TIDEWATER — the company as one system

Everything you have built, in flow order · where the machine stops · the gaps that matter · the ways forward. (state of record: 2026-09-21 — updated from the 9/18 map)
live now — running in production your systems — what executes it important gap — still undeveloped built since 9/18 — new or closed decision — yours to call

SINCE 9/18 — the three days of work

  1. The lane grew its second half: BILLS → SCHEDULE → SEND → CONFIRM. The bills page April receives now carries the invoice button and, under the bills, a live scheduling panel — calendar and board read from ClickUp, with the install dates written back into ClickUp. Ludy schedules; April can, on delegation.
  2. The production packet fires itself. The moment a job's services carry scheduled dates, the House Production Sheet stands up and the packet card posts into the job's thread — April's handoff, no press, no chase.
  3. The money-and-format law is now guarded hourly — two guards: every Invoice Ninja document must stay in its family (estimate skin · change order · work order · invoice = its estimate's twin, word for word), and every crew/bill PDF must obey the money law on the pinned shell.
  4. ClickUp now writes into ERPNext nightly. Both Lead Pipelines mirror into the ERP's own lead fields — status, inspection date, estimated job value, total job cost — matched by task link, anomalies reported, never guessed.
  5. The legend decides what a service is. Cabinets ≠ countertops · drywall rough ≠ finish · J-channel → Windows. A line item is never a service, and the pages now split by the legend.
  6. Housekeeping that used to be a person: every web-estimate page self-deletes at the end of its one-week validity; Invoice Ninja is backed up nightly; the channel-isolation registry syncs daily.
  7. A new fork opened today: build the system of record as a program (Tidewater Ops.app, running on the Mac) instead of ERPNext. See stage 07 and the last card.
00

Lead comes in

Every job in the company starts here — and everything downstream is measured from it.

Ads / organic / Google / referrals / callsFacebook & IG, website, Nextdoor, Jeff's network, Dialpad
→ ClickUp Lead Pipelinelead task created, source recorded, sales rep assigned
→ inspection bookedsite visit, photos, scope notes
→ estimate builtweb estimate page + quote
→ follow-up / negotiationWON = accepted, the handshake point
Lead attribution — source captured per lead; paid channels only counted
Meta ads digest — Fridays 3pm · Weekly KPI digest — Mondays 8am
Dialpad — call logs, SMS to subs from the office line
ClickUp → ERPNext lead sync — 5:30am nightly, both pipelines: status, inspection date, estimated value, total job cost into the ERP lead
Lead status driftsAccepted jobs still sit in the Lead Pipeline until a human drags them (1701, 620). The mirror now reports the mismatches instead of hiding them — the drag itself is still a person.
01

Estimate (sales lane)

Scope first, money second — never priced before you say so.

scope intakezero prices, come back with the list
→ price itcurrent web rates, all-in
→ web estimate pagetidewater-est-<job>.pages.dev — what the customer opens
→ quote (Invoice Ninja)Wave-twin design, one send
→ every estimate carries the repname · email · phone, on the page and in the PDF
→ decidefollow-ups, options, negotiation
Estimate view watcher — who opened, when
ClickUp estimate-field fill — every 30m, value/address into the lead
Estimate page expiry — each page deletes itself at the end of its one-week validity
Standing estimate rules — rep block on every document · "engineering/inspection fees" never on a customer surface
Ninja doc guard — hourly: the estimate stays on its approved skin, the invoice stays its twin
The customer document's identity is splitEstimate pages still carry old "Wave #…" numbers while the invoice numbering lives in Invoice Ninja. Same job, two identities — the guard now catches family drift but the numbering is still split.
02

ACCEPTED — the spine (9/14 → 9/19)

One thread per job. Nobody hand-posts anything: the press on the sheet makes every document.

ClickUp → WONwebhook → tunnel → route
→ #accepted-jobs threadcard: client · address · value · ClickUp · sheet · install date
→ invoiceInvoice Ninja, twin of the accepted estimate, DRAFT
→ page converts"Accepted Scope of Work — Invoice N"
→ Ludy assigns on the Production Sheetcrew · days · $$ · note — his password, his calls
→ Build the work ordersWO matrix + one page per crew, price-free
→ Create the billsone per work order, its own number, priced off the WO record
→ the invoice buttonon the bills page: Invoice #n · $amount → the job's own invoice PDF
clickup_accepted_route.py — the whole hand-off, no LLM
wo_build_watch.py / bill_watch.py — press → build → report in the thread
Bills page gated 9/19 — the crew password covers the page, the bills and the invoice copy
Production doc guard — hourly: crew WOs carry no money, change orders do, bills do, and the shell must be the pinned one
✅ Closed since 9/18 — the cross-checkThe sheet, the invoice and the accepted estimate are no longer compared by eye: the guards now enforce invoice = twin of the estimate word-for-word, and the bills are built from the WO record.
Mid-build: the packet lane is still a second home#production-packet holds the same job in a second thread. It is now fired by the scheduler instead of a press, which makes it useful — but it still has to be folded into the thread before every job has one home.
03

Production & the field

Work happens; the record of it is what feeds cost, billing and the next estimate.

crews assignedLudy on the sheet — the trigger for everything here
→ work orders outSMS from the office line, April confirms receipt
→ days workedWhatsApp "Dirección de trabajo" day reports
→ materials boughtLowe's, supply houses, receipts to the pipeline
→ prerequisites before a crew startsdrafted per trade: April gathers, Ludy approves, you approve money/scope
→ change work orderscustomer-facing, priced, when scope moves
→ inspections & permitscity permits, VA visits, HVAC A2L labels, tax abatement
Crew pages — one per crew, time allowance only, never prices
Contractor contacts — the phone book the WOs are sent from
WhatsApp ops monitor — day reports captured
file-transcript — a forwarded walkthrough/progress/customer transcript is identified by house, filed to the Drive folder and logged
Permit / inspection skills — submissions, VA compliance, closeouts
MATERIALS — there is still no systemThe materials guesstimate is law in the packet, but nothing tracks a job's material list through ordering → delivery → what actually got used → variance. Ludy buys, and the record is receipts after the fact. This is still the #1 leak.
Prerequisites are drafted, not tickedAll 21 trades have their pre-start list with an owner (April / Ludy / you) — but nothing ticks it yet: waiting on where April ticks them.
04

SCHEDULE — the second half of the lane (built 9/20 → 9/21)

The bills page April receives. Under the bills: the project, its services, the calendar and the board — all ClickUp, live.

the page April receivesband · invoice button · one row per bill + its PDF
→ the whole projectone ClickUp task: its phase and its project window
→ one sub service per servicea trade is a sub service, never the project itself
→ the legend attaches the line itemscabinets ≠ countertops · drywall rough ≠ finish · J-channel → Windows
→ Ludy sets the datesApril can, on delegation
→ save writes DATES ONLYnever a status, never the project's
→ calendar + boardread live from ClickUp — the two Active Projects boards
schedule.js on every job page — reads ClickUp, writes the install date back; live on 105 E 37th · 118 Timberneck · 1701 Mallory
install_bills_calendar.py — installs the panel, the API and the secret, then verifies the live page
Packet trigger — every 15m: a service with dates → the sheet stands up + the packet card posts (fired on 1701, 9/20)
The flags the panel carries — needs scheduling · needs a slot · outside the window · grouped by crew
✅ Closed since 9/18 — the install calendarThe ClickUp calendar step that was parked is now the panel itself: the calendar and the two Active Projects boards read live from ClickUp, the dates write back from this page, and the project window is per job.
Nothing moves the ClickUp task's own statusThe move to job prep / pre job is written but unarmed on every job — the signal April is meant to act on is still manual.
Confirm is still a person"We schedule it, we send it, the customer confirms" — the confirmation lives in a thread; nothing records it against the job's dates.
05

Send · money in

A project is not done when the work is done — it is done when the invoice is paid.

sendinvoice → customer · WO links → subs · bills → accounting
→ customer confirms the datesthe crew days stand on the ClickUp calendar
→ payment landsPlastiq · check · cash · Zelle
→ verifycustomer email + bank + the invoice
→ recordagainst the invoice in Invoice Ninja
→ payment receiptR-<invoice>-<n>, same design, payments as lines
→ filehouse Drive folder · #invoice-payments lane
#invoice-payments lane — verify → record → receipt → file
Wave → Invoice Ninja — one system of record; Joyce cancelling Wave
Invoice Ninja backup — nightly watchdog, alerts only on failure
Bank / check tools — check images pulled to match ledger rows
Payments do not allocate themselvesA payment is recorded on the invoice, but spreading it across the job's cost lines is still a manual reconciliation.
06

Costing, accounting & close

Every penny allocated per house — that is the standard the costing lane is judged by.

receipts arriveWhatsApp / email / the store
→ transcribedlocal vision pipeline, store · card · total · address
→ filed to Drivehouse folder, by address
→ EXPENSES ledgermatched rows, gaps flagged, balance to zero
→ per-house project costestimated side now fed by the lane's own WO / bill / invoice
→ close on paymentweekly discount, commissions, overhead
Receipt pipeline — watchers every 5–60m, 5pm missing-receipt check
Job costing workbooks — per-house, JOBS 2026 register
Commissions — Jeff 15% / Jorge 10% as their own bill
Overhead & debt register, WC audit
ERPNext, moved forward — it prints the customer estimate now (ClickUp/Wave design is the desk default), carries THI's terms, sends as Tidewater, and its desk holds only the 8 real estimates: the 249 stale ones were deleted 9/18
ERPNext is still not the system of recordInvoices, production and job cost live in the Google/Sheets world. Leads now mirror into the ERP nightly — that is the first real flow of work into it.
Sub bills → accounting (Mely) is a manual handoffBills are built; getting them to accounting and matched to the payment is still a person.
07

The fork you opened today — the system of record

Two futures for the same job: the ERP you already run, or a program built for your flow.

today: ERPNextWeb UI · quote → invoice → accounting · needs the migration finished
today: the Sheets worldproduction, job cost, EXPENSES — where the real work actually lives
9/21: Tidewater Ops.appa local program on the Mac: its own DB, built around this flow, not around an ERP
→ the questionwhich one carries the job record — and what gets migrated first
~/thi_ops — Tidewater Ops.app: app/desktop.py + server.py, a real DB built from your data (9/21)
ERPNext — self-hosted, backed up nightly, health-watched, leads mirroring in
Your callProgram or ERP as the record — and if the program: which stage it takes first (production? job cost? quoting?). Everything downstream changes shape with this answer.
Two systems with the same job in themUntil this is called, every job risks living in both the ERP and the program — and neither becomes the truth. This is the one decision that makes the others cheaper.
08

People — who runs each lane

The systems exist to give each person one place to work. Today that is only partly true.

Ludyproduction: crews, days, money, and now the install dates
Aprilthe bills page, the packet, follow-ups, contractor follow-ups
Joycereceipts, ledger, Wave wind-down
WelroseERPNext build-out
Faithchat window
youpricing, approvals, decisions
Lanes per person — #ludy · #april-workspace · receipts · #welrose
VA daily documents — 9pm Word docs (tracker, receipts, verification)
The chain is written down — the vault now carries [[Accepted Job to Production]], [[Accepted Job Part 2]], [[Bills to Schedule]], [[Service Legend]] and the job→invoice flow
1701 Mallory is the teaching job — reset 9/21 so Ludy can walk the whole system himself
April's work is still spread across surfacesThe lane now hands her the sheet, the bill links and the invoice without a chase — but there is still no single queue of "what I owe today".
Still no role playbook for a new personThe flows are written for the company; a per-role page (what April opens, what Ludy approves) does not exist yet.

THE GAPS THAT MATTER — re-ranked 9/21, in the order they cost you

  1. Materials (nothing exists). Still untouched. The guesstimate is written into the law; order → receive → use → variance is untracked, and Ludy's side of production runs on receipts.
  2. The system of record is undecided. ERPNext or the program — until it is called, the job lives in two places and neither is the truth. (New today.)
  3. ERPNext is half-migrated. It prints and sends correctly now, and leads mirror in nightly — but invoices, production and job cost are still in the Sheets world.
  4. April has no single work queue. The handoffs are automatic now; the queue is not. The packet lane still exists as a second home.
  5. Prerequisites are drafted but not ticked — 21 trades, three owners, nothing executes it yet.
  6. The ClickUp status move is unarmed. After the bills, the job should move to job prep / pre job — the code exists, no job is armed, so April's signal is manual.
  7. ClickUp cannot move a task between lists. Accepted jobs still sit in the Lead Pipeline until a human drags them; the mirror reports it, nothing fixes it.
  8. ✅ Closed since 9/18 — no cross-check between sheet · invoice · accepted estimate. Two hourly guards now weld them: invoice = twin of the estimate, word for word, and the money law on every crew/ bill PDF.
  9. ✅ Closed since 9/18 — no install calendar. The calendar and the board read live from ClickUp and the install dates write back from the bills page; the project window is per job.

A · Materials for Ludy

Build the material system: the accepted scope generates a real material list per job, tracked from order → delivery → used, with variance against estimate.

Untouched since 9/18 and still #1. Unlocks: Ludy runs production end-to-end and the biggest cost leak becomes visible on every job.

B · April integration — in motion

The lane now runs its whole second half: bills page, schedule, send, confirm. She receives the documents without a chase and the packet fires itself.

Done: the spine past the bills. Left: one queue for her day, and folding the packet lane in.

C · Coastal, properly

757 Coastal as its own company in Invoice Ninja — own clients, designs and numbering. The mechanism is verified; nothing has been stood up yet.

Untouched since 9/18. Unlocks: brand-correct documents end to end for the remodel side.

D · The system of record

Decide the program (Tidewater Ops.app) or ERPNext, and what it takes over first. Then the Sheets world drains into it, stage by stage.

New 9/21, and it is the decision that makes the rest cheaper — every other build lands somewhere once this is called.

Built from your live systems on 9/21/26: 48 scheduled jobs, the vault's own flow notes (Bills to Schedule · Job to Invoice · Service Legend), the lane rules in the channels, and the job pages, ClickUp, Invoice Ninja and ERPNext state read directly.
Solid boxes = running today. Green = built since the 9/18 map. Red = still not built. Amber = your call. Nothing here is a plan I have started — it is the map for the next build.