Three Gates — R4 Activation · LP Measurement · Level King Proof

SOW · 2026-07-22 · status: awaiting Akash decisions D1–D5 · supersedes WS1 of sow-master-r4-to-daily-engine-2026-07-20.md

Objective

Get ads live, make the funnel readable, and prove client delivery once — in that dependency order.

Why it matters

Zero ads running, zero calls booked, zero verified client leads. Net cash is −$1,004.

You need to

Answer 5 decisions (D1–D5). ~10 min. Everything else is mine.

Do this first, before reading anything else. Level King campaign 120247483840870714 is ACTIVE and spending right now, and three real leads have been sitting unanswered since Jul-21. Cindy Shaw Romaguera gave her phone, ZIP and said "Texting please" — nobody ever replied to her in Messenger. That is a live client-harm and reputation issue, and it is the only thing in this document that is urgent today. See D1.

The picture in one screen

Ads live0of 2,769 Net cash−$1,004business $2,659 Business runway86.5 dat current burn Calls booked0pending Verified client leads0Level King Lifetime paid spend$1,403→ 7 leads

The honest read: all three problems are real, but only one is urgent (Level King), only one is expensive (R4), and the cheap one in the middle (measurement) is what makes the expensive one worth doing. Activating R4 before the landing page can be measured would repeat exactly the last month: money spent, nothing learned.

D1 — Level King: pause the campaign and answer the three leads needs you
★ Recommended: pause the campaign now, and you personally text Cindy today (she asked to be texted and gave a valid number). Reply "pause LK" and I'll pause it; the two texts are yours to send, not mine.

Alternative if you'd rather not pause: leave it running but accept that every new lead lands in the same silence until WS-C ships. I don't recommend it — $6.47 conversations are cheap and worth having, but only if someone answers them.

D2 — R4 spend ladder: $100/day is not affordable needs you

R4 is built and verified — this is purely a "how much" question.

Daily budgetBusiness-cash runway14-day costExpected leads @ $35.57 CPL
$100/day (as built)20 days$1,400~39
$50/day33 days$700~20
$40/day38 days$560~16
$0 (stay dark)86.5 days$00
★ Recommended: $50/day for 14 days, $700 hard cap, starting only after WS-B lands (48h). Keeps ~33 days of business runway, buys ~20 leads — enough to judge the three concepts, not enough to judge 27 individual ads, and that's the right resolution for this budget.

Math: business cash $2,658.70; business-only burn ≈ $30.70/day (86.5-day runway). Adding $X/day gives $2,658.70 ÷ ($30.70 + X). Meta CPL $35.57 is your real last-30-day figure, not an estimate.

D3 — Sequencing: instrument before you spend needs you
★ Recommended: WS-B first (≤48h, no spend), then R4. Reply "instrument first" to accept, or "launch now" to activate R4 immediately and accept a blind read.
D4 — What counts as a win, and when I turn it off needs you

A kill criterion set now is worth more than a judgement call made at day 10 with money on the line.

CheckpointKill / continue rule
Day 3 (~$150)Kill any ad set with >$40 spend and zero landing-page views. Delivery failure, not message failure.
Day 7 (~$350)Continue only if ≥5 applications AND blended CPL ≤ $60. Otherwise pause all, keep the learning, spend nothing further.
Day 14 (~$700)Hard stop regardless of result. Write the verdict, decide round 5 separately.
Any timePause immediately if Meta's next charge would not clear from business cash.
★ Recommended: adopt as written. Reply "kill rules ok" or give me your numbers.
D5 — Two facts I need from you that I cannot get myself needs you
★ Recommended: answer both in one line. If you don't know about the revert, say so and I'll treat it as an unexplained system behaviour and add a guard.

WS-A — R4 activation

A. Context and verified state reference only

What R4 is: 27 ads = 3 concepts × 9 niches, tweet-static format. Built Jul-20 after a 45-ad draft was rejected.

FactValue
Campaign120248219884220390 "SP R4 | AI-First Champion" — PAUSED, CBO $100/day, OUTCOME_LEADS
Ad sets9, all PAUSED, no ad-set budget, US 25–65, FB feed + IG stream, fully broad (no interests, no exclusions)
Ads27, all PAUSED, page 1197436790119715 (Alex St. Pierre)
Spend everZero — maximum-window insights return 0 rows for all 9 ad sets
Approval on recordContact sheet approved by Akash 2026-07-20 13:35 ET; scope = "build PAUSED authorized; ACTIVATION requires separate go"
Readbackreadback-verification.json — campaign/adsets/ads pass, coverage exact, DR/DC guard pass, DOF opt-out pass
Canon check0 fails / 0 warns across 189 copy strings
Destination QA27/27 pass, cache-busted curl on all 27

