TIDEWATER — the company as one system

Everything you have built, in flow order · where the machine stops · the gaps that matter · the three ways forward. (state of record: 2026-09-18)
live now — running in production your systems — what executes it important gap — undeveloped, blocks or slows something decision — yours to call
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 — THI + Coastal pipelines, lead-only tasks
Lead status driftsFound accepted jobs still sitting in the Lead Pipeline (1701, 620). The API cannot move a task between lists, so the hand-off needs a manual drag or a guard that flags it.
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
→ decidefollow-ups, options, negotiation
Estimate view watcher — who opened, when
ClickUp estimate-field fill — every 30m, value/address into the lead
Estimate ↔ invoice weld — the invoice is the accepted estimate, word for word
Doc format guards — hourly, flags any doc that drifts off the format
The customer document's identity is splitEstimate pages still carry "Wave #1376" while the invoice numbering lives in Invoice Ninja. Same job, two identities — reconcile before the next customer asks.
02

ACCEPTED — the lane built 9/14→9/18 (the spine)

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" + View Invoice PDF
→ 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, own number, from the WO record
→ April's handoffsheet · matrix · bills · invoice + amounts → job-cost spreadsheet
clickup_accepted_route.py — the whole hand-off, no LLM
wo_build_watch.py / bill_watch.py — press → build → report in the thread
accepted_page_to_invoice.py / accepted_convert_est_page.py
Rules live in the channel — and only count once they are in the rules message
Mid-build: the packet lane is duplicated#production-packet holds the same job in a second thread and is meant to be absorbed into this lane. Pick the moment and merge it — otherwise every job has two homes.
ClickUp / sheet / invoice can still disagreeNo automatic cross-check that the sheet, the invoice and the accepted estimate carry the same money and wording.
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
→ 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
Permit / inspection skills — submissions, VA compliance, closeouts
MATERIALS — there is no system yetThe 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.
Crew days depend on WhatsApp exportsNo install calendar automation (the ClickUp calendar step is parked), so scheduling lives in threads.
04

Money in

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

payment landsPlastiq · check · cash · Zelle
→ verifycustomer email + bank + the invoice
→ recordagainst the invoice in Invoice Ninja
→ payment receiptR-<invoice>-<n>, same design, payments shown as lines
→ filehouse Drive folder · #invoice-payments lane
#invoice-payments lane — created 9/17 for this exact step
Wave → Invoice Ninja — one system of record; Joyce cancelling Wave
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.
05

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 costJOBS register → workbook → actual vs estimated
→ close on paymentweekly discount, commissions, overhead
Receipt pipeline — watchers every 5–30m, 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 — self-hosted, backed up nightly, health-watched
ERPNext is not the system of record yetIt runs and is watched, but invoices, production and job cost still live in the Google/Sheets world. The migration is the single biggest consolidation left.
Sub bills → accounting (Mely) is a manual handoffBills are built; getting them to accounting and matched to the payment is still a person.
06

People — who runs each lane

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

Ludyproduction: assign crews, days, money, install dates
Aprilhandoffs, follow-ups, estimates review, 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)
Kanban + dashboard portal
Obsidian vault + flow maps — the company's own map, kept current
April's work is spread across six surfacesHandoffs in job threads, follow-ups in her workspace, charts in a second lane, Word docs at 9pm. She has no single queue of "what I owe today".
Nothing trains a new personThe systems exist in skills (agent-side). No human-facing playbook per role yet, so every new VA learns from chat history.

THE GAPS THAT MATTER — in the order they cost you

  1. Materials (nothing exists). The guesstimate is written into the law; the tracking — order, receive, use, variance — does not exist. Ludy's side of production runs on receipts.
  2. ERPNext is half-migrated. Your intended system of record is running and empty of the real work. Until it lands, cost truth lives in a spreadsheet you have to tend.
  3. April has no single work queue. Every handoff is real but scattered; the packet lane duplicates the accepted lane.
  4. ClickUp cannot move a task between lists. Accepted jobs sit in the Lead Pipeline until a human drags them — the pipeline's own numbers lie.
  5. No cross-check between sheet · invoice · accepted estimate. Three surfaces, one money — nothing compares them automatically.
  6. Two-company reporting, once Coastal exists. The mechanism is verified (a company's own API token); the reporting has to read both.
  7. Document identity split (Wave #1376 vs Ninja numbers). Cosmetic today, a customer question tomorrow.
  8. No human-facing playbooks per role. Everything learned lives agent-side.

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.

What it unlocks: Ludy runs production end-to-end and the biggest cost leak (materials) becomes visible on every job. Ties directly into gap #1.

B · April integration

Finish the accepted lane and give April one queue: every handoff, follow-up, chart, doc and send in a single surface she works from — the packet lane folded in.

What it unlocks: the lane you have been building becomes the company's operating system; no parallel lanes, no manual chasing. Gaps #2, #3, #5.

C · Coastal, properly

Stand up 757 Coastal as its own company in Invoice Ninja (mechanism verified: the company's own API token decides where a document lands), with its own clients, designs and numbering.

What it unlocks: brand-correct documents end to end for the remodel side — today the customer's estimate says 757 Coastal and the invoice says Tidewater. Gaps #6, #7.

Built from your live systems: 44 scheduled jobs, the lane rules in the channels, the skills library, the ClickUp and Invoice Ninja state read live on 9/18/26.
Solid boxes = running today. Red = not built. Amber = your call. Nothing here is a plan I have started — it is the map for the next chat.