Ops Manager Cheat Sheet — the six areas you own
For whoever runs sales ops, delivery ops and general ops at St. Pierre. Six areas - pages, content, conversations, lead transfers, post-transfer outcomes, the issue tracker - each with its surfaces, how Akash has done it so far, what is automated, the problems seen, what already exists, and the questions only Akash can answer.
1 Read this first
You own six areas. Akash sells. Everything in these six is yours to run, prove, and fix.
| # | Area | One line | Your main surface |
|---|---|---|---|
| 1 | Pages | One Facebook page per state, named "[ST] Foundation Repair & Waterproofing", carrying every market in that state. | Page fleet table (section 3) |
| 2 | Content | One organic post per day across the state pages, about seven videos a week, plus a new foundation repair ad pack every week. Volume first. | B2C Scoreboard, Creatives |
| 3 | Conversations | "Comment to get a quick quote" on every post, comment-to-message, then the bot to name plus verified phone. Follow-ups, response time, scripts, errors. | B2C Board |
| 4 | Lead transfers | Name plus verified phone means transfer now. Right data, right format, landed on the client's board. | Lead ledger |
| 5 | Post-transfer | Quotes and jobs from the leads we sent. Coach clients on who to chase. Own the follow-up when the client cannot reach a lead. | Client lane |
| 6 | Issue tracker | Every problem from areas 1 to 5 logged once. Anything seen twice becomes a systemic fix and sets priority. | Bugs board |
Words you will see here, one line each
| Word | Means |
|---|---|
| The brain | Our database. Every lead, message, client, change and number lives there. Claude reads it for you. |
| The vault | The part of the brain that holds every password and API key. You never copy a key into a file. |
| The ledger | The log of every change anyone made to a live system: what, why, and how to undo it. |
| A rail | One path a message travels, for example a text from the bot to a homeowner. |
| The send guard | The check every automated message passes before it goes out. It says yes or no, and writes down why. |
| Camp | Whose turn it is on a lead: ours, or the client's. |
| GoHighLevel (GHL) | The messaging system. Homeowner chats, texts and the bot live there. |
| DripJobs | The clients' own job boards. A lead is only "with the client" when it is a card there. |
| The board, the ledger view, the client lane | Three views of the same lead data: by state, as a list, and by what each client owes. |
| The reconciler | A nightly check that asks the database 35 questions and flags anything that repeats. |
| The bugs board | The problems list, one card per thing that keeps breaking. |
| A job or cron | A task that runs on a schedule by itself, inside the database or on Akash's Mac. |
Five things always stay with Akash: money, messages sent as him, public-facing changes, account access, deleting data. Everything else is reversible. Do it, log it, report it.
Day-one access to ask Akash for
- The Sales Center key and the B2C board key. Each page asks once, then the browser remembers it.
- The passcode for the rooms site (CX, finance, scorecard, sales room, the conversation simulator).
- A Supabase login for the database tables named in this doc.
- Meta Business Manager access (portfolio 156978546776442) and GoHighLevel access (one shared location holds every client).
- Drive access to "Proven B2C Ads by Niche".
How to read the rest. Each area has the same parts: the surfaces, how Akash has done it so far, what is automated versus manual, the problems seen (recurring ones marked ★), what already exists, and open questions only Akash can settle.
2 Your daily loop
By 9:15
- 1Command Home (link). The six weekly numbers and the rails band. Anything red gets an issue row today.
- 2Nightly reconciler (rooms.stpierre.ai/nightly-reconciler, passcode). Sort by nights running. A finding that repeats is the signal.
- 3Lead ledger (link). Every lead from yesterday with a name and a verified phone is with its client. Prove it on the client's board, not on our label.
- 4B2C Board (link). "Needs reply" empty. Nothing in "Unreachable" with a phone number.
- 5Client lane (link). Any card older than 48 hours with no client action goes on today's client message.
By 3:00 pm
- Turn the nightly coaching drafts, the queued 24-hour card nudges, and the waiting-on-client alerts into one message per client. Hand them to Akash to send between 3 and 4. He owns the relationship. See area 5 for the open question on whether you may send them yourself.
At shutdown
- Log every clunk of the day in the issue register (area 6). A pattern logged three times in seven days becomes a build task automatically, but only if it gets logged.
3 Area 1 · Pages: one Facebook page per state
What good looks like. Every viable state has a page on the naming standard, with our two service accounts attached, its own tracking dataset proven by a test event, the Lead Ads terms accepted, the page connected inside GoHighLevel, and the four database rows that route its leads written. A page missing any one of those runs ads and delivers leads to nobody, with no error.
Surfaces
| Surface | What it is | When |
|---|---|---|
sp_page_rollout_plan (database) | The 57-market plan: which state page carries which metro, wave order, page status. Still carries old concrete-leveling names. | "What page next?" |
sp_capi_page_datasets, clients, sp_market_zip_map, sp_client_delivery_destinations, meta_campaign_client_map | The truth tables. Page id to dataset id; one client row per market; ZIP routing; where leads go; campaign to client. | Before staging any ad on a page |
Meta Business Manager → Pages, Events Manager → Messaging datasets, facebook.com/ads/leadgen/tos?page_id=… | Where pages are created, claimed, datasets made, and Lead Ads terms accepted. Browser only. | Spin-up |
| GoHighLevel → Settings → Integrations → Facebook | Two separate connections: the Lead Ads sync and the Messenger conversations connection. Akash's login. | Spin-up step 8 |
01-Projects/StPierre-GTM/fr-transition-2026-08-26/state-fleet/check_page_readiness.py | Read-only sweep: live name, terms status, token visibility for every page. Run first, every time. | Any page question |
…/state-fleet/standup_state.py --state XX --page-id … --dataset-id … --pairing-proof CODE --apply | Writes the four routing rows and arms the text rail for a new state. Refuses without a dataset test-event proof. | After page and dataset exist |
01-Projects/St_Pierre_Digital/lead-transfer-automation/fb-page-router/src/index.js | The page router worker. Page id to market tag; campaign id to tag for state pages. A page missing here gets the default bot. | Before any Messenger campaign |
Skill new-launch-qa and attribution/b2c_launch_control.py | The fail-closed launch gate. The only activation path. | Every launch |
The fleet today (live readback 7 Sep)
| Status | States | Notes |
|---|---|---|
| Page exists, on the new name | CO, IL, MI, MO, NC, NJ, OK (kept "OKC"), TN, TX, VA, PA, OH | TX carries Dallas, Houston, Austin, San Antonio. PA is Arbuckle's page and the state page. |
| Page exists, rename never landed | IN | Still "IN Concrete Leveling & Repair". Submitted 26 Aug. Re-submit or check Meta review. |
| Page exists but half-born | OH | Renamed 26 Aug. No client row, no ZIP rows, no destination, dataset row still labelled PA, router tags it PA. A lead here vanishes. |
| Held Texas city pages | ATX, HTX, SATX | Not renamed, not deleted, no client row. Fold into TX. |
| To create, in build order | GA, FL, MA, AL, WI, LA, CA, WA | Meta caps creation at about two a day. Only Akash can create. Blocked since 26 Aug. |
| Viable later | KS, NY, SC, NE, OR, UT, MD, KY, AZ, DC, CT, RI | Under the market-size bar or under ten contractors. |
| Client pages, never touch | DFW Concrete Leveling (Level King), DFW Foundation Repair (AlphaLift), MN Concrete Leveling (Able) | The client's owner decides. |
All 15 fleet pages have Lead Ads terms accepted today. None has an Instagram account.
How Akash has done it (the spin-up, in the order it happens)
- 1Decide the page and the name. One page per state. "[ST] Foundation Repair & Waterproofing". Akash, 11 Aug: "our entire strategy has been transitioned over to creating state scoped pages and having multiple markets in each state." Never a second PA page; never Dallas ZIPs on the TX page.
- 2Create the page inside Business Manager (Akash, browser, about two a day). Creating outside and claiming later changes the page id and stranded Texas for four days. Never run two creations in parallel.
- 3Assign both system users to the page: the messaging user and the Conversions API user. Scripted after Akash's go.
- 4Dress the page: badge, cover, first post, bio. Scripted (
apply_branding.py). Pages created 20 to 22 Aug ran ads as grey silhouettes for a week. - 5Create the page-scoped Messaging dataset in Events Manager, share it to the spending ad account, assign the Conversions API user, then prove the pairing with a test event that returns "received". The API route makes ordinary pixels that do not attach; five had to be recreated on 22 Aug.
- 6Accept Lead Ads terms on this page (Akash, one click). The 20 Aug fleet-wide click did not cover pages created two days later.
- 7Subscribe the page to the lead-form webhook (scripted, append-only). Fifteen of seventeen pages could not receive a form until this was done on 24 Aug.
- 8Connect the page inside GoHighLevel (Akash, OAuth). Both the Lead Ads sync and the Messenger connection. Seven markets ran ads on unconnected pages and produced zero leads on $134. Akash, 23 Aug: "pls always remind me to do that going forward before launching new markets." Say it in every launch ask. Prove it with a real contact from that page.
- 9Write the four routing rows with
standup_state.py --apply. Verify withsp_resolve_market_from_zip('<real zip>','FR'). - 10Register the page in the router worker and deploy. Then build campaigns paused and launch through the gate with Akash's exact words. Set the rollout plan row to live when spend starts.
Renaming a page is browser only (API rename is refused). Meta may queue a review and locks the name for 60 days.
Automated vs manual. Only Akash can create, claim, rename, accept terms, make the tracking dataset, and connect the page in GoHighLevel. Everything after a page id plus a dataset id is scripted. No scheduled job watches pages; run the readiness sweep yourself.
Problems seen (★ recurring)
| Problem | When | Rule that came out |
|---|---|---|
| ★ Page runs ads, zero leads, no error | 13 to 23 Aug, 7 markets | Page not connected in GHL. Reminder in every launch ask; prove with a real contact. |
| ★ Lead forms rejected | 20 to 23 Aug | Lead Ads terms are per page. Check every page in a wave. |
| ★ Form submits vanished | Found 24 Aug, 15 of 17 pages | Page not subscribed to the lead-form webhook. Subscribe at spin-up. |
| ★ Leads written correctly, delivered to nobody | 15 Aug, 22 Aug (TN, VA), OH today | All four routing rows or leads vanish. |
| ★ Wrong bot answers; lead with no market tag | 8 to 15 Aug | Page missing from the router. Add the line the day the page connects. |
| Datasets made by API were plain pixels | 15 Aug, found 22 Aug | Business Manager Messaging path only. Pittsburgh's is still a pixel. |
| Creation cap hit, parallel agents burned it | 27 Jul, 12 Aug, 26 Aug | Serial creation, never retry the same day. |
What already exists
STATE-FLEET-PLAN.mdandSOW-PAGE-RENAMES-AND-STATE-FLEET.md(26 Aug) in01-Projects/StPierre-GTM/fr-transition-2026-08-26/. The current plan.- The 38-check B2C Ad Launch Checklist,
01-Projects/StPierre-GTM/b2c-launch-checklist/index.html(24 Aug, local). - Machine Operating Guide, Machine 4 "Client onboarding and market launch" (
02-Areas/Team/machine-operating-guide-2026-09-03.html). - The page factory runbook from July (
01-Projects/StPierre-GTM/page-factory/RUNBOOK.md). Mint queue retired; dressing scripts still useful. - Memory notes: state-scoped pages, page-scoped datasets, all four rows, connect pages before launching, terms are per page, no Instagram.
Open questions for Akash
- Indiana's rename never landed. Re-submit, or is Meta reviewing it?
- Ohio is half-born. Run the stand-up script now, or wait for a buyer?
- Who creates the eight remaining pages and when? Now, or on the first signed buyer per state?
- Naming: two-letter code ("TX …") or full state name ("Texas …")? Live pages use the code.
legal.stpierre.aireturns an error today. Every Meta lead form points at it for the privacy policy. Meta may reject new forms until it is back.
4 Area 2 · Content: one post a day, one pack a week
What good looks like. Seven finished videos a week going out organically to the live state pages, tweaked per niche and state, plus one new foundation repair ad pack a week staged paused for Akash's approval. Every piece has three parts: audio (Eric voiceover), video (b-roll or AI), and text captions (red karaoke cards). The scoreboard says what won; the pack is the bet for next week.
Where it stands today. All B2C ads have been off since 2 Sep on Akash's instruction. Nothing organic has ever been posted to a homeowner page. The only publishing engine ever built posted one B2B carousel in July and has been parked since 2 Aug. The 3 Sep operating guide parked content; the one-post-a-day plan un-parks it.
Surfaces
| Surface | What it is | When |
|---|---|---|
| B2C Scoreboard, Creatives | Video wall plus one row per creative: niche, markets, spend, held viewers, conversations, leads, qualified, cost per qualified. Rebuilt nightly at 6:45. Pivot on the creative slug in the ad name, never the Meta video id. | Every morning. Before cloning, re-voicing or cutting anything. |
01-Projects/StPierre-GTM/ready-to-deploy/<date>--<slug>/ | Every finished pack. Open contact-sheet.html (approval), manifest.csv (truth), captioned/ (what ships). Sixteen packs exist, 28 Jul to 26 Aug. | "What did we build, what shipped" |
01-Projects/StPierre-GTM/ready-for-tos/<niche>/ | De-branded, approved b-roll per niche: BW 25, CF 8, CL 16, CS 39, FR 28 files. | Starting a pack |
03-Resources/generic-broll-library/library-index.csv | Register of cleaned clips with rights and OCR-clean proof. Videos cold-archived to Drive; restore script in the broll skill. | "Is this clip approved?" |
| Drive "Proven B2C Ads by Niche/<niche>/" | Finished winners at full size: BW 8, CF 20, CL 7, CS 19, FR 11. | Re-voice a winner before building new |
01-Projects/StPierre-GTM/voice-analysis/ | The tools: tempo and pause gate, caption cards, karaoke burner. | Every voiced ad |
01-Projects/StPierre-GTM/tos-copy-bank/ | Approved banner lines per niche and which clip each goes on. | Choosing a banner |
03-Resources/Ad-Library/ | 2,975 competitor ads. Hooks only, never footage. | Hunting hooks |
Skills, say the trigger phrase: b2c-creative-production ("build the FR pack"), broll-tos-pipeline ("stage crawl space for tos"), higgsfield-generate, meta-creative-preflight, new-launch-qa | The how-to scripts Claude follows. | Building |
Scheduled/sp-organic-publisher/ and tables sp_organic_queue, sp_organic_config | The dormant July engine. Posts images and carousels to the B2B page by Graph API. No video, no per-page routing. | Reference for the cadence guard only |
The weekly cycle
- 1Monday, read. Creatives tab, Last 7 days and All time. Rank by cost per qualified lead. Note the hook and the on-screen surface of the top three.
- 2Tuesday to Wednesday, build. Video pack: staged b-roll, Eric voiceover with the mandatory treatment (1.06x tempo, pauses cut to 0.08 s, one 0.45 s beat before "Send us a message"), red karaoke captions burned from the script, clips looped or slowed to the read, a silent control. Image pack: 20 hooks in 2 formats, 3 captions (Full 700 to 950 characters, Punch, Alt open) and 2 headlines each, inside one ad set.
- 3Thursday, stage. Contact sheet from the manifest. Ads created paused as a new "Pack N" ad set, a duplicate of Pack 1 with the videos swapped. Sheet to Akash.
- 4Friday, launch. After Akash's exact approval words, the launch QA, then activate. Nothing gets turned off when a new pack lands.
- 5Every day, post. One finished pack video to each live state page. See the organic note below.
How Akash has done the paid side (dated)
- 28 Jul. Footage harvested and cleaned. Rule: trim to a text-free window; tool branding fine, contractor branding disqualifies. Akash cut every clip where AI generated the motion.
- 12 Aug. The winning script reverse-engineered from audio: who we are, "We lift settled {surfaces}" with the on-screen surface first, "without the cost or mess of replacement", "Send us a message". About 41 words. Rule: voiceover first, then retime the footage. Never trim the read to fit a clip.
- 13 Aug. Eric picked by ear. Raw TTS never ships. Captions: "white font on red background as our caption standard". Descript tried and dropped the same morning; the local karaoke burner became the production path. Both niches launched from the approved 21-ad sheet.
- 16 Aug. "Never stretch the voice to fit captions, retime the picture to the read." Sync verified by re-transcribing.
- 25 Aug. Four data-backed winners re-voiced with three audio scripts and cloned to 17 markets, 12 paused ads per market.
- 26 Aug. FR AI b-roll: Higgsfield stills to Seedance clips, matched before/after pairs from our own stills. Eighteen ads passed QA and still wait on Akash. 399.5 Higgsfield credits left on 3 Sep.
- 27 Aug. Watch-depth metrics had read zero all August because Meta silently dropped a field. Fixed; hook rate and held viewers now populate.
- 2 Sep. "Turn all ads off."
Standards that are not up for debate
- One campaign per market, budget at the campaign level, ad sets are clones. Never fewer creatives: if per-ad budget looks thin, raise budget or extend the window.
- Ad accounts are per niche. One for concrete leveling, one for foundation repair, one for B2B. List the accounts with the token before every launch. Two near-misses already.
- Light backgrounds only. No adjectives or adverbs in copy. "Sales rep", never "estimator". "Or you don't pay" stays. Never the old two-word business name, never a ninety-day window in copy.
- Real footage first. AI motion needs the blind audit. Matched pairs come from our own stills.
Organic posting: what to build. Options were (a) revive the July B2B publisher and bolt on video, (b) post one finished pack video per day to each live state page by Graph API, reusing the paid pipeline, (c) post by hand in Business Suite. Pick (b). Every piece exists on the paid side. The July engine was built for B2B carousels with a retired offer. Manual posting will not survive seven pages times seven days. Reuse only the cadence guard (one a day, 20-hour spacing, 9 am to 7 pm) and the per-post ledger row with rollback.
Problems seen (★ recurring)
| Problem | When | Rule |
|---|---|---|
| ★ Dark renders | 4 Aug, 16 Aug, again | Light only. Audit by rendering, not by reading CSS. |
| ★ Wrong ad account | 13 Aug, 26 Aug | Account gate at step zero of every launch. |
| ★ Poster and Ad Library links expire | Every scrape | Capture at scrape time; fetch live and cache. |
| Untreated TTS shipped as a draft | 12 Aug | Treatment plus the tempo gate. |
| Caption words wrong from Whisper ("live" for "lift") | 13 Aug | Words from the script, Whisper only for timing. |
| One-frame double caption on every video | 13 Aug | Fixed at source; 12 live videos swapped. |
| AI motion rejected | 28 Jul | Real footage first. |
| Meta processing errors on 16 loop ads | 22 Aug | Never traced. Open. |
| Organic queue parked | 2 Aug | Every caption carried a retired offer line. Nothing since. |
What already exists
- Skills
b2c-creative-productionandbroll-tos-pipelinewith their gotcha logs. Current. - Sixteen packs with contact sheets and READMEs in
ready-to-deploy/. The record. AD-PACK-STANDARD.md,CAPTION-STANDARD,FOLD-STANDARDin01-Projects/StPierre-GTM/r5-cl-wave-2026-08-04/.- The Groundworks decode,
fr-broll-expansion-2026-08-26/groundworks-review.md: the biggest foundation repair advertiser's playbook. - Ad Creative Formats Ranked (17 Aug).
- The old Content OS at team.stpierre.ai/content-os is marked superseded. Every
eyefly-sp-*content doc is a dead link.
Open questions for Akash
- Which pages get organic first: the live state pages only, or all of them?
- Does the organic post use the Eric plus red-caption ad format, or the "no text, symptom first" style?
- Higgsfield: monthly credit budget, and does the "AI motion is cut" rule still hold now that matched pairs passed blind QA? The 18-ad FR matrix still waits on you.
- Ads are off. Is the weekly FR pack built for a relight date, and which buyer-backed market gets it?
- Which token posts to the pages? Only VA and TN are verified with full Page tasks. Nobody has tested a video post.
5 Area 3 · Conversations: comment to quote, then name and phone
What good looks like. Every organic post carries "comment to get a quick quote". A comment gets a DM within minutes: "what kind of project can we help with?" The bot captures name and verified phone. Stalls get a nudge in 5 to 30 minutes. Every automated send passes the send guard. "Needs reply" is empty by 9:15. Nothing texts a complete or transferred lead.
The flow today, end to end. Ad or post → the button under the ad asks for the phone ("We can help. Send me your best phone number so I can text you.", one line on all 514 ads) → the GoHighLevel bot "Jordan" captures the phone → texting takes over (iMessage first, normal SMS as backup) → stall nudges at 5 and 30 minutes → phone re-asks at 2 and 20 hours → transfer after name plus verified phone, or after 10 quiet minutes with a phone → every chase stops once the lead is complete.
Surfaces
| Surface | What it is | When |
|---|---|---|
| B2C Board | Every homeowner conversation by state. Pipeline / List toggle. Client and Niche filters. Outcomes, notes, archive. | 9:00 sweep |
| Conversation simulator (passcode) | 25 real conversation patterns with a defended default answer and a box to type what you would say. Built 2 to 3 Sep after Akash: "the B2C bots and the B2B bots are not following the script." Holds real homeowner data; never share outside. | Before touching any script. Akash's answers were never pasted back; that is the open loop. |
| GoHighLevel inbox and Workflow → Execution logs | Live threads, tags, bot toggle. The execution log is the only place that says what a workflow actually did. | "Why didn't the bot reply?" |
| Meta Business Suite page inbox | The only way to reply to a Messenger lead after 24 hours (7-day window). | Recovering a stale Messenger lead |
Tables: sp_send_guard_log, sp_lead_followups, sp_followup_config, sp_followup_suppression, sp_message_templates | Why a text did or did not go, the queue, the templates (169 rows), the manual do-not-chase list. | Guard log first, always |
01-Projects/CommandCenter/watchdog/ | The monitors: unanswered pager, lead monitor, handoff watchdog, MyCRMSIM watchdog, mirror freshness, reconciler, closer loop (shadow), nightly fixer (staged). Logs in logs/. | When a Telegram page fires |
01-Projects/StPierre-GTM/context/voice.md | Copy rules for every bot and text. | Before writing a line |
Skills ghl-conversation-ai, ghl-workflow-builder | Bot edits and workflow builds without the browser. The GHL workflow UI is not automatable. | Bot or workflow work |
01-Projects/St_Pierre_Digital/Funnel-and-Offer/sales-crm/ | The sales-crm worker: comment-to-message automation, the staged scripted Messenger sender. | Comment automation and the sender |
Comment-to-message: what exists. Already built and deployed in the sales-crm worker (July): a comment is classified, suppress-checked, gets a private DM, then a public "check your DMs" once the DM lands, with retry and a coverage check that every page still has the feed webhook. Enabled for one client only (Level King, DFW page). Ran live twice. Level King's stored script is already almost the new copy: "Hey [first name], I saw your comment. What kind of concrete repair project can we help with?" Akash ruled: "leave comment to messenger on if its not broken" and "do not route this back through the retired GHL comment workflows." The worker sends the DM; Jordan owns the conversation after that.
To make it fleet-wide: add each state page's token to the worker, subscribe each page to the feed webhook, flip the client flag and copy the script row per client, and rule on the suppressor that today blocks anyone who posts a phone number in the comment.
Response-time SLA and how to check it. B2B: median under one hour, unanswered replies keep ageing. B2C has no number yet. In practice: the pager pages at 30 minutes and escalates at 120; the handoff watchdog wants a transfer inside 60 minutes; the guide's pass line is a median first reply under 60 seconds. Today two monitors disagree (pager says 0 to page, lead monitor says 39 orphaned). Reconcile before trusting either.
Order of diagnosis when a text did not go. (1) The send-guard log for the lead. (2) GHL Workflow execution log; a webhook step "Executed" only means sent. (3) The live contact record. (4) Only then a theory. Never propose a timing change without a measurement.
Rules the system already enforces. Name plus verified phone transfers; chase texts to complete leads are refused at send time. One text script for everyone, slot-filled. Never the same link twice in 48 hours. One message per turn, 30 to 120 second jitter. Quiet hours 9:00 to 19:30 in the lead's time zone, two sends a day max. STOP is mechanical. Geography never disqualifies; non-English does. Testing on Akash's own number fakes a loop; use the fixture contact (id 88).
Automated vs manual. Automated: quick-reply phone ask, the AI bots, re-asks, nudges (cron every 2 min), the seeder, the 15-minute claim, the guard, the stand-down sweeper, STOP handling, drift monitor, pagers. Manual: off-script replies (held on the drafter sheet, Akash taps), Messenger replies past 24 hours, lifting a hold, registering a new template, deploying the staged Messenger sender (Akash's word).
Problems seen (★ recurring)
| Problem | When | Rule |
|---|---|---|
| ★ Chase texts to complete or transferred leads (179) | 8 Aug to 3 Sep | Stand-down rung, seeder filter, sweeper every 5 min. |
| ★ Global stop never lifted (10 days) | 16 to 26 Aug | A stop needs an owner and an expiry. |
| ★ "Built" is not "running" (seeder never scheduled; re-arm failing since 21 Aug) | 4 times | Check the cron table; trust the last run. |
| ★ Duplicate sends (same link twice in 90 min; 27-person blast through an interrupt) | 16 to 24 Aug | Duplicate rungs in the guard. Interrupting a tool does not stop sends. |
| ★ Bot drift, off-script copy (49% drift, "I'm a real person") | 2 Aug, 19 Aug, 2 Sep | Template fingerprint rung; bots go suggestive once the scripted sender ships. |
| ★ Two systems texting one homeowner | 20 to 24 Aug | Reply exits drip; one conversation, one number. |
| Ice breakers instead of quick replies, phone never asked | Launch to 17 Aug | Launch gate checks the action type. |
| 5:42 am text to a lead | 25 Aug | Send window on every workflow. |
| Message mirror stale (63 hours today); nightly fixer dark | 2 to 7 Sep | Open. The board is partly blind until the mirror runs. |
What already exists
- Machine Operating Guide, Machine 6 "Homeowner intake". The runbook and the never-list.
- The B2C sales system gap analysis and six-week SOW (3 Sep) and the "execute everything remaining" handoff (2 Sep) in
01-Projects/St_Pierre_Digital/SOWs/. - Follow-up rails "no-cracks" design (19 Aug), now enforced in the guard.
- The comment-to-DM SOW (14 Jul) and the live code in the sales-crm worker.
- The conversation simulator, now hosted on the rooms site.
Open questions for Akash
- Deploy the scripted Messenger sender? Until then the four AI bots stay on autopilot with about 49% drift.
- Comment-to-message: reverse the suppressor so commenters who post a phone still get the DM? Which pages first? Who supplies the per-page tokens?
- Will you paste your 25 simulator answers back so they become templates?
- Nightly fixer is dark because the headless login expired. Re-authorise, or leave the findings for the ops manager by hand?
- Which monitor is the truth for the daily sweep, the pager or the lead monitor?
6 Area 4 · Lead transfers: right data, right board
What good looks like. Every lead with a name and a verified phone is minted to its client's destination within a minute, sent within 15, and visible by name on the client's board within 30. Proof is the client's board and the delivery-truth view, never our own label.
The rail today. A scheduled job runs every minute and marks any lead with a verified phone as ready, including Messenger leads that have gone quiet for 10 minutes with a phone. The database then creates one delivery row per place the client wants leads. A sender runs every 15 minutes and delivers it: a DripJobs card for Level King and AlphaLift (phone in the phone field since 3 Sep, card at capture), a text to Akash for the 17 markets with no buyer. Scott (Arbuckle) and Able are prospects, hand-forward only.
Surfaces
| Surface | What it is | When |
|---|---|---|
| Lead ledger | One row per lead, all markets, camp decided server-side (ours or the client's). Row click loads the transcript. | 9:15, "is every qualified lead from yesterday with its client?" |
v_sp_lead_delivery_truth_v1 (database) | The "did the client get it" view. | Any delivery question |
| DripJobs boards (app.dripjobs.com, global search by name; Appointments calendar) | The only thing that proves a card exists. Akash's Chrome is signed in as Dan. | Verifying a card |
| Client portal | What the client sees. Each client's token link is on their record. "Delivered" here is a timestamp. | Client-side check |
| bookestimate.co/<market> | The branded booking link in every text; redirects to the market's form. | Verifying a market's link |
Tables: sp_client_leads, sp_client_lead_transfers, sp_client_delivery_destinations, sp_dripjobs_events, sp_dripjobs_unmatched, sp_sms_approval_queue, ops_alerts | Lead and stage, one row per delivery attempt, where each client's leads go, cards echoed back, Akash's one-tap sends, alarms. | "Where is lead X?" |
01-Projects/St_Pierre_Digital/lead-transfer-automation/ | lead_handoff_watchdog.py (30 min), second_look_appointments.py, RUNBOOK.md, WORKFLOW-REGISTER.md, rollback SQL. | Repairs |
| n8n workflows | 6ET0nCwUKY35WBwR the 15-minute drain; iPVzjwsRlIlwMeGQ the DripJobs events receiver; d3Nt1xBvEGWh5EOp the appointment creator. | When a send hangs |
How Akash has done it (dated rulings)
- 1 Aug. "Qualified" is only the spam gate and never sends. In scope plus phone means ready to transfer.
- 9 Aug. "Leads don't get sent anymore": we work the lead until the homeowner books; crew engages after the appointment request. Retired 12 Aug in favour of cards.
- 13 Aug. "All should be either fully auto or auto to me." No fully manual tier. Every no-buyer market texts Akash.
- 21 Aug. "A viable phone number is the ONLY hard requirement."
- 26 Aug. Camp rule: "we should never follow up with anyone that a client has made contact with; if we send a lead over and the client is unable to make contact they're still in our lane."
- 2 Sep. Audit found the pipe closed since 12 Aug: "transferred" had meant "texted Akash's own phone"; 58 verified-phone leads stranded.
- 3 Sep. "If we have a first name, a phone number, and we've verified that phone number somehow, we need to be transferring these to clients immediately." ZIP is never essential. Ten quiet minutes with a phone means transfer. Cards at capture, phone in the phone field. Both client boards cleaned by hand the same day.
Worked example, Donny Spurgin (Level King, 3 to 7 Sep, still open). A temporary hold was put on his pending card on 3 Sep so a real homeowner would not be the first card after a patch. The watchdog has paged every day since ("Hand-off stuck AFTER auto-retry, 0 attempts"). Proof when fixed: a transfer row with channel DripJobs and status sent, a matching card echo within 30 minutes, and the card by name in Dan's search. Not proof: our own "landed" field, or a text to Akash's number.
Automated vs manual. Automated: promotion, minting, sending, card echo matching, appointment requests, receipt reconciliation, delivery health alerts (60 min undelivered, 24 h client nudge queued, 48 h stale card), destination check daily, watchdog retries, nightly reconciler. Manual: tapping the approval queue (hand-forward packets, client nudges), verifying cards on the boards, board cleanup (no delete API), enabling or disabling a destination (Akash's word), page-inbox recovery past 24 hours.
DripJobs rules learned the hard way. Contact needs first and last name (2+ characters with a letter). Phone lives on the contact, not the deal. Archive is reversible, Delete is not. The appointment endpoint is broken on their side; only the Zapier action works and it needs email, city and ZIP. Address text must be ASCII or the Zap fails silently. Level King's board auto-texts Dan's booking link when a card with a phone is created; that is his funnel, not a bug.
Problems seen (★ recurring)
| Problem | When | Rule |
|---|---|---|
| ★ Verified-phone leads stranded, rows failing "not qualified yet" (58) | 20 Aug to 2 Sep | Immediate-transfer ruling; the promoter job. |
| ★ "Phone: N/A" on client cards | Seen 3 Sep | Phone in the phone field; 41 cards repaired by hand. |
| ★ Leads delivered to nobody | 15 Aug, 22 Aug, whole client lane to 2 Sep | Four rows; daily destination check; truth view. Recurs at each new market. |
| ★ Hand-off stuck, watchdog pages daily | 13 Aug, 18 to 26 Aug, 2 to 7 Sep | Auto-retry plus page. No auto-fix actor yet. 62 alerts open. |
| ★ Card echo cannot match ("???" payloads) | 22 Aug, 3 Sep (28) | Lead id in the card's source field; normalise phones. Open. |
| ★ Zapier silent failures (ASCII, blank ZIP) | 6 to 24 Aug | ASCII fold; ZIP half open. |
| Duplicate cards from two producers | 24 Aug | One producer. The form-jobs path is retired; never reconnect it. |
What already exists
- Machine Operating Guide, Machine 7 "Lead handoff and delivery" (master), and the Delivery Operating Manual (daily sweep step 3).
- Lead-transfer RUNBOOK, WORKFLOW-REGISTER and before-image folders in
01-Projects/St_Pierre_Digital/lead-transfer-automation/. - The 3 Sep board-cleanup SOWs and receipts.
- DripJobs tactical guide (27 Jul, partly superseded) and Level King lead flow (6 Aug, superseded on phone-first).
Open questions for Akash
- Missing ZIP on an appointment request: ask the homeowner again, or geocode the street address?
- Does the ops manager get tap rights on the approval queue, or does only Akash approve?
- The park-client destination for the shared Texas page: the 13 Aug ruling (text Akash) or the 27 Aug disable?
7 Area 5 · Post-transfer: quotes, jobs, and coaching the client
What good looks like. Every transferred lead has an outcome inside 48 hours from the client's CRM feed. A card 24 hours old with no estimate gets one text to the client. Anything waiting on the client past 48 hours is on the huddle. A quote with no update for three days gets the client a follow-up list. If the client cannot reach a lead, it comes back to our lane and we chase.
Where outcomes come from. The client's CRM feed is the truth (3 Sep ruling: "outcomes come from the CRM, clients never type"). DripJobs Zaps feed new lead, stage change, estimate scheduled, proposal accepted or rejected, payment, and project stage into our tables. The portal outcome buttons still exist but nobody has pressed one since 10 Aug. Three closed jobs are on record ($2,211 ticket, $221 fee).
Surfaces
| Surface | What it is | When |
|---|---|---|
| Client lane | Every lead the client owes an action on, aged green under 24 h, amber to 48, red past 48, pulsing past 96. The nightly coaching drafts show here with a copy button. | 9:15 and before the 3 pm client message |
| CX room (passcode) | Client health: Healthy, At risk, Blocked on client, with reasons and next actions. Its clock counts our last outbound touch, not deliveries. | Before talking to any client |
| Onboarding & Retention | Signed, setup step, live, first lead, first booked job, first 5-lead week. Mixes real clients with market tests. | Weekly |
| DripJobs boards and calendar | Estimate requested, scheduled, proposal, won. The calendar is the only reliable "did they book". | Before asking the client anything |
Tables: sp_dan_thread_outcomes, sp_lead_outcome_events, sp_closed_jobs, sp_dripjobs_events, v_sp_waiting_on_client, sp_client_coaching_drafts, v_sp_outcome_sla_worklist | Current state, audit, closed jobs, the feed, what waits on a client, the drafts, the 48-hour rule. | "What happened to lead X?" |
| Jobs | Dan-thread read 7:15 (proposes outcomes from the Level King group text), daily-touch drafts 6:45, drafter sheet 7:45, reconciler 5:30 (writes one coaching draft per client per day), 24-hour card nudge every 15 min (queues for Akash's tap), waiting-on-client 48-hour alert 9:45. | Checking the loop ran |
How Akash has done it (dated)
- 1 to 10 Aug. Dan's outcome pipeline shipped on his portal; Dan used the buttons 71 times, then stopped.
- 19 Aug. Machine-derived outcomes enter as proposals, never final. Portal-first rule: every outcome ask tells the client to mark it in the portal; a one-word text reply is the fallback.
- 20 Aug. The waiting-on-client stage. Questions only the client can answer go there, never into chat to Akash. Chase pauses; auto-exits on a portal tap, a reply, or an outcome.
- 27 Aug. "For everything that is the client's, they should chase. I want to be sent a list of all the leads in the client's lane so I can hold clients accountable to next actions. Probably needs to be a dashboard." Built as the client lane plus a nightly coaching draft per client.
- 2 Sep. Client clock ruled: 24 hours with no estimate, one text to the client; 48 hours, the huddle.
- 3 Sep. CRM feed is truth; portal goes read-only. Runbook: Collins drafts by 3 pm, Akash sends 3 to 4 pm and owns the relationship. Never send a client message as Akash. Portal proven unreliable both ways the same day; the board beats the portal label.
The number that explains this area. 22 coaching drafts written nightly since 27 Aug, 0 sent. 37 automated 24-hour client nudges queued since 2 Sep, 0 tapped. 21 waiting-on-client alerts open, the oldest 429 hours. The rails write; nobody sends. That is the job.
Worked example, M Saiful Razzaque (AlphaLift, 13 Aug to today). First real FR lead. Put into waiting-on-client with a question for Austin; the alert has fired daily since 1 Sep. What you do: open Austin's board (global search), check Appointments; if nothing, copy the client-lane draft ("Create the job card and book the estimate"), hand it to Akash to send. On Austin's answer the stage exits by itself. Never text the homeowner while the lead waits on the client.
Automated vs manual. Automated: feed ingest and matching, outcome proposals, portal writes, nudges queued, stale-card and waiting alerts, coaching drafts, daily-touch drafts, CX render. Manual: confirming proposals, every client-facing send, board deep checks, resolving unmatched cards, entering waiting-on-client questions, calling the CX reds.
Problems seen (★ recurring)
| Problem | When | Rule |
|---|---|---|
| ★ Transferred leads with no client action (67 of 115) | 26 Aug, 3 Sep, daily | 24 h nudge, 48 h huddle, 5 d we chase. Drafts must be sent. |
| ★ Outcomes overdue past 48 h (0 of 16 bookings recorded) | 19 Aug, 25 Aug, 3 Sep | CRM feed as truth; fix matching, not buttons. |
| ★ Waiting on client past 48 h (21 open) | Daily since 1 Sep | Alert reaches only Akash. Needs a sender. |
| Portal lies both ways | 16 Aug, 3 Sep | Board beats portal. Portal read-only is ruled, not yet shipped. |
| Outcome attribution blind (19 of 171 estimates matched) | 3 Sep | Lead id on the card. |
| Homeowner texted while in the client's camp | 19 Aug, 3 Sep near-miss | One camp predicate; board check first. |
| No lane for clients with no lead delivered in 24, 48, 72 h | Never built | Open gap. |
What already exists
- Machine Operating Guide, Machine 8 "Client outcomes and retention", with the 8-stage client kit.
- The contractor homeowner sales system tactical guide (the client kit) in
01-Projects/St_Pierre_Digital/Playbooks/. - The 3 Sep gap analysis and SOW with rulings 1 to 7 on quotes, outcomes, reviews and lost-lead nurture. Rulings 3 to 7 still unapproved.
- Client portal worker RUNBOOK and design notes in
01-Projects/Dashboards/client-portal-worker/.
Open questions for Akash
- May the ops manager send the daily coaching draft to Dan and Austin directly, or does "you draft, Akash sends" stay?
- Ruling 3 (post-quote follow-up: client calls day 1 and 6, Jordan texts days 2, 4, 6, 10) and rulings 5 to 7 are unapproved.
- Should a "no lead delivered in 24, 48, 72 h" lane page the ops manager, and at which threshold?
- Portal read-only for Level King and AlphaLift: ship date and contact sheet not yet produced.
8 Area 6 · Issue tracker: every problem once, recurring ones systemically
What good looks like. One list. Every problem from areas 1 to 5 lands there once with a severity, an owner and a status. Every fix carries a ledger row with a rollback. A closed issue points at the ledger row that closed it. Anything seen three times in seven days becomes a "build a system" task on its own. Priority comes from repeat count, not from who shouted last.
Where it stands today. There is no single tracker. There are six pieces that do not link:
| Piece | What it is | State |
|---|---|---|
issues table | The register behind the board: owner and status per bug. 27 rows, every owner "akash", 0 ever resolved. | Filled once on 13 Aug by the old per-alert sync. That sync stays retired: rerunning it would add 517 one-alert rows (dry-run 7 Sep). The board groups by pattern instead. |
Bugs board (passcode), view pipeline_bugs_board, builder 01-Projects/CommandCenter/scorecard/pipeline_bugs_tracker.py | One card per recurring failure, not one per alert: 49 bugs, 28 critical, 27 unowned, 23 on a third strike, 33 past SLA. Five stages left to right: Found, Owned, Fixing, Quiet (prove and close), Won't fix. Each card shows the business stage it breaks, severity, owner, age against SLA, who acts next, and the one proof that closes it. Built 7 Sep. | Start here. This is the register's live layer. To move a card: change owner or status on the matching issues row, rerun the builder, redeploy the page. |
| Nightly reconciler (passcode) | 35 checks written as SQL, run 5:30 nightly, findings stored, a finding that repeats two nights pages. 23 runs, 0 failures, findings 28 to 238. | The one thing that works. Its top finding: rulings written as prose with no gate (465). |
Watchdogs and ops_alerts | Five monitors writing alerts, an escalator every 10 minutes to Telegram with fix-first restarts. | Running. |
change_ledger | Every change, with who, why, before, after, rollback. About 4,700 rows since 15 Aug, 15 rolled back. | The only record of fixes. Nothing else points at it. |
| Clunk log and the rule of three | clunk.py add <key> "<what broke>" at shutdown; a cron turns a key seen three times in seven days into one build task. | The log has 0 rows. The rule has never fired. |
Five monitors are registered but not running: the nightly fix-it agent (login expired), nightly_fixer.py (plist never loaded), issues_sync.py, the clunk log, and the command-center sweep (31 failed restarts since 30 Aug).
How Akash has done it (dated)
- 2 to 7 Aug. "Root-cause all my Telegram alerts", five times in six days, each pass rediscovering the last. Fix: the alert defects register ("read before diagnosing, update when you fix") and fix-first restarts before paging.
- 15 Aug. "Just because we can doesn't mean we should." Prove the gap with a number before building.
- 24 Aug. The reconciler: "ask the system the questions nobody was asking." The repeat is the signal.
- 26 Aug. "Why do my directions keep living as prose instead of becoming mechanical?" A ruling closes as a gate at the write path, a reconciler check, or an explicit "prose-only because". "I don't want alerts, I want problems to solve themselves."
- 3 Sep. Clunk log and rule of three made binding. Bug lifecycle written: open, in progress, resolved or won't fix, close with proof, third strike becomes a gate, every fix ledgered. Akash: "how do we identify bugs? What is our current bug tracker? How do we mark bugs as closed inside of our system?"
- 7 Sep. The bugs board view built.
The loop you run
- 1Found a problem (a page, a red on the board, a client complaint, a clunk): it is a card in Found on the bugs board, or you add an
issuesrow the same day with severity and owner. Check the alert defects register first; it may be a known noise. Move it to Owned by naming the owner. - 2Fixing it: status in progress (the Fixing column), and a ledger row with the reason and the rollback. If you cannot write the rollback, the fix is not designed.
- 3Closing it: the card goes to Quiet only when the feed behind it has gone quiet; status resolved, the ledger id on the row, the proof the card names attached. Won't fix needs a reason.
- 4Seen it before: log the clunk key. Third time in seven days, the system files a build task. That task, not the fourth fix, is the priority.
- 5A ruling from Akash: register a reconciler check for it, or a gate at the write path. Never only a note.
The recurring-problem map across all six areas (counts from the register, alerts, reconciler findings and the ledger)
| Class | Where it shows up | Still open? |
|---|---|---|
| Lead qualified, hand-off never lands | 71 delivery alerts, 104 undelivered alerts, 242 watchdog pages | Yes. 9 Arbuckle and 6 Able leads never reached anyone. |
| Homeowner or contractor wrote, nobody answered | 244 reconciler findings, streak 11; 30 threads need a human today | Yes. Drafts wait on a tap. |
| Lead sitting with no next step | 312 hits; reconciler streak 15; top row of the bugs board | Yes. Biggest row today. |
| Client board silent (card missing or untouched) | 203 findings; 48 receipt-missing alerts | Yes. Needs the client-side clock worked. |
| Ruling written as prose, not a gate | 465 findings; 93 queued in the prose register | Yes. Loader half-built. |
| Two systems disagree (GHL, DripJobs, message mirror) | 119 mirror alerts; 90 findings | Partly. Instagram not mirrored. |
| Job or relay silently dead | 10 heartbeat findings; 20 failed restarts in 30 days | Yes. Sweep blocked on a login. |
| Consent and over-messaging errors | 15 rollbacks in the ledger | Mostly closed by the guard. |
| Copy drift and unapproved deploys | 2 deploys 4 Aug; nightly bypass 19 Aug | Closed by the deploy gate; old pages still surface. |
| Platform config gaps (pages, terms, datasets) | 15 of 17 pages could not take a form | Closed by the launch gate; recurs at each new page. |
| Alert that reaches nobody | 13 alerts hidden for three months by letter case | Recurs with every new surface. |
| Monitor registered but not running | Five today | Yes. |
| Building without proving the gap | Calendly slug "fixed" twice | Behavioural. |
Automated vs manual. Automated: detect, page, restart a dead job, record the rule of three (if fed). Manual and not happening: filing into the register, assigning an owner, setting a status, closing with proof, logging the clunk.
What already exists
- The bugs board (7 Sep) and the Delivery Operating Manual's bug lifecycle (3 Sep).
- The alert defects register,
01-Projects/Alerts-Migration/ALERT-DEFECTS-REGISTER.md, items 1 to 24. - The nightly fix-it runbook (26 Aug); the agent has never run.
- The prose-to-gates audit register, 542 rulings with a disposition.
- The old per-alert sync
issues_sync.pybeside the builder: retired, do not rerun.clunk.pyin.codex/references/. - The drift log board at team.stpierre.ai/ops/drift, last written 25 Aug.
Open questions for Akash
- May the ops manager close issue rows alone, and must a close carry a ledger id?
- Who logs the clunk: you at shutdown, the ops manager, or the bugs board automatically?
- Load
nightly_fixer.pynow (deterministic, sends nothing), since the Claude fix-it agent is blocked on the login? - The concrete-leveling launch gate mints about 90 warnings a day. Are CL ads meant to be on, or retire the gate?
9 Core surfaces, one table
| Surface | Link | What it is for |
|---|---|---|
| B2C Board | stpierre-b2c-board.stpierre.workers.dev | Every homeowner conversation. Pipeline / List toggle. |
| Lead ledger | /ledger | One row per lead, camp, next action, transcript. |
| Client lane | /clients | What each client is sitting on, aged. |
| B2C Scoreboard | stpierre-b2c-scoreboard.pages.dev | Live now, Markets (pivot by market and client), Creatives (pivot by creative). |
| Client Campaign Funnel | stpierre-client-funnel.pages.dev | One row per market: impressions to won, with weekly trends. Where the bottleneck is. |
| Conversation simulator | rooms.stpierre.ai/conversation-simulator | 25 real patterns with defended defaults. Passcode. |
| Bugs board | rooms.stpierre.ai/bugs-board | 49 recurring failures in five stages. The issue tracker. Passcode. |
| Nightly reconciler | rooms.stpierre.ai/nightly-reconciler | 35 checks, streaks. Passcode. |
| CX room | rooms.stpierre.ai/cx | Client health lanes. Passcode. |
| Sales Center | pipeline.stpierre.ai | Akash's B2B pipeline. You keep the records; you never send as him. |
| KPI Grid, weekly | data.stpierre.ai/kpi | Every metric by week against goal. |
| Command Home | stpierre-command-home.pages.dev | Front door. The six weekly numbers, the rails band, the project cards. The only project tracker. |
| Client portal | client.stpierre.ai | What the client sees. Token link per client. |
| Onboarding & Retention | stpierre-onboarding-board.pages.dev | Signed to first 5-lead week. |
| Outbound Sales Scoreboard | stpierre-outbound-funnel.pages.dev | Daily calls, texts, emails vs target; weekly dials-to-closed. |
| Sales HQ launcher | stpierre-sales-hq.pages.dev | Every sales tool behind one link. |
| Dashboard map | data.stpierre.ai | When you do not know a dashboard's address. |
| Weekly Scorecard | rooms.stpierre.ai/scorecard | Friday review. Passcode. |
| Machine Operating Guide | 02-Areas/Team/machine-operating-guide-2026-09-03.html | The deep how-to for each of the twelve machines. |
Retired, do not use: the Decision cockpit (stpierre-unblock-queue, address dead), Ads Live for B2C (the Scoreboard replaced it), every eyefly-sp-* content doc, the old creative board.
10 Sales ops: what you run for Akash
You keep the records; Akash has the conversations. Every worked conversation gets an outcome and a dated next action, or a valid closed status. Dead drafts come out of the Today queue. The 100-point game (one point per contractor conversation, 25 per demo booked, 100 a day) is counted in the sales room; check the counter matches the dialer dispositions. Kixie dispositions feed the scorecard and the game; only connected dispositions count. Stripe is the truth for a close. The offer of record is on the Sales HQ launcher; never invent terms.
11 Recommendations, in order
- 1Own the bugs board. 27 of 49 bugs have no owner and nothing has ever been in Fixing. Name an owner on every card, move the three-strike ones into build tasks, and set the builder to rerun nightly so the board is never a stale snapshot. One morning of work; it tells you what is actually broken.
- 2Send the client messages. 22 drafts, 37 queued nudges, 21 waiting-on-client alerts, 0 sent. Get Akash's ruling on whether you may send, then run the 3 pm rhythm daily.
- 3Close the three conversation loops before working the board by hand: deploy the staged Messenger sender, paste the simulator answers into templates, fix the stale message mirror and load the nightly fixer. Working the board on top of a blind mirror repeats August.
- 4Build the no-lead client lane. Clients with no verified delivery in 24, 48, 72 hours, with "newly launched" and "paused on purpose" separate. The receipt is the only honest clock.
- 5Fix the three page defects (Indiana rename, Ohio routing rows, the privacy page) before any new page is created.
- 6Organic rail as one pack video a day to each live state page by Graph API, reusing the paid pipeline.
- 7Tag creatives by hook and on-screen surface at build time so the Creatives tab can pivot by element.
Why this order: the register tells you what is broken, the client messages are the revenue, the conversation loops make the board trustworthy, and everything else builds on those three.