Niche message-match: verified clean. I checked all 9 R4 slugs against the LP alias map — basement-waterproofing, concrete-leveling, crawlspace-repair, deck-replacement, drainage-correction, foundation-repair, septic-replacement, siding-replacement, window-replacement all resolve. The roofing_replacement / concrete_leveling_large_projects mismatch found in live traffic came from older campaigns, not R4.

Estate context: 54 campaigns, 240 ad sets, 2,769 ads, 3,813 creatives. Lifetime spend $1,403.20 → 18,252 impressions → 490 clicks → 147 landing-page views → 7 leads. 53 ads DISAPPROVED (33 Unacceptable Business Practices, 15 Financial/Insurance, 5 Fraud/Scams — Meta returned no per-asset detail). 43 WITH_ISSUES, all in R2.

A. The work no action — mine once D2/D3 land
#TaskOwnerGate
A1Set campaign daily budget to the D2 figure (default $50/day)ClaudeD2
A2Apply url_tags to all 27 R4 creatives before activation, carrying message_variant_id + experiment_id + ad/adset/campaign macros. Must happen pre-activation — url_tags is immutable post-creation, so doing it later forces a creative clone that re-triggers ad review.ClaudeD3
A3Verify the c1/c3 destinations (manifesto, market-report) carry the same instrumentation as the LP — otherwise 18 of 27 ads are unreadableClaudeWS-B
A4Activate: 37 discrete unpause operations (1 campaign + 9 ad sets + 27 ads — each is individually PAUSED, not inheriting)ClaudeD2+D3+D4
A5Readback verification within 15 min of activation; screenshot contact sheet to youClaude
A6Daily 09:00 delivery check against the D4 kill rules; report only on a rule trip or on scheduleClaudeD4
A7Day-14 verdict written to brain + a decision row for round 5Claude
Not in scope, deliberately: repairing the 53 disapproved ads (Meta gives no per-asset reason — needs a manual Ads Manager review first), unpausing anything outside R4, and the daily additive ad engine (WS2 of the Jul-20 master SOW). One clean test before more machinery.
A. Acceptance criteria reference only

WS-B — Landing page: make it readable, then make it convert

B. The 56→10 number was wrong — here is what's actually true needs you

I reported "56 landing-page views → ~10 Typeform starts" earlier. That figure does not survive contact with the data, on either side.

Consequence: every CPL, start-rate and funnel figure produced in the last month is unreliable. Not wrong in direction — unreliable in magnitude. Fixing this is 1–2 days and it is the highest-leverage work in this document, because it is what makes the R4 spend worth making.
★ Recommended: approve WS-B as a block. It is all instrumentation and layout — no offer or copy rewrite without separate approval per your preview-before-deploy rule. Reply "WS-B go".
B. Verified causes, ranked reference only
#CauseConfidenceEvidence
1No form-start / form-submit instrumentation exists anywherecertaingrep for postMessage listeners returns 0 hits across the LP
2PostHog $pageview broken on the LPcertain103 $pageview vs 380 $pageleave / 387 offer-assigned
3Zero Typeform question visible above the fold on desktop; ~1 option on mobilemeasuredDesktop iframe top 645px in an 800px viewport; mobile 534px in 812px before iOS chrome
4disable-auto-focus=true forces a scroll and a click into the iframe before anything can be answeredcertainindex.html:126
5Attribution silently truncated at the Typeform boundarycertain11 hidden fields the LP sends aren't declared on the form (incl. sp_angle_id vs form's angle_id). message_variant_id is declared and always sent, yet populated 1 time in 161 responses
6The LP is your weakest destinationverifiedSince Jul-15: 2 applications tagged offer-lp vs 5 90day-projection and 5 manifesto
7Median dwell 11.3s = message rejection, not mechanicsstrongp50 11s / p75 21s; iframe interactive at 1.4s; proof bar sits below the form
8Cold traffic asked to fill an application as its first act, with no lower-commitment doorstrongThe resource pages that do have one out-produced the LP 5:1

Ruled out: load speed (no JS errors, no failed requests, Typeform interactive at 1,369ms), go.stpierre.ai 302s (both /privacy and /terms return 200 first-hop — that note is stale), and niche skip logic (verified working: ?sp_niche=foundation-repair correctly rewrites the H1 and opens on Q2).

