The master list — every page, every action, every task the owner asked for (2026-09-16)
Written on Omar's order: "Did you list EVERYthing that is gonna be on the website/app — like every page and everything that you can do. And then bring up everything the owner asked for in the video I sent you, I need EVERY task. Make sure it's every task."
What this file is. Part 1 is the app read page by page and button by button out of the portal's own source code, not out of memory or an earlier list. Part 2 is every task the owner saw or asked for in the Fieldflo video, one row each, traceable to a line in the notes. Part 3 is the gaps both ways. Part 4 is the count.
Sources — only these.
- Code:
portal/roles.js,portal/app.js,portal/app-ops.js,portal/app-ops2.js,portal/app-map.js,portal/ops.js,portal/ops2.js,portal/certs.js,portal/data.js,portal/geo.js,portal/index.html,portal/qr.js,portal/app.css. - Video:
profile/Fieldflo_Video_Workflows_2026-09-15.md(247 lines, read in full) andprofile/Fieldflo_Competitor_Call_2026-09-08.md(87 lines). - The old list, for Part 3c only:
profile/Screen_Inventory_2026-09-16.md.
Two standing facts. Every figure, name, ticket, permit and date in the app is demo data — the app carries a DEMO band on every screen and says so. Nothing in the app sends anything to anyone: where Fieldflo texts, the portal shows the message on screen and states that it was not sent.
Load order matters. index.html loads app.js → app-ops.js → app-ops2.js → app-map.js. Later files overwrite earlier ones. Three pages are overwritten: Start Day, Project Book and Crew's My Schedule. The rows below describe the live version, and say which file wins.
PART 1 — EVERY PAGE AND EVERY ACTION IN THE APP
1A. The pages
There are five logins (roles.js ROLES): Owner (ali/owner), Bookkeeper (priya/books), Estimator (ray/quotes), Site lead (sam/site — the old sam/pm still works), Crew (dale/crew). The Owner's 15 tabs are shown as 7 groups (roles.js GROUPS.owner); the other four logins have a flat tab bar and no groups (navGroups() returns null for them).
Order below is the app's own: login screen first, then each login's nav in its own order, then the two pages that need no login at all.
| # | Login(s) | Group | Page — nav label / page heading | What you can DO on it | Built? |
|---|---|---|---|---|---|
| 1 | everyone (before sign-in) | — | Sign in to your dashboard (index.html, buildLogin in app.js) |
Click any of 5 role cards to auto-fill its credentials · type username + password · press Enter or Sign in → · sign in as an owner-created team member with email + password · Install app button (opens the install sheet) · read the ✓/✕ "what this login sees" list on each card · read the DEMO · SAMPLE DATA note | Built |
Owner — 15 tabs in 7 groups (GROUPS.owner, app.js, app-ops.js, app-ops2.js, app-map.js)
| # | Login(s) | Group | Page — nav label / page heading | What you can DO on it | Built? |
|---|---|---|---|---|---|
| 2 | Owner | Dashboard | Dashboard / "Owner / Company Overview" (app.js:662) |
Read 4 hero cards (Revenue, Jobs, Outstanding, Profit) each with a sparkline and a click-through to another tab · Job sites map (app-map.js): hover or focus a pin for address, status and contract value, click a pin to open that job, click a status chip to hide/show those pins, read the by-area counts, see the downtown inset · Who's on site today per crew (started time, site, men, talk done, confirmations) · Bid vs actual — open jobs table, hottest first, click a row to open the job · Overtime flag (32+ / 40+) with a Payroll → button · Bid vs actual by cost code summary card, clicks through to the Project Book · Change orders card (approved / awaiting customer) with clickable rows · Revenue vs Profit trend: change the period from a dropdown (re-buckets live), hover the chart for a date + $ tooltip, read the stat strip · Where the money goes cost bars · Payment status donut · Recent Jobs table with live search + Status / Type / Client filters, click a row to open the job P&L |
Built |
| 3 | Owner | Jobs | Pipeline / "Sales Pipeline" (app.js:744) |
Read 4 KPIs (quotes sent, quote value, win rate, won value) · quote value by year bars · win rate by year bars · Recent quotes table with live search and an Outcome filter | Built |
| 4 | Owner | Jobs | Proposals / "Proposals" (app-ops.js:641) |
Quotes table with live search + Outcome / Work filters · click a row or its Proposal → button to open the proposal document · in the proposal: read prepared-for / site / date / valid-until / work / estimator, scope of work, Included and Not included lists, price + GST + total, terms, signature blocks · Print / Save as PDF (the browser's own) · close | Built — marked DRAFT; the owner sends it, nothing is emailed |
| 5 | Owner | Jobs | Jobs & P&L / "Jobs & P&L" (app.js:736) |
Every won job with demo date, project, invoice, PM, contract, cost, profit, margin, status · live search + Year / Month / Status / PM filters · click any row to open the job modal (see A20–A24 below) | Built |
| 6 | Owner | Jobs | Project Book / "Project Book" (app-ops.js:294, extended by app-ops2.js:333) |
4 KPIs (permits expiring, permits expired, no permit on file, men blocked) · open-jobs table: job, site, client, crew, permit pills, extra tickets the job needs, crew ready/blocked, status — with live search + Status / Crew filters · click a row to open the job modal (scope, permits, waste, P&L, cost codes, change orders, photos, documents, closeout) · Bid vs actual by cost code full table across all open jobs (budget, spent, used bar, variance) | Built |
| 7 | Owner | Schedule | Schedule Board / "Schedule Board" (app-ops.js:351, drag added app-ops2.js:383) |
Crews × 6 days grid · ← Previous week / This week / Next week → · click any cell to open the slot picker (choose a site or "No work / off", Save or Cancel) · drag a crew's day onto another day or another crew (tap-and-hold on a phone); dropping on an occupied cell swaps the two · a drop that would put a crew on a job it lacks the ticket for is refused and opens a block modal naming each man and each missing ticket · Text the week to the crew (in-app demo) shows the exact message every man would get, and states nothing was sent | Built |
| 8 | Owner | Schedule | Timeline / "Timeline" (app-ops2.js:472) |
Read-only Gantt: open jobs as bars grouped by crew, week headers, a Today line, colours for Open / Partial / Not started, a hatched "estimated span", a "No crew set" group, hover a bar for project + dates + note · click a bar to open that job | Built |
| 9 | Owner | Money | Collections / "Collections & AR" (app.js:770) |
4 KPIs (total outstanding, holdbacks, in court, to invoice) · open receivables table — project, invoice, status, owed incl GST, GST, demo date, age — oldest first, with a total row, live search and a Status filter | Built |
| 10 | Owner | Money | Payroll / "Payroll Approval" (app-ops.js:597) |
← Previous week / This week / Next week → · Export CSV (downloads a file headed "DEMO DATA", owner export includes rate and pay) · Approve this week (records who approved and when; afterwards the button is replaced by an "Approved by … " stamp) · 4 KPIs (hours, over 32 h, labour cost, status) · hours-per-man table by day with totals, a 32+/40+ flag, rate and pay columns, live search and a Crew filter · hours-per-job table with men, hours and labour cost | Built |
| 11 | Owner | Money | QuickBooks / "QuickBooks Online" (app-ops.js:548) |
Read the "Not connected" status panel · Connect QuickBooks Online button — it only explains that it needs the owner's QuickBooks login; nothing connects · read the what-would-sync table (Customers, Jobs/projects, Invoices, Payments, Employees — each with direction and what it does), every row marked Waiting · read the CSV fallback line and "Last sync: never" | Part built — a settings page, no integration |
| 12 | Owner | People | Team & Access / "Team & Access" (app.js:797 + app-ops.js:54) |
Add a team member: full name, work/Gmail email, role dropdown, temporary password (pre-generated) → Add member; validates the email and refuses a duplicate · Team table (5 demo accounts + everyone added) showing person, role badge, what that role sees, sign-in credentials — with live search and a Role filter · Edit a member (name, role, password — email locked) · Remove a member (their login stops working) · Who sees what: one on/off switch per page per person, flipped live; the owner's own login cannot be switched off; a switched-off tab disappears from that person's menu and render() refuses to open it by link · Reset all switches |
Built — owner-only, refuses to render for any other login |
| 13 | Owner | People | Tickets & Certs / "Tickets & Certificates" (app.js:1395 → certsPage) |
4 KPIs (men on the books, tickets in date, expiring, expired) · Needs attention table (man, ticket, expires, days left, status) with search and a Ticket filter, click a row to open the man · Put a man on a crew: pick the man, the crew and optionally the job → Add to crew; it lists what the crew needs plus what the job needs, then either allows him or refuses him and names every missing or lapsed ticket · The men table (man, crew, ticket chips, worst status, hat code) with search and Crew / Status filters · Show archive / Hide archive — every expired or renewed ticket, kept and never deleted, searchable · click a man for his file: hat code, phone, start date, day rate, his QR code, Open the scan view, tickets held, tickets replaced by a renewal | Built |
| 14 | Owner | Safety | Safety / "Safety & Incidents" (app-ops.js:525 + app-ops2.js:490) |
4 KPIs (open actions, incidents, inspections, closed actions) · Corrective actions list — Close or Reopen any one; overdue goes red; closed ones stay on file · Report an incident: type (near miss / stop work / injury), date, site, what happened, immediate action taken, plus an optional corrective action (the fix, its owner, its due date) → File it · Incidents table with search and a Type filter · Inspections table · Log an inspection: site, kind, result (pass / deficiencies), notes → Log it · Safety documents library — JHA, SWP, toolbox talks, SDS with rev, updated date, pages and which jobs require them, searchable and filterable by type, Open any one to read its placeholder page | Built — the 11 documents are placeholders |
| 15 | Owner | Gear | Equipment / "Equipment & Rentals" (app-ops.js:426) |
4 KPIs (assets, on rent, rentals overdue, inspections) · Reminders list (rentals to call off, inspections due) — click any to open the asset · Asset list (code, asset, owned/rental, where, next inspection, return by, value or day rate, status) with search and Kind / Status filters · click an asset for its record and its QR code, then See the scan page for the read-only view an operator gets | Built — the equipment list is invented; the owner has not given us his |
| 16 | Owner | Gear | Inventory / "Inventory" (app.js:794 → invPage) |
Stock-on-hand table (item, on hand, unit price, OK / Low stock) with search and a Status filter | Built |
Bookkeeper — 5 tabs, flat nav (TABS.book)
| # | Login(s) | Group | Page — nav label / page heading | What you can DO on it | Built? |
|---|---|---|---|---|---|
| 17 | Bookkeeper | — (flat) | Dashboard / "Accounting Overview" (app.js:986) |
4 hero cards (total outstanding, to invoice, in court, holdbacks) · the job-site map, pins limited to her own view · Invoiced vs Collected trend with a working period dropdown and a hover tooltip · outstanding-by-type bars · invoice-status donut · Oldest Outstanding table with search and Status / Type / Client filters, click a row to open the invoice view of a job | Built — costs and profit are not on the objects this login receives |
| 18 | Bookkeeper | — (flat) | Outstanding / "Outstanding Receivables" (app.js:1030) |
Money-owed table (project, invoice #, PO #, status, owed incl GST, GST, demo date, age), oldest first, with a total row, live search and a Status filter | Built |
| 19 | Bookkeeper | — (flat) | To Invoice / "To Invoice" (app.js:1047) |
Finished-but-unbilled jobs (project, PO #, demo date, age, invoice value, + GST 5%) with a total row and live search | Built |
| 20 | Bookkeeper | — (flat) | Payments / "Payments" (app.js:1061) |
3 KPIs (paid/settled, still owed, total invoices) · invoice-status donut | Built |
| 21 | Bookkeeper | — (flat) | Payroll hours / "Payroll hours" (app-ops.js:598) |
Same page as the owner's Payroll minus every rate and every dollar · week back / this week / forward · Export CSV (hours only) · hours per man and hours per job · no Approve button | Built — switched OFF by default (TABS.book, the only tab in the app that ships off); the owner switches it on for her on Team & Access |
Estimator — 5 tabs, flat nav (TABS.est)
| # | Login(s) | Group | Page — nav label / page heading | What you can DO on it | Built? |
|---|---|---|---|---|---|
| 22 | Estimator | — (flat) | Dashboard / "Estimating Overview" (app.js:1093) |
4 hero cards (quotes out, win rate, won value, average quote) · Quoted vs Won trend bucketed by quote date, with a period dropdown and a hover tooltip · recent-quotes table with search and Outcome / Year filters · no map — this login holds no jobs, so HOOKS.siteMap returns nothing |
Built |
| 23 | Estimator | — (flat) | My Quotes / "My Quotes" (app.js:1124) |
Every quote he wrote (quote date, site, quoted, won / open-lost, year) with search and Outcome / Year filters | Built |
| 24 | Estimator | — (flat) | Win Rate / "My Win Rate" (app.js:1134) |
4 KPIs · win rate by year bars · quoted value by year bars · a year-by-year table | Built |
| 25 | Estimator | — (flat) | Proposals / "Proposals" (app-ops.js:642) |
The same proposal builder as row 4, limited to his own quotes and with no estimator column, no sell price, no profit | Built |
| 26 | Estimator | — (flat) | Bid vs Actual / "Bid vs Actual" (app-ops2.js:359) |
4 KPIs (jobs, budget, spent so far, codes over budget) · one panel per open job he bid, each with its cost-code table (code, name, budget, spent, used bar, %) and a "% of budget spent" pill · no variance column, no sell price, no profit | Built |
Site lead (foreman) — 10 tabs, flat nav (TABS.lead)
| # | Login(s) | Group | Page — nav label / page heading | What you can DO on it | Built? |
|---|---|---|---|---|---|
| 27 | Site lead | — (flat) | Dashboard / "My Overview" (app.js:907) |
4 hero cards (my jobs, active now, contract value, upcoming demos) · the job-site map, his jobs only · Contract vs Cost trend with a period dropdown · a line stating company profit and margin are not in this role · my-cost-mix bars · my-jobs-by-status donut · Recent Jobs table with search and filters, click a row to open the job | Built |
| 28 | Site lead | — (flat) | Start Day / "Start Day" (app-ops.js:104, overwritten by app-ops2.js:108 which adds the photo panel) |
Before starting: pick the site from a dropdown (pre-selected from the board if the board has him somewhere today) → Start Day. After starting: 4 KPIs (on site, hours today, safety talk, confirmed) · a blocked-men panel naming every man who lacks a ticket this crew or this job needs · Timesheet — change any man's hours (number input, saved as you type), see his tickets OK / Blocked, his week-so-far with a 32+ flag, and his end-of-day answer · Pre-job safety talk — pick the topic from 6, tick all 6 checklist items, then Talk done — crew briefed (disabled until every item is ticked; locks the list once closed) · Site notes — type, or Talk into it using the browser's own speech recognition in 6 languages (English, Español, Filipino, ਪੰਜਾਬੀ, Français, العربية), then Add note; every note is stamped and marked spoken or typed · Send end-of-day check to the crew (in-app) — disabled until the talk is closed; afterwards it shows the exact message each man sees and states nothing was texted · Reset today's daily (demo) · Site photos — pick a stage (Before / During / After / Closeout), write a caption, Take / choose photo (opens the phone camera), the picture is resized to 960 px and kept on the device; click any photo to open it full size | Built — in-app only; texting is not switched on |
| 29 | Site lead | — (flat) | My Jobs / "My Jobs" (app.js:963) |
Assigned jobs with demo date, project, status, contract, actual cost and a cost-vs-contract bar; search and a Status filter; click a row for the job modal (his version: no profit, no margin) | Built |
| 30 | Site lead | — (flat) | Schedule / "My Schedule" (app.js:970) |
Upcoming demos table and Completed table, each with search and a Status filter, each row clickable into the job | Built |
| 31 | Site lead | — (flat) | Crew Board / "Crew Board" (app-ops.js:352) |
The same board as row 7 limited to his own crew — week navigation, click a cell to move the crew, drag-and-drop with the same ticket refusal, and the in-app text preview for his crew only | Built |
| 32 | Site lead | — (flat) | Timeline / "Timeline" (app-ops2.js:473) |
The same Gantt as row 8, his crew's jobs only | Built |
| 33 | Site lead | — (flat) | My Crew / "My Crew" (app.js:1400 → certsPage) |
The same ticket page as row 13 limited to his crew, including Put a man on a crew (his crew only), the attention list, the archive and each man's file — but with no course-cost column and no day rate | Built |
| 34 | Site lead | — (flat) | Safety / "Safety & Incidents" (app-ops.js:526 + app-ops2.js:490) |
The same safety page as row 14, his jobs only, including reporting an incident, logging an inspection, closing a corrective action and the document library | Built |
| 35 | Site lead | — (flat) | Equipment / "Equipment & Rentals" (app-ops.js:427) |
The same equipment page as row 15 with no value and no day-rate column | Built |
| 36 | Site lead | — (flat) | Materials / "Materials" (app.js:983 → invPage) |
Shared disposal stock — the same table as row 16 with a "shared across crews" note | Built |
Crew (labourer) — 4 tabs, flat nav (TABS.crew)
| # | Login(s) | Group | Page — nav label / page heading | What you can DO on it | Built? |
|---|---|---|---|---|---|
| 37 | Crew | — (flat) | Today / "Today" (app.js:1176) |
His site card: address, task, demo date, crew, status, and a PPE reminder · the job-site map, tap a pin for the address and status — no drill-in for this login · a warning panel if any of his own tickets is expiring or expired, with a See all my tickets → button · a Next up / last sites table · not one dollar figure is on the objects this role receives | Built |
| 38 | Crew | — (flat) | End of Day / "End of Day" (app-ops.js:211) |
If the foreman has not started the day, it says so. Otherwise: read his hours for the day and the safety-talk topic, then Yes, I attended or No, I did not, and tick My hours are wrong — flag it for the foreman. His answer is stamped, shown back to him, changeable, and appears on the foreman's Start Day and the owner's dashboard | Built — in-app; this is the question Fieldflo sends by text |
| 39 | Crew | — (flat) | My Schedule / "My Schedule" (app.js:1212, overwritten by app-ops.js:385 which adds the week strip) |
A six-day week strip showing where he is each day (today marked) · a full table of his crew's sites (demo date, site, task, status, age) with search and Status / Task filters | Built |
| 40 | Crew | — (flat) | My Tickets / "My Tickets" (app.js:1224) |
The code on your hard hat — his QR drawn on the device, his name, trade, crew and hat code, and See what the inspector sees · what he holds (expired ones included) · tickets replaced by a renewal | Built |
Pages that need no login at all
| # | Login(s) | Group | Page — heading | What you can DO on it | Built? |
|---|---|---|---|---|---|
| 41 | No login — reached by scanning a hard hat (?hat=MK-xx, inspectorView in app.js:1412) |
— | Read-only ticket check | See the man's name, trade, crew and hat code · a verdict banner: "N EXPIRED tickets — do not let him start" / "All in date · N expiring soon" / "All tickets in date" · every ticket held with number, issuer, expiry and status · the archive of renewed ones · Back to the portal · the page states it shows tickets only — no pay, no phone number, no job costs, because they are not on the object it is given | Built — works offline, the code is drawn on the device |
| 42 | No login — reached by scanning an asset (?asset=xx, assetScanView in app-ops.js:462) |
— | Read-only equipment check | See the asset name, make, owned/rental, code and serial · a verdict banner (in service / due back / inspection overdue) · where it should be, last inspected, next inspection, and for a rental who to return it to and by when · Back to the portal | Built — read-only; you cannot log an inspection from it |
Every page name above is the label the code itself uses. Nothing is generated dynamically except: the sub-heading lines, which are built from live counts (e.g. "N jobs with a book"); the crew names on the board and the Gantt, which come from certs.js crews; and the week labels on the board, Gantt and payroll, which are computed from OPS.WEEK.start.
Count for Part 1A
42 pages in all. 39 of them are login × tab pairs, 1 is the sign-in screen, 2 need no login. Split by login: Owner 15 · Bookkeeper 5 (one off by default) · Estimator 5 · Site lead 10 · Crew 4 · no login 2 · pre-login 1. Distinct page implementations are fewer than 39, because seven are one function serving two logins with different projections: the board, the Gantt, Equipment, Safety, Payroll, Proposals and the tickets page.
1B. The actions that are not pages
| # | Login(s) | Where it lives | Action — exactly as the code labels it | Built? |
|---|---|---|---|---|
| A1 | everyone | Login screen | Click a role card → fills that role's username and password | Built |
| A2 | everyone | Login screen + top bar | Install app → a sheet with the app icon, an Install app button, and per-platform steps for iPhone, Android and desktop; hides itself once installed | Built |
| A3 | everyone | Top bar | Search box — mirrors what you type into the current page's table filter; goes grey and disabled on a page with no table | Built |
| A4 | everyone | Top bar | Notifications bell → a popup of 3 role-specific notices with Mark all read; carries counts and dates only, never a dollar figure | Built — mock notifications |
| A5 | everyone | Top bar | Sign out | Built |
| A6 | Owner | Left rail | Open / close a nav group (accordion); a group with one tab acts as that tab | Built |
| A7 | Owner | Any page in a multi-tab group | The sub-tab row on a phone (the bottom bar only has room for the 7 groups) | Built |
| A8 | everyone | Every table | Live search + per-column dropdown filters, a live row count, and a "No matching rows" message; options are derived from the table's own cells | Built |
| A9 | Owner, Bookkeeper, Estimator, Site lead | Every trend panel | Period dropdown — re-buckets the same rows over a different trailing window and redraws the chart and the stat strip live | Built |
| A10 | everyone with a chart | Every trend chart | Hover or drag for a date + value tooltip, on mouse and on touch | Built |
| A11 | everyone | Every table on a phone | Rows become label:value cards automatically | Built |
| A12 | Owner | Team & Access | Per-person, per-tab on/off switch — flip it, sign in as them, the tab is gone from their menu and will not open by link | Built |
| A13 | Owner | Team & Access | Reset all switches back to the role defaults | Built |
| A14 | Owner | Team & Access | Add member form → a working login saved on the device | Built |
| A15 | Owner | Team & Access | Edit team member modal (name, role, password; email locked) | Built |
| A16 | Owner | Team & Access | Remove a member — their login stops working | Built |
| A17 | Owner, Site lead | Tickets & Certs / My Crew | Put a man on a crew → allowed, or Blocked with every missing ticket named and why ("never filed" or "expired") | Built |
| A18 | Owner, Site lead | Tickets & Certs / My Crew | Show archive / Hide archive toggle | Built |
| A19 | Owner, Site lead, Crew | Ticket pages | See what the inspector sees → the scan page in a sheet, plus Open it as its own page ↗ | Built |
| A20 | Owner, Site lead, Bookkeeper | Any job row, any map pin, any Gantt bar | Job modal — invoice #, PO #, quote date, demo date, then the money block gated per role (Owner: sell, total w/GST, cost, profit, margin, GST + a cost breakdown · Site lead: contract, actual cost, cost-vs-contract, assignee + his cost breakdown · Bookkeeper: invoice value, owed, GST, to-invoice). Crew and Estimator cannot open it at all (openJob returns early) |
Built |
| A21 | Owner, Site lead, Bookkeeper | Job modal | Job switcher — a dropdown of every job this login may see, ◀ / ▶ arrows, and an "n / N" counter; jumping re-projects, so it can never reach a job or a field the role is not allowed | Built |
| A22 | Owner, Site lead | Job modal | Project book section — scope, permits table with expiry pills, the tickets this job needs on top of its crew's, crew readiness (click a man for his file), waste and hauling | Built |
| A23 | Owner, Site lead | Job modal | Job book tabs — Cost codes · Change orders · Photos · Documents · Closeout | Built |
| A24 | Owner, Site lead | Job modal → Cost codes | Budget, spent, a used bar, % and (owner only) variance, per code and in total | Built |
| A25 | Owner, Site lead | Job modal → Change orders | New change order (what changed, fixed price or T&M, amount) → Save as draft | Built |
| A26 | Owner | Job modal → Change orders | Mark sent to customer · Approve · Decline · Back to draft. Approving raises the revised contract on the owner's view. The code says it plainly: "Sent to customer is a status, not a send" | Built — nothing leaves the device |
| A27 | Owner, Site lead | Job modal → Change orders | T&M day form — date, men, hours each, materials at cost (owner only), materials used, equipment, note → Save day; rolls into the order's man-hours and, for the owner, its value | Built |
| A28 | Owner, Site lead | Job modal → Photos, and Start Day | Take / choose photo — stage, caption, camera or file picker; resized to 960 px, kept on the device, capped at 24 added photos | Built |
| A29 | Owner, Site lead | Anywhere a photo appears | Open a photo full size, with ← Back to job | Built |
| A30 | Owner, Site lead | Job modal → Documents, Safety page | Open a document — a placeholder page watermarked DEMO, with which jobs require it, and ← Back to job | Built — placeholders only |
| A31 | Owner, Site lead | Job modal → Closeout | Open the closeout report — scope, permits, tickets the job needed, waste and landfill tickets, hours on the job, change orders, cost codes (owner only), safety, documents, photos, three signature lines. Owner copy carries prices; the site copy is headed "no prices" | Built |
| A32 | Owner, Site lead | Closeout report | Print / Save as PDF (the browser's own) · ← Back to job | Built |
| A33 | Owner, Estimator | Proposals | Open a proposal → Print / Save as PDF; banded DRAFT PROPOSAL — DEMO DATA | Built |
| A34 | Owner, Site lead | Schedule Board / Crew Board | Click a cell → pick a site or "No work / off" → Save | Built |
| A35 | Owner, Site lead | Schedule Board / Crew Board | Drag a day to another day or crew; swap when the target is occupied; tap-and-hold on a phone | Built |
| A36 | Owner, Site lead | Schedule Board / Crew Board | A drag that would break a ticket requirement is refused, and a modal shows the same block the crew page shows, one panel per man | Built |
| A37 | Owner, Site lead | Schedule Board / Crew Board | ← Previous week · This week · Next week → | Built |
| A38 | Owner, Site lead | Schedule Board / Crew Board | Text the week to the crew (in-app demo) — shows every man's message, sends nothing | Built as a preview only |
| A39 | Site lead | Start Day | Start Day — one button that opens the timesheet, the safety talk and the notes | Built |
| A40 | Site lead | Start Day | Change a man's hours (saved as you type, clamped 0–16) | Built |
| A41 | Site lead | Start Day | Safety-talk checklist — pick the topic from 6, tick all 6 items, Talk done — crew briefed (disabled until every item is ticked) | Built |
| A42 | Site lead | Start Day | Talk — browser speech-to-text in 6 languages, interim results into the box, then Add note | Built — the browser's own recogniser; nothing is uploaded |
| A43 | Site lead | Start Day | Send end-of-day check to the crew (in-app) — disabled until the talk is closed | Built — appears on each man's End of Day tab; nothing is texted |
| A44 | Site lead | Start Day | Reset today's daily (demo) | Built |
| A45 | Crew | End of Day | Yes, I attended / No, I did not + My hours are wrong | Built |
| A46 | Owner, Site lead | Safety | File it — report an incident, with an optional corrective action, owner and due date | Built |
| A47 | Owner, Site lead | Safety | Log it — log an inspection (site, kind, pass or deficiencies, notes) | Built |
| A48 | Owner, Site lead | Safety | Close / Reopen a corrective action; it stays on file either way | Built |
| A49 | Owner, Site lead | Equipment | Open an asset → its record and its QR code → See the scan page | Built |
| A50 | Owner, Bookkeeper | Payroll | Export CSV — a file headed "DEMO DATA"; the owner's carries rates and pay, the bookkeeper's carries hours only | Built |
| A51 | Owner | Payroll | Approve this week — records who and when, then shows the stamp instead of the button | Built — one approver, no chain |
| A52 | Owner, Bookkeeper | Payroll | ← Previous week · This week · Next week → | Built |
| A53 | Owner | QuickBooks | Connect QuickBooks Online — explains what it needs; connects nothing | Not built (the button is a note) |
| A54 | Owner, Bookkeeper, Site lead, Crew | Dashboard map | Click a status chip to hide or show those pins; the count updates | Built |
| A55 | Owner, Bookkeeper, Site lead | Dashboard map | Click a pin to open that job. The Crew map is deliberately drill-free | Built |
| A56 | No login | A hard hat | Scan the QR → page 41. Drawn on the device, so it works with no signal | Built |
| A57 | No login | A machine | Scan the QR → page 42 | Built |
| A58 | everyone | Every screen | The DEMO band under the header — it cannot scroll away or be dismissed, and render() never wipes it |
Built |
| A59 | everyone | The whole app | Install as an app (PWA) — full screen, works offline, updates itself; a service worker reloads once when a new build takes over | Built |
Not in the app — the text line
These are Omar's and the owner's four working seats in tools/, not portal screens. They read the portal's own data files and print exact figures. Listed because they are things you can do, by text, today.
| # | Who | Command | What it does | Built? |
|---|---|---|---|---|
| A60 | Owner | node tools/ask.cjs <command> — outstanding, jobs [status], job <address-or-id>, quotes [won|lost] [by <estimator>], crew <A|B|C>, tickets [man], inventory; --as book/est/lead/crew for a role view |
Ask it a number by text, get the answer off the data | Built |
| A61 | Owner | node tools/collector.cjs |
Nightly: what is not invoiced, what is overdue by age, holdbacks. Writes invoice drafts to outbox/invoices/ under a DRAFT header. The owner sends invoices, not the app |
Built |
| A62 | Site lead → Owner | node tools/daily.cjs --text "…" --from "…" |
Turns a foreman's end-of-day words (typed or transcribed) into a filed daily and a 5-line confirmation | Built |
| A63 | Owner | node tools/tickets.cjs |
Weekly: expiring tickets, expiries, and who cannot be booked on a crew | Built |
Count for Part 1B
63 actions. 59 inside the app, 4 on the text line. Of the 59 in-app: 58 built, 1 (Connect QuickBooks Online) is a button that only explains itself. Split by login — actions available to Owner 48 · Bookkeeper 17 · Estimator 12 · Site lead 40 · Crew 12 · no login 2. (A login is counted once per action it can reach; most chrome actions are available to all five.)
PART 2 — EVERY TASK ALI ASKED FOR OR SAW IN THE VIDEO
Every row traces to a line in profile/Fieldflo_Video_Workflows_2026-09-15.md. Timestamps are that file's timestamps. The "Whose ask" column is the important one: The owner asked means he said it himself, unprompted; The owner liked it means he reacted to a demo; Fieldflo showed means it was demoed and the owner said nothing; The owner pushed back means he was cool on it.
Flow 1 — Log in, branding, who sees what
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V1 | Log in to one platform that holds the business | @2:37 | Fieldflo showed | 1 | Built |
| V2 | Your own logo and branding on it — "wherever you see Fieldflo, just imagine your logo" | @2:37 | Fieldflo showed | every page | Built — black + gold, Makki's logo |
| V3 | Everything built on role and permission; access restricted to every part of the platform | @2:37, @3:40 | Fieldflo showed | 1, 12, and the projections behind all 42 | Built — a forbidden field is not on the object the role receives |
| V4 | Daily labourers verify time and safety but never log into the platform | @2:37 | Fieldflo showed | — | Not built — our labourer has a login (page 37–40); text-only is planned, not built |
| V5 | Open a person, tick the tabs they may see — the accountant given payroll only | @8:30 | The owner liked it: "Okay. Wow." @8:52 | 12 | Built |
| V6 | A foreman limited to view projects, add forms, take pictures | @8:54; Owner: "That's pretty much it." @9:24 | The owner confirmed | 27–36 | Built — he has 10 tabs, no profit, no margin, no other crew |
| V7 | Each employee sent his own approval by text: his time and hours for the day and the week, "Were you injured? Does everything look good?" | @9:40 | Fieldflo showed | 38 (in-app) | Part built — the question is on his End of Day tab; it is not texted, and the weekly total is not in it |
Flow 2 — The dashboard tour
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V8 | Today's active projects, coming to life as the foreman clocks his crew in | @3:40 | The owner liked the dashboards: "Very, very user friendly" @10:37 | 2 | Built — "Who's on site today" |
| V9 | Click into a project and audit all their paperwork from the dashboard | @3:40 | Fieldflo showed | 2 → A20–A23 | Built |
| V10 | Projects over 50% on bid vs actual: cost codes, labour types, bid / actual / remaining | @5:00 | Fieldflo showed | 2, 6, 26 | Built — by job and by cost code; "labour types" is a cost code here, not a separate axis |
| V11 | Certs flagged several ways as they get close to expiring | @5:00 | The owner liked it | 2, 13, 33, 40 | Built — 60-day and 30-day warnings |
| V12 | Employees nearing overtime, live at 32 hours | @5:31 | Fieldflo showed | 2, 10, 28 | Built — 32+ and 40+ |
| V13 | New projects on the dashboard | @5:31 | Fieldflo showed | 2 | Built — Recent Jobs |
| V14 | Time and materials and change orders on the dashboard | @5:31 | Fieldflo showed | 2, A23, A25–A27 | Built |
| V15 | Audit all forms in one place — "all the safety meetings across all our branches in the last month" | @5:31 | Fieldflo showed | — | Not built — safety talks are inside each day's Start Day; there is no one place that lists them all |
| V16 | Deploy one message to the whole crew by text or email (PPE week, holiday party) | @5:31 | Fieldflo showed | — | Not built |
| V17 | A map of where the projects are | @5:31 | Fieldflo showed | 2, 17, 27, 37 | Built — a pin per active site, with a downtown inset |
| V18 | A map of where employees clock in from | @5:31 | Fieldflo showed | — | Not built — no GPS clock-in anywhere |
| V19 | The last injury form on the dashboard | @5:31 | Fieldflo showed | 14, 34 | Part built — incidents are on the Safety page; there is no dashboard widget |
| V20 | Counts of employees, clients and users | @5:31 | Fieldflo showed | 12, 13 | Part built — people are counted on Tickets & Certs and Team & Access; no client or user count tile |
| V21 | A safety dashboard: incidents, near miss, stop work | @5:31 | Fieldflo showed | 14, 34 | Built |
| V22 | An incident reporting system that walks a claim through — property damage or injury | @5:31 | Fieldflo showed | 14, 34 | Part built — you can file an incident; there is no claim walkthrough |
| V23 | Inspection management — your own or ready-made inspections | @5:31 | Fieldflo showed | 14, 34 | Part built — you can log an inspection with a result; there is no question-set builder and no ready-made library |
| V24 | A failed item assigned as a corrective action to a person; "they'll remain on this board until they fix it" | @5:31, @27:47 | Fieldflo showed | 14, 34, A48 | Built — overdue goes red, closed ones stay on file |
| V25 | Reports and stats for OSHA | @5:31 | Fieldflo showed | — | Not built — and Fieldflo is US-built; nothing on the call covered Alberta OHS |
| V26 | An equipment dashboard: maintenance, corrective actions on assets, inspections due, rentals to call off, what is assigned where | @5:31 | Owner: "That's great." @21:20 | 15, 35 | Part built — reminders, inspections due, rentals, and where each asset is; no maintenance history and no corrective action on an asset |
| V27 | A CRM: reach-outs, job walks, proposals sent, won / lost | @5:31 | The owner cut into this pitch to ask for QuickBooks @8:00 | 3, 23, 24 | Part built — proposals sent and won/lost are there; no contacts, no reach-outs, no job walks |
| V28 | A notification digest daily, twice a day if there are night shifts | @10:42 | Fieldflo showed | — (text line A61, A63) | Part built — the Collector runs nightly and the Ticket Keeper weekly on the text line; there is no in-app digest |
| V29 | Instant notifications: property damage, injury, change order, no access | @10:42 | Fieldflo showed | A4 | Part built — the bell carries 3 mock notices; nothing fires on an event |
| V30 | What the digest carries: certs near expiry with a link, permits near expiry, who is not doing paperwork correctly, warehouse orders pending, low inventory, scheduling conflicts | @10:42 | Fieldflo showed | 13, 6, 16 | Part built — certs, permits and low stock exist as screens; "who isn't doing paperwork", warehouse orders and scheduling conflicts do not exist at all |
| V31 | Send each employee his own schedule to his cell or email | @10:42, @34:47, @36:37 | Fieldflo showed | 39, A38 | Part built — his week is on his own login; the board previews the message and sends nothing |
Flow 3 — QuickBooks and setting up an employee
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V32 | Connect to QuickBooks — Online | @8:00, @8:09, @12:47 | The owner asked — his first unprompted words to Dan | 11 | Not built — page 11 is the settings page the link will live on |
| V33 | The integration brings the employees across, so there is no duplicate entry | @12:48 | The owner asked (same ask) | 11 | Not built |
| V34 | Then click each employee to update their information | @12:48 | Fieldflo showed | 12, 13 | Part built — you can add and edit a team login and open a man's file; you cannot edit a man's record |
| V35 | CSV import where there is no integration | @12:48 | Fieldflo showed | 11 | Not built — the fallback is named on the page; the import does not exist |
| V36 | Every page works the same way: a big button adds, three dots customise — "painting by number" | @12:48 | Fieldflo showed | — | Part built — every add-form is consistent, but there is no three-dots admin customisation anywhere |
| V37 | A unique QR code created for a person the moment they are created | @12:48 | The owner liked it | 13, 40 | Built — generated on the device from the hat code |
| V38 | An inspector scans the hard hat and sees that man's active certificates | @12:48 | The owner's biggest reaction: "Oh that's great." @14:00, and "I haven't seen anybody else incorporate that." @18:54 | 41, A56 | Built — no login, works offline |
| V39 | The inspector sees only active certs; the employee sees the same page including missing and expired, "so it's on them and the company" | @14:06 | Fieldflo showed | 40, 41 | Part built — our scan page deliberately shows expired ones to the inspector too, because that is the point of the scan. The man's own page matches. "Missing" (never held) is not shown on either |
Flow 4 — Employee profile, skills, training
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V40 | Emergency details on the profile | @14:06 | Fieldflo showed | — | Not built |
| V41 | Training pushed to the whole company or a division, onto each phone, entered with a secret PIN, taken in his own language | @14:06 | Owner: "Perfect." @15:24 | — | Not built |
| V42 | 600+ Got Safety training videos with a quiz, at $4 per employee per month | @15:31 | Fieldflo upsold it | — | Not built — and it is a third party's library, not ours to resell |
| V43 | A passed training produces a branded certificate tracked like any other cert, with the same expiry warning | @15:31; the owner finished Dan's sentence: "And let you know that's been close to expiring and all that fun stuff." @15:45 | The owner asked, by finishing the sentence | 13 | Part built — the cert tracking and the expiry warnings are built; nothing produces a certificate from a training |
| V44 | Profile fields: employee number, name, cell, temp labour, default cost code / position, office or division | @15:51 | Fieldflo showed | 12, 13 | Part built — name, trade, crew, phone, start date, day rate and hat code are held; no employee number, no temp-labour flag, no default cost code, no office/division |
| V45 | Skills on the profile; dispatchers filter by skill; a skill icon on the project | @15:51; Owner: "Yeah. So they have a nice little picture, certs." @16:35 | The owner liked it | — | Not built — we have tickets, not skills |
| V46 | A training matrix: who has what certs and whether they have the right ones | @16:40 | Fieldflo showed | 13, 33 | Part built — "The men" table is exactly this for tickets; it is not a matrix and it does not cover trainings |
| V47 | Write-ups, permissions, trainings, documents and emergency contact on the person | @16:40 | Fieldflo showed | 12 | Part built — permissions are built (A12); write-ups, trainings, per-person documents and emergency contact are not |
Flow 5 — Certificates: add, renew, archive
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V48 | Define the list of cert types (three dots → Cert names) | @17:30 | Fieldflo showed | — | Not built — the types are seeded in certs.js; there is no screen to edit them |
| V49 | Add a certificate: pick the type, valid from, expiry, which employee, take a picture of it, upload | @17:30 | Owner: "It's pretty, pretty straightforward." @18:46 | — | Not built — this is the biggest single hole on the page the owner reacted hardest to |
| V50 | Certs listed alphabetically | @17:30 | Fieldflo showed | 13 | Part built — ours sort by urgency (expired first), which is the more useful order, and every table is searchable |
| V51 | A renewals list — "all the ones that need to be renewed" | @17:30 | Fieldflo showed | 13, 33 | Built — the Needs attention panel is exactly this |
| V52 | Renew a cert: new valid-from and expiry; the new one becomes active, the old one is archived forever | @17:30 | The owner liked it | 13 | Part built — renewed certs are archived and never deleted, and the app shows the archive; there is no renew action |
| V53 | Export a PDF pack of certs to send to anyone | @17:30 | Fieldflo showed | — | Not built |
| V54 | The archive is visible forever | @18:52, @19:01 | The owner liked it | 13, 33, 40, 41 | Built — "kept, never deleted, so you can always show what was valid on the day" |
Flow 6 — Inventory and equipment, yard to site and back
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V55 | An Inventory page with Add item (excavator, skid steer, sprayers) | @19:01 | Owner: "That's great." @21:20 | 15, 16, 35, 36 | Part built — the lists exist and are searchable; there is no Add item form in either |
| V56 | A QR code on every asset; an operator scans it and inspects it without logging into the platform | @19:01 | The owner liked it | 42, A49, A57 | Part built — the scan page exists and needs no login, but it is read-only — you cannot log the inspection from it |
| V57 | Read the SDS on a chemical from the same scan | @19:01 | Fieldflo showed | 14 (SDS placeholders) | Not built — SDS documents are in the library, not on the scan |
| V58 | The item record: number, warehouse location, name, inspections, quantity, office, cost codes and rates (T&M rates brought in) | @19:01 | Fieldflo showed | 15, A49 | Part built — code, name, make, serial, where, inspections, value / day rate; no quantity, no office, no cost code on the asset |
| V59 | Inspections per item; a failed one notifies the warehouse manager | @19:01 | Fieldflo showed | 14, 34 | Part built — "Equipment inspection" is one of the three kinds you can log on the Safety page; nobody is notified |
| V60 | Build your own inspection question sets | @19:01 | Fieldflo showed | — | Not built |
| V61 | Maintenance and repair history per item | @19:01 | Fieldflo showed | — | Not built |
| V62 | A loadout list: the PM lists what a project needs, the warehouse manager is notified with the address and delivery notes, and fulfils it | @19:01 | The owner liked the whole flow | — | Not built |
| V63 | Stock moves out of inventory onto the project, cost-coded, estimates versus actuals | @19:01 | The owner liked it | 6, 26 (cost codes exist) | Not built — inventory does not move onto a job |
| V64 | Reporting Center → Project Inventory Report: everything ordered, returned or consumed on a project, in real time | @19:01 | Fieldflo showed | — | Not built |
Flow 7 — Setting up a job: project book, proposal, closeout
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V65 | Projects come over from QuickBooks, or you press the big button | @21:26 | The owner asked for the QuickBooks half @8:00 | 5, 6 | Part built — jobs exist; nothing comes from QuickBooks and there is no "new job" button |
| V66 | Project details = the project book: name, number, night shift, crew list, loss type, projected work days, scope of work, address | @21:26 | This is the screen the owner called a perfect fit: "there's nothing I could think of that we would need added." @24:07 | 6, A22 | Part built — name, number, crew, scope, address and (on the Gantt) the work days are all there; no night-shift flag and no loss type |
| V67 | Permits and notifications in the book, with expiry warnings, visible to the field | @21:26 | The owner liked it | 6, A22, 27 | Part built — permits, their numbers, issuers, expiries and 30/60-day warning states are there and the site lead sees them; the permit document itself is not held |
| V68 | Per diem on the project | @21:26 | Fieldflo showed | — | Not built |
| V69 | What certs and trainings are mandatory for this project — set once, then checked when you schedule people and when they go on the timesheet | @21:26, @25:57 | The owner liked the enforcement | 6, 7, 13, 28, 31, 33, A17, A36 | Built — and ours refuses rather than warning. Trainings are not covered, only tickets |
| V70 | Cost codes for the job, mirroring your own naming | @21:26 | Fieldflo showed | 6, 26, A24 | Built — 7 codes, budget vs spent per code |
| V71 | Building and owner information on the project | @21:26 | Fieldflo showed | 5, 6 | Part built — the client is held; no building or owner record |
| V72 | Waste reporting: haulers, material types, truck types, landfills | @21:26 | The owner liked it | 6, A22, A31 | Part built — hauler, landfill, loads and the last manifest reference are on the job and in the closeout; no material types, no truck types, no per-load entry |
| V73 | Custom tabs on the project | @21:26 | Fieldflo showed | — | Not built |
| V74 | Templates — "for these projects, I want you to answer these questions" | @21:26 | Fieldflo showed | — | Not built |
| V75 | Insurance on the project | @21:26 | Fieldflo showed | — | Not built |
| V76 | Emergency contact filled in once, landing on the daily safety meeting every day automatically | @21:26 | Fieldflo showed | — | Not built |
| V77 | Job costing estimates on the project | @21:26 | Fieldflo showed | 5, 6, 26, A24 | Built |
| V78 | Proposal builder: send the proposal with bid items to the client; if it is awarded, they drop in | @21:26 | The owner liked it | 4, 25, A33 | Part built — the proposal is built and printable; it is not sent from the app, and there are no bid-item lines, only a single price |
| V79 | Add bid items by hand or from an Excel sheet | @21:26 | Fieldflo showed | — | Not built |
| V80 | Every project has its own document system | @21:26 | Fieldflo showed | A23, A30 | Part built — each job links the documents it needs; all 11 are placeholders and nothing can be uploaded |
| V81 | A closeout report with the dailies, certs and documents in it | @21:26, @36:37 | The owner liked it | A31, A32 | Part built — scope, permits, tickets, waste, hours, change orders, cost codes, safety, documents, photos and sign-off are in it; the dailies and the crew's certs are not |
| V82 | Branches tied into an HQ dashboard | @24:23 | Fieldflo showed | — | Deliberately out — Omar closed it 2026-09-15: Makki Demolition only, one company |
Flow 8 — The field day, on the foreman's phone
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V83 | The foreman opens the app and sees only projects, in any language | @24:23 | Fieldflo showed | 27–36 | Part built — he sees 10 focused tabs; the app is English only (only the speech-to-text takes 6 languages) |
| V84 | Press Start day and the day's paperwork appears — "a timesheet, a JHA, an inspection, and a daily" | @24:23; the owner confirmed: "Yeah." @25:39 and @4:26 | The owner confirmed this is what his crews fill out | 28 | Part built — Start Day opens the timesheet, the safety talk and the notes (daily); the inspection is on a separate page (14/34), not inside Start Day |
| V85 | Timesheet head start: three dots → Same as previous day | @25:57 | Fieldflo showed | — | Not built — Start Day seeds every man at 8 h instead |
| V86 | Timesheet head start: Pull from scheduling | @25:57 | Fieldflo showed | 28 | Part built — the site is pre-selected from the board, but the crew list is not pulled from the schedule |
| V87 | Add or delete men on the timesheet based on who really showed up | @25:57 | Fieldflo showed | 28 | Part built — you set a man's hours to 0; you cannot add a man who is not on the crew |
| V88 | A man added without the right certs: the supervisor is warned, and if he is added anyway an email goes to the office | @25:57 | The owner liked the enforcement | 28, A17, A36 | Part built — ours blocks instead of warning, which is stronger; the office email is written on screen as a demo note and nothing is sent |
| V89 | A cost code per man on the timesheet, mirroring the company codes, defaultable | @25:57 | Fieldflo showed | — | Not built — cost codes sit on the job, not on a man's line |
| V90 | Pick who is starting → Start; the supervisor controls the timesheet, each labourer verifies | @25:57 | Fieldflo showed | 28, 38 | Part built — the foreman controls it and each man verifies, but in his own login, not by text |
| V91 | The labourer gets a text within seconds asking for his location (optional) | @25:57 | Fieldflo showed | — | Not built — no texting, no location |
| V92 | The office dashboard shows the project started to the second | @25:57, @27:47 | Fieldflo showed | 2 | Built — "Who's on site today" carries the start time, the men, whether the talk is closed and how many have confirmed |
| V93 | The JHA / pre-job safety meeting, with Same as previous day then edit | @27:47 | The owner confirmed his crews do a safety meeting @4:26, @25:39 | 28 | Part built — a 6-item checklist and a 6-topic picker; no "same as yesterday", no free editing |
| V94 | The supervisor enters his PIN to sign the JHA | @27:47 | Fieldflo showed | 28 | Part built — he closes the talk with a button, stamped with the time; there is no PIN |
| V95 | JHA contents: nearest hospital, PPE requirements, personal limitations, hazards, evacuation plan (pulled from the project details), task steps, hazards and controls | @27:47 | Fieldflo showed | 28 | Part built — our 6 items cover hazards, PPE, permits and containment, muster point and first-aider, questions, and the right to stop work. No nearest hospital, no personal limitations, no task steps, and nothing is pulled from the project book |
| V96 | A task library — "hit add tasks and they'll select what they're doing, it will automatically fill out the paperwork for them" | @27:47 | Fieldflo showed | — | Not built |
| V97 | New-day questions must be answered fresh each day | @27:47 | Fieldflo showed | 28 | Built — each day starts a new daily; the checklist starts empty |
| V98 | Everybody on the timesheet verifies he understood the safety meeting — the whole meeting goes to his phone by text, translatable, signed on his own phone | @27:47, @36:37 | The owner liked it | 38 | Part built — he answers Yes / No in his Crew login. No text, no translation, and he sees the topic, not the whole meeting. The owner's own test texts failed on the call (@36:24) |
| V99 | Inspections during the day; a "no" or "broken" assigned as a corrective action, the person notified | @27:47 | Fieldflo showed | 14, 34, A47, A48 | Part built — you log the inspection and raise the corrective action; nobody is notified |
| V100 | Dailies ready-made for the industry | @27:47 | Owner: "I love how it's tailored to demolition and abatement." @33:05 | 28 | Part built — a free-text note, not a structured industry daily |
| V101 | Talk into the daily in any language — "What'd you do today?" | @27:47 | The owner liked it | 28, A42, A62 | Built — browser speech-to-text in 6 languages on Start Day, and tools/daily.cjs turns a foreman's words into a filed daily on the text line |
| V102 | An incident / near miss / stop work on the daily notifies the office at once | @27:47 | Fieldflo showed | 14, 34, A46 | Part built — you can file all three; nothing notifies anyone |
| V103 | Goals for tomorrow and the week, and a meeting log, on the daily | @27:47 | Fieldflo showed | — | Not built |
| V104 | "Any more asbestos that are mold detected, any abatement procedures" on the daily | @27:47 | The owner flagged this himself: "Some stuff for abatements is a little more detailed and job specific." @4:26 | — | Not built — the biggest hole on the owner's own words |
| V105 | Pictures on every daily | @27:47 | Fieldflo showed | 28, A28 | Built — stage, caption, straight from the phone camera |
| V106 | The containment log: names already there, respirator used, task, time in, time out, signature | @27:47 | The owner's abatement work needs it (@4:26) | — | Not built — needs the owner's own form |
| V107 | Unanswered containment fields stay red until they are filled | @27:47 | Fieldflo showed | — | Not built (there is no containment log to redden) |
| V108 | End of day: back into the timesheet — who is leaving, what breaks they took | @27:47 | Fieldflo showed | 28, 38 | Part built — hours are edited all day and each man confirms at the end; no leave times and no break entry |
| V109 | Everyone verifies by text at the end of the day: time correct, meals, injured, "everything looks good" | @27:47, @9:40 | Fieldflo showed | 38, A43, A45 | Part built — he confirms hours and the safety talk in-app and can dispute his hours; no text, no meals question, no injury question |
Flow 9 — Takeoff and estimating (skimmed)
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V110 | A takeoff and estimating system built for the abatement world | @33:12 | The owner pushed back: "I know our estimators aren't fans." @34:36 | — | Not built |
| V111 | Pick the work type — demolition or abatement; residential, commercial or industrial | @34:47 | The owner pushed back | 4, 25 (work type is a field on a proposal) | Part built — work type exists as a label; it drives nothing |
| V112 | Bring in the drawings and "Fieldflo will start cooking for you" | @34:47 | The owner pushed back | — | Not built |
| V113 | The output drops automatically into the proposal with bid items and tasks, sent to the client | @34:47 | The owner pushed back | 4, 25 | Not built — our proposal carries one price, no bid items, and is not sent |
Flow 10 — Scheduling and dispatch
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V114 | A dispatching system that sends each employee his own schedule | @34:47 | Fieldflo showed | 39, A38 | Part built — in his login, not sent |
| V115 | The projects in the chosen time frame are listed; pick the ones you want to schedule | @34:47 | Fieldflo showed | 7, 31, A34, A35 | Built — a board of crews × days, click or drag |
| V116 | Each employee gets his assignments on his cell phone | @36:37 | Fieldflo showed | 39 | Part built — in-app; the text version is not built |
| V117 | A Gantt chart of everything coming up, to see people coming off a project and where more work is needed | @36:37 | Fieldflo showed | 8, 32 | Part built — the timeline is built and read-only; it shows jobs by crew and a Today line, but it does not surface where more work is needed |
Flow 11 — Closeout and weekly payroll approval
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V118 | A closeout report of everything done on the project | @36:37 | The owner liked it | A31, A32 | Part built — see V81 |
| V119 | Weekly payroll approval: everybody's total time, then per employee, per project, per cost code | @36:37 | The owner's own access question was about payroll @8:14 | 10, 21 | Part built — per man per day, per man total, and per job; not per cost code |
| V120 | Make fixes inside payroll approval | @36:37 | Fieldflo showed | 28 | Part built — hours are fixed on Start Day, not on the payroll page |
| V121 | "A nice spreadsheet right for your in-house accountant" | @36:37 | The owner asked: give the accountant access to just payroll @8:14 | 10, 21, A50 | Built — Export CSV, and the bookkeeper's copy carries hours with no rate and no dollar |
| V122 | An approval chain: named PMs approve their own projects, with a trailing history; the payroll administrator cannot run it until they have all signed | @36:37 | Fieldflo showed | 10 | Part built — one approver, recorded with name and time; no chain, no trail, nothing is blocked |
Flow 12 — Price and next steps
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V123 | Priced in tiers, counted on supervisors, foremen and above — daily labour is not billed | @39:16, @39:36–@40:27 | Fieldflo's model (≈$15,000/yr, under 15 users) | — | Not an app task — a commercial fact for the deck |
| V124 | A demo or trial login to click through before signing | The owner asked @41:06; Dan refused @41:24 | The owner asked, and was told no | 1 and all 42 | Built — The owner's own portal is live for him today, on demo data. This is the one thing Fieldflo refused him |
The owner's own words — his asks, his pushbacks, his context
| # | The task | Source | Whose ask | Lands on page(s) | Built? |
|---|---|---|---|---|---|
| V125 | A program his workers and managers find easy to use on site — the last ones were "hard for our workers and our managers to use" | @2:01 | The owner asked — his reason for taking the call | all 42 | Part built — five purpose-built logins, a phone layout, big buttons; never tested by a Makki crew |
| V126 | One system everybody actually uses — today "some people were using it, some people weren't, everything was out of whack" | @2:01 | The owner asked | 12 and the gating behind all 42 | Part built — one login per person, each seeing only their own slice; nothing forces use |
| V127 | Roll it out across five companies | @2:01 | The owner asked | — | Deliberately out — Omar closed it 2026-09-15: Makki Demolition only |
| V128 | Connect to QuickBooks. Online. | @8:00, @8:09 | The owner asked — unprompted, cutting into the CRM pitch | 11 | Not built — the settings page exists, the link does not |
| V129 | Let the accountant see payroll and nothing else | @8:14 | The owner asked — his only unprompted access question | 12, 21 | Built — and gated at the field level: her Payroll page has hours and no rate. The tab ships off; the owner switches it on |
| V130 | An orientation video for the program, to share with managers | @32:09 | The owner asked — and Fieldflo had none to show him | — | Not built — nobody has offered him one since |
| V131 | Job-specific abatement forms — "some stuff for abatements is a little more detailed and job specific" | @4:26 | The owner asked | — | Not built — this is V104, V106 and V107 in one line, and it is his own words |
| V132 | What his crews actually fill out: a timesheet, a safety meeting, some dailies (@4:26) — and, agreed again, a timesheet, a JHA, an inspection, and a daily (@25:39) | @4:26, @25:39 | The owner confirmed twice | 28, 14, 34 | Part built — timesheet, safety talk and daily notes are inside Start Day; the inspection is on a separate page |
| V133 | 80 employees doing "meetings and time" in it | @40:00 | The owner said it | 37–40 | Part built — the crew login does exactly meetings and time; 80 men each needing a login is the thing V4 was meant to avoid |
| V134 | Pitch it to the VP; budget is already approved | @40:46, @42:35 | The owner's next step | — | Not an app task — a sales fact |
| V135 | A second full demo with the whole team | @41:24, @42:47 | Dan offered; nothing was booked | — | Not an app task |
Count for Part 2
135 tasks, counted off the tables above:
| Whose ask | Count |
|---|---|
| The owner asked for it himself, or confirmed it in his own words | 22 |
| The owner reacted well to it in the demo | 25 |
| The owner pushed back on it or was cool about it (V110–V113, takeoff and estimating) | 4 |
| Fieldflo showed it and the owner said nothing — of which 3 are commercial facts, not app tasks (V123, V134, V135) | 84 |
| Total | 135 |
The 22 the owner asked for himself: V6, V32, V33, V38, V43, V65, V84, V93, V104, V106, V119, V121, V124, V125, V126, V127, V128, V129, V130, V131, V132, V133.
PART 3 — THE GAPS, BOTH DIRECTIONS
3a. Video tasks with NO page and no action in Part 1 — the real holes
These are the 41 tasks marked "Not built" in Part 2 — the ones with no page and no action anywhere in the app today. Several are the same hole under different numbers (the abatement paperwork is four; the yard flow is three), so they group into 28 holes.
| Video # | The hole | What it would take |
|---|---|---|
| V4 | Labourers who never log in | A texting number (Twilio or the ported office line), the crew's phone numbers, and the owner's OK on the two wordings. Planned in Labourer_By_Text_Plan_2026-09-15.md; costs money; nothing sends today |
| V15 | One place that lists every safety meeting done | A "forms" page that reads every daily out of the device store and lists them by date, crew and job. Small — the data is already written |
| V16 | One message pushed to the whole crew | The same texting line as V4 |
| V18 | Where each man clocked in from | GPS on clock-in. Needs the labourer app or the text line first, and the owner's call on tracking his men |
| V25 | An OHS / regulator report at one button | The owner's own OHS documents and the Alberta forms he actually files. Fieldflo's is a US OSHA report and does not fit |
| V40 | Emergency details on a person | A person-record editor. There is no edit form for a man anywhere — see V34 and V44 |
| V41, V42 | Training pushed to a phone; the video library | A training module and a PIN sign-off. The $4-a-man library is a third party's and not ours to resell |
| V45 | Skills, and picking a crew by skill | A skills list per man on top of the ticket list, and a filter on the board |
| V48 | Editing the list of cert types | A small admin screen over certs.js types |
| V49 | Adding a certificate — type, valid from, expiry, the man, a photo of it | The single biggest hole. This is the page the owner reacted hardest to in the whole call, and today a ticket can only be read, never added. Needs a form and photo storage |
| V52 | Renewing a certificate | Same form as V49 plus the archive flip the app already understands — the archive works, the action does not |
| V53 | A PDF pack of certificates | Print styling over the existing cert tables. Small |
| V57 | SDS from an asset scan | Link a document to an asset and put it on the scan page |
| V60 | Building your own inspection question sets | An inspection-template builder |
| V61 | Maintenance and repair history per machine | A history list on the asset record |
| V62, V63, V64 | Loadout lists; stock moving onto a job cost-coded; the project inventory report | The whole yard-to-site-and-back flow. This is the block the owner said "That's great" to, and none of it exists. Needs the owner's real equipment list first |
| V68 | Per diem | A field on the project book |
| V73, V74 | Custom tabs and question templates per project | A template builder on the project book |
| V75 | Insurance on the project | A field on the project book |
| V76 | Emergency contact filled once, landing on every daily | A field on the project book plus a line on the safety talk. Small, and it is one of Fieldflo's better ideas |
| V79 | Bid items, by hand or from Excel | Line items on the proposal instead of one price. Waits on the owner's past quotes |
| V85 | "Same as previous day" on the timesheet | Read yesterday's daily out of the store and seed today from it. Small — the data is already there |
| V89 | A cost code per man on the timesheet | A cost-code column on the Start Day timesheet feeding the job's codes |
| V91 | A text asking the labourer for his location | The texting line, plus the owner's call on tracking |
| V96 | A task library that fills the JHA in | The owner's own task and hazard wording, then a picker on the safety talk |
| V103 | Goals for tomorrow and the week, and a meeting log | Fields on the daily |
| V104, V106, V107, V131 | The abatement paperwork: asbestos/mold lines on the daily, the containment log, and fields that stay red until filled | The owner's own words, flagged at @4:26 before Dan showed anything. Needs the owner's real containment form. Planned in Solutions_Plan_2026-09-15.md §4 |
| V110, V112, V113 | Takeoff and estimating, and bid items dropping into a proposal | The Estimator seat. Waits on a handful of the owner's past quotes — and the owner pushed back on this one, so it is the lowest priority of the lot |
| V128, V33 | QuickBooks Online connected for real | The owner's first unprompted words on the call. 15 minutes with the owner authorising it on the QuickBooks side. Read-only first |
| V35 | CSV import | A parser for customers, invoices and payments. The fallback if V128 stalls |
| V130 | An orientation video for managers | The owner asked for this out loud and nobody has offered him one. A screen recording of the portal with a voiceover. Cheapest item on this list |
| V79 / V49 / V55 | No "add" form anywhere for a cert, an asset or an inventory line | Three small forms. Every list in the app can be read, searched and filtered; almost none of them can be added to |
28 holes, 41 tasks. The four that matter most, in order: V49/V52 (add and renew a ticket — the page he loved), V128 (QuickBooks — his first words), V104/V106/V131 (the abatement paperwork — his own flag), V62–V64 (the yard flow — his "that's great").
3b. Built, but nothing in the video and nothing the owner asked for
Work that exists in the app today that no Fieldflo flow and no the owner request called for.
| Part 1 # | What it is | Where it came from |
|---|---|---|
| 2, 17, 27, 37, A54, A55 | The job-site map with a downtown inset, hoverable pins, status toggles and click-through | Fieldflo showed a map (V17), but ours is a built basemap with a Calgary inset, quadrant counts and an area breakdown that go well past what was demoed. Built 2026-09-15 |
| 9, 18 | Collections & AR and Outstanding — money owed, aged, with holdbacks and in-court buckets | Fieldflo showed no invoicing, no payments, no holdbacks and nothing about money owed in 43 minutes. This is entirely ours |
| 19 | To Invoice — finished jobs not yet billed | Ours. Feeds tools/collector.cjs |
| 20 | Payments | Ours |
| 5 | Jobs & P&L with profit and margin per job | Ours — Fieldflo showed job costing (V77) but never a P&L |
| A61 | The Collector — nightly invoice drafts into outbox/invoices/ under a DRAFT header |
Ours. This is the axis Fieldflo has nothing on |
| A60 | Ask it a number by text | Ours |
| A63 | The Ticket Keeper — weekly expiry summary by text | Partly V11, but the text delivery is ours |
| 6 (owner rail) | Seven groups instead of fifteen tabs | Omar's order, 2026-09-15 20:59. Not from the owner, not from the video |
| A59, A2 | Install as an app (PWA), offline, self-updating | Ours. Fieldflo has a native app; nobody asked for this shape |
| 41 verdict banner | The scan page's "do not let him start" verdict line | Ours. Fieldflo showed the certs; the plain-English verdict is an addition |
| A17, A36, A88 | Refusing a man rather than warning about him | Fieldflo warns and emails (@25:57). We block. A deliberate difference, not a request |
| 26 | Bid vs Actual for the estimator, with no sell price and no profit | Ours — Fieldflo's cost codes were an owner view |
| A58 | The permanent DEMO band | Ours, and it should stay until the owner picks the day it comes off |
Nothing here is wasted — but four of them (Collections, To Invoice, Payments, the Collector) are the answer to a question Fieldflo never asked, and that is worth saying out loud to the owner rather than burying.
3c. Where the old 100-item list was wrong, padded or short
Checked row by row against Parts 1 and 2.
It was short. The old list has 100 rows against 135 video tasks and 42 pages + 63 actions. Thirty-odd things Dan demoed have no row in it at all, including: the "three dots / big button" pattern (V36), per diem (V68), insurance on the project (V75), custom tabs and templates (V73, V74), building and owner information (V71), the night-shift flag and loss type on the project book (V66), the supervisor's PIN on the JHA (V94), the JHA's own contents — nearest hospital, evacuation plan, task steps (V95), new-day questions answered fresh (V97), goals and the meeting log on the daily (V103), reading an SDS from a scan (V57), building your own inspection sets (V60), stock moving onto a job cost-coded (V63), bid items by hand or from Excel (V79), adding or deleting men on the timesheet (V87), the location text (V91), fixing hours inside payroll approval (V120), the cert-names admin screen (V48), alphabetical cert listing (V50), and the profile fields Dan listed one by one (V44).
Three rows are wrong or too generous.
- Row 56 calls add/renew a certificate "PARTLY" built. It is not built. The archive existing is not the same as being able to add or renew, and this is the page the owner reacted hardest to. In Part 2 it is V49 and V52, both Not built.
- Row 30 says change orders are Built and "approving raises the revised contract". True — but the row does not say that "sent to customer" sends nothing, which is the part that matters when the owner is standing in front of it.
- Row 87 puts "a foreman's voice note turned into a filed daily report" in the app's "foreman's day" section. It is not a portal screen — it is
tools/daily.cjson the text line. The row says so in its last four words, but it is counted among the app's screens.
Two rows are padding. Row 4 ("a number a login may not see never reaches that login") and row 2 ("five logins") are the same fact counted twice — the field-level projection is how the five logins work, not a separate thing to see. Row 95 ("a DEMO header") is a property of every screen, not a screen.
One row is right and worth repeating. Row 51 — the bookkeeper's Payroll-hours tab is off by default. It is the only tab in the entire app that ships off, and if the owner is shown the app without it being switched on, his own @8:14 question looks unanswered.
Nothing in the old list is invented. Every one of its 100 rows traces to something real. The problem is coverage and a handful of statuses, not honesty.
3d. The verdict
No — the 100-item inventory is not complete, and 100 is not the true number.
It is a good grouped summary of themes. It is not a page-by-page, action-by-action list of the app, and it is not every task from the video.
The true numbers are:
- 42 pages and 63 actions in the app — 105 distinct things you can open or do, not 100 things to "see".
- 135 tasks in the video, not 85.
The old list's "100" sits between the two and is neither. Use the numbers in Part 4 from here on.
PART 4 — THE COUNT
The app, read out of the code
- 42 pages — 39 login × tab, 1 sign-in screen, 2 that need no login.
- Split by login: Owner 15 · Bookkeeper 5 (one of them off by default) · Estimator 5 · Site lead 10 · Crew 4 · no login 2 · pre-login 1.
- 63 actions — 59 in the app, 4 on the text line.
- 105 distinct things you can open or do.
The video, read line by line
- 135 tasks.
- 22 the owner asked for himself · 25 he reacted well to · 4 he pushed back on · 84 Fieldflo showed and he said nothing, 3 of those being commercial facts rather than app tasks.
Where those 135 tasks stand today
| Count | |
|---|---|
| Built | 30 |
| Part built | 59 |
| Not built | 41 |
| Deliberately out (V82 branches, V127 five companies — both closed by Omar 2026-09-15) | 2 |
| Not app tasks (V123 price, V134 the VP, V135 a second demo) | 3 |
| Total | 135 |
How many of the video's tasks have a home in the app today
- Strip out the 3 that are not app tasks and the 2 Omar closed: 130 tasks are in scope.
- 89 of 130 (68%) land on at least one page or action in Part 1 — 30 fully, 59 partly.
- 41 have no home at all. They group into the 28 holes listed in Part 3a.
- The single worst of them is V4: Fieldflo's labourer never logs in, and our app answers that by giving him a login — the opposite of what was demoed.
What I could not verify
- I did not run the app. Everything in Part 1 is read out of the source. The last verified browser run was 2026-09-15 (
_build/verify_fieldops.cjs, 83 checks), which predates the 7-group rail and this reading. If Omar wants Part 1 proved on screen rather than in code, say so and I will run the verifier. portal/data.jsis one 621 KB line — I read the shape of a job throughroles.jsand the pages that consume it, not by reading the 621 KB. No job count, client name or dollar figure from it appears in this file.- The action counts split by login in Part 1B are counted by hand off the table, not by a tool. The 42 pages and 63 actions are exact; the per-login action split is ±2.
- "Deliberately out" for V82 and V127 comes from
profile/Screen_Inventory_2026-09-16.mdrow 19 recording Omar's decision of 2026-09-15, not from the video. If that decision has moved, those two rows move with it. - V123's $15,000 is Fieldflo's price from the transcript, in a currency the call never stated.
Everything in this file is demo data or a statement about demo data. Nothing in the app sends anything to anyone, and nothing was changed to write this file.