B. The work no action
#TaskEffortApproval needed
B1Wire Typeform's postMessage bus: listen for form-ready, form-screen-changed, form-submit. Emit to PostHog + a new sp_funnel_events row.3hno
B2Fix posthog.init so $pageview fires. Backfill nothing; mark the break window in the metric contract.1hno
B3Redefine bot cohort 424638 off the now-invalid "no $pageview" rule; exclude the QA user-agent from all funnel reporting.1hno
B4Give QA automation a distinguishable application_token prefix so test traffic is separable at source.1hno
B5Declare the 11 missing hidden fields on form j4wHbfWD, and rename sp_angle_idangle_id to match. Read-only inspection is done; this is a form-definition edit.1hyes — touches the live form
B6Raise the form above the fold: compress the 4-line H1 + subhead + sub-subhead + chips, move the proof bar above the form, remove disable-auto-focus.3hyes — visual preview first
B7Confirm manifesto + market-report pages carry the same instrumentation (blocks reading 18 of 27 R4 ads).2hno
B8Rebuild the funnel view on trustworthy events; publish LP-view → form-start → form-complete → booked as one chain.3hno
★ B5 and B6 touch live surfaces. Per your preview-before-deploy rule I will send a visual preview and wait. B1–B4, B7, B8 are mechanical and I'll just do them.
B. Acceptance criteria reference only

WS-C — Level King: prove the delivery promise once

C. What is actually proven, step by step needs you
#StepVerdictEvidence
1FB ad → Messenger conversationPROVEN3 starts at $6.47, $19.42 spent
2Conversation → the new botNEVER HAPPENEDAll 3 real convos were Meta's native Page auto-flow, backfilled Jul-22 by script
3Bot qualificationTEST ONLY5 synthetic/owned-number leads. The one "qualified" real lead was marked by the backfill script
4CRM contact createdPARTIALPostgres yes (8 leads). GHL does not exist for this client — ghl_location_id NULL, no PIT, no custom values
5Qualified stage/tagMECHANICALLY PROVENStage events with idempotency keys
6Notification to clientWRONG RECIPIENT1 transfer, to Akash's phone (5477), 18h late. Dan has never received a lead
7CAPI Lead eventFAILINGStatus error, HTTP 400, events_received NULL. n8n relay gp1NILFWhEfkUGx3 is inactive

Client record: id 5cb23431-b9d7-4b9a-87bf-c339058cad3f, status upcoming (not active). Onboarding checklist 10/15. The new-launch-qa hard gate is failing: 4 pass / 5 fail / 3 warn. Step 9 blocker on record reads "Published active instead of paused" — which is why the campaign is live right now.

The parity audit is already partly stale in your favour. Files written later the same morning — messenger-bot-config.js and messenger-followup.js — do implement Jean's personality, exactly 21 FAQ ids, runtime client config resolved from the Page's own row (fails closed), and the verbatim 5-touch cadence with quiet hours, STOP/DND and a 24h policy guard. So the gap list is smaller than the audit says. But the rollout gate last read 20/28 → HOLD, and I did not re-run it.
★ Recommended: pause (D1), then run WS-C as a strict sequence — no client-facing sends until the gate reads 28/28 and one real lead has been handled live end to end.
C. The work no action — mine, except C1 and C7
#TaskOwner
C1Text Cindy today; decide whether Richard and Ann are still worth a replyAkash
C2Re-run the 28-check rollout gate; report the exact failing checksClaude
C3Close whatever the gate actually fails (the 8 known blockers may already be fixed in the later code)Claude
C4Fix the CAPI 400 and activate n8n relay gp1NILFWhEfkUGx3; stay inside the approved 10-event pilotClaude
C5Repoint lead transfer from your 5477 to Dan, with you on a copy for the first 10Claude
C6Close the new-launch-qa gate: fix M2 naming, set M4 inline_comment to OPT_OUT, get the campaign paused so the gate can pass honestlyClaude
C7Owned-number canary: you message the Page from a phone you control, and we watch all 7 steps fire liveAkash + Claude
C8Only after C7 passes: reactivate the campaign and take the next real lead live, with 72h close monitoringClaude
C9Stamp launched_at, flip status to active, finish checklist 15/15Claude
C10Decide whether Level King needs GHL at all, or whether Postgres + Messenger is the real product nowAkash — not urgent
C. Acceptance criteria reference only

Sequencing

What happens in what order reference only
WhenWhatBlocked by
TodayD1 — pause Level King, you text Cindyyour word
TodayD5 — you read the page ad-limit tier from Ads Manager (2 min)you
Day 1–2WS-B instrumentation (B1–B4, B7, B8). No spend.D3
Day 1–2WS-C gate re-run + fixes (C2–C6), in parallel — different systems, no contentionD1
Day 2B5/B6 previews to you for approvalWS-B
Day 3A2 url_tags on all 27 R4 creatives, then A4 activation at the D2 budgetD2, D3, D4, WS-B
Day 3C7 owned-number canaryC2–C6
Day 4–17R4 runs to the D4 kill rules; C8 Level King reactivation once the canary passes

Why this order: WS-B is cheap, fast, and makes WS-A's money readable — so it goes first. WS-C shares no systems with either, so it runs in parallel. WS-A goes last because it is the only one that spends, and it is the only one that can't be undone by editing a file.

Open questions and things I could not verify

Honest gaps in this plan reference only
Methodology & sources reference only

No external writes, sends, deploys, activations or form submissions were performed in producing this document. Everything in it is a read.