📌 THIS IS THE MASTER DOCUMENT — updated 5 Aug 2026. The corrected June diagnosis sits at the top of 📖 What happened; the verified live to-do list is in §12; every ruling and correction since approval is on the 📌 Status & updates tab. Finance stays on Aga's separate surface (never here).

What happened to revenue — and what we do next

One document. The story with its context, the funnel, the pricing, and every action with step-by-step instructions for Aga and Nic. All figures USD, net of fees, all rails, window-labelled. Every number re-pulled live 26–27 July 2026 and cross-checked against the Growth Cockpit and the $15K Cash Doc. Updated 5 Aug 2026 — every change since approval is on the 📌 Status & updates tab.
✅ APPROVED — this is the operating plan. 90-day timeline. Task 1 shipped 31 Jul. Attribution live since 29 Jul, so figures written before then are floors. Every update, ruling and correction now lives on the 📌 Status & updates tab — newest first, with what each one changes for the reader.

📖 What happened

🔒 THE STANDING RULINGS — Aga, 5 Aug 2026. These govern the quarter; nothing below overrides them.
RulingWhat follows from it
1 · SURVIVAL CASH over exit multipleBreak-even is the objective for 90 days. ⇒ No data-room, moat-summary or valuation work — it competes for the same 10 hours.
2 · Warm-list lifetime at $297 is back ONThe ~$413 LTV that banned it has no derivation anywhere; Aga's $150 is real. Capped windows, warm list ONLY, never cold (July's cold-paid cohort retained at D28 ≈ 0%). Model net of the 60-day guarantee and 9.88% refunds — not banked for two months.
3 · A premium COACHING tier is REJECTED"There is no one to execute on this — we don't have a trainer." Only a zero-human-delivery premium tier could ever be revisited. Never re-propose coaching.
4 · THIS is the master documentAll findings fold in here. Finance stays on Aga's separate surface. Cut authority: "build the list, I click" — nothing irreversible without her.
❓ THE FOUR OPEN FACTS THAT WOULD SETTLE THE MOST — none is more than ~30 minutes
WhatWhoWhy it is worth more than it looks
The quiz variant-switch deploy dateNICAsked for in three separate briefs since 27 Jul, never pulled. Until it lands, the June causal chain stays "strong, not proven" — we know when annual stopped selling, not why.
Apple ASC + Google Play export back to 2024AGA~30 min. The only thing that bounds the old funnel era's revenue (RevenueCat holds nothing before Feb 2026) — and it also fixes AGA-105's half-month artefact.
One canonical lead denominator (NIC-42)NICThe same metric reads 44, 106 or 179 per 7 days (4.07× spread) and the rate reads 23.2% / 4.1% / 1.1%. Every conversion claim is unfalsifiable until one is named.
Google Postmaster (AGA-107)AGA10 min. We cannot see our Gmail complaint rate at all — and that is the one metric that gets a permanent bulk sender SMTP-rejected, not spam-foldered.
🔄 UPDATED 5 Aug 2026 — the diagnosis, corrected by Aga and re-verified against live data
Aga's framing, and it is the right one: "we went from NOT having a paywall on the quiz to having a paywall — the rest stayed the same. The main revenue wasn't climbing; it was the 50% sale." The structural change was the paywall's introduction itself — before it, the quiz asked for a free app download and the selling happened later, by email, where annual lived at $78.50. No quiz paywall variant in this repo has ever carried annual (zero hits for $157/annual/yearly in any bundle) — so "the quiz stopped offering annual" describes a tier that was never on the quiz. It stopped being sold off the quiz.
The five concurrent changesVerdict on JUNE
Funnel model switched — app-download-first + email-sell → web quiz + paywallThe structural change. Fewer people into email AND email stopped selling, in the same fortnight
Annual absent from what buyers sawLast annual sale 19 Jun, then 21 straight days at zero; the annual line is ~85% of the shortfall. Restored at $97 on 31 Jul — but ~65% of paywall views still land on /2026-v2-2/ with no annual (AGA-56, the #1 action)
973 email rewrite (live 21 May; all on-ramps by 7 Jun)Offer clicks 45.6× worse — 6 offer clicks on 88,737 sends, zero proof/promo links. Not bad prose: the rewrite removed the offer. Never truly paused until 4 Aug (~1,674 more entered after it was declared off)
Android billing → Google Play/RevenueCatMeasurement artefact worth ~21% of the total Stripe fall (the famous "~80%" applied to the new-business line only — never apply both corrections, the all-rails series already nets Play)
Google Ads startedEXONERATED for June — first pound ever spent 27 Jun 2026 (API rows + campaign create-dates + card ledger). The 25–27 Jun app-install pivot is July's story
Net revenue by month — May is the sale, June is the break
Mar
$10,524
Apr — baseline
$11,973
May — 50%-off
$14,273
Jun — THE BREAK
$9,564
Jul — lifetime
$23,196
Aug — pace
$7,790
All rails, net. July = $19,997 one-time lifetime + only $7,957 recurring.
Annual subs sold per month — one line collapsed, the rest held
Jan
36
Feb
31
Mar
32
Apr
30
May — promo
50
Jun
11
Jul
14
Last annual sale 19 Jun → 21 straight days at zero. Non-annual held 46–70 every month.
Who converts — buy-click rate by source (90d GA4)
Owned pages
19.4%
Direct
17.9%
Google Search
15.5%
Instagram
8.8%
Facebook
8.4%
Search Partners
2.3%
Audience Netw.
1.6%
Display/PMax
0.0%
Meta = 54.3% of traffic at less than half direct's rate. No Email bar because there is no admissible data until ~11–17 Aug (links tagged 31 Jul · lanes live 29 Jul · pe= 4 Aug) — an artefact of untagged links, not of email not selling.
Paid + email, one paragraph each (full proof in the 5-Aug findings doc)
Paid: spend is FLAT across the Nic boundary (2025 £2,552/mo → Feb–Jul 2026 £2,768/mo); Meta CPL degraded 8× starting Sep-25, five months pre-Nic; on buy-clicks Meta (8.4–8.8%) is the traffic-quality problem, not Google Search (15.5%) — and the "May £457 spend cut" was a card-billing artefact, real May Meta spend was £1,477. Email: in the old model email WAS the monetisation engine (first ask at email 27 of a 30+ arc). The rewritten always-on nurture carried no offer link at all for 11 weeks; 758, the untouched control, remains the best performer in the estate (1.240% offer clicks/send). Email revenue is unreadable before 4 Aug — first honest read ≈11 Aug.
💰 FULL: money truth — LTV, lifetime UNBANNED, the mix inversion (folded 5 Aug)
FigureWhat it measuresVerdict
$150Stripe dashboard "Subscriber LTV" (£112.26 × 1.336) — book-average, gross, web-onlyReal — Aga's figure, sourced
$108–121New-customer forward LTV at observed mixReal, different question
$162 / $86 / $63Annual / quarterly / monthly per-plan (churn corroborated vs a 16,065-sub pull)Soundest in the estate
~$413The figure behind the old lifetime banRETIRED — no derivation anywhere. Lifetime UNBANNED (Aga, 5 Aug): $297, warm list only, capped windows, never cold (cold-paid cohort D28 ≈ 0%). Cash not banked for 2 months (60-day guarantee, 9.88% refunds)

The mix inverted: Feb–Apr annual 36.0% / monthly 33.7% → 10–27 Jul annual 16.1% / monthly 64.4%. Monthly churns 36.7%/mo vs annual's 9.1%; Q1 cohort realises annual $79.04 (69.7% active) vs monthly $27.99 (15.6%). "We didn't develop a retention problem. We started selling the plan that churns four times faster." The two promos are NOT equivalent: 50%-off netted ≈+$688 across May+June combined; lifetime added ≈+$13,800 ⇒ retire 50%-off as a mechanic, keep capped warm-list lifetime windows.

📧 FULL: email — the 973 evidence, the other rewrites, today's lanes (folded 5 Aug)
Measure (KPI: clicks+conversions)751 (old)973 (rewrite)Ratio
Offer clicks per send0.319%0.007%45.6× worse
Offer clicks, absolute1,2656 / 88,737 sends
Proof-link / promo-link clicks829 / 3560 / 0
Arc unsubscribe0.027%0.271%10×

Live 21 May · every on-ramp repointed by 7 Jun · "switched off" 28 Jul but never actually paused (no trigger of its own — fed by enter-blocks; ~1,674 more entered) until the real fix 4 Aug (AGA-98). Not bad prose — the rewrite removed the offer (218 blog clicks prove people read and act). Other rewrites: 988 unsub 2.07% vs sibling 0.60% (4.8×, z=4.22) · 991's first run 1.26% over the 0.5% hard-stop. 758, untouched, is the best in the estate (1.240% offer/send) — stays untouched. Evolution Law (locked 3 Aug) is the post-mortem. Today: 992 armed 4 Aug (🔴 audience defect — fires on ANY activation, caught a paying customer) · 750 improved, not rewritten · abandoned-cart lane built and idle awaiting NIC-54 signals.

💸 FULL: paid — spend history, CPL both bases, the 6 live governance breaches (folded 5 Aug)
£/leadJanFebMarAprMayJunJulAug 1–5
Platform (Meta API)0.950.921.342.051.851.963.700.65
Per REAL quiz lead6.638.5110.386.634.204.656.51~1.2–1.6/wk

Spend: 2024 £1,670/mo · 2025 £2,552/mo (Meta only) · Feb–Jul 2026 £2,768/mo all platforms — flat across the Nic boundary (first payment 15 Feb 2026); CPL degraded 8× from Sep-25, pre-Nic. The ledgers mislead: "May cut to £457" was one card threshold charge — real May Meta £1,477; real June Meta £2,466 + Google £502. The late-June spike: 26 Jun Advantage+ drifted into Audience Network junk (impressions ×15.7, 3,505 clicks → 28 leads → 129 landed) — the permanent AN placement lock was never applied. 25–27 Jun the app-install pivot (Meta 2,878 installs → 1 purchaser · Google UAC 1,230 → 0 · ASA 27 → 2 = 7.4%, the only good signal). Six live breaches → AGA-104: Google budget +43% on 1 Aug against the measurement gate · Google 68% of spend at ~6× its $8/day allocation · 3 campaigns vs the category-search-only ruling (Competitive Non-Branded £10.63/click 0 conv) · AN lock unapplied · ASA at $0 on our own brand terms · T14 YouTube-views question past due.

🧭 FULL: unexploited levers + estate traps (folded 5 Aug)

There is no second thing to buy — in eight years. No upsell, no premium tier, no order bump, no one-time offer. What's executable: a 24-month plan (~$157 collects 62% more cash today from the lowest-churn buyers; one Stripe price + one card — never proposed before) · a one-time product to the 83K list (the "64% would pay nothing" finding is about the SUBSCRIPTION; a $37 one-off is a different decision; uses the five guides that already exist) · the injury wedge (converts 5.1×, 36% of payers, only ever a segment — never an offer). ⛔ A premium COACHING tier is REJECTED (Aga, 5 Aug): "there is no one to execute on this — we don't have a trainer." Parked unless a zero-human-delivery version exists. Two free defects: the win-back ladder is inverted (SAVE30 = $109.90/yr, ABOVE the $97 front door) · monthly's price unmoved while it became 64.4% of sales.

Doc traps still live in the estate (full table in the findings companion): the 10X plan still recommends "warm-only lifetime" from the era it was banned and says 4.9★ · the CIO MIGRATION_MASTER_PLAN says "no credentials" — refuted same day, unstamped · the leads calculator's defaults carry a banned $30/day cap and a retired funnel model · the Stripe Payment Analysis (1 Jul) is superseded on its central finding with no banner · the retention plan's mtime says today but its content is 21 Jul. Trust order: kpi_15k.json → canonical_strategy.json → ship ledger → this doc.

⭐ The one thing to take from this tab (re-framed 5 Aug — annual was never ON the quiz; it stopped being sold off-quiz)
Annual stopped being sellable around 19–20 June — 21 days at exactly zero sales, the only such gap since February. It is 48.9% of new-sale cash. Nothing else in the story matters as much.
Read this first — the shape of the whole thing
Revenue did not fall off a cliff and it is not being eaten by churn. Two of the last four months were promotions, which makes the raw month-to-month line almost meaningless on its own. Underneath the promos, one real thing changed in June: the quiz stopped offering the annual plan. Not "sold less annual" — stopped offering it, to everyone, on every path. Annual is 48.9% of our new-sale cash and it is the plan that keeps people. That single change explains the shape of June and July better than any other candidate we tested.
★ Repeatable net cash — THE number
$7,790/mo
July pace · $7,210 short of $15,000 · lifetime excluded
July one-time (lifetime)
$19,997
excluded above — it will not repeat
Annual share of new subs
42% → 18%
May → July · the actual break
Latest week (20–26 Jul · 20–26 Jul)
+17 net
39 new · 22 ended
MRR, all rails (secondary)
$10,987
761 subs · book value, not cash — an annual $157 shows here as $13.08/mo for 12 months, but that cash arrived in a previous month
🔴 Which number we steer by — read this before any figure below
The main number is repeatable net cash: $15,000/month, month over month, to break even. That is money arriving in the bank. Today it paces at $7,570a $7,430 gap.

MRR is a secondary, valuation number. At $11,225 (5 Aug) it sits ~$3.4K/month above cash, because annual and quarterly cohorts keep accruing MRR long after their money landed. Reading "$7,210 short of $15K" off MRR compares a book value to a cash target and understates the real gap by $3,417. source: kpi_15k.json · script-owned, refreshed daily

🔴 DATING THE ANNUAL BREAK — corrected 27 Jul, re-derived from Stripe

Earlier drafts said "19–20 June" off a weekly bucket. The daily Stripe pull is sharper and does not agree with the round number:

  • Last annual sale before the break: 19 June 2026.
  • Then 21 days with ZERO annual sales — 20 June to 9 July. There is no other dry gap of even 7 days going back to February.
  • Annual resumed 10 July at a much lower rate (11 in July) — almost certainly non-quiz surfaces.

⚠️ OPEN — Aga's challenge, 27 Jul, and it is a good one. The new quiz funnel went live around May, not June. So the 19–20 June break is not the funnel launch — it is a later change. Do not treat 19 June as a proven cause until Nic confirms the actual variant-switch date from deploy history. What the data proves is when annual stopped selling, not why.

🔴 And the "42% → 17%" cliff is overstated. May's 42% was Memorial-promo inflated — 39 of May's 50 annual sales fell in 22–31 May. Like-for-like, promo stripped:

Windowannualquarterlymonthlytotalannual share
Feb–Apr (no promo)93788825935.9%
1–21 May (before Memorial)119193928.2%
22–31 May (MEMORIAL PROMO)393388048.8%
1–19 Jun (to the last annual sale)1116164325.6%
20 Jun – 9 Jul (the dry spell)01017270.0%
10–27 Jul (annual returns)1115356118.0%

The share was already drifting down before the June break (35.9% → 28.2% → 25.6%). The break is real and total — 21 days at exactly zero — but the "42% → 17%" framing compares a promo peak to a normal month and overstates the fall. Compare Feb–Apr, or 1–21 May, against June onward. reproduce: both Stripe keys, subscriptions created ≥ 1 Feb 2026, status ≠ incomplete, bucketed by created date and plan interval

The months, with their context attached Feb – 26 Jul 2026 · net, all rails, USD

MonthNet, all railsWhat was actually happening
Feb 2026$6,878Quiet month. Android billing begins migrating Stripe → Google Play, so from here Stripe-only numbers understate the business.
Mar 2026$10,524Quiz switches to the paywall model. New app version ships with bugs.
Apr 2026$11,973Clean month. Subscriptions net +9 — the first positive month in over a year.
May 2026 PROMO$14,273Memorial 50%-off subs. Best month of the year to that point. Subs net +15. Annual mix peaks at 42%.
Jun 2026$9,564The promo hangover — May pulled June's demand forward. And the real break: annual mix falls off a cliff to 17.7%.
Jul 2026 PROMO$22,117July-4 Lifetime, 2–14 Jul. Best cash month of the year — and $19,997 of it is one-time. Recurring: $7,957. Annual mix still flat at 18.9%.
Why the raw line lies
Two of these six months are promo pulses and a third is a hangover from one. Strip the promos and the recurring business has been broadly flat all year — it has neither collapsed nor recovered. August is the first clean read since February. The signal to watch: weekly annual adds ≥20 with no promo running.

Three things that looked like the cause and are not

❌ "Every rail fell — Stripe was down 42%" NOT TRUE like-for-like

What's actually going on

Around February–March 2026, Android subscriptions moved from Stripe billing to Google Play billing. That happened at the same time as the quiz→paywall switch.

So any Stripe-only comparison across that date is comparing (web + Android) before with (web only) after. The money didn't disappear — it moved to a different pipe. Roughly 80% of the apparent Stripe decline is that rail move.

What it means for us

Never quote a Stripe-only trend that crosses February 2026. Always combine Stripe + Apple + Google Play, or say plainly that the comparison can't be made.

❌ "Churn is eating us" REFUTED

What's actually going on

We pulled all 16,080 subscriptions across both Stripe accounts and rebuilt cancellations week by week going back two years. Cancellations are 24% lower now than before February 2026 — 23.8 a week versus 31.3 a week.

Churn by plan: annual 9.1%/month (that's at industry benchmark), quarterly 18.6%, monthly 36.7%.

The real story

We didn't develop a retention problem. We started selling the plan that churns four times faster — because annual disappeared from the paywall and monthly is what was left. Full detail in the 🪣 The bucket tab.

❌ "Email deliverability was strangling the funnel" FIXED — and opens prove it

What happened

There was a genuine fault: the domain published three conflicting DMARC records, so inbox providers ignored our email policy entirely. It was fixed. The authentication audit passed on 20 July 2026, bounce rate is 0.04%, complaints ~zero, Google Postmaster is clean.

The proof it worked

Open rates in 2026 are the best in about six years. July 2026 broadcasts opened at 20.4%, against 4.7–11.7% right through 2020–2023. Email is landing.

What is actually down — and it is not recent

Click-to-open — the share of people who open and then click — is 1.6–3.6% in 2026, against 8–31% in 2015–2019. So something real did change. But it changed around 2020, not this year. Today's click rate of 0.33% sits squarely inside the band this list has produced every year since.

So the honest conclusion is narrower than "email is broken": more people are opening our email than at any point in years, and fewer of them act once they do. That is a content, offer and list-composition question — not an inbox one. Full data in the 💷 Pricing tab's companion section below, and in 🔍 Verification.

Practical read: stop spending time on deliverability. The email play worth running is selling the year to the engaged list — job 7 in the plan, which is also the cleanest live test of whether the warm end of the list still converts.

📧 The 10-year email record, since it matters to the strategy 1,430 campaigns · Nov 2015 – Jul 2026

TMA sold mostly through email for years, so "is email still working?" is a load-bearing question — not a detail. Here is the actual record: every broadcast campaign of 300+ sends, pulled live from ActiveCampaign.

EraOpen rateClick rateClick-to-openWhat was happening
2015–20196.5–43%0.5–8.8%8–31%Smaller, warmer list. The era Aga is remembering — and the numbers back the memory.
2020–20234.7–11.7%0.07–0.70%2–7%Send volume rose to ~1M/month. Opens collapse. This is where the drop happens.
202510.0–22.3%0.23–1.34%2.3–6.6%Opens recovering
2026 (Jan–Jul)12.9–31.1%0.23–0.50%0.74–3.6%Opens near a 10-year high. Click-to-open near a 10-year low.

The three things this settles

  1. Deliverability is genuinely fixed. You cannot open at 20.4% from the spam folder.
  2. Email did get worse — but in 2020, not in 2026. The 2019→2020 step is where click-to-open falls from double digits to low single digits, and it coincides with send volume going from tens of thousands a month to roughly a million. The list got much bigger and much colder.
  3. Today is not a new collapse. July's 0.33% click rate is normal for this list across six years. Anyone describing it as a fresh emergency is reading one campaign, not the record.

🔴 And here is the part that actually answers "what changed"

Listing every 2026 campaign by name and audience separates two things the aggregate hides. It is not send size. It is who we sent to.

CampaignSendsOpenClick-to-open
CUSTOMERS & ACTIVELY ENGAGED
TMA Jan Challenge — 6 emails challenge participants314–32944.9–65.9%23.0–57.4%
980 Monthly→Annual Upgrade E1–E4 existing monthly payers814–84226.6–29.0%12.0–17.8%
July-4 Lifetime — CUSTOMERS / MEMBERS paying members1.7–2.0K26.3–34.8%4.6–12.9%
COLD LEADS — same small send sizes
967 LEADS WELCOME — E347718.0%3.49%
967 LEADS WELCOME — E248819.9%1.03%
967 LEADS WELCOME — E149922.8%0.88%
04 · Wk4 "No time"49328.4%0.71%
03 · Wk3 "£12 gym"1,96727.5%0.19%
02 · Wk2 "After 30 days"1,98224.9%0.00%
01 · Wk1 "Consistency"3,45118.2%0.00%
🔴 The finding, and it is not what it first looks like

Email converts superbly on customers and actively-engaged people — 12% to 57% click-to-open, as good as it has ever been for this business. The cold-lead sequences score 0–3.5% at the same send sizes.

But reading that as "cold leads don't convert" is wrong — because we open the emails and never ask. An audit of the live sequences found that 967 Welcome After Lead Magnet contains no offer language anywhere. Not a weak offer. None. Two of its emails are titled "Auto Response". People open at 18–23% and there is nothing to click.

We are not failing to convert cold leads. We are not asking them.

See the box below for what is in those sequences — it is worse than nothing.

🔴 The natural experiment — same offer, same week, only the audience differs

The July-4 Lifetime promo was sent to both leads and customers, in the same week, with the same creative family. That isolates audience from everything else.

AudienceEmailSendsOpenClick-to-open
LEADSEmail 2 · Launch44,74718.9%0.45%
Email 1 · Beta Hype15,53030.2%0.41%
Email 3 · Dave15,46420.4%2.00%
CUSTOMERSEmail 31,97026.3%12.93%
Email 2 · Launch1,78430.3%12.75%

Leads open perfectly well (18.9–30.2%) and then do not click. Customers open the same and click 6–30× more. This is the cleanest evidence in the whole analysis, because creative, offer and timing are held constant.

So the picture is both things at once: the lead sequences are broken and leads convert far worse than customers even when the offer is real and strong.

Two honest caveats before anyone over-reads it. ① The offer tested was lifetime — a large commitment to ask of someone who has never paid us, so it is the hardest possible test. ② The old model's leads self-selected on a specific topic via a lead magnet; these are generic quiz leads. The analogy to the old funnel is close, not exact.

🔴 CONFIRMED DEFECT — two lead emails have broken click tracking
"01 · Wk1 Consistency" (3,451 sends, 641 opens) and "02 · Wk2 After 30 days" (1,982 sends, 494 opens) each contain 5 tracked links and recorded zero clicks. 1,135 people opened these emails, and not one click was registered against 5 links. That is not possible with working links — it is a broken or untracked CTA.

Consequence for this analysis: those two are excluded from the cold-lead figures above. The honest cold-lead range is 0.71–3.49%, not "0–3.5%". Consequence for the business: a live sequence has been sending link-dead emails to leads.

🔴 What is live right now in the welcome sequences AC API, 27 Jul 2026
SequenceEnteredWhat is actually in it
750 · Welcome After Quiz
the main quiz-lead sequence
19,532🔴 "Biggest Black Friday Sale | 70% OFF" — live in July, body reads "the PRICE WILL TRIPLE on Tuesday 3rd of December"
🔴 "COVID-19 is creating a unique situation"
🔴 "Join our affiliate program" — affiliate recruitment inside a new-lead welcome
🔴 "BECOME OUR LEGACY LIFETIME MEMBER — 50% OFF, $149" — a price that no longer exists; links point at the old app checkout
967 · Welcome After Lead Magnet529🔴 No offer language at all. Two emails titled "Auto Response". CTOR 0.71–3.49%.
988 · Welcome After App Signup216🔴 Four emails saying "Seeing the pandemic…"
🔴 "Memorial Week Sale… signup before the end of May" — live in July
756 / 757 · Abandoned Cart0Built, live, and has never fired once
990 · Monthly→Annual Upgrade0Built, switched off, never fired

So the honest read on the era Aga remembers: email is not worn out and the audience is not colder in some unfixable way. The lead journey has decayed into stale promos, pandemic-era content and dead ends. That is a fixable problem, and it is cheaper than anything else in this document.

What this does NOT let us conclude: we still do not know whether a cold lead converts given a real offer, because we have not made one. That is the test worth running.

🔴 A possible live defect, flagged not proven
"01 · Wk1 Consistency" (3,451 sends) and "02 · Wk2 After 30 days" (1,982 sends) recorded 0.00% click-to-open across 5,433 sends combined. Emails that are opened by hundreds of people and clicked by nobody are usually either missing a link or carrying a broken one.

Not verified — it may be a deliberately link-free nurture email. The check is thirty seconds: open those two in ActiveCampaign and look for a working CTA. Worth doing before any conclusion about lead-email quality, because if they are broken then the cold-lead numbers above are unfairly pessimistic.

📧 The automations — what actually sells on an ongoing basis 368 automation emails · lifetime cumulative · AC API 27 Jul 2026

Broadcasts are one-off. The automations are the engine — they run against every new lead, forever. This is their real performance.

AutomationEmailsSendsOpenClick-to-openRead
988 · Welcome After App Signup1259824.7%18.92%best CTOR in the estate — tiny volume
758 · Nurture Sequence 23425,86131.5%17.65%our best real sequence — and barely used
980 · Monthly→Annual Upgrade43,31027.9%15.94%🔴 excellent — and switched OFF
766 · Facebook Lead Form1310,6651.7%10.33%🔴 1.7% open = a broken or dead list
760 · School of Strength1427024.8%7.46%healthy, negligible volume
977 · Sunset / Re-permission928614.3%7.32%working as intended
751 · Nurture Sequence 124397,16421.0%6.25%the workhorse — 3× the volume of everything else
975 · Onboarding After Purchase221,56042.9%5.97%best open rate anywhere
750 · Welcome After Quiz18156,94515.3%3.47%🔴 the main quiz-lead sequence — full of stale promos
973 · Nurture 1 "NEW COPY"2383,48918.7%1.87%🔴 the rewrite performs 3.3× WORSE than the original it replaced
967 · Welcome After Lead Magnet161,53721.4%1.52%🔴 contains no offer at all
976 · Cancelled Win-Back1374834.8%1.15%opens well, converts almost nobody
979 · Re-Engagement77,89323.0%0.11%🔴 effectively dead
925 · 28-Day Challenge51,13652.8%0.00%🔴 highest open rate in the estate, zero clicks

What the automation table says that the broadcast data could not

  1. 🔴 The rewrite made it worse. 973 "Nurture Sequence 1 NEW COPY" converts at 1.87% against the original 751 Nurture Sequence 1's 6.25% — a third of the performance, across 83,489 sends. That is a Claude-written rewrite underperforming the copy it replaced, and it is running live. It should be paused and the original restored while it is investigated.
  2. 🔴 Our best sequence is our least used. 758 Nurture Sequence 2 converts at 17.65% — nearly 3× the workhorse — on 25,861 sends against 751 Nurture Sequence 1's 397,164. We route almost everyone into the weaker sequence. Understanding why 758 Nurture Sequence 2 works is probably worth more than writing anything new.
  3. 🔴 Two automations open brilliantly and convert nobody. The 28-Day Challenge opens at 52.8% — the best in the estate — and records 0.00% clicks. Re-Engagement opens at 23.0% and converts at 0.11%. Combined with the two link-dead lead emails already confirmed, broken or missing CTAs look systemic rather than isolated.
  4. 🔴 766 Facebook Lead Form opens at 1.7%. Everything else sits between 14% and 53%. A 1.7% open rate on 10,665 sends means that list is dead, fake, or mis-addressed — worth an hour to find out, because it may also be dragging domain reputation.
  5. 980 Monthly→Annual converts at 15.94% and is switched off. It is one of the three best-performing things we have ever built.
Limit on this table
These are lifetime cumulative figures — ActiveCampaign does not expose automation performance by month. So this shows which sequences work, not whether any of them changed recently. A month-by-month automation series would need per-send logging we do not currently keep.

What this does NOT prove — stated plainly

  • Audience quality and creative quality cannot be separated here. The lead sequences may simply be worse-written, not aimed at a colder audience. Nothing in this data distinguishes the two.
  • We have never sent a genuinely strong offer to a cold-lead segment. The lead emails above are nurture content, not offers. So "cold leads don't convert" is really "our nurture content doesn't get clicks".
  • These are broadcast campaigns only. The big nurture automations (750 Welcome, 751 Nurture 1) report lifetime cumulative figures spanning years and cannot show what is true this month.
  • Some months rest on very few campaigns — February 2026 is a single 314-send campaign. Ignore the extremes.

The question worth answering next

Can a cold lead be sold to by email at all, given a real offer? Job 7 tests the warm end and should do well. The harder, more valuable test is a genuine offer to a cold-lead segment — because that single number decides whether any free-capture-then-sell-by-email model is viable, including the one Aga is asking about.

Reproduce: ActiveCampaign /api/3/campaigns, all 1,430 campaigns, ≥300 sends, by name and send month. Pulled 27 Jul 2026.

What actually broke: the annual plan vanished Jan – 26 Jul 2026 · % of new subs created each month

MonthJanFebMarAprMayJunJul
Annual % of new subs34.0%35.2%41.0%32.3%42.0%17.7%18.9%
🔴 The proof it is a removed tier, not falling demand Stripe, by week
Week25–31 May1–7 Jun8–14 Jun15–21 Jun22–28 Jun29 Jun–5 Jul6–12 Jul13–19 Jul20–26 Jul
Annual2972200158
Quarterly17754541710
Monthly78747451221

The discriminator is the asymmetry, not the zeros. Falling demand suppresses every tier together. In 22–28 Jun–29 Jun–5 Jul quarterly and monthly sat at ordinary levels while annual hit exactly zero. And in 13–19 Jul–20–26 Jul monthly surges to 12 and 21 — demand is plainly not falling — while annual limps at 5 and 8. One tier cratered while the others behaved normally.

Dating it: the kill lands at the start of 22–28 Jun, 19–20 June. The small residual annual sales in 8–14 Jun–15–21 Jun and the 13–19 Jul–20–26 Jul recovery are almost certainly non-quiz — the monthly→annual upgrade automations and manual/in-app sales — which is consistent with the tier being gone from the quiz specifically.

⚠️ The honest limit: Stripe subscriptions are not channel-attributed, so this data cannot by itself prove the quiz paywall is the cause. The code read below supplies that half. To close it completely: check whether any annual created after 19–20 June carries a quiz price-ID or quiz UTM.

🔴 The mechanism — found by reading the live code, not by guessing

The live quiz ships a setting called VITE_QUIZ_VARIANT="paywall_v2_2". It is a hardcoded build constant with no randomisation — so 100% of visitors see that one version, and the quiz cannot run an A/B test at all right now.

The tiers in that version are: 1-Week · 4-Week $12.48 · 12-Week $24.98. There is no annual plan. And the function that picks the tiers reads only the version — never the path — so this is every visitor on every quiz path, not just one journey.

The timing settles it: the annual cliff happens in June. The lifetime promo ran 2–14 July. The promo cannot explain a fall that had already happened. The missing tier can.

✅ And the fix is already built
A different version — paywall_v2_1 — already exists in the codebase and is unused. It has a coaching tier that acts as a price anchor, an annual plan, and a monthly plan, and its pre-select logic automatically highlights annual. It has never been switched on. See the 💷 Pricing & paywall tab for exactly how to turn it on safely — there is a trap in it.

What half-price selling actually costs book = live 27 Jul · new sales = 90d to 27 Jul

PlanSubs on the bookWhat the book paysWhat a new buyer pays firstWhat that buyer renews at
Annual432$155.71/yr$78.50$157
Quarterly154$49.58$24.98$49.97
Monthly67$19.08$24.36$24.97

The discount is first-payment only. Of the 72 annual subscriptions created in the last 90 days, 69 carry no discount at all today — the coupon is duration: once, consumed on the first invoice and removed. Actual first payments: 44 paid $78.50 · 22 paid $0.00 (free trial, not yet charged) · 4 paid $157.

✅ So the book does not erode
Every one of those 44 buyers will be invoiced $157 at renewal. Hold the subscriber count flat and refill at today's prices and MRR moves +3.3%, not down. The half-price selling costs us once, not forever.
⚠️ Where it does cost us
Someone pays $78.50 and is invoiced $157 twelve months later. That gap is the most likely driver of annual renewal churn — it is a retention cost, not a revenue-per-slot cost, and it is measured in a different place.

$97 charged today fixes both ends: it collects more than $78.50 does now, and the price paid finally equals the price renewed.

Reproduce: all status=active subscriptions across both Stripe accounts (book side) against all subscriptions created in the trailing 90 days plus their paid invoices (new-sale side), 27 Jul 2026.

🪣 The bucket — re-baselined

🔄 UPDATED 5 Aug 2026 — the bucket is net-positive; the old "5–6:1 runoff" is dead
Live engine numbers (5 Aug): last 7 days won 37 / cancel-ends 34 / net +16; last 30 135 won, net +35. The widely-quoted "34 cancels vs 6–13 new per week" was a busiest-week snapshot read as a rate and does not reproduce — the 16,080-subscription re-baseline puts it at 17.0 adds vs 23.8 ends. Money churn has been flat ~13%/mo for 22 months. 🔴 But the composition is worse: monthly is now 64.4% of sales and churns 36.7%/mo against annual's 9.1%"we didn't develop a retention problem, we started selling the plan that churns four times faster."
⭐ The one thing to take from this tab
Churn did not get worse. Cancellations fell 24% but new subs fell 27.7% alongside — that is a population leaving the Stripe rail for Google Play, not retention improving.

How many subscribers come in, how many go out, and whether the bucket is filling or draining — rebuilt from all 16,080 subscriptions across both Stripe accounts, back to January 2025.

🔴 "~34 cancels a week vs ~13 new subs a week" — RETIRED
That number was a busiest-week snapshot read as a rate. Rebuilt properly from all 16,080 subscriptions, weekly, across both Stripe accounts, the picture inverts.

Two years of the bucket, weekly Jan 2025 – 26 Jul 2026 · 16,080 subs · both Stripe accounts

EraNew subs /wkCancellations /wkNet /wkRead
The old-funnel era — 27 Jan 2025 – 22 Feb 2026 (56 weeks)23.531.3−7.8Net-negative every month
2025, full year23.231.5−8.3Same, all year
Paywall era, first stretch — 23 Feb – 31 May 2026 (14 weeks)21.921.4+0.4The only non-negative stretch in two years
Paywall era, since — 1 Jun – 26 Jul 2026 (8 weeks)17.023.8−6.8Back to roughly the long-run average
⚠️ Two things these counts do NOT prove

Both are easy misreads, and both would send us after the wrong problem.

❌ It does not prove churn improved
What fellChangeWhat it means
Cancellations, in count−24.0%looks like a win
New subs, in count−27.7%fell in parallel — so it isn't

The rate barely moved. June: 89 endings on a base of 763 = 11.7%/month. Pre-Feb back-solves to ~11.3–13.6%/month. The base shrank at the same time, so fewer cancellations is arithmetic, not retention.

The tell: both sides falling together is the signature of a population leaving the rail, not people staying longer. Android was ~25% of the Stripe base — and 31.3 × 0.75 = 23.5, almost exactly the Jun–Jul figure. The "improvement" is the Android migration.

❌ It does not prove the paywall era grew
23 Feb – 31 May, net per weekValueRead
As reported+0.4the only non-negative stretch in two years
Memorial promo stripped−2.7the real underlying rate

The paywall era has never had a positive non-promo block. Best stretch on record — but on quick ratio, not net count. Two promo weeks manufactured the plus sign.

So what do you take from it? Not "churn is fixed" and not "the paywall grew the base". Take this: the bucket drains more slowly than it did, mostly because a chunk of it moved to Google Play — and it has never actually filled without a discount running.

The number to put on the cockpit eras labelled in the table

Weekly counts are the wrong health metric because the base keeps changing underneath them. The quick ratio (new ÷ ended) is dimensionless and immune to base size.

EraWeeksAdds/wkEnds/wkNet/wkQuick ratio
2025 full year — old funnel, web + Android5223.231.50.74
Pre-Feb-2026 — old funnel, web + Android5623.531.3−7.80.75
Paywalled era to date — web only2220.122.3−2.10.90
  — pre-promo (23 Feb – 17 May)1218.621.2−2.70.87
  — Memorial promo (18–24 May–25–31 May)242.022.5+19.51.87
  — post-promo / July (1–7 Jun–20–26 Jul)817.023.8−6.80.72
Trailing 13 weeks — the operating line 27 Apr – 26 Jul 20261319.923.8−3.80.84
The sentence that should replace "34 vs 13" everywhere
"Over the paywalled era — 23 February to 26 July 2026 — the subscription bucket has run at a quick ratio of 0.90 — 20.1 new against 22.3 ended per week, net −2.1/week, −47 subscriptions counted. That is roughly half the leak of the pre-paywall era (−7.8/wk at 0.75), but it has never crossed 1.0 without a discount promo. Neither figure is like-for-like with 2025, because Android billing left the Stripe rail in Feb–Mar 2026."
And the last 8 weeks are statistically indistinguishable from zero
Net −6.75/week with a standard error of 4.40 gives a 95% confidence interval of −15.4 to +1.9. New subs are 2.4× more volatile than endings (CV 0.64 vs 0.27). Acquisition is the noisy variable; churn is the stable one — which tells you which side to run experiments on and which side to run a slow product programme on.

Window law, tightened: "never annualise under 4 weeks" isn't enough. Our promo cadence is 6–10 weeks, so the minimum honest window is one full promo cycle — use 13 weeks trailing. An 8-week window sitting in a post-promo trough will always read as a crisis.

Week by week, so you can see the noise · 27 Apr – 26 Jul 2026

Week27 Apr–3 May4–10 May11–17 May18–24 May25–31 May1–7 Jun8–14 Jun15–21 Jun22–28 Jun29 Jun–5 Jul6–12 Jul13–19 Jul20–26 Jul
New111513315322141012872439
Ended23242720252917151831292922
Net−12−9−14+11+28−7−3−5−6−23−22−5+17
Why single weeks must never be annualised
Cancellations across 26 weeks ranged from 13 to 35 with a mean of 21.8. Annualise the busiest week and you get 21.4%/month churn; annualise the quietest and you get 8.0%. Same business, same period. That is exactly how "34 vs 13" was born. House rule from today: never annualise a window shorter than four weeks.

The lifetime question, measured charges 25 Jun – 27 Jul · cancels Jun + Jul 2026

Some July cancellations should be upgrades, not churn — existing members who bought lifetime and then cancelled their subscription. We measured it rather than assuming.

CheckResult
Lifetime charges in the window (25 Jun – 27 Jul)68 · $19,833.72
— with a Stripe customer ID11 rest were guest checkouts
Every June + July cancellation, cross-referenced by email and customer ID190 cancels examined
Cancellations that are lifetime upgraders, not churn10 (9 in July, 1 in June)
Lifetime upgraders sitting in the cancel queue0
The honest answer
Aga is right in direction, and the effect is small. Roughly 9% of July's cancellations are lifetime upgrades. Strip them and July still shows ~92 endings.

Treat 10 as a floor, not a final number. 57 of the 68 lifetime buyers checked out as guests with no customer record, so some may have used a different email than their subscription. Any upgrader on the Apple/Google rail is invisible to this check entirely.

Reproduce: full Stripe subscription pull + charges pull, cross-referenced on lowercase email and customer ID. Cancellations counted as ended_at, or canceled_at where status is canceled.

🔴 The decisive finding: there was no acquisition collapse Jan – 26 Jul 2026 · subs created per month

Apply the verified annual share to the verified monthly new-subs and the June "collapse" resolves into one line:

JanFebMarAprMayJunJul (26d)
Annual new subs36313230501114
Everything else70574663695160
Non-annual sign-ups never left the normal range. Annual fell 61%.

June's 51 non-annual sits between March's 46 and February's 57. July's 60 — about 72 on a full-month basis — is above the January–April average. Meanwhile annual went from a 32/month average to 11 and 14.

The annual line accounts for ~85% of the entire shortfall as counted, and ~100% once July is put on a full-month basis.

There was no acquisition collapse. There was an annual-tier deletion.

And the promos explain the rest of the shape — all of it

The Memorial 50%-off sale borrowed 82% of its own excess from the following six weeks PULL-FORWARD

Weeks 21–22 produced +46.9 new subs above baseline. The following six weeks (1–7 Jun–6–12 Jul) ran a −38.3 deficit. So ~82% of the promo's excess was borrowed from the next six weeks.

Net incremental across the whole 8-week neighbourhood: about +9 subscriptions — all at 50% off.

It probably also caused the 29 Jun–5 Jul–6–12 Jul endings spike (31 and 29): a late-May half-price buyer hits full price at month two in exactly that window. Testable — check whether those cancellations carry a Memorial coupon.

The implication is uncomfortable and worth sitting with: a discount subscription promo netted us roughly nine extra subscribers, at half price, and cost us a cancellation spike.

The two worst new-sub weeks in the series sit exactly on the July-4 lifetime promo NOT A LOSS

29 Jun–5 Jul (8 new) and 6–12 Jul (7 new) are the two worst weeks in the entire 13-week series — and the lifetime promo ran 2–14 July, precisely those weeks. The shortfall against baseline is about 22 subscriptions.

In the same window: 68 lifetime charges, $19,834.

The subscribers did not disappear. They bought lifetime instead. That is a channel switch with a better cash profile, not a loss — and it inflated the endings column at the same time via upgraders. 13–19 Jul (24) and 20–26 Jul (39 — the best non-promo week in the series) recover the moment the promo ends.

This is why subscription-count net is a broken health metric during a lifetime promo. July reads −27 subs on the ledger, but roughly +41 net customers and +$19.8K cash. That is not a bad month being reported as a bad month.

What this changes about the plan

The priority moves
  1. "Arrest the leak before you scale" is retired as a sequencing rule. The leak roughly halved on its own when the funnel changed and has sat at a quick ratio of 0.74–0.90 for two years. It is not the binding constraint, and holding the plan behind it delays the one fix that pays.
  2. The constraint is neither churn nor acquisition volume — it is plan mix. A revenue problem expressed through a missing paywall tier.
  3. New sequence: fix the silent failures → restore annual → activate the dormant lanes → then durable product retention.
  4. Monthly-plan churn at 36.7%/month is genuinely bad (category norm is 8–15%). But note where that loop closes: the cheapest way to fix monthly churn is to stop selling monthly. Restoring annual is the retention fix.

🔻 The WEB QUIZ FUNNEL — walked end to end 28 Apr – 26 Jul 2026

🔄 UPDATED 5 Aug 2026 — two corrections to the funnel numbers below
1. The lead-rate collapse is over. The 6–12 Jul fall (26.6% → 17.1%) recovered to ~26.6% by 3 Aug; /api/quiz/config returns 200 (checked 2 Aug). It was also a separate event from the June revenue break — it began 17 days later. 2. 🔴 There is no single "lead" number. The same metric reads 44, 106 or 179 per 7 days depending on source (4.07× spread) and the rate reads 23.2%, 4.1% or 1.1%. NIC-42 is open to name one denominator — until it lands, never quote a lead rate without naming its source.
⭐ The one thing to take from this tab
3 of every 100 landings pay. Two big losses — the landing screen (2,816) and the paywall (570) — plus 356 who click buy and never reach Stripe.
Landed on the quiz
5,164
100.0%
▼ 2,816 leave without one tap
Answered first question
2,348
45.5%
▼ 857 lost across ~40 screens
Reached email capture
1,491
28.9%
▼ 265 lost — the email wall
Became a lead
1,226
23.7%
▼ 52 lost
Reached the paywall
1,174
22.7%
▼ 570 lost — half the paywall
Clicked buy
604
11.7%
▼ 356 vanish between GA4 and Stripe
Subscription created
248
4.8%
▼ 95 lost — created but never charged
Took money
153
2.96%
1 in 33.8landings become a customer
1 in 8.0leads become a customer
1 in 3.9buy-clicks become a customer

Read it as two big losses and one blind spot. The landing screen takes 2,816 before anyone taps. The paywall takes 570 more. And 356 people click buy and never appear in Stripe — invisible to either system alone, because GA4 cannot see purchases and Stripe cannot see intent.

📊 This tab is the summary — the full screen-by-screen study is its own tab
Every screen, cut by source, device, country and week, cross-railed to Stripe for true paid conversion. All 12 sections of it are folded into this document — nothing lives outside it.

→ Open 🔬 Drop-off detail — the full analysis

Every step from landing on the quiz to money in the bank. Reproducible in one command; two bugs that were silently corrupting these numbers have been found and fixed.

StepPeopleOf previousOf all landingsRead
Landed on the quiz5,164100%
Answered the first question2,34845.5%45.5%−54.5% · biggest single loss in the business
Reached the email box1,49163.5%28.9%~40 screens, none loses >2.5%
Gave us their email1,22682.2%23.7%the email wall is not the problem
Reached the paywall1,17495.8%22.7%
Clicked buy60451.4%11.7%
Subscription created in Stripe24941.2%4.8%normal cart abandonment, not a bug
Paid us money15461.8%2.98%1 customer per 33.5 landings
python3 tools/quiz-analytics/pull_quiz_deep.py 90daysAgo yesterday + python3 tools/finance/quiz_buys_90d.py 90

📅 Leads by month — the real series ActiveCampaign, contacts created, pulled 27 Jul 2026

Two different numbers have been quoted as if they were one. Here is the reconciliation.
"Leads at an all-time high" and "leads are declining" are both true of different measures. Total contacts created is inflated by bulk imports and is not a lead metric. The quiz's own tag is the honest one. Both are below.
MonthAll contacts createdTagged as importQuizUserCreatedNote
2025-01 … 2025-09633–1,634/mo4–310before the new quiz existed
2025-108,504142155140🔴 clearly a bulk import — only 142 carry the tag
2025-111,426260306
2025-1249534181
2026-0175742290
2026-0268536333
2026-0365438318
2026-043,443175277271🔴 import — only 175 tagged
2026-05950105352
2026-063,054240530157🔴 import · quiz leads peak at 530
2026-07 (26 days)4,7151,791326 ≈389 full-month8🔴 import (tag retired with the old quiz)

What this actually says

  1. Quiz leads DID hit an all-time high — in June, at 530. Real, and up roughly 3× from a standing start of 155 in October 2025.
  2. And they are now down from that peak. July's 326 over 26 days is a ~389 full-month pace — about 27% below June, though still well above every month before May.
  3. Both statements are true, and they get confused. The all-time high is June; the decline is June→July and the 6–12 Jul–30 weekly series. They are the same series at different resolutions.
  4. 🔴 Total contacts created is not a lead metric and should not be used as one. Four months (Oct-25, Apr-26, Jun-26, Jul-26) are dominated by bulk imports, and the Source: import tag catches only a fraction of them — October shows 8,504 contacts with just 142 tagged. Any "list growth" read off that column is reading an import.
✅ CLOSED — not a signal
An AC tag count fell because the old quiz carried that tag and the new quiz does not. It is the migration, not a funnel break. Closed 27 Jul 2026 — recorded only so it is not re-discovered.

The three things this tells us

① The quiz body is fine — stop looking there GOOD NEWS

There are about 40 screens between the first question and the email box. Not one of them loses more than 2.5% of the people who reach it. The assessment itself keeps people engaged.

The email wall costs 13.5%, and 82.2% of everyone who reaches it hands over an email address. That is a healthy capture rate. There is no work to do here.

② The landing screen loses 54.5% — and it's a page problem, not a traffic problem BIGGEST LOSS

2,816 people in 90 days arrived and never tapped once. It's the single biggest loss in the business.

But read it carefully before acting

  • It has been stable for weeks — 54.4% on 9 July, 54.5% now. Stable means structural, not a regression. Nothing broke; it has always been like this.
  • Strip the bot traffic and it's 49.8%, not 54.5%. About five points of "our landing page is bad" is actually "we are buying bots".
  • The bounce rate barely differs by source — Facebook 52.9%, Instagram 51.3%, Google 48.2%, direct 47.1%. A spread of only 4.7 points. So this is not "Meta sends bad traffic to the landing page" — it's a page that loses roughly half of everyone, whoever they are.
  • 🔴 The full per-source walk — read this before anyone says "it's a Meta problem, not the page"

    Two different problems at two different stages. Conflating them kills the landing-page work:

    SourceLandedBounced at landingAnswered Q1Clicked buyVerdict
    Owned (Leadpages)11268%23.2%STRONG — feed it
    Direct1,50047.1%53%18.9%STRONG — feed it
    Google69048.2%42%15.5%STRONG — feed it
    Instagram74251.3%49%8.8%WEAK
    Facebook1,65852.9%47%8.4%WEAK
    Audience Network12910%1.6%DEAD — kill
    m.facebook.com1445%1.4%DEAD — kill
    googleads.g.doubleclick1361%0.0%⚠️ see note
    facebook.com1284%0.0%DEAD — kill
    🔴 The two-stage answer
    At the landing screen, source barely matters. Every real source bounces between 47.1% and 52.9% — under 6 points end to end. Google, our best paid source, still loses 48.2%. Direct — people who typed our name in — still loses 47.1%. A page that loses half the people who already know us is a page problem, not a traffic problem.

    Downstream of the landing screen, source matters enormously. Buy-clicks run 18.9% direct · 15.5% Google · 8.8% Instagram · 8.4% Facebook — Meta converts ~2.5× worse and is 54.3% of all traffic. That IS a traffic-quality problem, and it is real.

    Both are true; each needs its own fix. Cut the dead placements and rebalance away from Meta and fix the page. Fixing traffic quality will not move the landing bounce — Google already bounces at 48.2%.

    ⚠️ One row could not be reproduced — do not act on it yet
    A live GA4 pull scoped to the quiz host shows googleads.g.doubleclick.net at 224 sessions, 30.4% bounce and 280 key events — 1.25 events per session, the highest density of any source. That is the opposite of "zero leads, zero buy-clicks". Hold the Display/PMax exclusion until this is resolved. The other three dead sources reproduce and are safe to cut.

Why it is not first in the plan

A number that has been stable for months is a hard problem, not a broken one — there is no recent change to undo. Fixing it means genuine creative and testing work, and right now we cannot even A/B test the quiz (see the pricing tab). Cut the junk traffic, re-baseline at 49.8%, get testing working, then attack it properly.

③ The lead rate collapsed in week 28 and is still down STILL BLEEDING
Weeks 18–27 average6–12 Jul13–19 Jul20–26 Jul
Visitors~384404540499
Became a lead26.6%17.1%14.6%19.6%

Traffic held. Only the conversion to lead fell. Week 29 was the floor at 14.6%. Week 30 has partly recovered to 19.6% but is still 26% below baseline. At current volume that is roughly 40 leads a week still being lost.

The leading suspect was the /api/quiz/config call returning a 404 on the live quiz. ✅ FIXED — returns 200, live-checked 2 Aug 2026; the lead rate recovered to ~26.6% by 3 Aug. The start date is permanently undatable. Ignore later mentions of this as a live 404. That link is unverified — dating when the 404 started, against the early-July breakpoint, is the cheapest diagnostic we have and it is the first job in the plan.

Two things that are not broken, so nobody wastes a week on them

The 604 → 249 gap (41% completion) is normal NOT A BUG

356 people clicked buy and never appeared in Stripe. That looks alarming and it isn't: 41% completion on a card-required subscription checkout is roughly normal — cart abandonment of ~70% is typical across e-commerce.

All six checkout URLs were tested and return 200. The destination is not broken. This is conversion-rate work, not a bug hunt.

But there is a real defect hiding next to it INVISIBLE BY DESIGN

In the live code: if (i!=="control" && !P?.checkoutUrl) return;

In plain English: if a visitor is on any non-control version and the checkout link is missing, the button silently does nothing. No error message. No fallback. And no analytics event.

That last part is the problem. Because it fires no event, these people are not in the 356 — they are not in any number we have. They are unmeasurable by construction. We cannot size this defect until it is logged, which is why "make the dead button speak" is in the plan even though it banks no cash by itself.

💷 Pricing & the paywall

🔄 UPDATED 5 Aug 2026 — lifetime is UNBANNED, and the coaching tier is rejected
🔒 Aga ruled 5 Aug: warm-list lifetime at $297 is back ON — capped windows, warm list only, never cold (July's cold-paid lifetime cohort retained at D28 ≈ 0%). The ~$413 LTV that justified the ban has no derivation anywhere in the estate and is retired; her $150 is real (Stripe's own book-average). Model lifetime cash net of the 60-day guarantee and the 9.88% refund rate — it is not banked for two months. ⛔ A premium COACHING tier is REJECTED"there is no one to execute on this; we don't have a trainer." Only a zero-human-delivery premium tier could ever be revisited. 🔴 Two free defects: the win-back ladder is inverted (SAVE30 = 30% off $157 = $109.90, dearer than the $97 front door) and monthly's price has not moved while it became 64.4% of sales at LTV $63 vs annual's $162.
⭐ The one thing to take from this tab
Ruled: annual $97, charged today, pre-selected, ramps kept. $157 behind a trial is the built-not-shipped fallback. $97 behind a trial is the one unsafe combination.
📚 The full pricing analysis lives in its own documents
This tab is the decision. These are the working:
DocumentWhat it answers
📊 Top models — deep analysisAll four pricing models costed out, with the demand and break-even maths. All four are already coded as live variants (v2_1v2_4).
📱 The new quiz checkouts + A/B test planWhat each one looks like on a phone — the $97 ship, the $157 fallback, and what is LIVE today.
🔧 Nic implementation briefTier lists, bucketing code, instrumentation and acceptance criteria for the build.
📐 THE UI CONTRACT — what Nic builds
tma-paywall-spec.netlify.app
The same page with every variant stripped out. One arm only — hero 12-Month full-width + two ramps, first-year cost on every tier. No model tabs, no A/B appendix, nothing to choose between. Send Nic this one.

Annual goes back on the quiz paywall. The price is the open decision, and this tab lays out both cases in full plus the trap in doing it naively.

🛠️ THE DESIGN IS BUILT — 27 Jul 2026

Live mockup: paywall-4model-v2 → arm m6 “Ladder $97 · nothing behind a trial” (opens on that arm by default).

The offer as built. 4-Week $12.48 · 12-Week $24.98 · 12-Month $157 → $97, pre-selected. Everything charged today, no trial on any tier. Ramps kept at their current prices per the ruling — they are the volume ramp and the decoy.

🔴 The discount asymmetry Aga caught. The ramps are 50% off list ($24.97→$12.48, $49.97→$24.98) while the annual is 38% off ($157→$97) — so the tier we want chosen carries the shallowest discount. Per-day that flattened the ladder to $0.45→$0.30→$0.27, a final step of just −11%. Fixed without touching a price: per-day removed from the two ramps (they now lead with the amount actually charged), so $0.27/day is the only per-day figure on the page. Annual badge is now “38% OFF · SAVE $60” — it previously read smaller than the 12-Week’s “SAVE 33%”.

🆕 The paywall is now also the checkout. Apple Pay / Google Pay and card entry sit directly under the tiers, mirroring the live checkout (#express-checkout-element + #payment-element). This removes the cross-domain redirect at peak intent — where 604 buy-clicks became 248 subscription starts. Plan selection is not a blocker: the selected tier drives the amount.

🔴 Fabricated proof removed (three seats flagged it independently). A counter random-walking 22–46 every 4.2s, “183 started today” (~100× real volume), and a toast of invented people — one reusing “Gareth”, a real member quoted 400px below. All deleted. The toast now rotates three real members with their real faces and quotes (Andrew 29, Gareth 46, Luke 31). Under the DMCC Act 2024 false limited-availability claims are automatically unfair — CMA direct enforcement, fines to 10% of turnover, TMA is Glasgow-based.

Also fixed: a false $0/7-day-trial price flashing in the sticky bar before JS loaded · “$19.97 total” on tiers that all recur (Stripe-verified) · disclosure text failing WCAG AA (3.77:1) · a POPULAR badge steering buyers to the $24.98 tier · an exit-intent modal with no trigger at all · six fabricated testimonial screenshots retired across 9 pages. Renewal terms stay in the legal microcopy at the consent point; the card says “price locked for 12 months”.

✅ AGA HAS RULED — 27 Jul 2026: annual goes back at $97, CHARGED TODAY
"Restore annual, charged today, at $97." Ship it as the hybrid:
  • Annual $97, charged today, no trial, pre-selected on render.
  • Framed "38% off" or "save $60" — not "50% off", because 50% off $157 is $78.50 and the claim has to reconcile against the price shown on the same card.
  • Keep the 4-week and 12-week ramps at their current prices. They are the volume ramp and the decoy — removing them is what makes a bare $97 swap fail. They also keep the per-week ladder honest: $6.20 → $3.84 → $1.87.

🔴 Never $97 behind a trial — that models at −9% at the measured 36.9% trial conversion. $97 is safe only when charged today. Kill-switch: rolling 14-day revenue per paywall view below $6.04 ⇒ revert.

→ See it on a phone: the new quiz checkouts

📋 SUPERSEDED — the earlier CMO/CEO recommendation, kept as the fallback
$157 behind the 7-day trial, pre-selected, monthly stripped of its trial. This is now the built-not-shipped fallback, not the plan. Its falsifiers are our monitoring list. The reasoning, in the CMO's order:

Ship this now; make $97 the instrumented second test. The reasoning, in the CMO's order:

  1. Reversibility decides it under a data vacuum. Only 4 of 154 buyers in 90 days ever paid $157 — we have no annual baseline on this traffic. When you are this blind, take the move you can undo. This is a config flip on already-shipped code; $97 is a permanent 38% price cut that burns a published anchor across four channels. Never make your first test into the unknown an irreversible one.
  2. The estate anchor is a demand cost. $97 forces an estate-wide re-sync and destroys the "$157/yr (~$3.02/wk)" line that makes every weekly-price claim land.
  3. The mix-versus-volume argument is airtight. $97-charged-today next to any free-start option loses the free-start buyers; remove the free option and you lose volume. $157-with-trial resolves it by making annual itself the free-start, pre-selected option.
  4. Zero marginal code — it ships in hours, and developer time is the binding constraint.

What would change the ruling: the store export shows the old low-entry era materially out-earned the web rail · trial conversion lands below 26.3% (the break-even) after shipping · checkout completion fails to rise under all-$0-today.

And a sharpening: there are three options here, not two. The pricing seat's actual recommendation is $97-hybrid — annual at $97 with no discount framing, but monthly and quarterly keeping 50% off as entry ramps. The mix-versus-volume attack does not fully land on that version. $157-with-trial first, $97-hybrid as the instrumented second test once A/B bucketing exists. Never launch at $117 — no baseline.

🔴 THE TRAP — read this before building anything

The obvious fix is "switch the paywall from version v2_2 to version v2_1, which has annual". That is the one move that loses money.

Version v2_1 makes every tier a 7-day free trial. Today's start-to-paid rate is a healthy 61.8% precisely because the current 4-week and 12-week tiers charge immediately. Flipping to trials trades cash-in-hand for cash gated behind a 36.9% trial conversion rate.

The four combinations, priced modelled against the 90d baseline: 154 sales / $7,091.97

ConfigurationEffect on cashVerdict
Annual $97 — charged today (no trial)+53%✅ THE RECOMMENDATION
Annual $157 — with the 7-day trial+40%✅ also safe
Annual $97 at 50% start-to-paid+24%tolerable
Annual $97 — trial-gated (the naive flip)−9%❌ THE TRAP

How much room we have

Annual priceAverage sale valueSales needed to break even (vs today's 154)Demand we can afford to lose
$157$108.446558%
$97 (the ruling)$70.5110135%
$78.50 (today's discounted reality)$58.8112122%

Read: at $157 we could lose well over half our buyers and still be ahead. At $97 we can only lose about a third. $97 is the safer price psychologically and the riskier price arithmetically. That asymmetry is worth knowing before we commit.

What we actually charge today — the discount problem 90 days to 27 Jul 2026 · 154 new sub sales

Annual price chargedSales (90d)Cash
$78.50 50% off44$3,454.00
$157.00 full price4$628.00
$79.99 / $109.905$459.77
$24.98 and $24.97 a YEAR for $25 — configuration fault2$49.95

Eight out of ten annual buyers paid half price. We have essentially never sold the year at a real price to this traffic — so "will $97 sell?" is a genuinely open question, not a formality. That is why the quiz-funnel and pricing specialists were asked to rule on it; their answer is below.

🙋 "Is $157 too big an ask for quiz traffic?" — the quiz-funnel expert's answer 27 Jul 2026

The short version
The worry is real but it is aimed one screen too early. Under this construction nobody is asked for $157 at the paywall — they are asked for $0. The $157 only appears on day 8, after a week with the product. That is the right place for a big number.

And $157/year is $13.08/month. It is not a high price. It is a big lump. Those are different problems, and only the lump exists here.

Where the risk actually sits — three moments, three different fixes

MomentRiskWhy
A · The paywall tier cardLOWthe number they see is $0 today. Cold traffic converts better on $0 than on $12.48.
B · The checkout screenHIGH🔴 this is where the instinct is most correct. 604 buy-clicks → 249 subs = 41.2% completion, 356 people gone. If the paywall promises $0 and the checkout renders $157, the shock lands on the step already losing 59%.
C · The day-8 chargeMEDIUMdecides the money — but decided by whether they trained in week one and whether they saw it coming, not by the number.

None of these is fixed by lowering the price. A and B are presentation; C is activation and warning.

🔴 PRE-SHIP BLOCKER 1 — the 12-week tier annualises CHEAPER than annual
TierAnnualised
4-week $12.48 × 13$162.24/yr
12-week $24.98 × 4.33$108.25/yr
Annual$157/yr

As priced, "annual is the best value" is not a true statement — the 12-week is $49 a year cheaper, and a careful shopper picks it.

This only resolves if the short tiers are introductory rates that renew higher (standard quarterly $49.97, monthly $24.97). ⚠️ Their renewal terms are UNVERIFIED. If they do renew at standard rates, annual genuinely is best value and the page should say so. If they don't, the ladder is incoherent and the 12-week tier must move before annual goes up.

🔴 PRE-SHIP BLOCKER 2 — there is no trial reminder email, and a standing decision forbids one

Live-read of the estate, 27 Jul: ActiveCampaign contains no trial automation of any kind. The one written trial sequence is Customer.io-targeted, and its own QA record confirms it was deliberately built with zero instances of "trial", "charge", "your trial ends" or "tomorrow you'll be charged" — under a 28 April decision recorded as Aga's: "Day 7/8 framing: continuity-only, never trial-expiry." Whether it is even deployed is unverified.

That decision was made when the day-8 charge was $12–25. At $157 it inverts from a nice retention touch into the main source of the risk being worried about.

The expert is explicitly disagreeing with a prior ruling and asking for it to be revisited. A single day-5 email — "your trial ends Thursday, here's what you built this week, here's the two-tap cancel" — is the cheapest point of leverage in the whole plan. Confident people who tell you the charge is coming get paid. Surprise charges produce refunds, chargebacks and a support load we do not have staff for.

🔴 PRE-SHIP BLOCKER 3 — the dead button would fake the exact result being feared
The live defect if(i!=="control" && !P?.checkoutUrl) return; means that if the new annual tier ships without a checkout URL mapped for its variant, the annual button does nothing and fires no event.

We would see zero annual sales, no error, and reasonably conclude "$157 was too expensive" — when the button was dead.

This is the single most likely way the test produces a false result that appears to confirm the worry. It must be on the pre-ship checklist alongside A/B bucketing.

What happens to the numbers — and why one of them getting worse is the plan working

Start→paid will fall from 61.8% to roughly 32%. Do not read that as failure. Today's 61.8% is only that high because the short tiers charge immediately — a subscription created is a subscription paid. A real trial breaks that identity. The metric that answers the question is cash per 100 people who reach the paywall.
Per 100 paywall viewsTodayRuled build @32%@26% (break-even)
Buy-clicks51.459–6959–69
Checkouts completed21.227–3127–31
Payers13.18.6–9.97.0–8.1
Cash by day 30~$249$1,350–1,554$1,100–1,270

Even at the pessimistic end that is 4–5× the cash in the first 30 days, because annual collects everything on day 8 while $12.48 and $24.98 dribble in against 36.7% and 18.6% monthly churn. Realistic trial-conversion range at $157: 28–36%, midpoint 32%.

🔍 Watch ONE number for the first 72 hours

Paywall view → buy-click rate. Today 51.4%.
If it drops below 40% for seven straight days, the price is scaring people on the page — and you were right. Revert the page construction and go to the $97 test.

You will know in 72 hours, not twelve weeks, because this signal has 40× the denominator of trial conversion. A clean read on day-8 conversion needs 150–200 matured trials, which is 6–8 weeks at ~3.5–4 trial starts a day.

Other triggers, set now so the decision is not made emotionally later: day-5 in-trial cancels above 55% → pull without waiting for the charge · first 60 matured trials converting under 24% → go to $97 · refunds plus disputes above 8% of $157 charges → the headline cash is fake.

⚠️ Do not contaminate the test
Do not send a 50%-off annual promo to this audience while the test runs. 44 of 55 annual buyers paid $78.50 — this list is trained to wait for half price. If our own promo undercuts the test we will read "price too high" when the real answer is "we outbid ourselves."

The page requirements — mobile-first, 79% of traffic

  • Annual first, pre-selected, visually dominant. The selected card and the CTA must both be above the fold on a phone — if she has to scroll to see what is selected, the pre-selection does nothing.
  • Lead with "$3.02 a week", with "$157 billed once a year" as the sub-line. Never lead with $157; never show a monthly equivalent.
  • Button: "Start my 7-day free trial — $0 today". The relief lives on the button, not the fine print.
  • Day-8 disclosure under the CTA with the real date: "Free for 7 days. On 3 August you'll be charged $157 for the year. Cancel anytime in two taps." Naming the date beats "day 8" — it raises trial starts among people who convert and cuts disputes among those who don't.
  • The 60-day guarantee sits adjacent to the price and repeats under the button — same viewport on mobile, never a footer. At $157 it is a bigger risk-reversal than the trial itself.
  • The checkout screen must show "$0.00 due today" with $157 as a dated schedule line beneath. Highest-leverage single item on this list — it sits on the step already losing 59%.
  • No discount-code field anywhere. On an audience trained on half price, that field is an exit.
  • One specific member testimonial about long-term value, with a face, directly below the tier block. Plus the published 4.8★ rating (blended — Aga ruled 4 Aug), never naming a platform.

Alternatives considered

OptionVerdict
14-day trialNO delays cash a week and delays learning a week when we are already volume-starved. Longer trials produce forgetting, not conviction.
$1 trialNOT v1 — keep as the named fallback validates the card and filters tyre-kickers, but destroys "$0 today", which is the whole mechanism. Deploy only if day-8 declines turn out to be the killer.
Monthly fallback in the CANCEL flowYES — highest-value risk reducer day 6, at cancel, is exactly when "I like this but $157 right now is too much" is real and addressable. Costs nothing at the paywall. ⚠️ today's downsell button is a confirmed dead defect — fix that first.
Exit downsell on the paywallNO undercuts the price before it is measured and teaches the audience to wait for the flinch.
$97 hybridcorrect as test 2 you cannot learn anything from discounting a price you have never tested.

Will $97 sell? The two specialists disagree — and Aga has to call it

🔴 This needs a decision before the build starts.
Both seats were asked the same question with the same verified numbers. They came back with different answers, and the disagreement is substantive rather than cosmetic. Presenting it straight, because picking one quietly would be the wrong call to make on Aga's behalf.
Quiz-CRO leadPricing reviewer
Recommends$157/year · $0 today · 7-day trial · pre-selected$97/year · charged today · pre-selected (test $117 at day 60)
Modelled cash+40% (realistic band +5% to +45%)+53% at 100% demand retention
Code neededNone — v2_1 already ships exactly thisEdit the tier price and billing mode
Price changeNone. Keeps the published $157 anchorPermanent 38% cut
The quiz-CRO's argument against $97 — and it is the strongest single argument on the table READ THIS

1. The mix and the volume cannot both hold

This is the flaw in the $97 model. The +53% figure assumes zero volume loss from raising the up-front ask 3.9× — from $24.98 to $97. It also assumes annual reaches 63% of sales.

Those two assumptions fight each other. The thing that preserves volume is a $0-today option. The thing that destroys annual share is also a $0-today option — because if $97-charged-today sits next to anything free-to-start, cold mobile traffic takes the free one at 80–90% regardless of how well we frame the value. Remove the free option to protect the mix, and you lose the buyers who only ever converted because starting was free.

2. The 61.8% start-to-paid rate does not transfer

That rate was produced by $12.48 and $24.98 immediate charges. A $97 charge generates materially more card declines, more 3DS challenges and more in-checkout abandonment. The loss doesn't vanish — it moves into the 604→249 step.

3. So the realistic range is not +53%

Realistic demand retention at $97-charged-today: 35–60% of today's 154 buyers. Break-even is 65.5%. That puts the outcome between −35% and −10%, not +53%.

4. Behind a free trial, the price barely matters at the decision moment

If both options cost $0 on day one, the visitor is deciding "do I try this", not "is this worth $157". $97 would have to convert 62% better than $157 just to break even on the price gap. It won't, because that isn't the question being asked at that moment.

5. 🔴 And the cost nobody has counted
$97 is a permanent 38% price cut that breaks our own estate-wide pricing rule. Every BWA page, TMA.com page, email and YouTube description now publishes "$157/yr (~$3.02/wk)" because that is the standing house rule. Repricing the paywall to $97 forces a full estate re-sync and destroys the $157 anchor everywhere it is already published. That cost appears in nobody's model — including the one I wrote yesterday.

Their break-even maths at $157-with-trial

  • Break-even annual share: 39.5%. Today's 18.9% is measured on a paywall with no annual tier at all — with annual pre-selected and badged, they model 50–70%.
  • Break-even trial conversion: 26.3%. Measured is 36.9%; against a $157 day-8 charge they model 28–34%. At 28% it's +6%; at 32% +22%; at 36.9% +40%.
  • Bonus: with everything $0 today, checkout completion should rise from 41%, partly offsetting the trial gate.
The pricing reviewer's case for $97 — three tiers, quarterly kept as the decoy THE OTHER SIDE

Keep quarterly — but weaponise it

They rule against removing quarterly. Shown with per-week maths it becomes the decoy that sells annual, with no substitution assumption required: monthly $6.20/wk makes quarterly $3.84/wk look reasonable; quarterly $3.84/wk makes annual $1.87/wk look obvious. They modelled substitution at 50%/30%/10%/0% and found no scenario where keeping quarterly costs money versus today.

Order and default

Most expensive at the top, annual at the bottom, pre-selected on render. Pre-selection alone lifts the chosen tier's uptake by 25–40%. They rate the default as mattering more than any copy element.

The reference price is honest

$157 is the real list price, so a strikethrough is legitimate — but call it "38% off" or "save $60", never "50% off" (that was $78.50).

On whether $97 is even the right number

Exit-survey data puts the acceptable price cluster near $9.97/month = $119.64/year. So $97 (= $8.08/mo) is 19% below what people said they'd pay. They argue we're leaving money on the table and suggest testing $117 at day 60 — but explicitly say do not launch at $117, because there is no annual baseline to test against.

The transition line they'd use

"You just completed a full assessment. The price below reflects that — it is not available once you leave this page." Honest, because the offer genuinely is gated behind the funnel. They explicitly reject inventing a cohort cap, a founding-member frame, or a countdown.

Guarantee placement

Put the 60-day guarantee before the CTA, not after it: "If you are not a better mover in 60 days, we send the $97 back. No phone call, no explanation." At a $97 up-front ask the guarantee is the objection-killer, so it belongs where the objection is raised.

Where they actually agree — build this regardless of the price decision NO CONFLICT
  • Annual must be pre-selected on render. Both rate the default as the single highest-impact element.
  • Three tiers, with a decoy at the top — the $97/month coaching tier as an anchor (quiz-CRO) or monthly-at-top cascade (pricing).
  • Per-week and per-day maths on the annual tier — $157 → $3.02/wk, or $97 → $1.87/wk. Never a monthly price in the framing.
  • Billing method stated per tier, never in a shared footer. Both flag this as the failure mode that has already burned us three cycles running.
  • The 60-day guarantee sits at the decision point, elevated, not in the footer.
  • Fix addToCartValue: 0 on the trial tier — it poisons every value metric and starves Meta's optimiser.
  • Enable Apple Pay / Google Pay in Stripe Checkout. 79% mobile; cheapest remaining lever on the 41% checkout completion.
  • Proof above the price block, drawn from the real testimonials database — never invented counters.
🔴 A live problem both raised that outranks the price question
The pricing reviewer flags that the paywall still carries documented deceptive elements (registered as KI-007 across three review cycles): a "this rate closes permanently" timer that resets on reload, a "Charged today" line that contradicts the trial model, and eight fabricated named-city notifications.

Launching a high-stakes annual plan onto a paywall with live fabrications means measuring conversion inside a trust-broken environment — the experiment won't be clean, and the fabricated cities are the kind of thing that should come down on principle regardless of what it does to conversion. Estimated fix: 30 minutes.

My read, for what it's worth
The quiz-CRO's mix-versus-volume argument is the one I cannot find a hole in, and the estate-wide pricing consequence is a real cost that nobody — me included — had counted. $157 with the trial also requires no new code and no permanent price cut, so it is the reversible option.

The pricing reviewer's counter is that the trial gate is exactly what makes $97 fail, which is true but argues for the $157 construction rather than against the trial.

Aga's call. If it helps: shipping $157-with-trial first keeps $97 available as the next test, whereas shipping $97 burns the anchor and cannot easily be undone.

💷 The pricing seat's full ruling tma-pricing-reviewer · 27 Jul 2026

We discount 50% off the first payment on every plan. This is the full analysis of what that does to annual — and why $97 is the answer rather than a deeper discount.

🔴 The headline: 50% off is not a strategy, it is an unmanaged default

Over 90 days, 44 of 55 annual buyers paid $78.50 and only 4 paid $1577.3% of transactions at the "list price".

When a discount reaches 80% of buyers, the discount is the price. $157 is not a price — it is a label pointing at a number almost nobody pays.

And it has a compounding cost: a buyer who paid $78.50 meets a $157 renewal. That is a 2× shock, and it sits underneath the modelled ~33% annual renewal rate.

The argument that is usually made — and is wrong

"Uniform discounting destroys the incentive to choose annual." On the arithmetic, no. Annual $157 vs quarterly $49.97 is a 3.14:1 ratio. At 50% off both, $78.50 vs $24.98 is also 3.14:1. Uniform scaling preserves every ratio — annual saves 21.5% per month either way.

The real harm runs through a different mechanism: 50% off makes the quarterly first payment $24.98 — small enough to feel like "a trial for a trial". The buyer anchors there, and then annual at $78.50 reads as 3.14× more expensive rather than better value. The uniform discount amplifies the absolute dollar gap at the exact moment of choice.

What each plan is actually worth MODELLED — assumptions stated

PlanChurn/moFirst paymentExpected LTVShare of sales
Annual9.1%$83.49~$16235.7%
Quarterly18.6%$27.67~$8643.5%
Monthly36.7%$20.21~$6320.8%
🔴 The number that should decide this
Every buyer who lands on quarterly instead of annual costs about $76 in expected lifetime value. At 67 quarterly buyers per 90 days, that is ~$5,092 of LTV given away every quarter — through mix alone, before any pricing decision.

We route more buyers to our lowest-LTV plan than to our highest — and we do not pitch the highest at all.

Assumptions: retention compounded from the stated monthly churn (annual 0.909^12 = 33.4% renewing); renewals at book price; first payments at the observed 90-day averages. Change the churn inputs and the ranking holds — annual leads on LTV under every plausible set.

🔴 Reconciling the willingness-to-pay data — and it settles the price question

Exit surveys say 78–80% of price-naming cancellers would pay at most $9.97/month. That looks like an argument for cutting price. It is the opposite, and here is why.

Annual at $78.50 is already $6.54/month. That is below the floor those cancellers name — and they cancel anyway.

We are already priced under the stated willingness of our most price-sensitive leavers, and it does not retain them. Price is not why they go.

The sampling bias, stated plainly: these are people who already decided to leave. "Too expensive" is the socially easy answer, and 65–71% of them say no price at all would keep them. Designing pricing around leavers' stated numbers is designing for the people least likely to buy.

What it actually argues for: the experience layer, not the price list. Lower the price and these people still leave.

The recommendation: an asymmetric hybrid, not a uniform rule

PlanWhat changesWhy
Annual$97, no "50% off" framing, pitched as the plan, pre-selectedstops training the buyer pool on half price; protects renewal economics
QuarterlyKeep 50% off first payment ($24.98)the entry ramp for commitment-averse buyers
MonthlyKeep 50% off first payment ($12.48)same

Modelled outcomes over 90 days — the variable is how far the mix shifts once annual is actually pitched:

ScenarioAnnual share90-day cashvs today
Conservative — no mix shift at all35.7%$7,836+10.5%
Base — annual pitched properly50%$9,029+27%
Optimistic60%$10,460+47.5%

Downside protection: we can lose 7.7 annual buyers — 14% of the current 55 — before $97 is worse than today on first-payment cash. On lifetime value the crossover is later still.

The anchor — keep it, but stop misusing it

Keep $157 as the stated list and renewal price. Stop using it as "the number 50% comes off." Price annual at $97 and present it as the annual plan, not as a discounted $157.

That preserves the published "$157/yr (~$3.02/wk)" across BWA, TMA.com, email and YouTube — no estate-wide re-sync — while ending the conditioning that teaches people to wait for a sale. It also keeps $157 credible where it already works: existing subscribers renew at $156.58.

Where the two reviews disagreed
The quiz-CRO recommends $157 behind a 7-day trial (+40%). The pricing review calls that right in principle, wrong in timing: a trial only works if the product earns the price by day 7, and 65–71% of cancellers say no price would keep them — a product-experience signal, not a price signal. Its view is that $157-with-trial is the right destination in 12–18 months, once the experience layer is repaired, and the wrong move today.

Both seats agree on the thing that matters most: presentation is first-order and price is second. Annual is not on the paywall at all — changing the price of something nobody is shown is a second-order decision.

The falsifier — what would prove this wrong within 30 days
Annual as a share of new sales. Today 35.7%. If it stays below 35% after annual is actively pitched, the constraint is not price architecture — it is the paywall presentation or commitment aversion at any price. Above 48% and the base case is live. At current volume (~50–60 sales/month) that is 17 vs 24 annual buyers — detectable inside 30 days.

One more thing worth knowing before building

We cannot A/B test the quiz at all right now
The paywall version is a hardcoded build constant with no bucketing — every version is 100% or 0% of traffic. So any change we make is a sequential bet, not a test: we change it, and we compare before-and-after periods that also contain promos, seasonality and traffic-mix shifts.

Adding proper bucketing should ride along with this change. Without it we will keep arguing about what caused what.

🚦 Traffic & channels

🔄 UPDATED 5 Aug 2026 — the paid picture is now measured, and it clears Google of the June break
Verified against the live Meta + Google APIs on 5 Aug. Google Ads spent its first pound EVER on 27 Jun 2026 (API rows + campaign create-dates 26 Jun + card ledger) — £502 in June, all app installs. It cannot have caused a decay that began in the first week of June. The real paid event is 25–27 Jun: Advantage+ drifted into Audience Network junk on its own (impressions ×15.7 in a day, 3,505 AN clicks → 28 leads → only 129 landed), Meta pivoted budget into app installs (2,878 installs → 1 purchaser; Google UAC 1,230 → 0), and Meta's daily quiz leads halved. That damage lands in July, not June. 🔴 Spend did not change when Nic arrived — 2025 averaged £2,552/mo (Meta only) vs £2,768/mo Feb–Jul 2026; CPL degraded 8× starting Sep-2025, five months before him. 🔴 The ledgers mislead: "May cut to £457" was one card-threshold charge — real May Meta spend was £1,477. Six live governance breaches are queued as AGA-104. Meta being 54% of traffic at ~half direct's buy-click rate is confirmed — that part stands.
⭐ The one thing to take from this tab
Meta is 54% of traffic and converts 2.5× worse — but its scoreboard is broken (lead counter wrong 7–9×), so fix the signal before judging the channel.
📅 The window for this entire tab
90 days: 28 April – 26 July 2026. Source: GA4, quiz hostname only, measured in users (not sessions). "Lead" = the generate_lead event. "Buy-click" = the add_to_cart event, which on the live quiz is the real checkout button press followed by a same-tab redirect.

Why 90 days and not 30: at ~57 quiz visitors a day, a 30-day window puts most individual sources below the point where their conversion rate means anything. 90 days is the shortest window that also contains a full promo cycle.

💰 What acquisition actually costs Meta monthly to Jul 2026 · Google 7d · our own funnel truth

This was the gap the CMO named — a plan governing a $3,000/mo budget with no cost-per-lead in it
Every figure below divides real spend by our own verified outcomes — quiz-tagged leads from ActiveCampaign and subscriptions created in Stripe — not by the ad platforms' self-reported numbers, which are demonstrably wrong (see below).
MonthMeta spendMeta claims leadsREAL quiz leadsREAL new subs$ per real lead$ per real sub
2026-01$1,9222,026290106$6.63$18
2026-02$2,8353,06833388$8.51$32
2026-03$3,3002,46031878$10.38$42
2026-04$1,837894277$6.63$20
2026-05$1,477800352$4.20$12
2026-06$2,4661,25853062$4.65$40
2026-07$2,12425232674$6.51$29
90 days (May–Jul)$6,0661,208255$5.02$24
🔴 Meta's own lead counter is wrong by 7–9×

January to March, Meta reported 2,026 · 3,068 · 2,460 leads. Our actual quiz lead capture in those months was 290 · 333 · 318.

Meta has been counting roughly eight "leads" for every one we actually received.

That is the broken purchase-signal problem seen from the other side — the platform has been optimising toward an event that does not correspond to a real lead, which is precisely how you end up buying Audience Network traffic that never converts.

And it got worse: Meta's reported leads fell to 252 in July from 1,258 in June, while our real leads only fell 530 → 326. The counter is now under-reporting as badly as it was over-reporting. No bid decision should be made on Meta's in-platform numbers until this is fixed.

What the cost numbers actually say
  • Cost per real quiz lead: $5.02 over the last 90 days, ranging $4.20 to $10.38. That is genuinely cheap — leads are not the expensive part of this business.
  • Cost per real new sub: $24 — but read this carefully. It divides Meta spend by every new subscription, including those from direct, Google and email. It is a floor, not the true Meta CAC. Since roughly 29% of quiz traffic is direct and converts best, the real cost of a Meta-acquired subscriber is meaningfully higher.
  • Against the North Star target of Cost per Trial under $20, we are at $24 on the most generous possible basis. Not far off, and not verified.
  • May was the best month on both measures — $4.20 per lead and $12 per sub — and May is also when annual was still on the paywall at 42% of sales. Efficiency and mix moved together.

🔴 The honest limit: a true CAC by channel cannot be computed today — subscription metadata is empty on all 154 sales and the same checkout URLs serve quiz, email and standalone traffic. This is what fixing the purchase signal buys us: the ability to answer this question at all.

🔴 Google: the cheap clicks are the worthless ones
Campaign (last 7 days)SpendClicksCost/clickConversions
Quiz Funnel · Competitive Non-Branded · US£745£14.710
Quiz Funnel · Competitors Branded · US£7350£1.450
Quiz Funnel · Non-Branded · US£6037£1.632
Quiz Funnel · PMax · US£38117£0.326
Quiz Funnel · Branded · US£96£1.424

Two things jump out. Competitive Non-Branded costs £14.71 a click and has converted nobody — that is the single most expensive click we buy. And PMax delivers by far the cheapest clicks at £0.32 — but PMax is the Display placement serving doubleclick, which over 90 days produced 136 visitors, zero leads and zero buy-clicks.

The cheapest traffic we buy is the traffic that never converts, and the most expensive converts nobody either. Branded — £9 of spend, 4 conversions — is quietly the best line in the account.

The junk, by who sold it to us 28 Apr – 26 Jul 2026

Four traffic sources behave in a way humans do not. Between them they sent 537 people over 90 days and produced 12 leads and 4 buy-clicks in total.

What makes them identifiable as junk rather than just poor traffic: a normal source converts 20–30% of visitors into leads. These convert 0–5%. And googleads.g.doubleclick.net sent 136 people, of whom exactly one answered a single quiz question. A page that loses 99% of arrivals at the first tap is not being visited by people who intended to arrive.

SellerSourceVisitors (90d)LeadsBuy-clicks
META
401 visitors · 7.8% of all quiz traffic
m.facebook.com14432
an — Audience Network12972
facebook.com12820
Meta subtotal401124
GOOGLE ADS
136 visitors · 2.6%
googleads.g.doubleclick.net
= the Display / Performance Max placement
13600
Combined junk537 (10.4%)124
The answer: it's mostly Meta — 75% of it
Meta sent 401 of the 537 junk visitors (75%). Google Ads sent 136 (25%) — but Google's is the purer zero: not one lead and not one buy-click from 136 people over 90 days, versus Meta's 12 leads and 4 buy-clicks.

What each of these four things actually is

Audience Network (an) — 129 visitors, 7 leads, 2 buy-clicks META

What it is

Meta's Audience Network places our ads outside Facebook and Instagram — inside third-party mobile apps and games. When Meta's automatic placements are switched on, this is included by default and most advertisers never notice it.

Why it produces this

A large share of Audience Network impressions are full-screen interstitials inside mobile games, where the close button is small and mis-taps are common. The "visitor" is frequently someone who was trying to dismiss an ad. That is why 129 people produced 7 leads — they never intended to arrive.

How to switch it off

It is controlled in Meta Ads Manager, at ad-set level, under Placements — not on our website. Switch from "Advantage+ placements" to "Manual placements" and untick Audience Network. Facebook and Instagram feeds and reels stay on.

Google Display / Performance Max (googleads.g.doubleclick.net) — 136 visitors, 0 leads, 0 buy-clicks GOOGLE

What it is

doubleclick.net is Google's ad-serving domain. Traffic arriving with that referrer came from a Display banner or a Performance Max placement — a banner on a third-party website or app, not a Google search result.

Why it produces this

Display and Performance Max buy impressions across a very large network of partner sites and apps, much of which is low-quality inventory. Unlike search, there is no intent behind the click: nobody typed anything. Performance Max in particular will spend into Display inventory automatically unless it is constrained.

The number that matters

136 visitors over 90 days. One answered a single quiz question. Zero gave an email. Zero clicked buy. This is the clearest result in the whole dataset — there is no interpretation under which this traffic is worth paying for.

How to switch it off

In Google Ads, find the campaign serving Display or Performance Max traffic and pause it. Note this does not affect Google Search, which is a genuinely good source for us (511 visitors, 15.5% buy-click rate over the same 90 days).

m.facebook.com — 144 visitors, 3 leads, 2 buy-clicks META

What it is

The mobile Facebook web domain. Traffic tagged this way did not come through the tracked ad placements — it came from a link opened inside the mobile Facebook web experience, and it arrives without the campaign parameters that would tell us which ad it was.

Why it behaves badly

A 2.1% lead rate against a site average of 23.7% over the same 90 days puts this firmly outside normal human behaviour. Some of it will be automated crawling of links posted to Facebook; some will be accidental in-app taps.

Worth being honest about

This one is less clear-cut than Audience Network or Display. A small share may be real people arriving through an untracked route. But at 144 visitors producing 2 buy-clicks in 90 days, it is not a source worth defending — and it cannot be optimised, because we cannot see which ad produced it.

facebook.com — 128 visitors, 2 leads, 0 buy-clicks META

What it is

The desktop Facebook domain, same story as above — an untracked referral rather than a tracked ad click.

The result

128 visitors, 2 leads (1.6%), zero buy-clicks in 90 days. Combined with m.facebook.com, the two untracked Facebook referrers sent 272 people and produced 2 buy-clicks between them.

What happens when this is switched off — set the expectation now
Total quiz traffic will drop by about 10%, and every conversion rate on this page will go up. That is junk leaving the denominator, not performance improving and not a new problem.

Specifically: the landing-screen loss re-baselines from 54.5% to 49.8%, and the overall lead rate rises without anybody doing anything to the page. Re-baseline before judging any later change, or the improvement gets double-counted.

What it saves: the spend is not separately broken out in what we can currently see, so the saving is real but unsized — it is not the reason to do it. The reason to do it is that these placements are actively teaching Meta and Google what kind of visitor we want.

Everything else, ranked by whether it actually buys 28 Apr – 26 Jul 2026 · GA4 users

SourceVisitorsShareBecome a leadClick buyRead
Direct1,50029.0%29.3%18.9%47% of ALL buy-clicks come from here
Google (search)5119.9%25.8%15.5%small and good
Meta — real placements (fb + ig)2,40146.7%~24%8.6%volume, weak intent
Leadpages971.9%37.1%19.6%best real source we have
linktr.ee80.2%75.0%62.5%too small to trust
Bodyweight Training Arena70.1%28.6%28.6%~1.9M search impressions/28d → 7 visits in 90 days

The Meta finding that changes how we spend 28 Apr – 26 Jul 2026

A Meta lead is half as likely to buy — and it's probably our fault

Once someone has handed over an email, a direct lead buys at 64.3% and a Meta lead buys at 35.1%. These are people who finished a 40-screen assessment and typed in their address — so this is not a bounce problem and not a creative problem.

The most likely cause is our own broken purchase tracking. Meta is currently being trained on 5,171 "Leads" against 172 "Purchases". For 90 days we have effectively been paying Meta to find people who click buy rather than people who pay. It got very good at exactly what we asked for.

So: fix the signal before judging the channel. Cutting Meta now would be punishing it for following our instructions.

Organic — counted properly quiz figures 90d · AC lead figures monthly

SourceVolumeRead
Clean organic new leads (ActiveCampaign, uploads stripped)~650–950/moMarch 654 · May 950. Real, steady, free.
Direct traffic to the quiz1,500 / 90dOur best-converting source at 18.9%. Partly mis-attributed paid (in-app browsers strip the referrer) — the gap is real, the size is soft.
Google search to the quiz511 / 90d15.5% buy-click — second best.
BWA → quiz7 / 90dThe gap, not the channel. ~1.9M impressions per 28 days. At a realistic 0.32% click-through that's ~6K sessions/month available, worth perhaps 8–9 customers/month — but only once the links carry UTMs and point at the quiz root.
Three of five lead sources are dark
Only two sources are actually measured (177 leads in the last 7 days). themovementathlete.com non-quiz pages, BWA, and in-app free sign-ups capture nothing we can see. Attribution-dark is a hole in the map — it is not evidence that those channels don't work.

✅ The plan

🏠 PERMANENT HOME FOR AGA'S TASKS (Aga's ruling, 6 Aug 2026). This tab is where Aga's revenue-plan tasks live, in priority order — done rows retire to the ✅ Done tab, never deleted. Her cross-project ranked list is the generated page marketing/seo/AGA_TODO_NOW.html (built from the tracked queue — the five revenue rows here were minted into it as AGA-117…121 on 6 Aug, so the two surfaces cannot drift). AGA-56 CLOSED 6 Aug PM — Aga approved the paywall-routing card and sent it to Nic (implementation + acceptance test live on his brief). Top of her order now: the two unsent sends — AGA-118 (warm pool) · AGA-119 (annual offer).
🔒 Standing rule (Aga, 6 Aug): Nic's boards are approval-gated. Nothing enters the master analytics brief or the attribution brief without Aga's approval AND full live verification. Aga has approved everything currently on both.
🔄 STATUS UPDATE — 6 Aug 2026: the list was re-verified LIVE and split. Every remaining row was re-checked the same day against the live systems (AC API · Meta Marketing API · Google Ads API v22 · GA4 · curl on the served pages/bundles) — read the dated badge on each row. 18 done/superseded rows moved to the new ✅ Done tab; this tab now holds only the 16 open ones (Aga 10 · Nic 6).
The three live reads that change priorities:The $97 paywall still doesn’t reach everyone — 7-day GA4: ~30% of quiz page views (9,144 of 30,625) land on variant doorways (/2026/ · /2026-v2-2/ · /2026-v2-3/) that carry no $97 annual at all. Closing that routing gap (AGA-56) is the highest money-per-minute item on this page — it completes task 1, the row rated 60–70% of achievable gap closure. ② The two unsent email levers are still unsent (tasks 12 + 14): newest real broadcast is 24 sends on 4 Aug — nothing at the ~1,020 warm-pool or ~6,367 engaged scale has ever gone out. ③ The Google junk kill never happened (task 6): “Competitive Non-Branded” is ENABLED, £199.28/30d, 24 clicks, 0 conversions.
Also: task 19 verified done and archived · task 10 reassigned to Aga (the remaining work is the recovery email lane; the capture halves live with Nic’s NIC-54 and an hourly v3 tag job) · task 16 is re-ranked LAST but explicitly NOT started (Aga, 6 Aug: “we have not done anything about this”).
🔄 ADDED 5 Aug 2026 — the broadcast cadence is now set policy, and it is the cheapest revenue lever on this page
🔒 Aga ruled 5 Aug: one broadcast per week to Core (~5,090 engaged), permanently — Mid gets a best-of fortnightly, Dormant gets nothing ever, promo bursts cap at 6 sends / 1 per day, ≤4 bursts a year and none within 6 weeks. Today we send zero between promos: 0 broadcasts 12 Jul → 5 Aug, June zero, Feb 3 → Apr 8 nothing. That famine is measurable — July's burst (28 sends in 12 days) unsubscribed at 0.451% per send against the May sale's 0.093%, 4.8× worse on the same promo shape, and cost 1,326 people. The weekly baseline is the fatigue insurance for the burst.
🔴 And the burst was aimed at the wrong 60%. Engaged-reachable is ~5,090 but promo sends ran 12,000–44,747, so 60–90% of every promo hit someone unengaged for a year. CUSTOMERS (~1,900) out-clicked LEADS (~12,000) by 20–30× per recipient. The revenue came from the engaged; the unsubscribes came from the cold.
🔴 Two live defects found doing this, both free to fix: 47 of 236 live automation emails have HTML and plaintext versions that disagree, and 34 carry a deadline that exists only in the plaintext — a clock that expires for nobody on evergreen automations (one is subject-lined “No deadline. Just the honest choice.”). Rewriting the HTML never regenerated the plaintext. Fix = plaintext regeneration, not a copy rewrite — the HTML is already correct, so the Evolution Law is not engaged. And we cannot see our spam-complaint rate at all (AC has no complaint field; Postmaster is the only source) while we are a permanent Gmail bulk sender.
🔴 Do NOT pause automations to avoid a double send — use AC's Currently in automation → is-false. AC has no global frequency cap (Klaviyo and Customer.io both do — a real argument for the migration), so the cap is only as good as the conditions actually added. That is why the caps that already existed were breached by 2× in July, and why this ships with a gate: tools/retention/send_collision_check.py.
📄 Full findings, evidence and rulings: the 📧 Email cadence tab on this page. Owner seat tma-broadcast-cadence-owner · on Aga's list under 📧 Email: AGA-106 (approve the plaintext regeneration) and AGA-107 (Postmaster access — the most important missing number in the estate).
⭐ The one thing to take from this tab
16 OPEN tasks, one list, priority order. Aga 10 · Nic 6. The 18 done/superseded rows moved to the ✅ Done tab on 6 Aug — this tab is now only what is left. Task 1 — ship the new quiz pricing page — is DONE: it went live 31 Jul. Updated 31 Jul 2026 — the biggest single item on this plan has shipped, so the question changes from “when does it go live” to “what is it earning”. Nothing is re-ranked yet: the first clean read is due after 14 days of live data (kill-switch: rolling 14-day RPV < $6.04).
📌 2 Aug 2026 — Nic's checkout/tracking tasks were verified one-by-one and now live on ONE page
Every open Nic task on this board touching the checkouts, attribution or tracking (tasks 8 · 10 · 11 · 19 · 28 · 29 · 30 · 33 · 34 · 35) was re-verified against live Stripe / GA4 / the deployed bundles on 2 Aug and consolidated, in priority order with full step-by-step, at tma-nic-attribution-brief.netlify.app (source of truth: the tracked queue). Verified state changes: task 8 is already FIXED (/api/quiz/config returns 200, live-checked) · task 34 was removed by Aga's ruling (its substance became acceptance tests of the abandonment rebuild) · task 29's gap was proven live on the quiz estate (rich metadata, zero utm_*). Do not work Nic's checkout tasks from this tab — the brief supersedes it for those rows.
✅ 4 Aug 2026 — Nic's rows on this board are STALE ON PURPOSE. Here is what has actually happened since.
Aga's ruling, 4 Aug: the brief stays Nic's single list; this tab links to it. The rows below were frozen on 2 Aug when his checkout work was consolidated, so read this block, not the row text, for anything touching checkouts/attribution. Live source of truth: tma-nic-attribution-brief.netlify.app (gated against the tracked queue, so it cannot drift) · ground truth doc: CHECKOUT_ATTRIBUTION_CODE_AUDIT_GROUND_TRUTH_2026-08-03.md.

🚀 SHIPPED 3 Aug — both checkout estates stopped minting Stripe records on page load. Quiz checkout now mints on password blur / tap-to-load / pay and keeps stampPaywallView; checkouts-v3 mints on valid email blur so stamp-abandon-email still has an intentId; coupon recreate cancels the prior incomplete sub. Verified by reading the files the server actually serves, not from a status message.
🔴 A MEASUREMENT DISCONTINUITY LANDED 3 AUG — do not compare any checkout number across it. Phantom trial/subscription counts collapse by design and checkout conversion jumps by design. Neither is churn, a demand drop, or a marketing win. Every conversion rate on this page measured before 3 Aug is fiction and not a baseline. Clean data starts 4 Aug · honest read ~11 Aug · reliable ~17 Aug. Cash collected is unaffected — phantoms never charged anyone.
Row-by-row, as of 4 Aug: task 8 ✅ fixed (200) · task 10 → moved to Aga (AGA-57) · task 11 the server CAPI webhook already exists; quiz fbq/eventID parity was reported shipped 4 Aug but could NOT be verified from outside (quiz success now 302s without a valid intent — the success-gate ship working correctly), so NIC-34 stays open pending one real purchase or a Pixel Helper capture · task 19 ✅ CLOSED 4 Aug (NIC-37) — the dead Buy button now emits checkout_button_dead and shows the buyer an error · task 28 ✕ retired as superseded (Aga, 3 Aug) · task 29 ✅ — but note the audit corrected its cause: the handoff already forwards the query string and both estates already write UTMs to Stripe, so empty UTMs mean the URL arrived empty · task 30 ✅ CLOSED 4 Aug (NIC-30) — the React bundle was rebuilt (hash index-CEOCAHYQ.jsindex-DFwXN-qe.js, so we know it really went out), app-test is gone (0 hits, was 7), the pay URL points at prod, and addToCartValue:0 went with it · task 34 ✅ closed (send-time exclusion + mark_purchased).
📧 Email attribution is 3 legs of 3 (wired 4 Aug): ✅ AC estate 100% UTM-tagged (1,101/1,101 links) · ✅ both checkouts already write utm_*/gclid/fbclid into Stripe metadata · ✅ the pe= recipient field shipped 4 Aug (NIC-50), verified on both estates — so the chain that lets us say which contact, which automation, which email made a sale is complete, 25 days before its 29 Aug charter deadline. 🔴 But wired is not attributable. Three things stand between this and a usable number: nothing has flowed through it yet (confirm pe on the metadata of the next real sale); the 3 Aug measurement discontinuity still governs; and someone must still build the join that turns pe into per-contact / per-automation / per-slot revenue. Realistic first trustworthy read: ~11–17 Aug.
📨 4 Aug 2026 — how the abandon email actually works (Nic). Canonical. Read before quoting any abandoner number.
Quiz estate. It goes to someone who opened the CHECKOUT page with an email on it — almost always because the quiz handed them over with it prefilled — and then didn't buy. It sends ≈1 hour after that checkout visit. No password and no card are needed — landing on checkout with an email is enough. Subject: "Your login is in this email" (free first workouts + login details). What does NOT trigger it: starting the quiz; or typing an email earlier in the quiz and never reaching checkout.
🔴 The two emails everyone mistakes for it. "…your results are ready!" fires when they finish the assessment; "One Last Step: Verify Your Account" fires when the account is created/verified. Both land on the same person at almost the same second, which is why they sit next to each other in the log and look like the abandon. Neither is it — and "results are ready" was NOT rewritten into the abandon. The abandon is ~1h later, so it can never appear in the same second. Live sending had also been held off by a safety switch on Nic's side — fixed 4 Aug, a new build deploying to Azure Prod. ⚠️ Until that build is confirmed live, "no abandons in the log" is not evidence either way.
👥 "Gave us their email but never reached checkout" is a DIFFERENT audience — the abandon lane cannot see it. It only knows people who hit the checkout page. Email-only quiz drop-offs sit earlier in the quiz / in ActiveCampaign and are a separate segment we can build if we want it. Do not size the warm-pool or recovery opportunity as if the abandoner count already includes them.
checkouts-v3 has NO abandon email today. Type a valid email → Stripe customer + open payment/subscription created with the email on both records, so they appear in Stripe even if they never pay. Bounce without typing an email → nothing in Stripe at all (the 3 Aug defer-mint working as designed). An hourly job can TAG those people into ActiveCampaign for the recovery lane — that is tagging, not a send. Never report it as an abandon email.
🎟️ Coupons & affiliates — Nic's recommendation. Keep the free trial and the quiz checkout clean, no coupon box on either. Affiliates go to the full-price checkout, which already has a coupon field — a prettier affiliate link can simply redirect there. That also answers future coupons for our own list: same page, same box. A separate affiliate checkout is optional and branding-only — more to maintain, and not needed just to support coupons.

✅ THE TASK LIST — one list, ranked by priority

🤔 DECISIONS — not tasks (three open; #17 closed 7 Aug). Nobody can action these until Aga rules; they have no record of ever being decided.
#The questionWhat I recommend, and why
32Does /register migrate to checkouts-v3, or is it retired? 🔴 The one that matters — task 23 (CRO the /register page) waits on it, and it is the last legacy checkout estate.Retire it. Two estates is what makes every attribution question twice as hard, and GTM-PPGJXHH fires on the legacy /register checkouts and is not even in our GTM account. If it still carries live buyers, migrate them to v3 and close it — do not CRO a page you intend to kill.
24The day-5 trial reminder email — keep, change or kill? The checkout page promises buyers a pre-renewal reminder, and Aga verified on 10 Jul that a day-5 reminder exists, but nobody has ever established which rail sends it.Keep, then verify the rail. The promise is on the checkout page, so removing it creates a broken promise. One question to Nic: does it send from Django, AC, or Stripe? Until that is answered we cannot say whether trial-enders are covered.
26Run the data pulls monthly — still needed?Mostly obsolete — close it. The 06:00 job already pulls most rails daily. What is genuinely still manual is the Apple ASC + Google Play export, and that already exists as legacy task 18 / AGA-105. Keeping this row alive just duplicates them.
17Where were the Report Bug widget and Funnelytics seen?Close it. No record anywhere, no downstream task depends on it, and no number moves either way. If a widget turns up on a live page, file it fresh with the URL.
None of these four is worth more than five minutes of your time — but #32 blocks a real task, so rule on that one first.
🔎 EVERY ROW RE-VERIFIED 5 Aug 2026, and every NIC row again on 7 Aug — read the green/red badge on each task, not the original text
16 done · 5 changed or superseded · and after the 7 Aug Nic pass, the rows still open here are Aga’s or awaiting her ruling — every outstanding NIC row moved to Nic’s brief (6 · 16 · 23), task 10 was retired on Aga’s order, and 11 & 17 closed on evidence. Highlights: task 8 (/api/quiz/config) is FIXED — do not work it. Task 21 (rebuild 750) is CHANGED — do not rebuild; the Evolution Law bans it and 750 improved on its own. Task 7 (/50promo) and task 20 (re-baseline) are SUPERSEDED. Task 11 (CAPI) is already built — minutes of verification remain. The still-open rows are consolidated with the live tracked queue in §12 below.
Start at 1 and work down
This is the whole plan — all 34 tasks, most important first. No phases, no weeks. Task 1 — the new quiz pricing page — shipped 31 Jul and is now being measured. Open why this matters + step-by-step on any row for the reasoning, the exact steps, and what "done" means. Impact is ●●●●● highest. Your ticks save in this browser, so you and Nic keep separate progress.
👥 Who owns what
OwnerOwns
AGAEmail — all of it. Plus anything doable in WordPress, ActiveCampaign or Intercom.
NICPaid ads — all of them. Plus anything technical: the app, the quiz, checkouts and carts, webhooks, tracking.
Aga 10 · Nic 6 — open rows only. The rule is deterministic, so no task is shared. If one turns out misfiled, hand it over and say so.
#TaskOwnerTimeImpact
4
Pause steps 18, 19 and 22 of 973 Nurture Sequence 1 NEW COPY FROM CLAUDE
🔎 RE-VERIFIED 6 AUG — STILL OPEN, and now confirmed material. 973 is live in AC (status=ACTIVE, 11,056 entered), so in-flight contacts can still receive steps 18/19/22 — including the false “closes at midnight”. 10 minutes.
🔎 VERIFIED 5 AUG — STILL OPEN. 🔴 No evidence it was ever done. Moot for new entrants (973 is now fed by nobody) but the in-flight contacts can still receive the false "closes at midnight" steps. 10 min.
Disable three discount emails inside 973 Nurture Sequence 1 NEW COPY FROM CLAUDE — one is titled “This closes at midnight”.
why this matters + step-by-step →

Why it matters. Queued to roughly 8,800 people, promising a deadline that does not exist. That is a trust problem, not just a performance one.

📄 Context: One Nurture Sequence — the consolidation plan. These three steps do not survive the consolidation either — disabling them now simply stops the false-deadline sends while the rebuild is decided.

How to do it

  1. Open 973 Nurture Sequence 1 NEW COPY FROM CLAUDE.
  2. Find steps 18, 19 and 22.
  3. Disable each — do not delete; we may restore them with honest copy.

✅ Done when: All three disabled, nothing queued behind them.

AGA30 min ●●●●
12
Email the ~1,020 warm pool
🔎 RE-VERIFIED 6 AUG — STILL OPEN; nothing has been sent. Newest AC broadcast with real volume is 4 Aug at 24 sends; nothing at the ~1,020 warm-pool scale exists in the campaign log. The pool is still un-emailed.
🔎 VERIFIED 5 AUG — STILL OPEN. 🔴 Open — and broadcasts have been silent since 20 Jul. Sits behind the unsub gate.
570 people saw the price, 450 reached checkout and did not buy. Email them.
why this matters + step-by-step →

Why it matters. Free before paid. The warmest non-buyers we have, and nothing reaches them at the right moment.

How to do it

  1. Build the two segments.
  2. Route through /email-fleet — never hand-build.
  3. Show the rendered emails before sending.

✅ Done when: Fleet-written, lint-passed, and you have seen it rendered.

AGA ●●●●●
14
Annual offer to the engaged ~6,367
🔎 RE-VERIFIED 6 AUG — STILL OPEN; nothing has been sent. Same read as task 12 — no broadcast anywhere near the ~6,367 engaged scale. The biggest un-pulled email lever on this page.
🔎 VERIFIED 5 AUG — STILL OPEN. 🔴 = NIC-31 (draft the Job-7 annual push). Writing is blocked by nothing; SENDING is blocked by the unsub gate.
One annual offer to the engaged segment.
why this matters + step-by-step →

Why it matters. ⚠️ A one-time decaying pulse, not a monthly annuity. The engaged list is finite — you cannot re-offer the same annual to the same people every month.

How to do it

  1. Confirm the engaged segment.
  2. Route through /email-fleet.
  3. Book the result as one-off cash, not recurring.

✅ Done when: Sent, and booked as one-off.

AGA ●●●●●
18
Apple App Store Connect + Google Play export back to 2024
🔎 RE-VERIFIED 6 AUG — STILL OPEN, but now half-automatable. The App Store Connect API key in the repo authenticates fine (ES256 JWT accepted); the only blocker is the vendor number — a one-glance read in ASC → Payments and Financial Reports. Hand that over and the Apple half becomes a script instead of a recurring chore. Google Play still has no API credential.
🔎 VERIFIED 5 AUG — STILL OPEN. 🔴 Still open (R5) — the only thing that bounds the old funnel era's revenue, and now also needed for AGA-105 (re-enter July Play + iOS proceeds to kill the 0.3184 ratio artefact). ~30 min.
🔄 UPDATED 6 AUG — the Apple half is now a 2-minute ask, not a 30-minute export. The App Store Connect API key in .env.local authenticates (verified live 6 Aug: /v1/apps returns Movement Athlete). tools/finance/asc_finance_reports.py, built the same day, pulls Apple's official financial report for every month back to 2024 — and that report carries both the customer-paid figure and Extended Partner Share, so it also settles the standing gross-vs-net question (Nic-brief task 28, moved to Aga 6 Aug). Aga supplied the vendor number the same day, so Apple is done and automatic. 🟢 So is Play — she granted the bulk-bucket read, and tools/finance/play_earnings_reports.py now pulls Google's official net payout (it immediately caught July understated by £412.41). 🔴 The one thing this task wanted that CANNOT be had: neither store's bucket holds revenue back to 2024 — Play earnings start May 2026. Bounding the old funnel era from store data is not possible; it needs a different source.
Pull the official store proceeds exports.
why this matters + step-by-step →

Why it matters. 30 minutes, and it bounds the pre-Feb era. It also settles whether app revenue is ~15% overstated — the iOS gross→net ratio currently calibrates to 1.02×, which contradicts Apple's commission.

How to do it

  1. App Store Connect → Payments and Financial Reports → export to 2024.
  2. Play Console → Transactions → same.
  3. Drop both into tools/finance/data_app_proceeds.json.

✅ Done when: Both exports in the repo and the app ratio recalibrates.

AGA30 min ●●●●●
21
Rebuild 750 TMA Welcome Sequence After Quiz
🔎 VERIFIED 5 AUG — CHANGED — do not do as written. 🔴 Do NOT rebuild 750. It was never wholesale-rewritten and it improved (CTR 0.457% → 0.658%). The EVOLUTION LAW (3 Aug) bans whole-sequence rewrites. What Aga actually ruled: move 750 to a day 3–4 start, and fix [Chosen Password] first because it carries the login.
Remove the Black Friday references and other stale claims.
why this matters + step-by-step →

Why it matters. 19,532 people have been through a sequence shipping falsehoods. It is the first thing a new lead reads.

How to do it

  1. Audit every email in 750 TMA | Welcome Sequence After Quiz for stale or false claims.
  2. Rebuild through /email-fleet.
  3. Review rendered before it goes live.

✅ Done when: 750 TMA | Welcome Sequence After Quiz contains no false or out-of-date claims.

AGA ●●●●●
24
Rule on the day-5 trial reminder email
🔎 VERIFIED 5 AUG — STILL OPEN. ❓ Ruling never made.
Decide whether the day-5 “your trial ends soon” email stays as it is.
why this matters + step-by-step →

Why it matters. The 28 Apr “continuity-only” ruling was made when the day-8 charge was $12–25. That reasoning does not automatically survive the change.

How to do it

  1. Re-read the 28 Apr ruling.
  2. Decide: keep, rewrite, or drop.
  3. Tell the email fleet — do not hand-edit the email.

✅ Done when: A decision recorded and the fleet has it.

AGAyour call ●●●●●
25
Suppress the 766 Facebook Lead Form Building Muscle list
🔎 RE-VERIFIED 6 AUG — STILL OPEN. 766 Facebook Lead Form | LM: Building Muscle After 40 reads status=ACTIVE in AC with 913 entered.
🔎 VERIFIED 5 AUG — STILL OPEN. 🔴 Open — and it matters: 766 is one of the feeders found in the estate-wide scan, and its list must be suppressed before any warm send.
Exclude the ~913 contacts from that old lead form from all sends.
why this matters + step-by-step →

Why it matters. ⚠️ Recency-corrected 27 Jul. This was ranked a 1-hour P1, “must happen before any warm send”. Live check: automation 766 Facebook Lead Form Building Muscle was last modified 5 Dec 2025 and the last contact entered on 14 Nov 2025 — dead for eight months. The 1.7% open on 10,665 sends is 2025 history, not a live bleed. Two minutes of hygiene so the contacts cannot creep into a warm send.

How to do it

  1. Find the 766 contacts in ActiveCampaign.
  2. Add to global suppression.
  3. Do not delete.

✅ Done when: Suppressed. Do not let it block anything.

AGA2 min ●●●●
26
Run the pulls monthly
🔎 RE-VERIFIED 6 AUG — recommend CLOSE as obsolete. The 06:00 job already pulls most rails daily. The only genuinely manual pull is the Apple ASC + Play export, which is already task 18 — and per today’s check the ASC half becomes a script the moment the vendor number is handed over. Keeping this row alive just duplicates 18.
🔎 VERIFIED 5 AUG — STILL OPEN. ❓ Open — partially automated since (the 06:00 job pulls most rails).
quiz_buys_90d.py · pull_quiz_deep.py · pricing_model_rerun.py
why this matters + step-by-step →

Why it matters. Stops this going dark again and re-discovering the same findings in three months.

How to do it

  1. First working day of each month, run all three.
  2. Compare against the previous month.
  3. Update the plan if anything moved materially.

✅ Done when: Three fresh outputs, monthly.

AGA ●●●●
32
Decide whether /register migrates to checkouts-v3 or is retired
🔎 RE-VERIFIED 6 AUG — STILL OPEN, and cheaper to decide than it was. The live quiz bundle still ships 14 /register/ destinations (yearly3 dominant), so /register is genuinely load-bearing — but the new $97 paywall already pays through the checkouts-v3 rail. The estate is half-migrated by accident; ruling now stops it drifting further.
🔎 VERIFIED 5 AUG — STILL OPEN. ❓ Decision never made. It gates task 23.
We now run two checkout estates on two different analytics contracts. Nobody has decided which survives. [NEW — added 29 Jul 2026]
why this matters + step-by-step →

🆕 ADDED 29 Jul 2026 after live-reading the production bundles. This decision was missing from the plan entirely, and it silently corrupts two other tasks.

Why it matters. Nic shipped 24 checkouts-v3 pages to production — on-page Stripe Elements, wallets, first-touch attribution, real purchase values, transaction_id dedupe. Good work. But the live quiz bundle contains the string checkouts-v3 exactly zero times — it still ships six hardcoded app.themovementathlete.com/register/<plan>/ URLs. So we now have:

Estate A — NEWEstate B — UNTOUCHED
URLs/payments/checkouts-v3/* (24)/register/<plan>/ (6)
Fed byemail, ads, promo, upgrade linksthe quiz paywall
Checkouton-page Elements + Apple/Google Payunchanged
Attributionattribution.js → rides into the payment intentnone
Analyticsreal value, transaction_id dedupenone of it

Two estates on two analytics contracts is a measurement problem, not just a tidiness problem. It directly undermines task 11 (“reconcile Meta’s purchases to Stripe within ~10%” — across two contracts that report differently) and task 20 (re-baseline — the denominator now depends on which estate a buyer happened to land in). Left undecided, it quietly makes both unanswerable.

How to do it

  1. Decide: does the quiz paywall repoint to checkouts-v3, or does /register stay and get brought up to the v3 contract?
  2. Recommendation: migrate. Task 28 (on-page checkout) already wants the v3 contract on the paywall — doing both at once retires Estate B rather than maintaining two.
  3. Write the decision down. Tasks 10, 11, 23, 28, 29 and 30 all change depending on the answer.

✅ Done when: a written decision exists, and every affected task above has been re-pointed to match it.

NICdecision ●●●●
33
Make a free test account so the free-member experience can be audited
🔎 RE-VERIFIED 6 AUG — STILL OPEN. /register/ (bare) returns 404, so there is no obvious self-serve free-signup door to test from outside; the free-member experience genuinely cannot be audited without an account being made. 5 minutes of Aga’s time unblocks it.
🔎 VERIFIED 5 AUG — STILL OPEN. 🔴 = AGA-66, 10 min — and it blocks NIC-70 (the free-member audit was run and dead-ended because the supplied account is a paying Monthly 70%-off subscriber).
Three questions about what a free member sees cannot be answered from outside the login wall. A throwaway free account settles all three. [NEW — added 29 Jul 2026]
why this matters + step-by-step →

Why it matters. The web app analysis established that an upgrade path does exist — /payments/checkouts-v3/upgrade/<plan>/ works and is correctly login-gated. What it could not establish is whether that path is ever shown to anyone. Everything behind /login is invisible to an outside read, so three questions are still open:

  1. Does a free member see an upgrade CTA on /skills/main (815 sessions — the 2nd busiest page in the app) or anywhere in the navigation?
  2. Does /profile/subscriptions (388 sessions) present the plan menu, or only the member’s current plan?
  3. Is content actually gated for free members, or is the whole skill tree browsable?

🔴 The reason this is worth two minutes. If a free account sees no upgrade prompt anywhere, that is a bigger finding than the missing pricing page — it would mean free accounts are a dead end by construction, and the people arriving on /register are acquired and then never asked for money. It also tells us which of the three checkout lanes an in-app upgrade CTA feeds; if it routes to the old un-instrumented lane, task 32 becomes more urgent.

⚠️ Aga’s own account will not answer this. It is on a paid or lifetime plan, so it renders the paid UI. The specimen has to be an account that has never paid.

How to do it

  1. Go to https://app.themovementathlete.com/registerno trailing slash; the slash version returns a hard 404.
  2. Sign up with a throwaway alias (e.g. aga+freetest@…). It must be done by hand — the signup form carries reCAPTCHA. Do not upgrade it and do not enter a card.
  3. Add two lines to .env.local (gitignored and untracked — it already holds the Stripe, Meta and Google Ads keys):
    TMA_APP_EMAIL=… · TMA_APP_PASSWORD=…
  4. Tell Claude to run tools/app-audit/free_member_probe.py — already written and verified. It makes exactly one POST (the login form) and GETs only thereafter; it never clicks upgrade, never starts a checkout and never changes a setting. Credentials are read from .env.local and never printed.

✅ Done when: the three questions above have written answers, and we know which checkout lane the in-app upgrade CTA feeds.

AGA2 min ●●●●●
📊 Below: does this plan actually close the gap?
The honest arithmetic on whether the 34 tasks above add up to $7,430/month. There are no tasks below this line — the list above is the whole plan.

Does this actually close the cash gap? ($7,210/mo at the 5 Aug pull; $7,430 when written)

The honest arithmetic
🔴 No. Not on these actions alone — and the gap is bigger than we were saying.

This plan closes roughly $600–900/month within 30 days, and $1,500–2,100/month within 90 days. The cash gap is $7,430 — not the $7,430 an MRR reading suggests.

BASIS CAVEAT The per-job sizings below were written on a mixed basis — some are cash, some read as MRR, and the two "one-off" rows are neither. They need one re-pricing pass onto pure cash before anyone plans against the total. Stated rather than silently reconciled.

Closing the rest needs three things to also happen: new subs recovering toward the paywall-era level of ~22/week, the ad-platform signal fix actually landing, and the plan mix compounding across several cohorts. Full closure by November is possible. It is not guaranteed on current evidence.

This is deliberately more conservative than summing each job's modelled ceiling. Adding up separate seats' best cases produces a number nobody should plan against.

Where the closure actually comes from
Putting the year back on the paywall produces 60–70% of all achievable gap-closure over 90 days. Everything else on this page is either hygiene (do it anyway, it's cheap) or bench (real, but not a 30-day lever).

That is the whole 80/20. One change, measured in hours of build time, is most of the answer — which is also why the price decision on it matters more than any other decision in this document.

JobModelled /monthStatus
Task 1 · Ship the new quiz pricing page (annual back on the paywall)the 60–70%✅ SHIPPED 31 Jul — measuring
live-verified 31 Jul 2026 — quiz subdomain redirected, $97 annual charged today, ramps intact. The forecast below is now an outcome to be measured, not a projection.
7b · Monthly→Annual upgrade engine (990)+$320–830 one-offbench · the only retroactive lever
5 · Ad-platform purchase signal+$450–800bench · gates paid scale
7 · Annual offer to the engaged list+$700–1,000 one-offCORRECTED — a one-time decaying pulse, NOT recurring
the engaged list is a finite ~6,367; you cannot re-offer the same annual to the same people monthly
1 · Fix the early-July lead leak~+$1,000
$3,500 only under full-recovery + LTV assumptions
DOWNGRADED
40 leads/wk × ~12.6% lead→paid × ~$46 ≈ ~$1k/mo of first-payment cash. Decline is CONFIRMED real; the cause and therefore the value are not.
4 · Stop buying the junksaves spendhygiene · do today
3 · Make the dead button speakunmeasurable until loggedhygiene · do anyway
Payment recovery rail+$160–320MODELLED
BWA → quiz links+$41–83bench · do not rush it
Cancel-save waves B/C+$310–520~$0out of the forecast
🔴 One line came out of the forecast today
The cancel-save waves were carrying +$310–520/month. Verified live: only ~30 members are actually sendable (not 81), the copy carries no offer by design, and 65–71% of cancellers say no price would keep them. Wave A returned 0 saves from 24 delivered — the mechanism working as designed, not a failure. Send it for the churn-reason data. Do not forecast revenue against it.

What is genuinely settled: $15K is reached through average sale value and conversion, not traffic. "Thousands of customers in 90 days" would need roughly 8,000 leads, 33,755 landings and ~$120K of spend against a $9K/90-day budget — about 13× short. Thousands of leads is achievable. Thousands of customers is not.

Watch one number: average per new sale is $46.05 today. If it is above $65 by week 4, this is working.

⏳ The growth fleet is re-running this ranking now
Four specialist seats — quiz CRO, pricing, retention and the channel-neutral growth lead — are re-ranking against the corrected numbers, with the skeptic gating every claim. Their verdicts fold into this tab.

✅ Done — archived from the plan, 6 Aug 2026

These rows are DONE, SUPERSEDED, RETIRED or MOVED — taken off ✅ The plan (18 on 6 Aug 2026, 6 more on 7 Aug 2026) so the plan tab shows only what is left. Each keeps its full original text and its 🔎 verify badge (5 Aug sweep + 6 Aug live re-checks). Nothing here needs action. Done: 1 · 2 · 3 · 5 · 8 · 9 · 13 · 15 · 19 · 22 · 27 · 28 · 29 · 30 · 31 · 34  ·  Superseded: 7 · 20.
7 Aug — the Nic pass: retired by Aga: 10  ·  closed on evidence: 11 · 17  ·  moved to Nic’s brief, still open: 6 · 16 · 23.
🔎 6 Aug live confirmations worth keeping: task 19’s checkout_button_dead is in the served bundle · task 5’s 979 Re-Engagement - For people who stopped opening Before Sunset reads INACTIVE in AC · task 9’s 990 Monthly→Annual Upgrade Engine (Jul 2026) reads ACTIVE (but only 20 ever entered — the feed is its own open thread).
#TaskOwnerTimeImpact
🗓️ 7 AUGUST 2026 — THE NIC PASS: every Nic row re-verified live, then retired, closed or moved. ✅ The plan is now AGA’s list plus the open decisions.
10
🗑️ RETIRED BY AGA — 7 August 2026. Aga: "this has to be removed". It had already been reassigned to her on 6 Aug because the only part left was an email build — but the two halves it waited on have since resolved in opposite directions, which is why it stops being a row at all: the quiz-side capture is DONE (NIC-54 shipped 7 Aug — the five stage tags carry real contacts, verified by live census, so NEW quiz-reached-checkout already identifies a quiz abandoner), while the v3 side still has no email capture to attach anything to. The recovery lane itself belongs to the email fleet under the sequence law; the v3 email-capture question rides with NIC-41. Nothing is lost — and nothing is silently closed either. This is where it went.
Rebuild abandoned-cart capture on the v3 payment-intent flow
🔎 RE-VERIFIED 6 AUG — reassigned to AGA (her call, 6 Aug). The technical capture half is not this row’s work: the quiz estate needs NIC-54’s five stage signals (with Nic, on his own brief — verified today at 0 flow: tags exist, 0 contacts), and checkouts-v3 mints a Stripe customer with an email on valid-email blur, so an hourly job can TAG those people into AC. What is left here is the recovery lane itself — an email build, which is Aga’s by the ownership rule. The old webhook is not broken, it is obsolete: checkouts-v3 has no Checkout Session for it to listen to.
🔎 VERIFIED 5 AUG — STILL OPEN. 🔴 Still open, and the ground shifted: the Stripe abandoner feed died 3 Aug when page-load minting stopped (6→7→2→0/day). Quiz estate needs NIC-54's five signals; v3 has no email capture at all, so a tag would attach to nobody.
The old webhook is not broken — it is obsolete. checkouts-v3 has no Checkout Session for it to listen to. [Estate A — checkouts-v3]
why this matters + step-by-step →

🔄 REWRITTEN 29 Jul 2026 — Nic shipped checkouts-v3 to production. The previous version of this task said “fix the dead Stripe checkout-abandoned webhook — 0 contacts in 46 days”. Chasing that webhook is now the wrong job. checkouts-v3 confirms payment on-page using a PaymentIntent/SetupIntent — there is no Checkout Session, so checkout.session.expired can never fire for a v3 buyer. The webhook is not broken; it is listening for an event this checkout no longer produces.

Why it matters. 756 Abandoned Cart Reminder Part 1 and 757 Abandoned Cart Reminder Part 2 have never fired — an entire recovery lane is silently dead. But v3 actually gives us a better abandon signal than the webhook ever did: POST /update-payment-intent captures email + name + phone before the payment is confirmed. An abandon is now simply a payment intent that received an email and never succeeded — which is a cleaner, earlier signal than a Stripe session timeout.

How to do it

  1. Build the abandon query off the v3 flow: payment intents that got an email via /update-payment-intent and never reached succeeded. Pick the cut-off (suggest 60 min).
  2. Re-point 756 Abandoned Cart Reminder Part 1 and 757 Abandoned Cart Reminder Part 2 at that source.
  3. 🔴 Nic to confirm (cannot be checked from outside): does Estate B — the /register/<plan>/ pages the quiz still redirects to — also use hosted Checkout Sessions? If yes, decide whether that webhook is worth fixing or whether the estate is being retired (see the new /register migration task).
  4. Confirm a real test abandonment on a v3 page produces a contact.

✅ Done when: a test abandonment on checkouts-v3 produces a contact and 756/757 fires — and the Estate B question above has a written answer.

AGA ●●●●●
11
✅ CLOSED 7 August 2026 — it was never a build, and the build half already shipped. The client leg is in the served bundle (fbq Purchase + event_id) and the server leg shipped as NIC-34, which Nic’s own attribution brief has carried as ✅ closed since 6 Aug. What was left was one observation — see a real purchase flow with a matching event_id — and an observation is not a task on a cash plan. It rides as a watch line on Nic’s brief.
Fix the purchase signal — server-side CAPI
🔎 RE-VERIFIED 6 AUG — NARROWED to a watch, not a build. The served quiz bundle carries fbq + a Purchase event + event_id (5 refs), i.e. the client leg is shipped. What remains is observation, not work: one genuine purchase must flow through and be seen with matching event_id. Do not re-scope this as a build.
🔎 VERIFIED 5 AUG — NARROWED. ⚠️ Server CAPI is ALREADY BUILT — do not rebuild. Remaining work is one verification step (a real purchase or Pixel Helper capture on quiz success) = NIC-34, minutes not hours.
The browser half now works on checkouts-v3. What remains is the server half, a pixel-load check, and Estate B parity. [Estate A partly done · Estate B untouched]
why this matters + step-by-step →

✅ NARROWED 29 Jul 2026 — part of this is already shipped. Nic’s /static/checkouts_v3/analytics.js now sends purchase with a real value from TMA_PLAN (not a static number), dedupes in-session by transaction_id, and passes that id to fbq as eventID — which is exactly the key server-side CAPI needs to deduplicate against. begin_checkout also carries the real value. On checkouts-v3, the browser half of this task is done.

Why it matters. Gates every paid decision. Meta is trained on 5,171 “Leads” against 172 “Purchases”, and its own lead counter is wrong by 7–9× — it reported 2,026/3,068/2,460 leads in Jan–Mar against our actual 290/333/318. We have been paying it to find button-clickers.

How to do it — the three things actually left

  1. Wire server-side CAPI with the real Stripe amount. The browser pixel is only half the signal; the eventID dedupe key is already in place to match against.
  2. 🔴 Verify the Meta pixel is even loaded on the v3 pages. fbq appears zero times in the v3 page HTML — it exists only inside analytics.js. If GTM does not inject the pixel, window.fbq is undefined and the Purchase call silently does nothing — the same invisible-failure pattern as task 19. Check this before trusting any Meta number. Meta Pixel Helper on a live v3 checkout answers it in 30 seconds.
  3. Estate B parity. The /register/<plan>/ pages the quiz redirects to have none of this — no real values, no dedupe, no attribution. Either bring them up to the v3 contract or retire them (see the new /register migration task).

✅ Done when: Meta’s reported purchases reconcile to Stripe within ~10% — and the pixel-load check above has a written answer.

NIC~1 hr ●●●●
17
✅ CLOSED 7 August 2026 — recommended CLOSE twice, and it moves no number. No record anywhere of where the Report Bug widget or Funnelytics were seen, 0 references in the live quiz builds, nothing downstream depends on it. If one ever turns up on a live page, file it fresh with the URL.
Confirm where the Report Bug widget and Funnelytics were seen
🔎 RE-VERIFIED 6 AUG — recommend CLOSE. Still no record anywhere of where the Report Bug widget or Funnelytics were seen, no downstream task depends on it, and no number moves either way. If one turns up on a live page, file it fresh with the URL.
🔎 VERIFIED 5 AUG — STILL OPEN. ❓ Never answered. Low value now.
Neither is on either live quiz variant. The other two defects have been folded into task 1. [Estate B — the quiz paywall]
why this matters + step-by-step →

✅ MOSTLY DISSOLVED 29 Jul 2026 — this task was four items; two are already gone and two moved. Both live bundles were read directly (/2026-v2-2/assets/index-DPkL72Wi.js and /2026-v2-3/assets/index-DBgHnaAZ.js) plus both page shells.

Original itemin v2-2in v2-3Status
Dead downsell button ("show me another option")22→ moved into task 1 (same bundle as checkoutUrl)
“96 progression levels” copy43→ moved into task 1 (same bundle)
Report Bug widget00NOT IN PRODUCTION
Funnelytics tracker (403)00NOT IN PRODUCTION

Why it matters. The Report Bug widget and Funnelytics appear nowhere on either live variant — not in the JS bundle, not in the page shell — and no third-party bug-report widget of any known kind is present either (checked Marker.io, Usersnap, BugHerd, Sentry, Instabug, Jam, Bird Eats Bug). Either Nic already removed them, or they were observed on a staging/preview build, or on a different surface entirely. Do not spend build time removing something that is not there.

How to do it

  1. Ask Nic: were these already removed, and if not, where were they seen — which URL, which build?
  2. If they were on a preview/staging build, note it and close this. If they are on a surface we have not checked (a different variant, the app shell, the /register pages), name that surface and re-scope.
  3. The two real defects need no action here — they ship with task 1.

✅ Done when: a one-line written answer from Nic on where the Report Bug widget and Funnelytics live, or confirmation they are gone.

NICsame deploy ●●●●●
➡️6
➡️ MOVED TO NIC’S BRIEF — 7 Aug 2026 · Kill the junk traffic — the dead placements
Meta Audience Network solved itself ($4.61 of $605.91 = 0.8% of 30-day spend). The live half is a Google Ads console action — Quiz Funnel | Competitive Non-Branded | US, still ENABLED, £199.28 in 30 days, 24 clicks, 0 conversions. It is still open — it now lives on Nic’s brief with its full text, so there is exactly one list per person.
NIC
➡️16
➡️ MOVED TO NIC’S BRIEF — 7 Aug 2026 · The landing screen — the biggest single loss
Aga, 6 Aug: "this is NOT done and we have not done it." Real and stable at 54.5% since ≥9 Jul, so structural rather than a regression — and under the standing ruling it goes LAST, because stable-and-expensive waits behind the leaks that actually moved. It is still open — it now lives on Nic’s brief with its full text, so there is exactly one list per person.
NIC
➡️23
➡️ MOVED TO NIC’S BRIEF — 7 Aug 2026 · Work the /register page as CRO
Still blocked on decision 32, and the block is real: all five /register/ plan URLs return 200 live, so the page is genuinely still serving buyers. Do not CRO a page that may be retired. It is still open — it now lives on Nic’s brief with its full text, so there is exactly one list per person.
NIC
1
SHIP THE NEW QUIZ PRICING PAGE — built exactly as the UI contract ✅ SHIPPED 31 Jul — live, now measuring
🔎 VERIFIED 5 AUG — DONE — but see note. ✅ Shipped 31 Jul — but completion is AGA-56: /2026-v2-2/ still takes ~65% of paywall views, so most buyers still never see the $97 annual.
🔗 Build target: tma-paywall-spec.netlify.app — one arm, no tabs, no alternatives, no A/B notes. What is on that page is what ships. The page is designed, finished, and it is the pricing page and the checkout in one. Nic ships it verbatim and does no copy work — his job is the Stripe and tracking wiring underneath it. Annual $97 charged today, full-width and pre-selected; the 12-week and 4-week ramps beneath at $24.98 / $12.48 against their struck standard prices. [Estate B — the quiz paywall. Untouched by checkouts-v3.]
why this matters + step-by-step →

✅ SHIPPED — 31 July 2026, by Nic. Live-verified 31 Jul: quiz.themovementathlete.com 302s to /2026-quiz-checkout-v1/ (200) — the whole subdomain now points at the new page, so it takes hold on every quiz finisher. Checkout also reachable direct at app.themovementathlete.com/payments/quiz-checkout/ (200). Confirmed in the live bundle: annual $97 charged today (yearOne:"$97", /50off/12month/), ramps at $24.98 and $12.48 against their struck standards, 60-day guarantee and per-week maths present, addToCartValue now populated 97 / 25 / 12 (the 0 defect is fixed on the live path), tma_ckt_out is set on hand-off, the exit modal is wired and firing (paywall_exit_modal_shown / paywall_exit_modal_cta, variant paywall_v2_2_newpaywall), and UTMs incl. gclid/fbclid are forwarded into the checkout URL. GA4, GTM and the Meta pixel are all in the page shell. The measurement clock starts now — kill-switch armed: revert if rolling 14-day RPV < $6.04, or demand retention lands under 65%.

⏳ Shipped, but four things are still open — none of them blocks the measurement.

Open itemWhat it isOwner
🔴 A test domain is baked into the production bundleThe shipped JS carries VITE_REGISTER_PAY_URL: "https://app-test.themovementathlete.com/register/yearly_2026/". That is the fallback register route, not the primary path — but if it ever fires, a real buyer lands on a test domain. Point it at production or remove the fallback.NIC
A second plan set still sends addToCartValue: 0The register/ plan block (annual_trial 157, monthly_trial 0) still carries the original defect. Harmless while the /50off/ set is the live path; becomes a Meta-optimisation bug the moment the fallback is used.NIC
The real-money test purchaseBundle config says $97 — that is not the same as Stripe charging $97 today and scheduling $157 at renewal. One real annual purchase confirms the coupon mechanic end to end.NIC
A buyer must never get an abandonment emailAga, 31 Jul: “if someone pays I want to make sure they get a welcome email, not the abandonment email.” Raised as its own task below.NIC

Also landed in the same push: the welcome email no longer says “the password you chose” — it carries the generated password (Aga caught it on the live send, 30 Jul); and the exit popup, which looked missing, is in fact deliberately delayed ~15–20 seconds so it cannot interrupt someone who is actually paying. Nic has offered to A/B that delay — parked for next week, not in this task.

Why it mattered. 60–70% of all achievable gap-closure sits in this one task. Annual is 48.9% of new-sale cash and has been unbuyable since 20 June — the live variant paywall_v2_2 has no annual tier on it at all. This is a missing product, not a presentation problem. Verified live in Stripe on 29 Jul: annual did not simply fall, monthly doubled. Feb–Apr annual 36.0% / quarterly 30.2% / monthly 33.7% (n=258) → 10–27 Jul annual 16.1% / quarterly 19.5% / monthly 64.4% (n=87). On the Q1-2026 cohort at 4–7 months, annual realises $79.04 per subscriber with 69.7% still active; monthly realises $27.99 with 15.6% still active. Every week this waits, another cohort is sold the worst plan we have.

What to build — the card row, exactly as shipped on the ★ SHIP arm

TierPays todayStruck standardBadge
12 Months — hero, full-width, pre-selected$97$157SAVE $60 · 3× cheaper than 4-Weekly
12 Weeks$24.98$49.9750% OFF
4 Weeks$12.48$24.9750% OFF

DESIGN LAW The ramps sit under a shared header “Not ready for 12 months?”, carry an unselected radio dot, and print 1st year · $175 / $287 bolded so the decoy fires on the card. The per-week number stays loud on the ramps — on that axis annual wins outright ($1.87 < $3.36 < $5.52), which is exactly what makes the decoy work. Do not flip it to lead on cash-today. And never ship the bare 50% OFF badge without the struck standard price on the same card — the badge is only honest because it reconciles against the price printed directly above it.

How to do it

  1. 🔴 Open the UI contract: tma-paywall-spec.netlify.app — this is the build target and it has nothing on it but the screen to build. No model tabs, no alternative arms, no A/B appendix. The only control is the 8-path preview strip: copy changes per path, layout and pricing do not. If you want to see the arms that were not chosen, the full 4-model comparison page still exists and opens on the ★ SHIP arm (m7) — but build from the contract, not from it.
  2. Read the full brief — tier lists, bucketing code, defects 1–8, Step 6’s 7 wiring hooks, and the 6 acceptance criteria.
  3. 🔴 Mint the $97 mechanic in Stripe first — it does not exist. There is no $60-off / 38.2% coupon in the account, and every annual subscription since 1 June charged $157 with no coupon. Create a duration: once mechanism that charges $97 the first term, $157 after. Without it the annual rung cannot charge $97 and the whole ship arm is blocked.
  4. 🔴 Never build $97 behind a trial. At the measured 36.9% trial conversion that models at −9%. Charged today, no trial.
  5. Make the sticky CTA carry the selected tier. It currently enrols everyone at $24.97 regardless of what they tapped. On the July trial run-rate this one fix alone is a modelled +$1,300–2,600/month on identical traffic and identical conversion.
  6. 🔴 Wire the CTAs to actually pay. On the design page every CTA only scrollIntoViews and the primary button has no click handler at all. Also set tma_ckt_out on checkout hand-off — it is never set today, and the exit modal’s return trigger depends on it.
  7. Fix addToCartValue — the trial tier currently sends 0, and Meta optimises on that event. Forward UTMs into Stripe subscription_data.metadata.
  8. 🔴 PRE-SHIP GATE — tap every tier on a real phone. The live line if (i !== "control" && !P?.checkoutUrl) return; means a tier without a checkoutUrl has a button that does nothing and fires no event. If the annual rung ships that way we would see zero annual sales, no error, and conclude “$97 doesn’t sell” — when the button was dead. This is the single most likely way this ships as a false negative.

✅ NIC DOES NO COPY WORK ON THIS — 29 Jul, Aga. “He should not need to do that if he ships the checkout we created — it combines pricing page and a checkout.” The ★ SHIP arm is the pricing page and the checkout in one artifact (verified: it carries its own paybox, Card number, Expiry, CVC and Stripe fields). He ships it verbatim. Tier names, wording, levels copy, proof and layout are settled on the page before handoff — they are Aga's, not his. If something reads wrong it comes back to Aga and the page changes; it is never patched in the build.

Two old-bundle chores are therefore deleted from this task, not deferred:

Was on Nic's listWhy it is gone
Relabel “4 Weeks”→“1 Month”, “12 Weeks”→“3 Months”Not Nic's call. It is a tier name on Aga's page. The underlying fact still holds — Stripe has monthly3 = 1 month and quarterly2 = 3 months, and no week-interval price exists among the 82 active prices — so “per 4 wks” on the old live bundle implies 13 charges a year and misstates the charge. That string does not exist on the new page. Whether the ramps are named in weeks or months is decided on the page, by Aga, before handoff.
Fix the levels copy (“96 progression levels across 9 foundations” → “100+ … 9 Fundamentals”)Moot. Verified 29 Jul: that string appears zero times on the new page. It only ever existed in the old quiz bundle, which this page replaces. Nothing to fix.

🔴 OPEN — the downsell button, for Aga. "show me another option" appears twice in each live bundle and zero times on the new page. Aga, 29 Jul: “this needs to be wired.” Before it is added, one thing has to be true: the old paywall needed an escape hatch because it showed one price. The new page already shows all three tiers on the same screen, so the escape hatch is the page. Decide on the page, before handoff — either it goes on and is wired to something real, or it is deliberately absent. What must not happen again is the current live state: a button that is there and does nothing.

⏱️ The one dependency, stated plainly. Task 2 — the /api/quiz/config 404 — is a timeboxed 2–4 hr diagnostic, and the fallback config may be what controls the live tier list. It must report before this DEPLOYS. It no longer sits ahead of this in the priority order (Aga, 29 Jul). Run them in parallel; do not let the diagnostic hold the build.

🔴 “What’s the fallback?” — the word means three different things in these documents. For Nic, spelled out:

Which “fallback”What it meansWhere it lives
1. Fallback config
the cause
The quiz cannot reach /api/quiz/config (404), so it boots from a hardcoded default set of values.Task 2. Must report before this deploys.
2. Fallback URL in the code
the bug
The handler works out a backup checkout URL — and then throws it away one line later, before ever using it:
const N = P?.checkoutUrl || EM();
if (i !== "control" && !P?.checkoutUrl) return;
This task + task 19. One line causes both.
3. Fallback offer
the business decision
Variant v2_6 — annual $157 behind the 7-day trial, ramps unchanged. Built behind a flag, not shipped.Step 2 of the Nic brief. Deployed only if the kill-switch fires (14-day RPV < $6.04) or Aga rules again.

✅ Done when: the shipped page is the ★ SHIP arm, unchanged; a real test purchase of the annual rung charges $97 today and is scheduled to renew at $157; the ramps charge $12.48 and $24.98; every tier button actually goes somewhere; and the Stripe metadata is not empty.

NIC1–2 days
+30 min validation
●●●●●
2
Confirm the price ruling effectively answered
🔎 VERIFIED 5 AUG — DONE. ✅ Ruled — annual $97 charged today, pre-selected; shipped 31 Jul.
Put the ruling in writing to Nic so the build has a paper trail: $97/year, charged today, pre-selected, ramps unchanged.
why this matters + step-by-step →

✅ ANSWERED BY THE READY PAGE — 29 Jul 2026. This used to be task 1 and it gated everything. It no longer does: the ★ SHIP arm is the ruling — $97 annual, charged today, pre-selected, ramps unchanged — and Aga has it ready. Nic starts task 1 now; this is a one-line written confirmation, not a gate.

Why it matters. It costs zero developer time and it is what Nic quotes back if anything is ever queried.

How to do it

  1. One line to Nic: annual $97, CHARGED TODAY, pre-selected; ramps unchanged; build the ★ SHIP arm.
  2. Framing on the hero: “SAVE $60” against a struck $157. Not “50% off” — 50% off $157 is $78.50, so at $97 that claim is arithmetically false.
  3. The bare 50% OFF badge is honest on the two ramps, because they print the struck standard price on the same card and the Stripe coupon is duration: once — $24.98/$49.97 = 50.01%, $12.48/$24.97 = 50.02%. It is only honest with that strike-through beside it.

✅ Done when: Nic has it in writing.

AGA0 min ●●●●●
3
Pause 973 Nurture Sequence 1 NEW COPY FROM CLAUDE → route to 751 Nurture Sequence 1
🔎 RE-VERIFIED 6 AUG — routing DONE, but 973 is still ACTIVE. 973 Nurture Sequence 1 NEW COPY FROM CLAUDE reads status=ACTIVE in AC with 11,056 entered (was 9,518 on 29 Jul). The 7 enter-blocks were repointed so new entrants go to 751 — but contacts already inside keep moving, which is precisely why task 4 still matters.
🔎 VERIFIED 5 AUG — DONE. ✅ Fixed 4 Aug (not 28 Jul as first claimed — it had no trigger of its own; 7 enter-blocks at the end of 750/967 were repointed to 751, AGA-98). ~1,674 people entered after it was declared off.
Stop the rewrite and send new entrants to the original sequence.
why this matters + step-by-step →

Why it matters. Measured across 83,4xx sends the rewrite converts at 1.87% against the original's 6.25%. It is a live regression costing money every day it runs — the single most expensive thing still switched on.

📄 Read first: One Nurture Sequence — the consolidation plan. This task is step one of that plan. The doc sets out what each sequence actually does, why the blog-to-offer ratio explains the whole performance gap, and the decision to consolidate onto 758 Nurture Sequence 2 — so pausing 973 Nurture Sequence 1 NEW COPY FROM CLAUDE is a stop-the-bleeding move, not the end state. §3 has the execution order.

How to do it

  1. Set 973 Nurture Sequence 1 NEW COPY FROM CLAUDE to Inactive. (Live-checked 29 Jul: status ACTIVE, 9,518 entered — still running.)
  2. Repoint the entry trigger to 751 Nurture Sequence 1.
  3. Send a test contact through and confirm it lands in 751 Nurture Sequence 1.

✅ Done when: A test contact enters 751 Nurture Sequence 1, not 973 Nurture Sequence 1 NEW COPY FROM CLAUDE.

AGA15 min ●●●●●
5
✅ Pause 979 Re-Engagement - For people who stopped opening Before Sunset
🔎 RE-VERIFIED 6 AUG — CONFIRMED DONE. 979 Re-Engagement reads status=INACTIVE (11,130 entered, frozen). Replacement 991 NEW Re-Engagement is ACTIVE with 479 entered.
🔎 VERIFIED 5 AUG — DONE. ✅ 979 retired/emptied 31 Jul (3,498 journeys ended) → replaced by 991. ⚠️ 991's first run unsubbed 1.26%, over the 0.5% hard-stop.
ALREADY DONE — live-verified 29 Jul. The automation is already Inactive. No action needed.
why this matters + step-by-step →

✅ CLOSED 29 Jul 2026 — checked live against the ActiveCampaign API, not a doc. 979 Re-Engagement - For people who stopped opening Before Sunset returns status=2 (inactive), 11,130 entered. It is already switched off. Tick this and move on. Flagged under the standing recency rule: verify the timeline of every proposed action before spending time on it.

Why it mattered. 3,498 contacts active, only 2 have ever exited, 0.025% CTR. It promoted non-responders into 758 Nurture Sequence 2, polluting a sequence that actually works.

📄 §6 of One Nurture Sequence — the consolidation plan sets out what happens to this audience next. Pausing it was step one; the doc has the rest.

Remaining check (30 seconds)

  1. Confirm waves 5–6 are not still queued behind the paused automation — pausing stops entry, it does not always clear a queue.

✅ Done when: confirmed nothing is still queued. The pause itself is already complete.

AGA15 min ●●●●
7
Strip the lifetime plan and the countdown from /50promo
🔎 VERIFIED 5 AUG — SUPERSEDED. ⚠️ Aga ruled 29 Jul /50promo stays exactly as it is. Do not action.
Remove the lifetime offer and the countdown timer from the promo page.
why this matters + step-by-step →

Why it matters. It sells a plan we have banned, behind a timer that never ends — and 15 emails across 6 automations point at it. Every one currently sends people to a broken promise.

How to do it

  1. Edit /50promo: remove the lifetime option and the countdown.
  2. Check the 15 linking emails still read correctly against the new page.
  3. Leave the discount offer itself in place.

✅ Done when: The page has no lifetime option and no timer, and the linking emails still make sense.

AGA~1 hr ●●●●●
8
Check why /api/quiz/config returns 404
🔎 VERIFIED 5 AUG — DONE.RESOLVED — returns 200, live-checked 2 Aug. The lead rate recovered to ~26.6% by 3 Aug. The start date is permanently undatable, and this was a separate event from the June break (began 17 days later).
The live quiz calls /api/quiz/config, gets a 404, and runs on fallback config. Find when that started and what it changes. Runs first — nothing else in the paywall deploy starts until this reports. [Estate B — the quiz paywall]
why this matters + step-by-step →

Why it matters. 🔴 Narrowed 27 Jul. This was a 2–4 hour “two unexplained signals” investigation. The second signal was diagnosed from GA4 and needs no developer: quiz sessions rose in early July (+9%) while generate_lead dipped 143 → 68 and has since recovered to 98–101 — but that is still ~25–30% below the June peak of 143/132, so it is not fully over. What changed is the shape of the job: the fall is verified real (below), it was not a traffic loss, and it does not need a developer to establish. The /api/quiz/config 404 is the part that does.

✅ CHECKED 27 Jul — it is real. There is no ghost.
Quiz-tagged ActiveCampaign contacts, against GA4 lead events, by week:
Week15–21 Jun22–28 Jun29 Jun–5 Jul6–12 Jul13–19 Jul20–26 Jul
AC quiz contacts143105976688101
GA4 leads13211898697998

Across 29 Jun–5 Jul→6–12 Jul the fall is −32% in ActiveCampaign and −30% in GA4. These are mechanically different systems — a backend tag write versus a browser event — and they fell together. A GA4 measurement failure cannot move the ActiveCampaign number, so the lead decline is real.

Precision, stated honestly: the two series track closely from 25–31 May onward (correlation 0.90, mean deviation 7%), but diverge in the earlier weeks — up to 48% in 27 Apr–3 May. That is likely because the AC tag and the GA4 event fire at slightly different funnel steps. The parallel drop is the evidence; do not quote the two series as interchangeable counts.

🔴 What this proves and does not prove: it proves the leads really stopped arriving. It does not tell us why. The cause is still open — that is the rest of this job.

How to do it

  1. Find when the 404 started — deploy history or logs.
  2. Establish what the fallback config changes, especially anything touching the paywall tier list.
  3. 🔴 While in deploy history, pull the paywall-variant switch date. That is the fact that turns the annual-break correlation into cause — Aga's point that the funnel went live around May, not June, is unresolved without it.
  4. Report in one paragraph. Do not exceed an hour.

✅ Done when: We know when the 404 began, what it affects, and the variant switch date.

NIC30–60 min ●●●●
9
Switch on 990 Monthly→Annual Upgrade Engine (Jul 2026)
🔎 RE-VERIFIED 6 AUG — CONFIRMED ON. 990 Monthly→Annual Upgrade Engine (Jul 2026) reads status=ACTIVE. ⚠️ But only 20 contacts have ever entered — switched on and starved. Treat “on” as the start of the job, not the end.
🔎 VERIFIED 5 AUG — DONE. ✅ Armed 3 Aug 12:14 — both gates open (automation ACTIVE + sentinel file). 22 tagged / 22 entered as of 4 Aug. Read CONVERSIONS, not opens.
Fire the upgrade engine at the cohort sold monthly while annual was unavailable.
why this matters + step-by-step →

Why it matters. 🔴 Time-decaying. Built, never fired. The only lever that reaches the ~81 people who were mis-sold, and it weakens every week.

How to do it

  1. Confirm the audience: June–July buyers on monthly.
  2. Run it.
  3. Count upgrades separately from new sales so they do not contaminate the paywall read.

✅ Done when: Sent, with upgrades counted separately.

AGA ●●●●
13
E3 — find why 758 Nurture Sequence 2 works
🔎 VERIFIED 5 AUG — DONE.Answered 5 Aug: 758 works because it has offer links where 973 had none — 1.240% offer clicks/send, 3.9× better than 751 and 177× better than 973. It is the untouched control and stays untouched.
It converts at 17.65% against 751 Nurture Sequence 1's 6.25%. Work out why, then route more people into it.
why this matters + step-by-step →

Why it matters. Highest value per hour on the list — no writing, no build, just a read of something already working.

✅ Largely ANSWERED already — read One Nurture Sequence — the consolidation plan before starting. §2 gives the reason: the blog-to-offer ratio explains the whole gap. §3 takes it further and rules that the consolidated sequence should be built on 758 Nurture Sequence 2. So this task is mostly a confirm-and-execute, not an open investigation.

How to do it

  1. Read §2 and §3 of the consolidation plan — the structural answer is there.
  2. Confirm it is copy and not an audience artefact (the one thing the doc does not settle).
  3. If it holds, route more entrants into 758 Nurture Sequence 2.

✅ Done when: the copy-vs-audience question is answered, and a routing decision is made.

AGA ●●●●●
15
E2 — investigate the broken CTAs
🔎 VERIFIED 5 AUG — DONE.Answered 5 Aug: the broken CTAs were 973's link architecture — zero offer, proof or promo links across 88,737 sends. Also 979: two emails with 5 tracked links each recorded literally zero clicks.
Four emails show high opens and near-zero clicks. Establish whether the links are broken or the copy is.
why this matters + step-by-step →

Why it matters. 🔴 Do not rewrite copy on 925 TMA 28 Day Challenge 2026 or 979 Re-Engagement until this rules. If it is a tracking fault those sequences may be fine, and we would be rewriting something that works. Hand to Nic only if it proves to be a code fault.

How to do it

  1. Click every CTA in the 4 affected emails and follow the redirect.
  2. Check link tracking is not mangling the URL.
  3. Report: tracking fault or copy fault.

✅ Done when: A verdict of “tracking” or “copy”, with evidence.

AGA1–2 hrs ●●●●●
19
Make the dead checkout button speak
🔎 RE-VERIFIED 6 AUG — DONE, confirmed live. checkout_button_dead is present in the served quiz bundle (index-DFwXN-qe.js), so a dead Buy button now emits an event and shows the buyer an error instead of silently swallowing them. Aga confirmed the same day. Moved to the ✅ Done tab. The two related defects are separate rows and stay open: NIC-59 (the 50%-off expiry button 404s) and NIC-58 (three of four 30trial/ URLs 404 — re-verified today: only 1month returns 200).
🔎 VERIFIED 5 AUG — PARTIAL. ⚠️ Related live defects: NIC-59 (the 50%-off expiry button 404s) and the dead Buy button on non-control variants. Both still open, both small.
When the Buy button silently does nothing, the person disappears from every number we have. Make it leave a trace. [Estate B — the quiz paywall]
why this matters + step-by-step →

What this actually is, in plain English. There is a line in the quiz checkout handler that says: if this visitor is on a non-control version of the paywall and the checkout link is missing, stop. No error, no message, no analytics ping — the button just does nothing and the page sits there.

const N = P?.checkoutUrl || EM();               // a backup URL is worked out here…
if (i !== "control" && !P?.checkoutUrl) return;  // …and thrown away here, before it is ever used

Why it matters. Because it fires no event, that person leaves no trace anywhere. They are not in the 604 buy-clicks, not in the 356 abandoners, not in any number in this document. We cannot say whether this is a small problem or a huge one — we genuinely cannot see it. That is the whole point of this task: it banks no cash by itself, it makes an invisible loss countable.

🔴 This is the insurance policy on the $97 test. If the new annual tier ships without a checkoutUrl mapped for its variant, the annual button does nothing and fires no event. We would see zero annual sales, no error, and reasonably conclude “$97 doesn’t sell” — when the button was dead. This is the single most likely way the whole plan produces a false negative. Do not treat it as a logging chore.

How to do it

  1. Find the early return in the checkout handler (quoted above — it is in the live quiz bundle, not in any repo copy).
  2. Before it returns, emit one event — checkout_button_dead — with the variant and the selected tier attached.
  3. Wait a week, then count it. That number sizes the defect.

✅ Done when: the bail-out fires an event and we can count how many people hit it.

NIC1 hr ●●●●●
20
Re-baseline every conversion rate once junk traffic is gone
🔎 VERIFIED 5 AUG — SUPERSEDED. ⚠️ Superseded by the 3 Aug measurement discontinuity — page-load minting stopped on both estates, so nothing before 4 Aug is an admissible baseline. Honest read ≈11 Aug, reliable ≈17 Aug.
Recompute the funnel after the dead placements stop.
why this matters + step-by-step →

Why it matters. Every rate in this document is measured over traffic that is ~10% junk. When it goes the rates move — and quoting the old baseline afterwards double-counts the improvement.

How to do it

  1. Wait 14 days after task 6.
  2. Re-run pull_quiz_deep.py.
  3. Replace the baseline and note the change date.

✅ Done when: A new baseline recorded with its start date.

AGA ●●●●●
22
Walk the other seven quiz paths
🔎 VERIFIED 5 AUG — DONE. ✅ Done — Round 4 pass 1 + the pass-2 production review over a 95-capture atlas; 7 redesigns and ~30 findings fixed.
Every defect found so far came from one path (Pain-Free / Recovery). Walk the rest.
why this matters + step-by-step →

Why it matters. 🔴 Reassigned 27 Jul — Claude walks these, not Nic. It is a scripted browser walk, not development. Nic only gets a defect list to fix, and tests his own build. Assume the same faults on the other paths until proven otherwise.

How to do it

  1. Claude drives each remaining path end to end on a mobile viewport.
  2. Defects logged per path.
  3. Anything that also affects the annual rung goes to Nic first; the rest is a batch.

✅ Done when: All 8 paths walked and a defect list handed to Nic.

AGA ●●●●●
27
Sign off the new paywall design ✅ signed off 29 Jul
🔎 VERIFIED 5 AUG — DONE. ✅ Signed off 29 Jul.
The ★ SHIP arm opens by default: annual full-width on top, ramps beneath, per-week leading on every tier. Kept as the record of what was approved.
why this matters + step-by-step →

✅ DONE — 29 Jul 2026. Aga: “the new quiz pricing page I have ready.” The ★ SHIP arm is the approved build target and it is now task 1. This row stays as the record of what was signed off, and as the place to look if anything about the approved layout is ever disputed.

Why it matters. Everything downstream — the Nic build, the attribution wiring, the offer copy across the estate — keys off this one page. It is the only artifact that shows the offer exactly as a buyer meets it.

How to do it

  1. Open the paywall — it lands on the ship arm.
  2. Tap each of the three tiers and watch the sticky bar and the legal line follow your selection.
  3. Compare against the ALT · 3-across tab, which is the previous layout.
  4. Say yes, or name what to change.

✅ Done when: You have told Nic which arm to build.

AGA10 min ●●●●●
28
Build the paywall as an ON-PAGE checkout
🔎 VERIFIED 5 AUG — DONE. ✅ That is what shipped 31 Jul — the pricing page and the checkout are one page.
Mount Stripe Elements under the tiers so the buyer never leaves the page — porting the contract Nic already proved on checkouts-v3. [Estate B — the quiz paywall]
why this matters + step-by-step →

Why it matters. 604 buy-clicks produced 248 subscription starts. The redirect to app.themovementathlete.com/register/… sits at the exact point of peak intent, and it is the clearest structural loss on the funnel.

✅ MUCH CHEAPER AS OF 29 Jul 2026 — the contract now exists in production. This task used to say “exactly as the live checkout already does”, which meant reverse-engineering it. It no longer does. Nic’s /static/checkouts_v3/stripe-client.js is the working reference: on-page #payment-element + #express-checkout-element, PaymentIntent for paid-today tiers, SetupIntent for $0 trials, wallets live, PII stripped from the URL after prefill. Copy that contract — do not invent a second one.

How to do it

  1. Port stripe-client.js from checkouts-v3 onto the quiz paywall. Server endpoints are already built: POST /create-payment-intent {checkout_version:'v3', plan, attribution}{clientSecret}, then POST /update-payment-intent {payment_intent_id, email, name, phone}.
  2. Mount #express-checkout-element (Apple/Google Pay) and #payment-element.
  3. Drive the amount from the selected tier — window.TMA_PLAN already works this way on v3.
  4. Wire all three CTAs to the real handler. Two of them currently only scrollIntoView, and the primary button has no click handler at all.
  5. Keep account creation, but move it to after payment.
  6. Note this supersedes task 29 if done — an on-page v3 checkout carries attribution natively, so the redirect-and-forward approach becomes unnecessary.

✅ Done when: A buyer can pay with Apple Pay without leaving the paywall.

NIC4–6 h ●●●●●
29
Pass quiz attribution into Stripe
🔎 VERIFIED 5 AUG — DONE. ✅ Shipped 4 Aug — UTMs/gclid/fbclid flatten into Stripe metadata on both estates, and pe= (the email recipient) landed the same day. Wired ≠ attributable: the join report (NIC-78) is still to build. NIC-45 (quiz answers into checkout) is phase 2 and waits.
Populate subscription_data.metadata at checkout-session creation. [Estate B — checkouts-v3 already solved this; copy it]
why this matters + step-by-step →

✅ THE MECHANISM NOW EXISTS — 29 Jul 2026. Nic’s /static/checkouts_v3/attribution.js already does this on checkouts-v3: it captures first-touch utm_source · utm_medium · utm_campaign · utm_content · utm_term plus gclid · fbclid · ttclid, persists them per browser, and getPayload() rides into POST /create-payment-intent. Do not design this from scratch — port the working module. Note it is first-touch, which is the right default and should be kept consistent across both estates.

Why it matters. Zero of 278 subscriptions in 90 days carry any attribution. Until this ships, no before/after on this page is legitimate and no channel CAC can be computed.

How to do it

  1. The quiz already appends utm_source · utm_medium · utm_campaign · quiz_variant · screen_id to the register URL — capture exists.
  2. Forward those into subscription_data.metadata; Stripe propagates them to invoice.subscription_details.metadata, so they survive the renewal.
  3. Add quiz_path and the selected tier.
  4. Verify in test mode with a Stripe test clock before deploying.

✅ Done when: 7 consecutive days with zero null-source subscriptions.

NIC6–8 h ●●●●●
30
Fix addToCartValue: 0
🔎 VERIFIED 5 AUG — DONE. ✅ Fixed — verified gone from the rebuilt bundle (NIC-30; hash moved index-CEOCAHYQ.jsindex-DFwXN-qe.js).
The trial tier reports a zero-value add_to_cart to Meta and Google. [Estate B — the quiz paywall]
why this matters + step-by-step →

Why it matters. Meta is optimising against an event worth nothing, which is a plausible contributor to Meta leads converting at half the rate of direct.

ℹ️ Align with the v3 convention rather than inventing a second one. checkouts-v3 made a deliberate, different choice: add_to_cart fires on intent (field focus or CTA tap) carrying no value, and the real money value rides on begin_checkout instead. Its source comment explains why: a page-load ATC “makes every funnel read 100% and poisons A/B denominators”. Decide once, apply to both estates — either put the value on ATC everywhere, or move to the v3 pattern everywhere. Two estates reporting the same event with different semantics is worse than the original bug.

How to do it

  1. Pick the convention (see above) and write it down.
  2. Set addToCartValue to the real charge for every tier — the trial tier currently sends 0, and Meta optimises on that event.
  3. Confirm the value reaches Meta and Google.
  4. Re-check channel cost-per-result a week later.

✅ Done when: Meta reports a non-zero value on the money event, and both estates use the same convention.

NIC30 min ●●●●○
31
Decide the fabricated-proof question
🔎 VERIFIED 5 AUG — DONE.Ruled 4 Aug: the composited lifetime set (LT-01…20, proof walls, banner) is approved for use — real quotes, artwork chrome — with two limits: never caption one as a real/unedited screenshot, and never submit one where a platform wants authentic customer evidence. Generating NEW fabrications stays banned.
Live counters and the join-toast were invented. They are removed from the ship arm — decide whether they return, wired to real data.
why this matters + step-by-step →

Why it matters. Under the DMCC Act 2024 a false limited-availability claim is automatically unfair, with CMA direct enforcement and fines to 10% of global turnover. TMA is Glasgow-based.

How to do it

  1. The counter random-walked 22–46 every 4.2s and claimed 183 starts/day against a real ~13 paywall views/day.
  2. The toast invented people, including reusing “Gareth”, a real member quoted on the same page.
  3. Either wire both to real Stripe data, or leave them out.

✅ Done when: You have ruled: wired to real data, or gone for good.

AGA5 min ●●●●○
34
🔴 A buyer must never receive an abandonment email NOW
🔎 VERIFIED 5 AUG — DONE. ✅ Built with a live paid-check at BOTH sync and enrol time, so a buyer can never receive an abandonment email. Dry run: 37 abandoners, $3,589 at stake.
Confirm that paying customers are excluded from the cart-abandonment lane — someone who pays gets the buyer welcome, never a “you left something behind”. If the exclusion does not exist, build it. [NEW — added 31 Jul 2026, Aga, on the back of the new checkout going live]
why this matters + step-by-step →

Why it matters. The new quiz checkout went live on 31 Jul and the abandonment capture is being rebuilt on the v3 payment-intent flow (task 10) at the same time. Those two things landing in the same week is exactly how a paying customer gets emailed “you didn’t finish”. It is the single worst email we can send: it tells someone who just gave us money that we don’t know they did, on day one, before they have taken a first session. It costs a refund and a review, not an open rate.

The failure is mechanical, not hypothetical: abandonment lanes trigger on email captured + no purchase recorded. If purchase is recorded late, on a different rail, or under a different identity than the captured email, the buyer still looks like an abandoner. The checkout stamps buyer_email at pay-click, so the join key exists — what has to be proven is that the abandonment lane actually uses it, and re-checks it at send time rather than only at enrolment.

How to do it

  1. Name the lane. Confirm which automation is live for cart abandonment right now (756 / 757 Abandoned Cart Reminder were dormant — the Stripe checkout-abandoned webhook had fired 0 contacts in 46 days). If nothing is live, say so — that closes this in one line.
  2. Find the exclusion. Check whether the lane has a purchase-based exit goal or suppression, and whether it is evaluated at send time, not only at entry. Entry-only checks are the trap: buy 20 minutes after enrolling and the mail still goes.
  3. Test it end to end. Complete a real (or coupon-zeroed) purchase from the new checkout with a fresh address, then confirm within 24h that the address is out of the abandonment lane and in the buyer welcome.
  4. Check the reverse case too — a genuine abandoner still gets the abandonment mail. Suppressing everyone is not a fix.

Depends on task 10 (rebuild abandoned-cart capture on the v3 payment-intent flow). Do not arm the abandonment lane until this exclusion is proven. If the two cannot ship together, ship the exclusion first and leave the lane off — a lane that is off costs us nothing; a lane that mails buyers costs us the buyer.

✅ Done when: a test purchase from the new checkout is confirmed out of the abandonment lane and in the buyer welcome within 24h, a genuine abandoner is confirmed still receiving the abandonment mail, and the exclusion is written down as a send-time check.

NIC~30 min
longer if it must be built
●●●●

📧 Email cadence & collision measured live from the AC API · 5 Aug 2026

Aga asked: “we have all the automations going in AC — how often on top of that should we be sending the campaigns, and to who? What is the industry standard? And when I send, how do I avoid double send — do I just pause all the automations?” Every figure here was read from the live ActiveCampaign estate, not from a doc. Reproduce with python3 tools/retention/send_collision_check.py --audience 132.

🔒 RULING — Aga, 5 August 2026 · now live policy
Adopt the weekly baseline: one broadcast per week to Core, permanently. Mid tier gets a best-of every second week. Dormant gets nothing, ever. Promo bursts cap at 6 sends, one per day, ≤4 bursts a year, none within 6 weeks. The weekly slot never pauses during a burst — the burst replaces that week's slot rather than adding to it.

The three answers

Do I pause the automations?
Never
Use AC's Currently in automation → is-false. Pausing strands people mid-wait and switches off the highest-earning mail we send.
How often, on top of them?
1 / week
To Core (~5,090 engaged). Today it is zero between promos.
Industry standard
2–3 / week
We average ~0.6/week, delivered in bursts. Engagement drops ~20% above 5/week.

Finding 1 — the problem is famine, not firehose

MonthBroadcastsSendsUnsubsUnsub / sendRead
2026-0728293,7861,3260.451%The lifetime burst — 12 days
2026-0600Nothing at all
2026-0515453,5754230.093%Memorial sale — same shape, 4.8× better
2026-04264,769250.039%Spring sale
2026-0300Nothing
2026-02131430.955%Jan-challenge tail
2026-0110202,5914350.215%Jan challenge

Read it as a calendar: Jan burst → 9 weeks silent → Apr → May burst → June nothing → July burst → 24 days silent to today. There is no baseline; the list only hears from us when we want money.

🔴 The final day of the July burst is the whole lesson
12 July carried eight sends in one calendar day — four to leads, four to customers, at 8am / 1pm / 6pm / 10pm. The leads sends unsubscribed at 0.35%, 0.30%, 0.45%, then 0.90% on the last one: double the burst average and ~10× the May sale's rate. That is the price of the fourth email in a day. The weekly baseline is the fatigue insurance for the burst — a list mailed weekly does not spike when a sale arrives.

Finding 2 — the burst was aimed at the wrong 60%

AudienceTypical sendTypical clicksClicks / 1,000
LEADS~12,00018–43~1.5–3.6
CUSTOMERS~1,90073–154~38–81

Engaged-reachable is ~5,090, but promo sends ran 12,000–44,747 — so 60–90% of every promo hit someone unengaged for a year. On 12 Jul, leads took ~48,325 sends for 157 clicks; customers took ~7,403 for 343 — 2.2× the clicks off 15% of the volume, a 20–30× gap per recipient. The revenue came from the engaged; the unsubscribes came from the cold.

Caveat, stated plainly
These were split-test campaigns, so clicks distribute unevenly between arms (1 Jul shows 29 clicks on one arm, 192 on its sibling — a tracking artefact, not behaviour). The leads-vs-customers gap is an order of magnitude and survives that noise, but do not quote the individual per-send figures.

Finding 3 — an AC email has two renderings, and ours disagree

Live emails scanned
236
across 26 active automations
Carry an offer
71
selling a discount or lifetime
HTML ≠ plaintext
47
the two versions disagree
Deadline in plaintext only
34
a clock that expires for nobody

Every AC email ships an HTML version and a plaintext alternative — and rewriting the HTML does not regenerate the plaintext. Ours was rewritten; the plaintext was not. Measured on 750 TMA | Welcome Sequence After Quiz, campaign 3107:

RenderingLengthContains “48 HOURS”
HTML — what most people see12,663 charsNo — no offer at all
Plaintext — same email3,291 charsYes — “⏰ FINAL 48 HOURS ⏰ 50% OFF EXPIRES IN 48 HOURS”
🔴 The sharpest single instance
766 Facebook Lead Form | LM: Building Muscle After 40, campaign 3497, is subject-lined “No deadline. Just the honest choice.” — and its plaintext version carries a deadline.

Why it matters: it is a false-urgency claim in a version that is genuinely delivered (plaintext renders in some clients, accessibility contexts and previews); HTML/plaintext mismatch is a recognised spam-filter signal while we are a permanent Gmail bulk sender; and it is invisible to any audit that reads one rendering. Worst by divergence: 988 9 · 992 7 · 750 6 · 766 6 · 967 6 · 751 4.

Reconciliation — “50% off” is not a rogue discount, it is our working price
The same-day offer forensics established that 90.7% of new annual sold at exactly 50% off, and zero at $157 in 24 months. So the 50%-off copy inside the welcome sequences is the standing acquisition price, not a competing promotion. Do not remove the discount — it is the price that converts. The defect is only the false clock. Fix = plaintext regeneration from the existing HTML, so no copy changes and the Evolution Law is not engaged.
A correction against my own first read
My first pass reported that 750 “is running a permanent 50% OFF EXPIRES IN 48 HOURS”, citing the live body. That grep hit the plaintext; the HTML is clean. Directionally right, specifically wrong — and the difference changes the fix from a copy rewrite to a plaintext regeneration. Three versions of the truth exist — the step label, the HTML, the plaintext — and only two are delivered.

The mechanics — how to avoid a double send without pausing anything

ConditionWhat it does
Currently in automationThe one you want. Entered and not completed — mid-flight right now.
Has entered automationCurrently-in plus completed. Too broad — excludes everyone who ever passed through.
Has not ended automationSubtly different from the first. Not interchangeable.
Has been sent <campaign>Time-boundable (“in the last 30 days”); covers automation emails too.
🔴 AC has NO global frequency cap
Has been sent names one campaign at a time — there is no “nobody gets more than three this week” switch. Klaviyo has Smart Sending (16h default); Customer.io has workspace message limits. AC has neither, so the cap is only as good as the conditions someone remembers to add. That is exactly why July breached caps that already existed on paper — and a real argument for the Customer.io migration.
The standing exclusion set, AND-logic only (never OR — the 4 Jul precedent where OR ballooned an audience):
INCLUDE list 132 .TMA LEAD: [APP+QUIZ] · AND Tag does-not-exist <CAMPAIGN>-NoPromo · AND Currently in automation is-false 975 Onboarding | After The Purchase · AND … 976 Cancelled Win-Back · AND … 990 Monthly→Annual Upgrade Engine (Jul 2026) · AND Has been sent <yesterday's burst email> in the last 1 day · AND opened or clicked in last 90 days

The estate underneath every broadcast

AutomationEmailsIn flight now
758 Nurture Sequence 21114,609
754 Part 1 - Engagement Tagging (tagging only)09,006
751 Nurture Sequence 1121,101
750 TMA | Welcome Sequence After Quiz10772
967 TMA | Welcome Sequence After LEAD MAGNET8544
991 NEW Re-Engagement - For people who stopped opening Before Sunset3477
976 Cancelled Win-Back7306
988 TMA | Welcome Sequence AFTER APPSIGNUP10302
975 Onboarding | After The Purchase18225

26 automations ACTIVE · 236 emails · ~17,000 contact-flights in progress. 758 Nurture Sequence 2 alone holds 14,609 in flight against a leads list of 13,063.

ACTIVE is not the same as SENDING
759 Nurture Sequence 3 (38 emails) and 764 Nurture Sequence 4 (15 emails) are ACTIVE with zero entered, ever — 53 emails of built content that has never sent. Separately, 751 Nurture Sequence 1 and 973 Nurture Sequence 1 NEW COPY FROM CLAUDE are both live (1,101 vs 7 in flight).

The adopted policy

TierBaselineMax per burstRules
Core — opened/clicked ≤90d (~5,090)1 broadcast / week, permanently6Max 1/day. Never four in a day, as on 12 Jul.
Mid — 91–365d1 per 2 weeks, best-of only3Open, midpoint, last call only.
Dormant — 365d+Zero, ever0Re-permission / sunset only. They are not reach.

Why one a week and not the industry's two to three: we already put 236 automation emails under this audience. The industry figure assumes a lighter lifecycle layer. Start at one, hold four weeks, read unsubs and clicks, then decide about two. Do not start at two. Also: suppress converters within the hour, and send weekend/late emails only to openers who did not buy — that is where the 0.90% came from.

Open — and what we still cannot see

#ItemOwner
AGA-106Approve the plaintext regeneration on 34 live emails. Not a copy rewrite — the HTML is already correct. Needs a yes because it writes to live member-facing sends. 10 minAga
AGA-107Google Postmaster Tools access. Our spam-complaint rate is invisible — AC returns unsubs and bounces but no complaint field, and Postmaster is the only source. We are a permanent Gmail bulk sender and enforcement is SMTP rejection, not spam-foldering. The most important missing number in the estate. 10 min · impact 5Aga
3Where does /50promo/ resolve? One email promises “nothing charged until day 8” against that link, while the 50off/ family charges immediately. Flagged, not asserted — not yet checked.Fleet
4759 and 764 ACTIVE with zero entered — wire them or deactivate them.Fleet
5751 and 973 both ACTIVE — confirm which is canonical.Fleet
🔴 What is NOT on this page: revenue per send
Email revenue is DARK — the pe= recipient pipe is built and empty (NIC-77), so no send here can be tied to money. Every revenue statement is inferred from clicks and tagged as such. Until that lands, cadence decisions run on engagement and unsubscribes, never on revenue.

What was built, and why it shipped with a gate

Why a checker and not just a page
The caps already existed, in the send-governor and lifecycle-director doctrine — and nothing enforced them. They lived inside the email fleet, so they did not bind a send made outside it, and July breached them by more than double. A rule with no gate is a suggestion.

Provenance: broadcast volume and rates from live GET /api/3/campaigns (400 records) · automation and email counts from /api/3/automations + /blocks · in-flight from contactAutomations (status = active) · list sizes from /api/3/lists · offer, deadline and divergence counts from send_collision_check.py --scan-offers, reading both the HTML and plaintext fields separately, step labels explicitly disregarded · AC condition semantics from ActiveCampaign's Help Center and AC Learn · engaged-reachable (5,090) from the Email fleet charter scoreboard, not independently re-derived · revenue attribution not verified. Industry benchmarks: Clearout, FoundCOO, AI Advantage, beehiiv, Talk Shop, Gmail 2026 bulk-sender rules, Klaviyo, Customer.io, Braze.

⚡ What would have to happen to close the gap in 90 days

⭐ The one thing to take from this tab
The gap is $7,430/month of cash. These actions model at $600–900 in 30 days — real, and not enough on their own.

Asked directly, answered with arithmetic rather than optimism. Every figure below is derived from verified inputs and the working is shown, so you can check it or change an assumption and re-run it.

The starting position
Target: $15,000/month of repeatable net cash. Today ~$7,570/month lands. Gap: $7,430/month. Not the $4,013 MRR figure — MRR is book value, and an annual $157 shows as $13.08/month long after the cash arrived.

Step 1 — what one new subscriber is actually worth per month

PlanPrice today (realised)Monthly cashAt list priceMonthly cash
Annual$83.49$6.96$157$13.08
Quarterly$27.67$9.22$49.97$16.66
Monthly$20.21$20.21$24.97$24.97
⚠️ The counterintuitive bit — read it before drawing the wrong conclusion
On pure monthly-cash terms a monthly subscriber contributes more than an annual one ($20.21 vs $6.96), because the annual's cash is spread across twelve months.

That does not make monthly better. Annual wins on lifetime value (~$162 vs ~$63) and churn (9.1%/mo vs 36.7%). You could hit a monthly cash number faster by selling monthly — and the book would evaporate underneath you. That is precisely the trap this business fell into when annual disappeared.

Step 2 — how many subscribers that means

ScenarioCash per new sub /moNet new subs needed+ churn replacementGross sales in 90 daysvs today's 154
Today's mix and prices$10.706943091,0036.5×
Fixed — $157 annual, 50% mix$16.534493097584.9×

Fixing price and mix does real work — it cuts the required volume from 6.5× to 4.9×. That is the single biggest structural improvement available. It is still 4.9×.

Step 3 — what 4.9× actually costs

To land 758 sales in 90 daysRequiredTodayMultiple
Quiz landings25,4505,1644.9×
Leads6,0321,2264.9×
Paid spend at $5.02/lead$10,093/mo~$3,000/mo cap3.4×
🔴 The honest answer

The gap cannot close in 90 days on any lever available today.

Closing it on paid alone needs ~$10,100/month of spend against a $3,000 cap — and spending that today would be worse than useless, because the purchase signal is broken and the platforms would buy more of the traffic that never converts. This is exactly why the CEO extended the timeline to roughly two quarters rather than lowering the target.

Step 4 — every lever, and its realistic ceiling

LeverAdds /month% of the $7,430 gapWhat it depends on
Paid, fully working inside the $3k cap+$3,72050%requires the purchase signal fixed FIRST, and the junk cut. Today's spend buys the wrong people.
Churn 23.8/wk → 14/wk+$1,35918%the single largest non-acquisition lever. Mostly delivered by selling annual instead of monthly.
Price and mix — annual restored at $157, 50% mix+$89812%hours of build. The most certain of the four.
Conversion — landing, checkout, defects (+27%)+$6949%needs A/B bucketing to be measurable at all
All four, everything landing+$6,67190%and that is the ceiling, not the forecast

Read it carefully: even with all four levers working perfectly and simultaneously, the arithmetic reaches 90% of the gap — and each depends on the one before it. The realistic 90-day figure is the $1,500–2,100/month the plan already states.

Step 5 — the paid levers, specifically

Ranked by return on the money and on the hour. The first three cost nothing.

① Fix the purchase signal — the multiplier on every other paid lever GATES EVERYTHING

Meta is optimising against 5,171 "Leads" and 172 "Purchases", and its own lead counter over-reported by 7–9× in Q1 before collapsing to 252 in July. We have spent 90 days paying Meta to find people who click, and it got good at it.

Until this is fixed, every additional pound of paid spend makes the traffic worse, not better. It is not a lever in itself — it is the thing that makes the other levers work. Nothing about scaling spend should be discussed before it lands.

② Kill what does not convert — free, and it happens today FREE
KillEvidence
Meta Audience Network129 visitors → 7 leads → 2 buy-clicks in 90 days — burst ended ~13 Jul; now ~0.1% of spend (see task 6)
Google Display / PMax136 visitors → 0 leads, 0 buy-clicks in 90 days — and it is the source of the cheapest clicks in the account at £0.32
Google "Competitive Non-Branded"£10.63 per click blended, 0 conversions — the most expensive click we buy. ⚠️ Campaign began 10 Jul: 19 days, 10 clicks — too few to read anything into the zero. Kill on cost-per-click, not on conversions (task 6).

Between them these consume budget and teach both algorithms the wrong target. Cutting them does not reduce real traffic — it reduces the denominator. Expect total sessions to fall ~10% and every rate to rise.

③ Scale the one line that already works — Branded search cheapest real conversions

Google "Quiz Funnel · Branded · US": £9 of spend, 6 clicks, 4 conversions. It is the best-performing line in the entire paid account and it is being starved.

Caveat worth stating: branded search largely harvests demand we already created — it is defensive, and it will not scale far, because it is capped by how many people search for us. Take the cheap conversions; do not mistake it for a growth engine.

④ Retarget the two warm pools we already have highest intent available
PoolSize (90d)Why it is the best paid audience we own
Reached the paywall, did not click buy~570finished a 40-screen assessment and saw the price
Clicked buy, never paid~450reached checkout with intent to pay — the warmest audience in the business

Roughly 1,020 people per 90 days at maximum intent. Neither pool is being retargeted, and neither is being emailed — the cart-abandon automation exists and has never fired because its webhook is dead.

Do the free version first (email), then the paid version. Retargeting an audience you have not even emailed is paying for something you can have for nothing.

⑤ Build lookalikes on PAYERS, not leads — only possible after ① blocked

Every audience the platforms have built for us is modelled on a lead event that over-counted by 7–9×. A lookalike built on that is a lookalike of the wrong person.

Once real purchase data flows, rebuild the seed audience on payers. This is the change most likely to move Meta's post-lead buy rate off 35.1% toward direct's 64.3% — and it costs nothing but the wait.

Pre-committed check: if Meta still buys below ~50% after the signal fix and a payer-seeded rebuild, the problem is creative and audience, not tracking — and the honest response then is to stop scaling Meta rather than keep fixing it.

⑥ Apple Search Ads — the highest-intent channel we are not measuring no cost data

App-store search is the highest-intent paid inventory available to a fitness app — the person is already searching for what we sell. It currently has no cost feed at all, so we cannot compute its cost per trial.

Sequence it after the signal fix, and start with brand defence, which is the cheapest and protects against competitors bidding on our name.

⑦ Raising the cap — the one lever that is genuinely blocked not yet

Closing the gap on paid alone needs ~$10,100/month against a $3,000 cap. That is the honest number, and it is not a recommendation.

Two things must be true before the cap moves at all:

  1. The purchase signal is verified working — otherwise a bigger budget buys more of the wrong traffic, faster.
  2. Cost per trial is measurable and under $20. Today the best available figure is $24 per new sub on the most generous possible basis, and true CAC by channel cannot be computed at all because subscription metadata is empty on all 154 sales.

Scaling spend into an unmeasured funnel is how the money leaves without a number to show for it.

What would have to be true for 90 days — stated plainly

  1. The paid budget rises from $3,000 to ~$10,000/month — and only after the purchase signal is verified, which alone takes weeks.
  2. Or conversion roughly doubles, from 2.98% of landings paying to ~6% — in a funnel that cannot currently run an A/B test.
  3. Or a channel that does not exist today produces ~2,000 leads a month for free. Organic is flat at ~435/month and three of five lead sources capture nothing.

None of these three is 90-day realistic. That is the finding, and it is why the timeline moved rather than the target.

What 90 days genuinely buys: the paywall fixed, the junk gone, the signal working, the live harms stopped, and — for the first time — the ability to measure what a customer costs. That is not the gap closed. It is the precondition for closing it, and it does not exist today.

🛑 Don't do this

🔄 UPDATED 5 Aug 2026 — three amendments to the do-not list
Removed: "never sell lifetime" — Aga unbanned warm-list lifetime at $297 on 5 Aug (capped windows, never to cold traffic). Added: ⛔ never propose a coaching tier — there is no trainer to deliver it; ⛔ never rebuild a live email sequence wholesale (the Evolution Law, locked 3 Aug — the 973 rewrite cut offer clicks 45.6×); ⛔ never read paid behaviour from a bank/card ledger — settlement is not media spend; ⛔ never quote a lead rate without naming its denominator (three live values, 4.07× apart).
⭐ The one thing to take from this tab
Mostly: do not annualise short windows, and do not compare Stripe across February — Android billing moved rails.

Each of these has been tested and rejected. They are here so nobody spends a week rediscovering why.

  • Don't run a third lifetime promo as a growth plan. Two pull-forwards in eight months — Black Friday ~$31.6K, July-4 ~$21.8K — have already borrowed from the recurring base. July looks like the best month of the year while recurring sits at $7,957. There is no third one available that doesn't eat the asset.
  • Don't fix the landing screen first. It is the biggest number and the worst opening move. Stable for months means hard, not broken — there's no recent change to undo. Cut the junk traffic, re-baseline at 49.8%, get A/B testing working, then attack it.
  • Don't do any more deliverability work. It is clean, and opens prove it — 20.4% in July 2026 against 4.7–11.7% through 2020–2023, with bounce at 0.04% and Postmaster green. What is low is click-to-open, and that fell around 2020, not this year. It is a content, offer and list-composition question. The email play worth running is job 7.
  • Don't treat the 604→249 checkout gap as a bug. 41% completion on a card-required subscription checkout is roughly normal, and all six checkout URLs return 200. That's conversion work, not a bug hunt.
  • Don't scale paid spend until the purchase signal is verified. Meta is trained on 5,171 Leads vs 172 Purchases. More spend on a Leads-optimised campaign buys more of exactly the wrong person.
  • Don't launch a $9.99 tripwire — 7-day or 30-day. At $9.99 you bank 21.8% of the current $45.84 blended sale, so you need 4.6× more buyers just to break even in month one. At $0.33/day it also inverts the price ladder against annual's $0.43/day. The 7-day version is worse still: our trial is card-upfront passive auto-bill, and that passivity is the 36.9% conversion mechanism — charging on day one makes day eight unresolvable.
  • Don't flip the paywall to the built version as-is. It makes every tier a 7-day trial. At $97 that turns a +53% outcome into −9%. Take the annual tier, set it to $97, charge immediately.
  • Don't reopen the app-download funnel before the tracking is fixed. The same broken signal would infect it, Apple's privacy framework makes teaching the algorithm harder rather than easier, store fees are 15–30% against Stripe's ~3% (worse the more we push annual), and splitting the budget puts both arms below Meta's learning threshold.
  • Don't quote a Stripe-only trend across February 2026. Android billing moved to Google Play then. Any such comparison shows a decline that is mostly a pipe change.
  • Don't annualise a window shorter than four weeks. This is how "34 cancels vs 13 new" happened. Weekly cancellations range 13–35; pick your week and you can prove almost anything.

❓ A SECOND QUIZ FUNNEL — the download-and-email model

🔄 UPDATED 5 Aug 2026 — Aga answered this herself — and the answer reframes the whole diagnosis
Her account, 5 Aug: "we also had the PREVIOUS funnel asking people to download the app so they would go through the quiz. There was no paywall. They download the app, get the app, and then get sold via email. That was the whole funnel." The old model is confirmed, not hypothetical — AC list 205 holds 16,451 in-app quiz takes imported 29 Oct 2025, and 750's emails still carry dual app-download CTAs with the first direct ask at email 27 of a 30+ arc. 🔴 The decisive new fact: no quiz paywall variant in this repo has EVER carried annual (zero hits for $157/annual/yearly in any bundle), yet annual was 64% of new-sale cash with 43 of 54 sales at $78.50 — the 50%-off EMAIL price. So the high-value plan was being sold off the quiz all along. Still unprovable: the old era's revenue, because RevenueCat holds nothing before Feb 2026 — the ~30-minute Apple ASC + Play export (legacy task 18) is the only thing that would settle it, and it is still open.
⭐ The one thing to take from this tab
Not a new plan — a second route in. Its engine is email selling, and email on leads currently clicks at ~0.2%. Prove that lane before building the front end.
The question, as Aga put it
"Should we launch a new plan where people can download the plan and see results — we ran it for YEARS and then we sell through email, so no fees, and this is what was working for our company?"
🔴 Framing correction — this is NOT a new plan, it is a NEW QUIZ FUNNEL
Nothing about pricing, tiers or the paywall changes. It is a second route in: quiz → downloadable plan → email sells the subscription.
  • It does not compete with or delay the paywall work — different surface, different owner.
  • It is additive, not a replacement. It runs alongside and can be switched off without touching the paywall funnel.
  • Its metric is lead → paid by email, not paywall conversion. That lane currently clicks at ~0.2%, so prove the lane before building the front end for it.
📱 Reference execution — Levls
Worth pulling apart before we design ours: what the download actually is (PDF, web page, or an app-like plan view), how fast it arrives, what the first email asks for, and where the subscription sell lands.

NOT YET ANALYSED An unverified reference, not a teardown. A proper walk of the Levls funnel is a ~2 hour job and should happen before any build, so we copy the mechanic rather than the vibe.

The short answer

Not yet — and not for the reason you'd expect
The honest position has three parts: (1) we cannot prove the old model earned more, because the data for it was never recorded; (2) on every rail we can measure, the current model is doing better, not worse; and (3) the old model's engine was email selling — and email is the one thing we've measured as currently not working on leads.

But the instinct behind the question is sound, and there is a version of it worth testing — after the paywall is fixed. Details below.

Why we can't prove it either way

The old funnel sent people to the app. So its money arrived through Apple and Google, not Stripe. But RevenueCat — the tool that records app revenue — was only created in February 2026 and holds nothing before that. Pre-May data is incomplete on top of that.

The old funnel's main revenue pipe was never recorded. That makes "the old funnel earned more" unfalsifiable — not disproven, but not checkable either. Anyone who tells you confidently in either direction is guessing.

✅ And this is fixable in 30 minutes
Apple and Google keep their own history independently. Exporting it (job 8 in the plan) would put real numbers on the old era for the first time. That is by far the cheapest way to settle this — and until it's done, the question stays open.

What the measurable evidence says

MeasureOld-funnel era (pre-Feb 2026)Paywall era (Mar–May 2026)Read
New subs per week23.521.9slightly lower
Cancellations per week31.321.424% better now
Net per week−7.8+0.4the only non-negative stretch in two years
Subscriptions created per month (ex-promo)86.388.0marginally better after

On the web rail, the current model outperforms the old one on both sides of the equation — and that comparison still flatters the old era, because Android revenue was flowing through Stripe back then and isn't now.

The argument against reverting, stated plainly

The old model's engine is the thing that's currently broken

The model Aga describes works like this: give the plan away free → they see their results → email sells them later. The whole thing rests on email converting.

And email's ability to convert a cold lead is exactly what we cannot currently evidence. Ten years of broadcast history shows click-to-open fell from 8–31% (2015–2019) to 1.6–3.6% (2026) — the drop landing around 2020, as the list grew from tens of thousands of sends a month to roughly a million. Opens today are healthy; the action after the open is not.

So the objection is not "email is dead" — it plainly is not. It is that the model depends on converting cold leads by email, and the last six years of data do not show us doing that well. Rebuilding the funnel around that capability before re-testing it would be betting on an unproven assumption.

Reverting the funnel would mean betting the company on the one channel we have measured as not currently working on that audience. That's the real objection — not the theory, the engine.

And we've never actually tested the current model properly
The paywall has been running without an annual plan on it. We would be abandoning a funnel we have never seen working, before spending the few hours it takes to fix it. Fix the paywall first, then judge it.
On "no fees" — half right
The fee logic holds only if the email sale routes to web checkout (Stripe ~3%). If people subscribe inside the app instead, Apple and Google take 15–30%. The old funnel drove people to the app, so a fair amount of that era's money would have paid store fees. The saving is real but smaller than it sounds — and it gets more important the harder we push annual, since the fee scales with the price.

🔴 The strongest argument for Aga's instinct — list-building measured properly, 27 Jul

The old model built the list. The current one adds ~435 real contacts a month, and it is flat.

The email list — 83,339 contacts — was manufactured by exactly the model Aga is describing: free download, see your results, sell by email afterwards. It is the single most valuable owned asset in the business.

What today's funnel adds, measured honestly: ActiveCampaign shows 14,241 contacts created in the first seven months of 2026 — but 79% of that is bulk imports (April 3,443 · June 3,054 · July 4,698, plus a Source: import tag on 4,540). Strip them and genuine capture is ~3,046 over seven months = about 435 a month.

That cross-checks almost exactly against the quiz's own tagged lead series: 1,226 leads over 13 weeks = ~409 a month. Two independent measures agree. Real organic capture is ~400–450 a month and roughly flat — not accelerating, not collapsing.

And the list is mostly inert: of 52,131 active contacts only 8,124 are Engaged (15.6%). Three of five lead sources capture nothing at all, the in-app free-signup list sits at 199, and BWA's ~1.9M monthly impressions produce 7 quiz visits in 90 days.

A funnel that converts better per visitor while capturing almost nobody it fails to convert is a funnel that shrinks its own future.

That cost is real, it compounds, and it appears in no subscription metric anywhere in this document. Aga is pointing at something the subscription data cannot see, and she is right that it matters.

Guard against the flattering version of this
The raw "14,241 contacts in seven months" number looks like explosive list growth and is not — four-fifths of it is imports. Anyone quoting it as evidence the funnel is building an audience is quoting an import. The number to use is ~435/month organic, and it is flat.

What else Aga is right about

  1. The paywall is expensive at the top. We lose 54.5% at the landing screen and only 2.98% of visitors ever pay. A free-first model genuinely does capture more people at the moment of highest interest.
  2. The assessment result is the product's best moment. Our own product doctrine says the spine is "the system places you and owns the journey". Putting a price in front of that moment has a real cost.
  3. Owned-audience selling has no acquisition cost. Every sale made to an existing email address is a sale we didn't buy.

How much weight the comparison can carry

Two limits on the table above
  1. The paywall era's "+0.4/week" was a promo. Strip the Memorial fortnight and it runs −2.7/week. It is still the best stretch on record by quick ratio (0.87–0.90 vs 0.74–0.75) — but it has never had a positive non-promo block.
  2. Part of the apparent improvement may just be Android leaving. Pre-Feb Stripe was web + Android; post-March is web only. Store-billed subscriptions typically churn worse than web-billed, so removing them improves the blended figure for free, with no real change in retention. If Android was ~25% of the base, that alone reproduces the whole effect.

So: the subscription data cannot adjudicate old-versus-new in either direction. What it can say is that there is no 56-week stretch in the old model's record where the bucket grew — pre-Feb ran −7.8/week at a 0.75 quick ratio for fifty-six consecutive weeks.

The recommendation

Don't revert. Test the hybrid — after the paywall is fixed.
  1. First, fix the paywall (jobs 1–4). It takes hours, and we have never seen the current funnel run with an annual plan on it. Judging it now would be judging a broken version.
  2. Do the 30-minute store export (job 8). Until then this whole question is opinion.
  3. Then test the hybrid, not the revert: keep the quiz and the paywall, but add a free results path for the people who bounce — they cost us nothing today. Route them to an email sequence that sells the year via web checkout, so we keep the ~3% fee rather than 15–30%. That captures the upside of the old model without giving up a funnel that is currently outperforming it.
  4. And answer the email question regardless, because it is the blocker for any email-led model, old or new: why do people who open no longer click? Job 7 is the cheap live test on the warm end. A month-by-month series for the nurture automations — which we do not have today — would settle the cold end.

One caveat worth stating: the hybrid needs the assessment result to be genuinely valuable for free and still leave a reason to pay. That's a product design question, not just a funnel one — and it's the part most likely to go wrong.

The retention lead's ruling, which lands in the same place
"On retention evidence, do not revert — but do not declare the paywall a winner either, because the improvement is partly the Android population leaving and the loss (list-building) is unmeasured. This is not either/or. Keep the paywall as the primary conversion path, and restore a genuine free capture lane behind it."

Useful detail: /start-training already exists as a free route, and the /30trial $9.99 step-down is already validated. And the willingness-to-pay data supports a low-priced or free lane — 78–80% of people who name a price name $9.97 or less.

And the key methodological point: this question is answerable going forward, never backwards. Run both lanes and compare lead volume plus 90-day paid conversion. No amount of digging in Stripe will settle it retrospectively.

What would change this answer

If we learned…Then…
The Apple + Google export shows the old era earning materially more than the web rail suggestsThe revert case gets much stronger, and the hybrid should be weighted toward free-first
Android was only 5–10% of the pre-Feb Stripe baseThe "improvement is just composition" objection collapses; the paywall genuinely halved the leak and the case against reverting hardens
The annual-offer email to the engaged list converts wellEmail selling still works on warm audiences, and an email-led model becomes viable again
It converts badlyThe old model's engine is confirmed broken, and free-first would just build a bigger list we can't sell to

Two of those four are cheap and are already in the plan — the store export (job 8) and the annual email offer (job 7). Do them, and this question stops being a matter of opinion.

🔬 Drop-off — the full analysis

🔄 UPDATED 5 Aug 2026 — what changed under this analysis
The landing-screen loss (~54.5%) is stable since ≥9 Jul — structural, not a June regression — so the standing ruling holds: the landing screen goes LAST. The week-28 lead collapse analysed below has recovered (~26.6%, 3 Aug) and its cause is permanently undatable. 🔴 And every conversion rate here predates the 3 Aug measurement discontinuity — page-load intent minting stopped on both estates, so nothing before 4 Aug is an admissible baseline or control. Honest read ≈11 Aug, reliable ≈17 Aug.
⭐ The one thing to take from this tab
The full screen-by-screen study. The landing screen is the biggest number in the business, and it is a page problem, not a traffic problem.
What this tab is
The complete screen-by-screen quiz drop-off study, imported whole so it lives with the plan instead of beside it. Source: marketing/campaigns/quiz-funnel/QUIZ_FUNNEL_DROPOFF_ANALYTICS_2026-07-26.html · GA4 177471782 + both Stripe rails · 27 Apr – 26 Jul 2026 · fully reproducible.
The answer, in one line

Of every 100 people who land on the quiz, 3 end up paying. The single biggest loss is the landing screen — 2,816 people leave without one tap. The most surprising loss is invisible to both systems alone: 356 people click buy and never appear in Stripe.

Landed
5,164
~57/day
Became a lead
1,226
23.7% · ~14/day
Clicked buy
604
11.7% of landings
Actually paid
153
2.96% · ~1.7/day
Landing-screen loss
54.5%
2,816 people
Buy-click → no Stripe
58.9%
356 people

1 · The full funnel

Landed on the quiz (S01)
5,164100%
▼ 2,816 lost — 54.5%
Answered first question (S02)
2,34845.5%
▼ 857 lost across ~40 screens
Reached email capture (P52)
1,49128.9%
▼ 265 lost — 17.8%
Became a lead
1,22623.7%
▼ 52 lost — 4.2%
Reached the paywall (R10)
1,17422.7%
▼ 570 lost — 48.6%
Clicked buy (add_to_cart)
60411.7%
▼ 356 lost — 58.9%  ← invisible to either system alone
Subscription exists (Stripe)
2484.8%
▼ 95 lost — 38.3%
Took money
1532.96%
In plain terms

1 paying customer per 33.8 landings · per 8.0 leads · per 3.9 buy-clicks.
Daily: 57 landings → 14 leads → 1.7 paying customers.
The quiz rail's own 90-day contribution: $7,013 in new subscription cash (~$2,338/mo).

2 · The five leaks, ranked by people lost

#LeakLostSurvivalVerdict
1Landing → first question2,81645.5%The monster
2Paywall → clicked buy57051.4%Above guardrail — not the problem
3Clicked buy → subscription exists35641.1%The invisible one
4First question → email capture85763.5%Attrition over ~40 screens, no cliff
5Started → took money9561.7%Mostly unresolved trials

2.1 🔴 The landing screen loses 54.5%

5,164 land. 2,348 answer one question. 2,816 leave without a single tap.

This is the largest single loss anywhere in the business by an order of magnitude — and it is stable. The measured 54.5% matches the 54.4% baseline recorded on 9 Jul, so it is structural, not a recent regression. Everything downstream fights over the 45% who survive this one screen. A 10-point improvement here is worth more than doubling the paywall's conversion rate.

2.2 356 people click buy and never appear in Stripe

604 clicked buy in GA4. 248 subscriptions exist in Stripe. Neither system can see this alone — GA4 cannot see purchases (CAPI outstanding) and Stripe cannot see intent. It only appears when you cross-rail.

What "click buy" actually means — now Confirmed from the live code

I read the live production bundle (quiz.themovementathlete.com/2026-v2-2/assets/index-DPkL72Wi.js). The checkout handler is:

const N = P?.checkoutUrl || EM();                  // checkout URL, or a fallback
if (i !== "control" && !P?.checkoutUrl) return;    // silent bail-out (see below)
const O = P?.addToCartValue ?? 157;
qt("add_to_cart", { value: O, currency: "USD" });  // ← the event fires HERE
const R = Yye(N, k, _);                            // build URL with email + UTMs
window.location.href = R;                          // ← same-tab redirect to checkout

So add_to_cart = the person tapped the real checkout button and was redirected to the checkout page. Not a tier selection, not a scroll, not a hover. This settles the open question and refutes my earlier caveat — the measurement-artifact explanation is dead. These are 604 genuine checkout-button presses.

It also refutes a hypothesis I formed and discarded within the hour

Every local copy of the quiz (prototype/quiz/, quiz-v3-cro-work/, and Nic's own QUIZ PROTOTYPE FROM NIC/) uses window.open(url, "_blank") — a new-tab popup, which mobile in-app browsers (Facebook's and Instagram's especially) block or mishandle. Given 79% mobile and 54% Meta traffic that would have been a beautiful explanation. The live build does not do this — it uses a plain same-tab window.location.href. The local prototypes are simply out of date. I checked before telling you, and it was wrong.

So where do the 356 actually go?

They land on the checkout page and don't finish. I tested all six checkout destinations in the live bundle — every one returns HTTP 200:

Checkout URLStatus
/register/monthly_2026/✅ 200
/register/monthly_tripwire_2026/promo/✅ 200
/register/monthly_2026_promo/promo/✅ 200
/register/quarterly_2026_promo/promo/✅ 200
/register/yearly_2026/✅ 200
/register/yearly3/✅ 200

The destination is not broken. This is ordinary checkout abandonment: people arrive at a working registration page, are asked for card details, and leave.

Honest calibration — this is not the scandal it first looked like

41% of buy-clicks becoming a subscription is roughly normal for a card-required subscription checkout. Typical ecommerce cart abandonment runs ~70%; 59% here is in the same territory and arguably better than average. I flagged this as "the invisible leak" before I knew what the event meant, and it deserves recalibrating now that I do.

It is still the second-largest addressable pool in the funnel (356 people) and worth work — but it is a conversion-optimisation problem on the checkout page, not a bug hunt. It will yield to incremental CRO, not to a fix.

🔴 One genuine defect the code reading DID surface
if (i !== "control" && !P?.checkoutUrl) return;   // silent: no error, no event, no fallback

For any non-control variant whose config has no checkoutUrl, the checkout button silently does nothing. No error, no message, no analytics event — the user taps and the page sits there. That is exactly the behaviour observed on the dead downsell button this morning, and checkoutUrl comes from config — which is 404ing (re-confirmed today).

These users never fire add_to_cart, so they are NOT part of the 356 — they are lost before the counter, invisible in every metric we have.

Modelled If the 356 converted at the same rate as the rest, 356 × $45.84 ≈ $16,300 of gross intent over 90 days. A ceiling on the opportunity, not a recoverable sum — most were never going to enter a card.

2.3 The body of the quiz is not the problem

Between S02 and the email capture there are ~40 screens and not one loses more than 2.5%. The quiz is long, but well built — people who commit to question one mostly finish. Two exceptions:

TransitionLostSurvival
P52Capture → P53Processing (the email wall)20286.5%
R07Day1 → R08Journey4796.2%

The email wall costing 13.5% is normal and arguably cheap. Of the 1,491 who reach capture, 82.2% hand over an email — that screen is doing its job well.

3 · Traffic quality — where the good people come from

3.0 The full funnel, walked separately per source

🔄 READ WITH THE 29 Jul CORRECTION. The GA4 figures below are a true 90-day window, but that window contains a three-week Audience Network burst that has since ended. AN peaked at £136.90 in the week of 29 June and has run at ~£0.05/week since 13 July — it is 3.3% of 90-day spend and ~0.1% today, not an ongoing 10%. Read these tables as history, not as the current state. Live-verified figures and the current action are in task 6.

Reproduce: python3 tools/quiz-analytics/pull_quiz_by_source.py 90daysAgo yesterday · rates are % of that source's own landings.

GroupLandedAnswered Q1CaptureLeadPaywallClicked buyLead→buy
META2,82142%27%21%20%7.4%35.1%
DIRECT1,50053%35%29%29%18.9%64.3%
GOOGLE69042%23%20%18%11.6%58.8%
OWNED (Leadpages, linktr, BWA)11268%46%39%37%23.2%59.1%
OTHER5829%16%16%17%8.6%55.6%
SourceLandedAnswered Q1LeadBuyBuy %Verdict
startup2013.lpages.co9767%361919.6%STRONG — feed it
(direct)1,50053%44028318.9%STRONG — feed it
google51052%1327915.5%STRONG — feed it
ig74249%180658.8%WEAK
fb1,65847%4031408.4%WEAK
an (Audience Network)12910%721.6%DEAD
m.facebook.com1445%321.4%DEAD
googleads.g.doubleclick.net1361%000.0%DEAD
facebook.com1284%200.0%DEAD
linktr.ee888%6562.5%too small to rule on
bodyweighttrainingarena.com757%2228.6%too small to rule on
🔴 The "dead" sources die at the LANDING SCREEN — that is a bot signature

Look at Answered Q1 for the four dead sources: 1%, 4%, 5%, 10%. Real humans do not bounce at 95–99% — compare direct (53%) and Leadpages (67%). 537 users, 10.4% of all quiz traffic, produced 26 people willing to answer a single question.

googleads.g.doubleclick.net is the starkest: 136 landed, 1 answered one question, 0 leads, 0 buys. That is not targeting or creative. That is bots, click-farm traffic, accidental in-feed taps, or crawler hits.

This is corrupting every headline rate in this document. Strip the four dead sources and the funnel's own numbers improve:

MetricAs reportedExcluding dead sources
Landings5,1644,627
Answered Q12,3482,322
Landing-screen drop54.5%49.8%

So roughly 5 points of the "landing screen loses 54.5%" headline is not a UX problem at all — it is junk traffic. The landing screen is still the biggest leak; it is just less catastrophic than the raw number implies.

The deeper story: Meta leads are half as likely to buy

The bounce problem is only half of it. Look at lead→buy — people who already gave you an email: Direct 64.3% · Google 58.8% · Meta 35.1%.

A Meta lead is roughly half as likely to buy as a direct lead, even after clearing every qualifying step in the quiz. That is not a landing-page problem and not a bounce problem — it is an intent problem in who the targeting reaches. Meta delivers people who will answer questions and give an email but will not enter a card.

SourceUsers% trafficLeadsLead %ATCATC %
(direct)1,50029.0%44029.3%28318.9%
fb1,65832.1%40324.3%1408.4%
ig74314.4%18024.2%658.7%
google5119.9%13225.8%7915.5%
m.facebook.com1442.8%32.1%21.4%
googleads.g.doubleclick.net1362.6%00.0%00.0%
an (Audience Network)1292.5%75.4%21.6%
facebook.com1282.5%21.6%00.0%
startup2013.lpages.co971.9%3637.1%1919.6%
linktr.ee80.2%675.0%562.5%

3.1 🔴 Meta sends 54% of the traffic and converts 2.5× worse than direct

GroupUsers% of trafficATCATC %
Meta family (fb, ig, an, m.facebook, facebook)2,80254.3%2097.5%
Direct1,50029.0%28318.9%
Google (organic + ads)64712.5%7912.2%

Direct is 29% of volume but 47% of all buy-clicks. Meta is the majority of the traffic and a minority of the intent.

Caveat before anyone cuts spend

"Direct" is partly mis-attributed paid traffic — in-app browsers, stripped referrers and dark social all land in (direct). The gap is real but its magnitude is soft. What is not soft is the sub-source detail below.

3.2 🔴 Three placements are producing essentially nothing

537 users — 10.4% of all quiz traffic — produced 12 leads and 4 buy-clicks. Audience Network is a known low-intent placement and is almost certainly worth excluding. The 136 doubleclick users producing zero leads is either a broken placement or a bot signature; either way it is paid-for traffic returning nothing.

3.3 The small sources are the best sources

linktr.ee (62.5% ATC) and Leadpages startup2013.lpages.co (19.6% ATC) are the highest-intent sources in the table. linktr.ee's 8 users is an anecdote, not a finding — but Leadpages at ~100 users and 19.6% is a real signal worth feeding.

4 · Device — 79% mobile, and mobile converts worse

DeviceUsers%LeadsLead %ATCATC %
mobile4,07979.0%99224.3%45811.2%
desktop90717.6%20122.2%13014.3%
tablet1833.5%3318.0%168.7%
This connects straight to the paywall audit

Every defect in the companion document — the Report Bug widget over the CTA, the truncated wordmark, the competing sticky CTA — is a mobile-viewport defect. Mobile is 79% of traffic and converts 22% worse than desktop.

Modelled If mobile merely matched desktop's rate that is ~126 additional buy-clicks per 90 days. It assumes the gap is entirely fixable UX rather than intent differences between device populations — unlikely to be wholly true.

5 · Geography — the biggest market converts worst

CountryUsersLeadsLead %ATCATC %
United States2,67658221.7%2669.9%
United Kingdom78221427.4%9011.5%
Australia1995527.6%2412.1%
France1853418.4%1910.3%
India1745431.0%2916.7%
Canada1023635.3%2726.5%
Germany832530.1%1619.3%
Netherlands361233.3%719.4%

The US is 52% of traffic and has the lowest ATC rate of any major market. Canada converts at 26.5% — 2.7× the US.

Unverified  This is probably targeting, not geography

The US is where the Meta spend lands, and Meta is the low-intent source (§3.1). Canada and Germany are probably largely organic/direct. Cut source × country before anyone reallocates budget — I have not run that cut, so treat this table as a prompt for that analysis, not a conclusion.

6 · 🔴 The trend — lead rate collapsed three weeks ago

WeekUsersLeadsLead %ATCATC %
27 Apr–3 May1383323.9%1611.6%
4–10 May2087234.6%3014.4%
11–17 May3909624.6%4511.5%
18–24 May2669134.2%5319.9%
25–31 May42610624.9%4510.6%
1–7 Jun48512024.7%438.9%
8–14 Jun42311928.1%4410.4%
15–21 Jun64713220.4%568.7%
22–28 Jun48011824.6%7014.6%
29 Jun–5 Jul3779826.0%6417.0%
6–12 Jul4046917.1%399.7%
13–19 Jul5407914.6%478.7%
20–26 Jul4999819.6%5611.2%
Weeks 18–27 averaged 26.6% lead rate. Weeks 28–30 averaged 17.1% — a 36% degradation.

Critically, traffic did not fall (404, 540, 499 users — healthy). Only the lead rate did. This is not a demand problem; something changed in the funnel's ability to turn a visitor into a lead.

Timing: 6–12 Jul ≈ 6–12 Jul · 13–19 Jul ≈ 13–19 Jul · 20–26 Jul ≈ 20–26 Jul.

This is the most urgent open question in the document. A 36% degradation that began three weeks ago and has not recovered is a live, compounding loss — roughly 40 leads per week against the prior baseline.

Two hypotheses, both Unverified and both cheap to test:

  1. The /api/quiz/config 404. If the quiz fell back to default config around then, degraded capture behaviour is exactly the symptom you'd expect. Check when that endpoint started 404ing — first thing to look at.
  2. The Lifetime promo burst ran 2–14 Jul and moved attention and traffic mix. But subsequent weeks did not recover, which argues against a pure promo effect.

7 · The full price-point table (now complete)

The companion document flagged an unitemised residual in annual and quarterly. Now fully resolved — every one of the 153 sales is accounted for.

PlanPrice paidSalesCash
Annual$78.5043$3,375.50
Annual$157.00 (full)4$628.00
Annual$79.993$239.97
Annual$109.902$219.80
Annual$24.981$24.98
Annual$24.971$24.97
Quarterly$24.9858$1,448.84
Quarterly$49.97 (full)6$299.82
Quarterly$44.971$44.97
Quarterly$34.981$34.98
Quarterly$24.991$24.99
Monthly$24.97 (full)21$524.37
Monthly$9.986$59.88
Monthly$12.485$62.40
Total153$7,013.47
⚠️ New defect found in this table

Two "annual" sales at $24.98 and $24.97 — annual-interval subscriptions charged a monthly/quarterly price. Someone received a full year for ~$25. Two occurrences is small money ($50), but it indicates a price-configuration fault that could recur at scale. Worth Nic checking the price objects.

Plan% of sales% of cashAvg
Annual35.3%64.4%$83.58
Quarterly43.8%26.4%$27.67
Monthly20.9%9.2%$20.21

8 · Reconciliation with the companion document

Both pulls were re-run today with committed, repeatable scripts. Where numbers differ, the difference is definitional and stated here rather than smoothed over.

MetricCompanion docThis pullWhy
Sub sales that took money153 / $7,013.47153 / $7,013.47✅ exact match
Avg per new sub sale$45.84$45.84✅ exact match
Matured trial conversion36.9% (31/84)36.9% (31/84)✅ exact match
Subscription starts246248Window moved a few hours; different incomplete treatment
Lifetime76 / $22,657.9472 / $21,822.72This pull excludes fully refunded charges — reports NET, per convention
Renewals310 / $13,784.37317 / $14,258.04Different renewal definition

The lifetime difference is the meaningful one. $21,822.72 net is the more correct figure under the "report NET" convention; the companion document's $22,657.94 is gross of refunds.

Methodology correction made today

The first version of the rebuilt script bucketed cash by invoice billing_reason and reported 1 new sub sale instead of 153. TMA's Stripe emits no subscription_create invoices at all — only subscription_update and subscription_cycle. The correct definition is the first paid invoice of a subscription created in the window. Now encoded in the script header.

9 · What I'd do about it, in order

#ActionWhyOwner
1Find when /api/quiz/config started 404ing and whether it correlates with 6–12 JulThe lead-rate collapse is live and compounding — ~40 leads/weekNic
2Verify what add_to_cart actually fires onDecides whether leak 3 is a $16K hole or a measurement artifactNic
3Pause Google “Competitive Non-Branded”; lock Audience Network off (revised 29 Jul)Competitive Non-Branded is 35% of Google spend; AN already self-stopped ~13 Jul — untick it so it cannot returnNic
4Fix the mobile paywall defects (companion §2.1–2.3)79% of traffic is mobile and converts 22% worseNic
5Attack the landing screen2,816 people — the biggest single loss in the businessAga
6Check the two mispriced annual price objectsA year sold for $25Nic
7Cut source × country before any budget reallocationGeography differences are probably targeting differences
A deliberate note on #5

The landing screen is the biggest leak by a mile — but it is also the one everyone always attacks first, and the one with the most stable baseline (54.4% → 54.5% over months). Items 1 and 2 are cheaper, newer, and more likely to be broken things rather than hard things. Fix the broken before optimising the hard.

10 · Reproducibility — the companion doc's gap is now closed

python3 tools/quiz-analytics/pull_quiz_deep.py 90daysAgo yesterday   # GA4 funnel
python3 tools/finance/quiz_buys_90d.py 90                            # Stripe money

Bugs fixed in existing tooling today:

  1. pull_quiz_funnel.py overwrote screen rows on duplicate normalised names instead of aggregating. GA4 returns rows users-descending, so a stray 1-user S01Landing | L'athlète du mouvement row clobbered the real 5,163 — every headline number was computed off 1 user (it printed a lead rate of 122,600%). Now aggregates and warns whenever names collapse.
  2. quiz_buys_90d.py — the billing_reason trap in §8.

Traps now encoded in both script headers: bucket by subscription-created date · both Stripe keys (key 2 403s on /v1/account but its data pulls fine) · never bucket cash by billing_reason · Assessment_*_Q2 drops are conditional routing, never abandonment.

11 · Confidence

FindingTag
Every funnel count, rate and cut in §1–§7Confirmed live pulls, reproducible
The 153 / $7,013.47 / 36.9% figuresConfirmed reproduced exactly, twice, by independent method
Cause of the ATC → subscription gapUnverified check add_to_cart semantics first
Cause of the 6–12 Jul–20–26 Jul lead-rate collapseUnverified config-404 hypothesis untested
$16.3K intent-loss · 126 mobile buy-clicksModelled upper bounds, assumptions stated inline
Geography as a driverUnverified confounded with source

12 · THE TO-DO LIST — step by step

🏁 THE RANKED ACTIONS — 5 Aug (cash per hour of effort, finance excluded)
1. Finish AGA-56 — $97 annual to 100% of paywall traffic (retire /2026-v2-2/ + /2026-v2-3/) — completes the June fix · 2. The cut list on Aga's separate surface (AGA-103) · 3. One-time product to the list (replaces the REJECTED coaching tier — no trainer exists) · 4. 24-month plan (one Stripe price, one card) · 5. Verify real burn vs bank (the $15K target has been UNVERIFIED since 20 Jul) · 6. The two free defects (invert the win-back ladder back under $97 · raise monthly for NEW customers only) · 7. One warm-list lifetime window ($297, capped) · 8. Nic: R1 native sprint ONLY (analytics tasks 22 + 23 — the RevenueCat Paywalls SDK ends the paywall release cycle; only 15–20% of app paywall viewers enter a card) + NIC-55/54/19 on web — paid-measurement wiring stays parked (fails MRR-30, ruled 5 Aug).
✅ THE CONSOLIDATED TO-DO — one list, every owner, highest impact first
95 open tasks — Aga 44 · Nic 10 · 🤖 fleet 41. Generated 12 Aug 2026 from the tracked queue (SEO_HUMAN_QUEUE.json) and the same walkthroughs that build AGA_TODO_NOW.html — so this list and Aga's page cannot disagree. Ordered by impact, then urgency, then how long it takes. Open any row for the reasoning, the exact steps and what "done" means. Finance rows are excluded by the sharing boundary; they live on Aga's separate surface.
#TaskOwnerTimeImpact
1
GO/NO-GO: a 500-contact activation test to the 6,813 who never worked out — $0, the growth fleet's top-ranked lever NOW
why this matters + step-by-step

What: Approve the fleet drafting ONE activation email (get workout 1 done — no offer, no discount) to a 500-contact test slice of the app-side contacts who finished the survey but never did a single workout. You see the rendered email AND the segment-guard PASS before anything sends — this row is only the GO to draft-and-show.

Why: The 10 Aug growth-fleet verdict on your no-paywall question ranked this #1 of five levers: 6,813 people are already ours, already qualified, and cost $0 to reach. If 5% activate and 7.3% of those pay, that is ~24 paying customers — more than the $97 paywall produced in its first ten days [MODELLED — the fleet's own skeptic flagged both rates as benchmarks, not measurements, which is exactly why the 500-contact test comes first]. The no_workout funnel-stage field went live 7 Aug, so the segment is buildable today.

Steps

  1. Reply GO (or amend) on this row
  2. The fleet builds the 500 segment from %TMA_FUNNEL_STAGE% = no_workout and runs segment_guard.py — its PASS text comes to you with the draft
  3. The fleet drafts via /email-fleet (locked footer, lint gate, activation CTA per the welcome doctrine — NO offer)
  4. You approve the RENDERED email; day-7 read of clicks + workout-1 completions decides whether the remaining ~6,300 get it

Done when: 500 contacts have received the activation email and the day-7 click/activation read exists — THAT number, not the modelled one, decides the full-list send.

AGA5m●●●●●
2
GO/NO-GO: give 758 Nurture Sequence 2 (14,600 contacts) a quiz-root CTA slot — sister of AGA-129 NOW
why this matters + step-by-step

What: Approve ONE slot in 758 Nurture Sequence 2 carrying the quiz-root CTA (https://quiz.themovementathlete.com/, UTMs per the link rule). A single-slot change through the email fleet under the Evolution Law — not an arc rewrite. One GO can cover this and AGA-129 together.

Why: The growth fleet's lever #2 ('fix the tap before the bucket'): ~14,600 contacts sit in that automation sending the quiz NOTHING, while email produced 0 of the new quiz's first 14 sales and owned surfaces are its best-converting source. The no-paywall question (§NP) cannot even be tested while the email engine converts at 0% — this row and AGA-146 are what un-darks it.

Steps

  1. Reply GO (or amend) on this row — say if one GO covers AGA-129 too
  2. The fleet names the worst eligible slot from the scoreboard and drafts the single-slot change via /email-fleet
  3. Collision + segment checks run against the live automations; results attached to the approval
  4. You approve the RENDERED email; day-7 read: email-sourced quiz leads vs the ~0.1/day baseline

Done when: One live slot in 758 Nurture Sequence 2 carries the quiz-root CTA and email-sourced quiz leads move off zero.

AGA5m●●●●●
3
Tell the dev to update Divi BEFORE touching PHP on Calisthenics Academy NOW
why this matters + step-by-step

What: One message to Sovat with a single instruction: on calisthenicsacademy.co, update Divi before anything touches PHP — and confirm the Elegant Themes licence is still live, because the updater needs its API key.

Why: The assessment he is working from is wrong. CA's active theme is Divi 4.4.8, and Elegant Themes only added PHP 8 support in Divi 4.8 — the theme predates PHP 8 support by four minor versions, so upgrading PHP first breaks the site. Page Builder Everywhere is real but is the smaller blocker: its entire footprint was one copyright line in one widget area.

The likely cause of the wrong read: BWA runs Divi 4.27.7, so a check done there looks clean — CA was never separately verified. Re-measured 12 Aug and it still holds: his report said the theme was updated and ‘Divi version verified’, and the live theme is still 4.4.8.

Steps

  1. Message Sovat: update Divi on CA first, then PHP — never the other way round
  2. Ask him to confirm the Elegant Themes licence/API key is still active (the updater needs it)
  3. Ask him which PHP version CA is on today — we cannot read that from outside WP Engine
  4. Ideally the whole job moves onto Rocket staging rather than being done on WP Engine at all

Done when: The dev has confirmed the Divi-before-PHP order in writing, and we know what PHP version CA is actually running.

AGA10m●●●●●
4
One builder visit — the workout-1 email + 2 safety conditions NOW
why this matters + step-by-step

What: Three things in one ActiveCampaign sitting, about 12 minutes: build one small automation, add a skip-condition to two welcome arcs, and the promo-opt-out condition you already have queued.

Why: The highest-intent moment in your whole funnel currently carries no email at all — the morning after someone finishes their FIRST workout. About 48 people a day reach it. Someone who trained yesterday is a different person from someone who downloaded an app: they have felt the product, and the ask stops being “buy something” and becomes “keep doing what you did yesterday”. Everything on my side is built and running — a nightly job reads the app’s data out of Intercom, finds everyone whose workout count went from 0 to 1, excludes payers four separate ways, and stamps the tag workout1-yesterday on them by about 03:30. The tag is the bridge: ActiveCampaign never has to see the app. What it cannot do is build an automation or add a condition — those are builder-only, which is the whole of your 12 minutes.

Steps

  1. 1 — the new automation (~6 clicks). Automations → New → start trigger Tag workout1-yesterday is added (runs once) → Wait until 8:00am (contact’s time zone) → Send the workout-1 email → End. I’ll have the email written, QA’d and rendered for you to approve before you build this
  2. 2 — stop nagging people who already train. On 992 TMA | Welcome Sequence AFTER APPSIGNUP AB TEST Aug4th and 750 TMA | Welcome Sequence After Quiz, add a condition on the later send steps: skip if tag workout1-done exists
  3. 3 — while you are in there: AGA-145’s promo-opt-out exclusion on 993 SALES SEQUENCE — same 2-minute condition class
  4. Tell me when the automation exists and I’ll push a test contact through it and verify the whole chain end to end

Done when: The automation exists and is armed, both welcome arcs skip people carrying workout1-done, and I’ve confirmed a test contact flows through correctly.

AGA12m●●●●●
5
Send the RN devs one link, then hold them to three things on return NOW
why this matters + step-by-step

What: The in-app paywall rebuild is with the RN team. Your part is one link out and three checks when it comes back — you are not building anything.

Why: All three in-app pricing pages (full price / 30% off / 50% off) are separate copies, and that is exactly how the current bug survived. The fix is to put all three on one component with a variant switch. The real defect being fixed is non-USD currency — a price literal hardcoded in the UI shows the wrong number to anyone not paying in dollars. Scope is UI only: RevenueCat, purchase, restore, terms and analytics are already wired, and the offers are already configured.

Steps

  1. Send them https://tma-paywall-brief.netlify.app/ — it links the design contract and the package zip on the same domain (all three verified live 6 Aug)
  2. Ask them to confirm the estimate before starting — 5h max, in 6 milestones
  3. On return, check three things: (1) no price literal anywhere — every figure comes from the store product at render time, with a retry state if offerings fail; (2) they used one component with variant=full|off30|off50, not three rebuilds; (3) their on-device pass included a non-USD currency

Done when: One paywall component serves all three pricing pages, every price is read from the store at render time, and a non-USD buyer sees the correct amount.

AGA15m●●●●●
6
Paid compliance sweep — 5 checks in the ad UIs, ~20 min NOW
why this matters + step-by-step

What: Five checks in Meta Ads Manager and Google Ads that stop live rule breaches. None of them need a decision — they are verifications and one small revert.

Why: 🔴 Found 5 Aug against the live Meta + Google APIs. Google is now 68% of paid spend running at ~6× its allocated $8/day, and its daily budget stepped up +43% on 1 Aug ($35→$50) — the measurement gate makes the Lead→Paid meter a hard gate before ANY budget increase, and no artefact records it clearing. Separately, three campaigns still violate the category-search-only ruling (Competitive Non-Branded alone took 35% of Google spend at £10.63/click with 0 conversions) and its kill task has no completion record. And the Audience Network drift that doubled Meta CPL in late June stopped on its own — the permanent lock was never applied, so it can come back with nobody touching anything.

Steps

  1. Google Ads → Campaigns: confirm Competitive Non-Branded, Competitors Branded and PMax are PAUSED (they violate the category-search-only ruling)
  2. Meta Ads Manager → ad set → Placements → Manual: untick Audience Network. This is the permanent lock — Advantage+ reallocates on its own without it
  3. Google Ads → budget: revert the 1-Aug step back to ~$35/day, OR record why the measurement gate is considered cleared
  4. Google Ads → filter campaign type = Video: is anything live? 69,076 "advertising" views at ~4.4 seconds each says something may be buying garbage (open since 28 Jul)
  5. DECIDE — Apple Search Ads brand defence at ~$8/day. ASA is the best-evidenced paid channel we have (7.4% install→purchase, 2.6× organic) and we currently bid $0 on our own brand terms. It also billed £256 through 25 Jul while the cockpit shows "$0 not running" — confirm its real state

Done when: Three Google campaigns show Paused · Audience Network is unticked under Manual placements · the Google budget is reverted or the gate is recorded as cleared · the Video question is answered yes/no · ASA has a decision.

AGA20m●●●●●
7
Point traffic at the evergreen launch we already own — cheapest cash on the board NOW
why this matters + step-by-step

What: One entry-trigger change in the ActiveCampaign builder so leads actually flow into 760 School of Strength (NEW) — the complete evergreen 50%-off launch arc we already own.

Why: We do not need to build an evergreen launch. We already have one, switched on, fully built with real deadline mechanics — education → the offer at E10 → "8 hours left" → "this closes at midnight". Twenty-nine people have ever entered it. Meanwhile 14,619 contacts sit inside 758 Nurture Sequence 2, which carries no priced offer on any surface at all. That is a routing failure, not a copy failure — which is why it is the cheapest cash in the estate: the asset is built and paid for, it is simply not connected to the people.

Steps

  1. The fleet hands you the click-by-click entry-trigger spec (which tag, which arc, what order)
  2. In the AC builder: set the entry trigger so the right cohort flows into 760 School of Strength (NEW)this is the one step only you can do, the API cannot create or move entry triggers
  3. 🔴 Do it as an ATOMIC swap — both arcs live means double-mailing, neither live means new leads get nothing
  4. The fleet watches entrant counts for 48h and confirms people are actually arriving

Done when: 760 School of Strength (NEW)'s entered count is climbing instead of frozen at 29, and the fleet has confirmed the first cohort reached the offer email rather than dead-ending before it.

AGA20m●●●●●
8
The annual offer to the engaged — 🔴 NOT ready for you: the audience halved and the draft does not exist NOW
why this matters + step-by-step

What: Nothing for you to do on this one this week. The plan was: sell the annual plan to everyone still opening our email. Three things have to be true before that reaches you, and none of them is. (1) We know who we are mailing — the list we call Engaged held 2,912 people when read live on 11 Aug, against the 6,038 the 31 July audit recorded. It has more than halved in eleven days and nobody knows why yet (FLEET-53, the fleet has taken it). (2) The email exists — it does not; FLEET-07 is still open. (3) The unsub gate is clear — 967 sits at 0.51% against a 0.5% hardstop.

Why: That headcount is the denominator of the whole prize. Every number attached to this row — the +$898/mo modelled here, the $500–900/mo email goal in the charter, the cockpit’s email headline — is that count multiplied by a rate. Halve the people and you roughly halve the money, so approving a send sized on 6,367 would be approving a number that is no longer true. The underlying case still stands: annual buyers churn 9.1%/mo vs monthly’s 36.7%, and no broadcast at this scale has ever gone out.

Steps

  1. Nothing from you right now — this row is parked on fleet work, not on your decision
  2. Fleet: diagnose the Engaged-tag collapse, publish the real audience number and what maintains it (FLEET-53)
  3. Fleet: write the email through /email-fleet and lint it (FLEET-07)
  4. Fleet: collision-check it — never the same week as the 50%-off falsifier (FLEET-38) or the warm pool (AGA-118)
  5. Then it comes back to you, and your decision is ONE thing: read the rendered email and pick the week
  6. Day-7 read lands on the scoreboard: sends → clicks → annual starts, reconciled to Stripe

Done when: The engaged tier has been made the annual offer against an audience number we can defend, the day-7 read exists, and the mix shift (annual share of new sales) is measured against the 36.8% baseline.

AGA20m●●●●●
9
Point ONE weekly email at the quiz root — a link decision, not a campaign NOW
why this matters + step-by-step

What: Approve making the CTA of one already-scheduled weekly send to the engaged list the quiz ROOT (https://quiz.themovementathlete.com/, UTMs per the link rule). One link in one send — not a new campaign, not a sequence rewrite.

Why: Email produced exactly 1 quiz lead in 8 days — and it landed on the DEAD 2026-v2-3 build (via 967 TMA | Welcome Sequence After LEAD MAGNET E7/E2, which still links the old URL). Meanwhile ~14,600 sit in 758 Nurture Sequence 2 with no priced offer, and 4 of the 8 provable $97 buyers came from our own surfaces — owned traffic is the highest-converting source the $97 funnel has, and it is free. Rough sizing: 6,000 reached × 1–2% CTR ≈ 60–120 best-qualified visitors ≈ 1–3 × $97 sales per send [ESTIMATE].

Steps

  1. Say which weekly send carries it (or let the email fleet propose one)
  2. The fleet drafts via /email-fleet — locked footer, lint gate, cadence collision check
  3. You approve the RENDERED email (nothing sends unseen)
  4. Day-7 read: email-sourced quiz leads vs the current baseline of ~0.1/day

Done when: One weekly send to the engaged carries the quiz-root CTA, and email-sourced quiz leads move off ~zero on the scoreboard.

AGA20m●●●●●
10
Rule on the post-quiz journey — six decisions (J1–J6) that make the strategy real NOW
why this matters + step-by-step

What: Read §0 of the post-quiz journey strategy you ordered (about 5 minutes) and rule on six decisions. Each has its full argument written out; you are picking, not designing.

Why: The shape: one journey, five stages, gated on BEHAVIOUR rather than on a timer. One arrival email instead of the current 5–6-email first-day burst; activation nudges until workout 1; then 🔴 the pitch lands the morning after workout 1 — the highest-intent moment in the whole funnel, which today carries no email at all. The 16-email evergreen 50% arc becomes the scheduled second-chance engine entering at ~day 8–10 unconverted, and abandonment overlays as-is.

Steps

  1. J1 — merge results-ready + the login email into ONE arrival email and KILL the verify email (it gates nothing and double-enrols into 992). ~1h of Nic
  2. J2 — adopt behaviour-gating on the live funnel-stage fields. Nightly grain means the pitch lands next morning; good enough, and needs no Nic
  3. J3 — the evergreen arc enters at the journey exit, NOT from 750's terminal, and 760 School of Strength is SUPERSEDED as the bridge (same offer, second clock). Recommend RETIRE
  4. J4 — pitch price: $97 while their quiz window lives, $78.50 only in the evergreen event (this reconciles AGA-114)
  5. J5 — 750 fixes are SURGICAL per the Evolution Law, worst slot first (the 1.14%-unsub E1). Never a rewrite
  6. J6 — activation becomes its own 3-email micro-arc replacing 750's front

Done when: All six are ruled, and the build order follows from them rather than from whoever asks next.

AGA20m●●●●●
11
Approve the personalised-welcome design — 20-min read, 4 calls NOW
why this matters + step-by-step

What: Read the design artifact and reply GO (or amend) on the four calls in it — this is the green light for rebuilding the welcome sequence on the quiz personalisation data, with the abandonment engine doing the rendering.

Why: You asked for exactly this: “take this personalisation engine and extrapolate it for the email sequence, starting with the welcome sequence — with a very strong fallback.” The analysis is done: 750 TMA | Welcome Sequence After Quiz is over its own unsubscribe hard-stop, sends one generic track to all 7 quiz paths, and its first ask contradicts its own spec. The engine, the per-stage fallback ladder and the build plan are ready — only these four calls are yours: (D1) deploy as a NEW automation + trigger swap (this row's GO is the Evolution-Law override) · (D2) stage-branched start — only checkout-reachers wait to day 3–4 · (D3) the welcome ask = soft free-trial, the $97 stays with the abandonment lane · (D4) measure by 50/50 split (the AGA-64 setup) rather than a blind swap.

Steps

  1. Open the design page: the welcome personalisation design — the 5 decision cards are at the top
  2. Reply in any session: “AGA-134: GO” — or GO with amendments per card (e.g. “D3: use the $97 ask instead”)
  3. The fleet then runs the build (FLEET-47/48) and comes back with the rendered 5-email arc for your review before anything touches AC

Done when: You've replied GO/amend on AGA-134. Nothing deploys to a live automation before that reply — and nothing sends without your rendered-review sign-off after it.

AGA20m●●●●●
12
Rotate 3 leaked passwords — one is a live WordPress admin on Calisthenics Academy NOW
why this matters + step-by-step

What: Three passwords are sitting in plaintext in a repo file, and one of them belongs to an account that is currently an administrator on calisthenicsacademy.co. Rotate them, and tell me whether to remove the stale admin user.

Why: Found 10 Aug in SUPPORT/Ca SUPPORT SOPs.txt (~20 password lines from the Calisthenics Academy era). ✅ Contained: I verified the file is tracked locally but was never pushed to origin — same shape as the July token find. I have added SUPPORT/ to .gitignore, which stops it reaching a remote but does not fix an already-committed secret. Only rotation does, and rewriting git history is forbidden here.

🔴 The live exposure is #1: jeffcowancc@gmail.com — its password is in the file and that Gmail is an administrator on CA (WP user calisthenicsacademy-2). Anyone with that password can password-reset their way to full control of the site.

Steps

  1. Change the jeffcowancc@gmail.com Gmail password — this is the one that actually matters
  2. Tell me whether to REMOVE that WordPress admin account — it is the old CA support person, and I would not delete a user without your word
  3. The Drift and UserEcho logins for hello@calisthenicsacademy.co are both services we no longer use — cancel them rather than rotate

Done when: The leaked Gmail password is changed, the stale WordPress admin is either removed or explicitly kept, and the two dead services are cancelled.

AGA20m●●●●●
13
The ~1,020 warm pool (saw the paywall / clicked buy) has NEVER been emailed — approve the send NOW
why this matters + step-by-step

What: Approve emailing the two warmest segments we own: ~570 people who reached the paywall and did not click buy, and ~450 who clicked buy and never paid (90-day pools).

Why: The revenue plan calls this the best paid audience in the business and orders the FREE version first — email before retargeting. Re-verified 6 Aug in the AC campaign log: nothing at this scale has ever been sent (newest real broadcast: 24 sends). The fleet drafts through /email-fleet, runs send_collision_check.py, and shows you the rendered emails; your part is the yes and the cadence slot.

Steps

  1. Say go — the fleet drafts both emails (paywall-seen → objection-answer; buy-clicked → finish-checkout) via /email-fleet
  2. Review the rendered emails (you see them open in the browser, per the email rule)
  3. The collision check runs against the live automations; result attached to the approval
  4. You pick the send slot inside the weekly-cadence doctrine — never the same week as the 50%-off falsifier send (approved 6 Aug, now FLEET-38)

Done when: Both segments have received their email, opens/clicks/purchases are read at day 7, and the paid-retargeting version of the same pools inherits proven copy.

AGA45m●●●●●
14
42 people typed their email at checkout and nothing ever emailed them NOW
why this matters + step-by-step

What: Build the sequence that follows up people who started paying and stopped.

Why: 42 people got as far as typing their email address into the checkout and did not finish — the highest-intent free traffic you have — and roughly 14 more accrue every day. I audited all 20 scheduled jobs: nothing emails them. Cancellations are covered, failed cards are covered, renewals are covered. Walk-aways are covered by nobody.

Steps

  1. This one is being built in its own dedicated chat — it is bigger than a single sitting
  2. Your decisions in that chat: the four email drafts, and the four shells in ActiveCampaign
  3. Nothing sends until you have read all four

Done when: Somebody who abandons the checkout gets a first note within an hour, and buyers are excluded at send time.

AGA120m●●●●●
15
🔴 REPOINT 'QLG | ADV+ OFF | MC | Control' TO THE QUIZ ROOT — 5 min in Ads Manager. All 4 of its live ads still land on h…

🔴 REPOINT 'QLG | ADV+ OFF | MC | Control' TO THE QUIZ ROOT — 5 min in Ads Manager. All 4 of its live ads still land on https://quiz.themovementathlete.com/2026/, the old page that does NOT show the 97 dollar offer. Change the destination on all four to https://quiz.themovementathlete.com/ (the ROOT). Nothing else: leave url_tags, budgets, geo and the objective exactly as they are, and do NOT pause the campaign. EXACT LIST — adset 'General / T2 / FM 30-54 US/Canada' (GBP 9.62/day, geo US+CA): ad 120253084939360728 and ad 120253084939340728. Adset 'General / T2 / FM 30-54 AUS, FR, UK SING, NZ' (GBP 9.62/day, geo NZ GB IL AU FR): ad 120245527336080728 and ad 120245527336070728. WHY THIS AND NOT A PAUSE — measured live 11 Aug on the Meta API, 30 days, unified attribution: MC Control produced 129 leads at GBP 2.43 each, the biggest lead source on Meta (56% of the two QLG lines' 230 leads; 57 in the last 7 days). Pausing would cut Meta lead volume by more than half in the window we are banking leads for Black Friday. Repointing keeps all 129 leads/month and sends them to the page that shows the 97 AND enrols them into 993 SALES SEQUENCE, whose 10 Sep gate the whole paid plan waits on. Zero cash change either way — the account's daily budget is GBP 45.48 before and after. This is also exactly what Aga's 10 Aug ruling asked for ('RE-AIM into the ONE geo-locked lead line, quiz root'); NIC-97 was built as a clone, which the spec allowed, so MC Control itself was never touched. TWO OPTIONAL EXTRAS while you are in there: (a) drop IL from the second adset's geo — Israel is the only country in this campaign not on the buyer list (US UK CA AU DE SE NL FR); (b) pause the third adset 'General / T2 / FM 22-65 North America' — it holds a GBP 7.00/day budget but all SIX of its ads are paused, so it cannot deliver and spent GBP 0 in the last 7 days. Hygiene only, frees nothing. VALIDATION (2 min): after saving, open each of the 4 ads' preview and confirm the click goes to the quiz root and lands on the page showing the 97 offer, then confirm the campaign is still ACTIVE and its daily budget is unchanged at GBP 9.62 + 9.62.

NIC5m●●●●●
16
🔴 FLEET — EVERY FABRICATION AUDIT MUST LOAD data/testimonials/ (177 per-person files with raw video transcripts). The 75…

🔴 FLEET — EVERY FABRICATION AUDIT MUST LOAD data/testimonials/ (177 per-person files with raw video transcripts). The 759 audit's first three rounds produced SIX FALSE 'fabricated' verdicts — all of Heath's quotes and most of Gareth's detail — because the brief named only SUCCESS_STORIES_SCRAPED.md and the TESTIMONIALS-DATABASE. They are real; the corpus was just missing from the search. Absence of evidence was absence of corpus. I re-verified every earlier repair (973/751/758/764) against data/testimonials/ afterwards and all of them hold — Timo's own file confirms 15kg and no frog stand, and the only 'Jacques' there is the AVATAR persona — but the near-miss is the point: a fabrication verdict that deletes real member copy is as damaging as the fabrication. ACTION: add data/testimonials/ to the standing audit brief and to the ANGLE_REGISTRY prohibition note, so no future run can score a quote fabricated without it.

FLEET20m●●●●●
17
🤖 FLEET — 'THE ENGAGED LIST' IS NOT ONE LIST. ✅ DIAGNOSED 11 Aug, one decision left. Live AC tag census: 7 Day Engagers…

🤖 FLEET — 'THE ENGAGED LIST' IS NOT ONE LIST. ✅ DIAGNOSED 11 Aug, one decision left. Live AC tag census: 7 Day Engagers 1,666 · 30 Day 2,567 · Engaged(237) 2,912 · 60 Day 6,153 · 90 Day 7,172 · 180 Day 12,296 · 360 Day Engagers 19,826 · Active Users 14,054. AGA-119 says 'the engaged (~6,367)' and names NO tag — that figure sits between the 60-day (6,153) and 90-day (7,172) cohorts, so the audience for the plan's headline email has never actually been defined. 🔴 THE CHOICE SWINGS THE AUDIENCE 12x AND THE MODELLED PRIZE WITH IT. Two further findings: (1) tag 237 'Engaged' — the one the cockpit reports as 'engaged-reachable' — appears in exactly ONE file in the estate (tools/email-plan/email_cockpit_sync.py:60) and in no doc, so it is a DASHBOARD METRIC, not a proven send audience; its fall from 6,038 (31 Jul trust audit) to 2,912 is consistent with a rolling-window tag shedding the June-July intake wave (2.4x May, Facebook-heavy — CONFIRMED timeline event), i.e. mechanical decay, not list death [PLAUSIBLE, not confirmed — the maintenance rule is undocumented]. (2) History warns against reaching for the big tags: past promos went to 12,000-44,747 and 60-90% of every one went to people who had not engaged in a year. REMAINING: pick the tag with tma-email-deliverability + tma-segment-integrity-officer, write the rule down, and register a >20% drift check in estate_selfcheck.py.

FLEET60m●●●●●
18
📧 MOVE THE ASK IN 973 Nurture Sequence 1 NEW COPY FROM CLAUDE — from step 18 (day 57) to ~step 7, where 751 Nurture Sequ…

📧 MOVE THE ASK IN 973 Nurture Sequence 1 NEW COPY FROM CLAUDE — from step 18 (day 57) to ~step 7, where 751 Nurture Sequence 1 proved it works. Measured 5 Aug via offer_reach_check.py: the offer currently reaches 0.0% of the arc; 751's identical ask at step 7 reaches 74.3% and clicks 1.25%, the best in the estate. ~11,000 people are currently walking an arc whose ask never arrives. This is a single-slot CHALLENGER change and is EVOLUTION LAW compliant. 973 is now visible on the scoreboard (12,141 sends, Tier B) since the campaign-map fix, so the instrument tier is DIRECTIONAL dated slot-swap. Run through /email-fleet; Step 1.4b offer-reach gate applies.

FLEET90m●●●●●
19
📧 GIVE 758 Nurture Sequence 2 A PRICED OFFER BEFORE ANYONE ELSE MIGRATES IN — it holds 14,619 contacts and is TRIAL-DOOR…

📧 GIVE 758 Nurture Sequence 2 A PRICED OFFER BEFORE ANYONE ELSE MIGRATES IN — it holds 14,619 contacts and is TRIAL-DOOR ONLY: 11 emails, every CTA to /start-training/, no priced offer on any surface (verified 5 Aug via offer_reach_check.py). 973's contacts are being migrated INTO it, which as built moves 14,619 people from a weak late offer to none at all. This is an EXTENSION class change (net-new slot, no existing slot touched) so it does not consume 973's single-slot budget. Run through /email-fleet.

FLEET90m●●●●●
20
📧 FLEET (me, not Nic) — 50%-OFF FALSIFIER BROADCAST, everything except the copy. Aga APPROVED the send on 6 Aug with one…

📧 FLEET (me, not Nic) — 50%-OFF FALSIFIER BROADCAST, everything except the copy. Aga APPROVED the send on 6 Aug with one amendment: 'I am going to create and prove the emails' — so /email-fleet does NOT write this one, she does. MINE: (1) build the Core audience — opened or clicked in the last 90 days, ~5,090, dormant tier EXCLUDED (July's 0.451%/send unsub damage came from there, and the June Postmaster spike band coincides with the dormant/sunset lanes); (2) mint a UNIQUE coupon code so invoice.discount.coupon.id becomes the campaign revenue key — only two coupon ids exist in eight years, which is exactly why email revenue is dark; (3) run tools/retention/send_collision_check.py so nobody mid-offer is double-mailed; (4) lint Aga's copy through tools/retention/email_lint.py, INCLUDING the new charge-immediately gate — this send points at a 50%-off link so it must carry no trial mechanics at all; (5) at T+72h read the $78.50 charge count and report the verdict either way, including if it refutes the offer-layer hypothesis. Aga presses send.

FLEET90m●●●●●
21
🤖 FLEET — THE MEMBER-FABRICATION CLEANUP (the rest of it). An 11 Aug audit of 5 nurture arcs found 57 named people: 35 r…

🤖 FLEET — THE MEMBER-FABRICATION CLEANUP (the rest of it). An 11 Aug audit of 5 nurture arcs found 57 named people: 35 real, 16 exist NOWHERE in TMA's records, 46 of 57 carry at least one attribute their source does not support, and 6 verbatim quotes were transplanted from 3 real donors onto other people's names. ALREADY FIXED TODAY: 973 slot 8 (Braden's life published as Jacques's, plus an invented daughter), 973 slot 3 (Tim's 7kg/frog-stand/muscle-up published as Timo's — Timo lost 15kg), 758 slots 3/5/7 (Anthony's tendinitis quote published as 'Mark, 37' and 'Karim' across ~19,600 sends), and the ROOT CAUSE (ANGLE_REGISTRY.json told writers to 'assign new names + specific details before writing' — now replaced with a hard prohibition). STILL OPEN: 751 entirely (144,606 sends, the biggest carrier, incl. an invented 'David, 47'); 759's Martin (a fabricated medical outcome in his own voice — 'and my knee healed', 0 hits; his record says 'bad knee aches'); the reusable fake identity 'Sarah, 48' carrying FOUR different medical histories across four assets; 764 slot 4's twelve invented people; Andrew's job and age differing between arcs; 'Peter' (7,015 sends) whose name TMA's own article deliberately withholds. METHOD THAT WORKS: grep every name/number/job/injury against marketing/avatars/SUCCESS_STORIES_SCRAPED.md, and confirm identity on a SECOND attribute — near-identical first names (Tim/Timo) caused two of the three transplants.

FLEET180m●●●●●
22
🤖 FLEET — PHASE 1 OF THE ABANDONMENT BUILD, APPROVED BY AGA (D5, 7 Aug PM). Five moves, all fleet-executable, nothing wa…

🤖 FLEET — PHASE 1 OF THE ABANDONMENT BUILD, APPROVED BY AGA (D5, 7 Aug PM). Five moves, all fleet-executable, nothing waiting on a human: (1) FLEET-10 pagination fix — the limit=10 Stripe bug is live in check_saves.py/r1_daily.py while wb_tag.py tags wb-eligible daily, so a paying member on an 11th record can be mis-tagged expired; fix before 976 is ever armed. (2) Re-feed quiz_abandon_sync.py from tag 63773 NEW quiz-reached-checkout instead of Stripe incompletes — Stripe undercounts checkout viewers ~7x because a PREFILLED quiz email never fires the blur that mints the record; keep Stripe as the buyer-safety check and the KPI read. 🔴 EXPECT THE RECOVERY RATE TO FALL as the denominator widens with lower-intent people — that is dilution, not decay. (3) E1-E4 personalised rebuild through /abandon-fleet + /email-fleet gates (FLEET-42) against the §8 quiz data. (4) Wire cart_abandon_reconcile.py hourly + a register row so v3 has an audience the day it has traffic. (5) Hygiene: nothing left — the STOP/reply wiring, the AGA-125 title, the _briefs/02 correction and the E11 row were all completed 7 Aug PM. ORDER MATTERS: (2) before (3), because a better email to 1.5 people/day is worth less than the same email to 10.

FLEET240m●●●●●
23
🤖 FLEET — EXTRACT THE PERSONALISATION CORE + BUILD THE WELCOME PACK AND ENROL-WRITER (Phases 0–2 of WELCOME_PERSONALISAT…

🤖 FLEET — EXTRACT THE PERSONALISATION CORE + BUILD THE WELCOME PACK AND ENROL-WRITER (Phases 0–2 of WELCOME_PERSONALISATION_ENGINE_EXPANSION_2026-08-07.md). PHASE 0 PROOFS FIRST: (a) one 150-char sentence → one test contact text field → read back, no truncation (SHARED with FLEET-44 step one — run it once, both estates consume it); (b) the pipe-default hypothesis %FIELD|full sentence% proven on a REAL send or not used. Then: lift assemble()/pick_quote()/jly_block()/tier-detection/manifest machinery into tools/retention/personalisation_core.py with quiz_abandon_manual_notes.py behaviour byte-identical (--example both tiers before/after must match); assemble_welcome() implementing the §5 LEAD-tier/zero-data ladder (slot COPY is written by Agent 07 through /email-fleet — the engine stores it, never authors it); mint the 7 TMA_WELCOME_* fields (NEVER reuse the abandon adapter's 72–76 — same person can be in both estates in one week, shared fields + the freeze law = cross-arc rewrites); welcome_personalise.py enrol-writer on the funnel_stage_export.py PUT pattern (one call · retry 429/5xx · abort >200 errors · clear-stale · read-back) + per-person manifest + freeze check via contactAutomations + launchd + AUTOMATION_JOB_REGISTER row. Bulk AC writes need the segment gate (segment_guard.py PASS, Step 1.4c).

FLEET240m●●●●●
24
1 min: tell Sovat to restore CA to STAGING, not over production — or he undoes yesterday's repair NOW
why this matters + step-by-step

What: Send the one-paragraph follow-up in your existing thread: marketing/seo/DEV_FOLLOWUP_RESTORE_TO_STAGING_2026-08-12.md. It says one thing — if a pre-push restore point exists for Calisthenics Academy, restore it into a staging environment, not over production.

Why: Your sent message asks whether a restore point exists. It does not say what to do with it. If he finds one and helpfully restores it over production to put things right, he wipes the repair made on 12 August — all 44 ebook buy links pointing at ThriveCart — and puts the site back to 2020 a second time.

And the answer to your question — yes, it can come back, but there is very little to bring back. I hold pre-push copies of 5 CA pages: 4 are byte-identical to the reverted state, and the 5th has identical visible text to the character — its only real loss was 2 ThriveCart links, already redone. The May-2026 web archive of the ebook page has less content than the page live today. One confirmed casualty: the footer copyright line — but that is the Page Builder Everywhere deactivation, not the rollback, and the fix is already in your main message.

Honest limit: that is hard evidence for 5 of 25 pages, and a database holds more than pages — settings, widgets, menus, users. Which is exactly why it is worth restoring to staging and comparing, rather than declaring it fine.

Steps

  1. Reply in the same thread with the one paragraph — it is written, no editing needed
  2. If he produces a staging restore, tell me and I will diff it against production myself
  3. If the restore points do not reach back that far, we treat production as final

Done when: Sovat knows not to restore over production, and either we have a pre-push copy to compare against or we know for certain none exists.

AGA1m●●●●○
25
🟡 HOLD until 13 Aug — then a 2-minute GO/NO-GO on Google hardware negatives NOW
why this matters + step-by-step

What: A 2-minute read-then-decide. If you say GO, the fleet executes it by API — you are not clicking anything in Google Ads. The change is set-level negative keywords on Quiz Funnel | Competitive Non-Branded | US.

Why: 30-day totals: £235.89 / 32 clicks / 0 conversions — and zero all-conversions — while both siblings converted (Competitors Branded £311.57 → 24; Non-Branded £241.33 → 6). All 60 still-enabled keywords are equipment phrases, and the campaign carries zero negatives and zero shared negative lists. The money has been buying ‘backyard calisthenics setup’ £9.94, ‘outdoor calisthenics gym’ £8.46, ‘wooden parallettes’ £7.91, ‘dip bar for home’ £3.26 — hardware shoppers, and we sell a programme.

This also corrects an argument we have made ourselves: ‘never pause, 59 of 66 keywords are untested’ is right in general but does not transfer here — the untested 60 are the same equipment-intent class that has already spent £235.89 for nothing.

Steps

  1. Do nothing until 13 Aug. Read the campaign then
  2. If spend is still ~£6–9/day on hardware search terms → the set-level fix is needed. Say GO
  3. If there is a material sustained drop → Nic's round worked. Stand this row down and let the campaign have its clean fortnight to the 24 Aug gate
  4. On GO the fleet adds campaign-level hardware negatives: bar, bars, parallettes, equipment, gear, machine, station, vest, kit, setup, buy, for sale, cheap

Done when: Either the negatives are live and the 24 Aug gate reads a clean campaign, or the row is stood down because Nic's surgery already fixed it.

AGA2m●●●●○
26
Decide the Remarketing Playbook — two calls left (item 1 is struck) NOW
why this matters + step-by-step

What: Read the playbook (~5 min) and rule on two things: how far to un-pause Meta, and the shape of the Google abandoner ladder.

Why: (2) Meta un-pause is DEMOTED to a small experiment. The ‘10 purchases at £2.41’ that justified a bigger un-pause was double-counted AND window-cropped; the honest figure is 5 purchases at £67.48 full-life — and all of them bought a $297 offer that ended 12 Jul. So the case for scaling it is much weaker than it first read.

(3) The Google abandoner ladder at £12/day — rung 1 is fine; rung 2 must move to days 17–30 so paid does not undercut the welcome email's only full-price ask on day 10. Two of our own channels bidding against each other for the same person is the thing to avoid.

Steps

  1. Read the playbook — it is one page: https://tma-remarketing-playbook.netlify.app
  2. Rule on Meta: run it as the small experiment, or leave it paused
  3. Rule on the Google ladder: confirm rung 2 moves to days 17–30
  4. The fleet executes both by API once you rule — no ad-UI clicking for you

Done when: Meta has an explicit run-or-stay-paused decision sized on the honest number, and the Google ladder no longer competes with our own day-10 email.

AGA5m●●●●○
27
993: build the promo-opt-out exclusion — 5 min, the arc is live and promises it NOW
why this matters + step-by-step

What: One condition in the AC builder: add Tag does-not-exist promo-opt-out to the standing exclusion on every promo send path — 993 SALES SEQUENCE’s entry first, then any promo broadcast segment.

Why: Every email in 993 SALES SEQUENCE promises “reply STOP to promo emails” and tags the replier promo-opt-out. The tag exists (I created it, id 63977) — but nothing reads it yet, so a member who opts out keeps receiving the arc. That was tolerable while it was paused; you armed it, 115+ are in flight, so the promise is now live and unkept. The exclusion condition lives in automation segment logic the API cannot write — genuinely builder-only.

Steps

  1. ActiveCampaign → Automations → 993 SALES SEQUENCE → entry/segment settings
  2. Add condition: Tag · does not exist · promo-opt-out
  3. Same condition on any promo broadcast segment you send to (the broadcast-cadence doctrine list)
  4. Tell me it’s in — I’ll verify a tagged test contact is actually skipped

Done when: A contact carrying promo-opt-out cannot receive a 993 email or a promo broadcast; verified with a test contact.

AGA5m●●●●○
28
One wording ruling — 12 emails tell app signups they took a quiz they never took NOW
why this matters + step-by-step

What: Give me one sentence and I apply it to all 12 emails in 751 Nurture Sequence 1 myself, HTML and plaintext.

Why: All 12 currently say ‘You're receiving this because you took the assessment at The Movement Athlete’. That is false for the app-signup cohort, who arrive via 988 TMA | Welcome Sequence AFTER APPSIGNUP and never took the quiz. This is not theoretical — a real lead (contact 377159) replied asking ‘What is this for’, which is how it was found. A permission reminder that is untrue for a whole cohort is the line that turns a legitimate email into a suspected one.

Steps

  1. Approve a wording that is true for BOTH quiz leads and app signups
  2. My suggestion: ‘You're receiving this because you signed up at The Movement Athlete.’
  3. I apply it to all 12 emails, HTML + plaintext, through the upload-integrity gate
  4. Nothing else in the arc changes — this is a footer line, not a copy pass

Done when: All 12 emails in 751 carry one permission line that is true for every person who can receive them.

AGA5m●●●●○
29
🔴 By 18 Aug — cancel a duplicate trial before it dunning-mails a paying member NOW
why this matters + step-by-step

What: Cancel one Stripe subscription: sub_1U3ABWI6s6pBAbnmVQgr1ADU. Stripe Dashboard → Subscriptions → search the id → Cancel immediately.

Why: Laurent Frejaville (achatnet43@laposte.net) holds two trialing annual $157 subscriptions on two customer records, both with trial_end 18 Aug 2026. One has a card attached; the other has no card.

On 18 August the carded one bills correctly — and the uncarded one attempts, fails, and starts sending dunning mail to a live paying member. He gets chased for money he has already paid. That is a support ticket and a cancellation risk manufactured out of nothing.

Steps

  1. Stripe Dashboard → Subscriptions → search sub_1U3ABWI6s6pBAbnmVQgr1ADU
  2. Confirm it is the one with NO payment method attached, then Cancel immediately
  3. Leave sub_1U3MTMI6s6pBAbnm9BmlPxJ1 (the carded one) alone — that is his real subscription

Done when: Only one subscription remains on that member, and nothing dunning-mails him on 18 August.

AGA5m●●●●○
30
We are quoting two prices for the same annual plan — $97 and $78.50 NOW
why this matters + step-by-step

What: Rule on the annual price: (a) harmonise everything to $97 and retire $78.50, (b) harmonise to $78.50, or (c) keep them deliberately separate and document why.

Why: Both are live right now. The restored quiz paywall tier sells annual at $97; the email offer sells the same annual at $78.50 through /50promo/. Anyone who meets both — and email subscribers who take the quiz do — is quoted two different prices for the identical product. This is not obviously wrong: a channel-specific intro price is a normal, defensible tactic, and the quiz tier is already producing sales. But right now it is inherited rather than decided, which means nobody can propagate it consistently and every new page or sequence guesses. One ruling ends that.

Steps

  1. Pick (a), (b) or (c) — you can answer in chat, there is nothing to click
  2. If (c), say in one line WHY they differ (e.g. "quiz = intro price, email = win-back price") so it can be written down
  3. The fleet then propagates your ruling across the offer ladder, every sequence and every page in a single pass, and the reason travels with it so no future session re-opens it

Done when: One annual price story exists, written into the ladder and matching on every live surface — or a documented, deliberate split that anyone can read and follow.

AGA10m●●●●○
31
10 min in the 973 builder — three emails promising a deadline that does not exist NOW
why this matters + step-by-step

What: Open 973 Nurture Sequence 1 NEW COPY FROM CLAUDE in the AC builder and pause steps 18, 19 and 22 — the three discount emails, one subject-lined “This closes at midnight”.

Why: The entry repoint (AGA-98) stopped NEW people entering 973 — but re-verified live 6 Aug: the automation is still ACTIVE with 11,056 entered, so contacts already in flight can still receive the three steps, and the midnight deadline they promise does not exist. That is a trust problem on every send. The v3 API cannot touch steps, so this is genuinely a builder click.

Steps

  1. AC → Automations → 973 Nurture Sequence 1 NEW COPY FROM CLAUDE → open the builder
  2. Pause / disconnect steps 18, 19 and 22 (the three discount emails)
  3. Tell me “done” — I re-read the automation and close the row

Done when: No in-flight contact can receive a false-deadline email from 973; the row closes on my API re-read.

AGA10m●●●●○
32
Add the split step in 991 — 10 min, and the test runs NOW
why this matters + step-by-step

What: In the ActiveCampaign builder, add a 50/50 Split to 991 NEW Re-Engagement so half get the current first email and half get the new one. It is the only thing left.

Why: You said “split it” — this is that, and I genuinely cannot do it: POST /api/3/automations/991/blocks returns 405 Method Not Allowed, so automation steps can only be built in the UI. I checked the ways round it too — cloning to a parallel automation is equally builder-only, and a standalone broadcast would skip R2/R3 and the suppression logic and break the arc. Everything else is done: the challenger is written and through every QA gate (including a flow gate it failed first and was fixed, not waved through), 8,765 contacts are cleaned, and the bounce circuit-breaker is armed. The current email gets 2 clicks per 478 sends — 0.42%, while 28% open it. This settles whether an easier ask fixes that, for every re-engagement email we send after this one.

Steps

  1. Open 991 NEW Re-Engagement - For people who stopped opening Before Sunset in the automation builder
  2. Add a Split action immediately after the start, BEFORE the first email — set it 50/50
  3. Leave path A on the existing R1 (“You’ve ignored my last 19 emails. Fair.”, campaign 4109)
  4. Point path B at the new challenger — the HTML is at marketing/email-sequences/991-r1-challenger-3choice-2026-08/R1B-three-choices.html (already open on your screen)
  5. 🔴 Keep the subject IDENTICAL on both arms. Deliberate — the subject earns 28.24% opens and is not the problem; changing it too would confound the only thing being tested
  6. Let both paths rejoin afterwards so R2, R3 and the suppression logic are untouched
  7. Tell me it’s live and I start the feed and read it at 7 days

Done when: Both arms are running on the same 8,765 people, and in about a week we know — on CLICKS, never opens — whether an easier ask wakes a dormant list. Either answer is worth having.

AGA10m●●●●○
33
Approve three wording fixes in the live T+1h abandon email — they ship to Nic as one NOW
why this matters + step-by-step

What: Say yes to three corrected wordings. They then go to Nic as one small deploy, alongside NIC-94 which already touches the same estate.

Why: The email is ‘Try the app on us — your results are ready’ — the ~1h post-checkout send doing about 30 in 4 days at 29.3% open. Read live 7 Aug, its copy publishes:

(1) the retired 4.9★ — the published figure is 4.8. FLEET-14 swept the whole estate to 4.8 and missed this one because it lives in Django, not in AC or WordPress.
(2) ‘Backed by Lead Sports Accelerator — led by Adidas and ex-Red Bull executives’. Canon is ‘the LEAD Sports Tech Accelerator — run by the Adidas family and ex-Red Bull executives’. It drops ‘Tech’ and turns ‘run by the Adidas family’ into ‘led by Adidas’ — a corporate endorsement we cannot evidence.
(3) the T+0 results email additionally promises ‘goodbye to that annoying joint pain in just 30 days’ to every quiz finisher — a dated outcome claim we cannot stand behind.

Steps

  1. Read the rendered copy — the SendGrid group at the top of the review doc
  2. Say yes to all three wordings (or amend any of them)
  3. They ship to Nic as one deploy with NIC-94, which already covers the "[Chosen Password]" literal in the same estate

Done when: The live abandon and results emails carry the published rating, the accelerator's real name, and no dated outcome promise.

AGA10m●●●●○
34
🚨 Rescue the rotting Facebook leads — a 90-day fuse is burning, ~264 still retrievable NOW
why this matters + step-by-step

What: Two things in the Facebook UI, about 10 minutes: export the stored leads before Meta deletes them, and reconnect the ActiveCampaign ↔ Facebook Lead Ads integration.

Why: The MOF - Lead Form campaign's AC sync died on 1 Dec 2025. Every muscle-guide form lead since — roughly 1,100 people — filled in a form and never reached email. 🔴 Meta deletes stored leads after 90 days, so most are already gone: about 264 (May–Aug) are still retrievable today, and fewer tomorrow.

Meanwhile the campaign still spends about £78/mo into the broken pipe — so reconnect it before any more money goes in.

Steps

  1. Ads Manager → Leads Center → the Build Muscle With 40+ higher-intent form → export leads as CSV and drop it in the repo
  2. ActiveCampaign → Apps → reconnect the Facebook Lead Ads integration so new leads flow again
  3. Tell me when the CSV is in and I will import, tag and route them
  4. Reconnect BEFORE more spend — the campaign is live right now

Done when: The CSV of still-retrievable leads is saved, the AC↔Facebook connection is live again, and new form leads reach email the same day.

AGA10m●●●●○
35
Arm the cart-abandon lane, or leave the highest-intent audience unserved NOW
why this matters + step-by-step

What: Decide whether to arm 756 Part 1 - Abandoned Cart Reminder with its finished email. 757 Part 2 - Abandoned Cart Reminder stays off — its four emails are still literally empty.

Why: Cart abandoners are the highest-intent audience we have and we currently send them nothing. The feed already exists and is running: on 5 Aug it found 43 abandoners worth $4,171, synced them into ActiveCampaign with persona, offer and plan — and actioned zero, because there is nothing armed to receive them. 🔴 Two things changed since this row was written: you paused both 756 and 757 on 5 Aug (so nothing is armed and dangerous today — verified live), and the missing-unsubscribe blocker is solved — a compliant replacement email is written and passes the lint gate. So this is no longer "fix a broken thing", it is simply on or off.

Steps

  1. Say arm it (or not) — 757 stays off either way
  2. The fleet loads the rebuilt email into a fresh AC shell (the live campaigns are ed_version=2, which the API cannot overwrite)
  3. You un-pause 756 only — automation status is builder-only, there is no API path for it
  4. The fleet creates the safety sentinel and runs the enrolment; a buyer can never receive one (the paid check re-runs at send time, not just at entry)

Done when: 756 is live with the compliant email, the ~14/day abandoners are being chased within the hour, and 757 stays safely off until someone writes its four emails.

AGA15m●●●●○
36
BWTA has no SPF, no DKIM and no DMARC — publish all three NOW
why this matters + step-by-step

What: Publish three TXT records on bodyweighttrainingarena.com and flip one switch in Google Admin.

Why: 🔴 Proven on a real message header, not inferred. Mail claiming to be from BWA carries no authentication a receiver can check — spf=none, and the only DKIM signature belongs to the host (mail1.wpengine.com) rather than to us, so it doesn't align. Two consequences on our biggest property (1.9M impressions): inbox placement rests entirely on IP reputation, and anyone can send mail as this domain with nothing to stop them. All three records are free and none of them change mail routing.

Steps

  1. You do NOT need a new Cloudflare account — the zone is already there (heather.ns/zeus.ns.cloudflare.com). You need the login to the existing one
  2. Full click-by-click, either for you or to hand to the external dev: the BWTA email authentication work order
  3. Record 1 — TXT on @: v=spf1 include:_spf.google.com ~all
  4. 🔴 Record 2 (DKIM) is the one that matters and only you can generate it — it needs Workspace super-admin. Google Admin → Apps → Google Workspace → Gmail → Authenticate email → select the domain → Generate new record (2048-bit) → publish the value as google._domainkeycome back and click Start authentication, which is the step everyone forgets
  5. Record 3 — TXT on _dmarc: v=DMARC1; p=none; rua=mailto:hello@bodyweighttrainingarena.com; fo=1;
  6. 🔴 Publish at p=none, never reject. The site's contact-form mail currently goes out unaligned through the host — at reject you'd start bouncing your own form notifications. Tighten it in a separate job after a fortnight of reports

Done when: A real test email to Gmail shows spf=pass, dkim=pass with header.i=@bodyweighttrainingarena.com, and dmarc=pass. The header.i domain is the bit that decides it — any other domain means the platform signed it, not us.

AGA20m●●●●○
37
Fleet work: rebuild the 756/757 arc E1–E4 with quiz-data personalisation NOW
why this matters + step-by-step

What: The fleet (not you) runs /abandon-fleet → /email-fleet to rebuild the four abandonment emails with the new quiz data — persona conditional content, obstacle line, stakes echo — before Nic uploads them (E11).

Why: The existing E1–E4 passed lint on 3 Aug but were written before the lead-signal data existed; uploading them as-is would waste the personalisation edge the NIC-54 ship just created.

Steps

  1. Fleet runs the loop: data brief → owner strategy → specialist copy → full gate stack
  2. Finished HTML lands beside the old set with scorecards; you see the rendered emails before anything uploads
  3. Then E11 (Nic/you): upload into 756/757, add steps/waits, activate — and the QA gate + your sentinel arm enrolment

Done when: Four gate-passed personalised emails on disk, rendered set shown to you, E11 unblocked.

FLEET120m●●●●○
38
Two rulings on the rebuilt old arc — nothing gets wired until you say so
why this matters + step-by-step

What: Twelve old 50%-off emails have been rebuilt and are sitting as files. They are not an automation, nobody is receiving them, and nothing happens until you answer two questions.

Why: I did everything that was mine: built all 12, passed the lint gate 18/18, checked every image loads, and put them in a viewer. What is left is genuinely yours. (a) is a positioning call — one email (Free Shoulder Mobility Week with Ricky Warren) sells Bulletproof Your Shoulders, which is a different product from the Academy, so it may not belong inside an Academy discount arc at all. (b) is a send to real members, and I never arm one of those without your yes.

Steps

  1. Open the viewer on your Mac — it is a local file, not a website: marketing/seasonal-campaigns/memorial-day-2026/index.html. Double-click it, then click the 🗄️ OLD tab.
  2. Read OLD-11 (the Ricky Warren shoulder one). Answer (a): does it stay in the 50%-off Academy arc, or move to the 984 Shoulder Mobility Week lane where the shoulder product already lives?
  3. Answer (b): do you want these 12 wired into ActiveCampaign at all — and if yes, which list enters them? They currently have no entry trigger and no day order.
  4. Tell me both answers. I build the automation; you approve the arming before a single email sends.

Done when: Both answered. Either the arc is scheduled to be built to your spec, or it is parked — and nothing has sent.

AGA10m●●●●○
39
For your awareness: 15 members paid twice, $1,662.86 — no action taken, and none will be
why this matters + step-by-step

What: Nothing for you to do unless you decide otherwise. This is a finding put in front of you because it is money and members, and any money decision on it is entirely yours.

Why: Measured 11 Aug across every Stripe subscription since 2024: of 3,478 customers, 370 hold more than one subscription, and 15 of those paid for two overlapping periods — $1,662.86 in total.

🔴 This also corrects a claim I made to you. I said a live subscription plus a checkout always double-bills. You said our system recognises the email and lets them upgrade or rebuy — and you were right: 355 of the 370 resolve cleanly. But these 15 are real, and nothing in the estate was watching for them.

The worst: andreszeledon@gmail.com $157 over 314 overlapping days · mattlahana@gmail.com $141.30 over 290d · moniquetavian@gmail.com $235.50 over 90d · bmwparts@outlook.com $78.50 over 176d · stoica.ciprian@gmail.com $235.50 over 44d · tomifaludi@gmail.com $199.88 over 43d. Nine more run 4–39 days.

Steps

  1. Read it. That is the whole ask
  2. If you want to do something for any of these members, that is your call and you tell me
  3. What the fleet is doing without you: diagnosing HOW these happen — whether one specific path leaves the old subscription running — from Stripe alone

Done when: You have seen it, and the fleet has a diagnosis of the path that creates them so it can be closed at source.

AGA15m●●●●○
40
750 welcome — 24 live subject variants that can never be read. Pick (a) or (b)
why this matters + step-by-step

What: One choice between two ways out of a test that cannot produce an answer.

Why: You built A/B/C splits on all 8 slots of 750 TMA | Welcome Sequence After Quiz (campaigns 4147–4153). ActiveCampaign returns split data BLENDED — one row per campaign, not per variant — so no arm can ever be declared the winner. On top of that, 8 concurrent slots on one automation breaks the max-3-tests rule, so even readable data would be confounded.

One arm has to go regardless of which route you pick: slot 6's ‘your 50% off is live’ sells the same discount that 993 sells, on a different clock — the exact collision the deploy spec warns about.

Steps

  1. (a) I build per-arm readback first (campaigns/<id>/campaignMessages + per-message stats), and we keep ONE slot under test
  2. (b) Collapse to the single best variant per slot now, and test properly later once readback exists
  3. Either way: kill slot 6's "your 50% off is live" arm — it collides with 993

Done when: 750 is either running one readable test or no test at all — and in both cases the discount collision with 993 is gone.

AGA20m●●●●○
41
Turn on 3 email tests — the weekly learning loop has learned nothing for 3 weeks
why this matters + step-by-step

What: Set up three A/B splits inside ActiveCampaign. The specs are already written.

Why: The self-learning loop has now run three weeks in a row with zero live experiments, because splits have to be created by hand in AC and nobody has. So the loop faithfully reports every week that it has nothing to learn from. Three tests are designed and waiting — a subject-line test on the quiz welcome, plus one on nurture and one on re-engagement.

Steps

  1. Open ActiveCampaign → the automation → the email → Split test
  2. The exact variants and split percentages are written in the ledger and the weekly report — copy them
  3. Tell me when they are live and I will confirm they are collecting

Done when: Three splits are running and the next weekly report has real data in it.

AGA45m●●●●○
42
Revoke the external dev's WP Engine SFTP — the day his work signs off
why this matters + step-by-step

What: Delete his SFTP user on three environments, once the PHP upgrade is finished.

Why: He holds live SFTP to three production sites and is mid-upgrade, so his access is correct right now. A contractor's access outliving the job is the commonest way a fixed breach quietly returns — so this is dated, not urgent.

Steps

  1. Ask him for a completion date and tell me — I set the reminder from his answer, so this does not sit here rotting.
  2. On that day: WP Engine → Sites → each environment → Users and SFTP → delete. Three times, once per environment.

Done when: No contractor SFTP user remains on any of the three environments.

AGA10m●●●●○
43
Own the WordPress dev workstream — 69 outdated plugins, two slow sites
why this matters + step-by-step

What: Brief the external WordPress developer and hold four items, none of which you do yourself.

Why: You took this from Nic on 2 Aug. It is a coordination job: 69 outdated plugins across three environments and 11 outdated themes, plus a mobile speed score of 48/100 on two sites. Neither is urgent enough to rush and both are the kind of thing that quietly gets worse.

Steps

  1. Plugins — ask the dev to triage first, not update everything: security releases now, live environments only, and Divi / Yoast / Redirection / WP Rocket handled carefully because those four break things
  2. Speed — the mobile-48 fix and the WP Rocket Delay-JS task are the same sitting; give them together or the second undoes the first
  3. 404s — WP Engine had a live wp-admin incident, so rule that out before anyone diagnoses a 404 on our sites
  4. Bandwidth — just eyeball it next cycle: 401 of 550 GB used with visits up 63%

Done when: The dev has a triaged plugin plan, the speed work is scheduled as one job, and bandwidth is checked once.

AGA20m●●●●○
44
🤖 FLEET — CONFIRM THE NIC-91 PAYMENTINTENT STAMP ONCE A REAL SALE LANDS. Nic deployed the three attribution writes 7 Aug…

🤖 FLEET — CONFIRM THE NIC-91 PAYMENTINTENT STAMP ONCE A REAL SALE LANDS. Nic deployed the three attribution writes 7 Aug ~19:20 UTC. Two halves are already verified in served code: /register/monthly_2026/ now posts a quiz_variant hidden field plus the full UTM set, and the live quiz bundle (index-yC00xO94.js) carries first_touch_utm_source/medium/campaign/content/term + first_touch_fbclid/fbc/fbp behind a once-only __tma_quiz_first_touch_applied__ flag. The THIRD write — checkout_version stamped onto the PaymentIntent — is server-side and can only be proven by a sale created AFTER the deploy. There were none on deploy day (last PI 11:31 UTC, eight hours early), so the state is NOT KNOWABLE, not broken. RUN: python3 tools/analytics/attribution_stamp_check.py — exit 0 confirms, exit 1 means still no sale (re-run later), exit 2 means the write genuinely did not land and Nic gets it back. Expect a sale within ~24-48h at current volume.

FLEET5m●●●●○
45
🤖 FLEET — THE STAGING-PUSH ALARM IS LIVE, AND IT NEEDS ONE HABIT TO STAY HONEST. Built 12 Aug after the CA loss: tools/o…

🤖 FLEET — THE STAGING-PUSH ALARM IS LIVE, AND IT NEEDS ONE HABIT TO STAY HONEST. Built 12 Aug after the CA loss: tools/ops/staging_push_guard.py watches all 3 production WordPress sites for content moving BACKWARDS in time, which is the signature of a stale staging database landing on production (normal work only ever moves the stamp forward). Credential-free by design — it reads the public REST API, because the CA push wiped the application password as a side effect and an authenticated guard would have gone dark at exactly the wrong moment. Registered in estate_selfcheck as 'staging-push-guard' (offline logic proof, 5 properties) + 'staging-push-live' (the live alarm, --network). Baseline laid 12 Aug from a verified-intact state: BWA pages 2026-08-12T03:32:13 + 31 quiz-root links across the 5 sample pages, TMA pages 2026-08-11T16:17:01, CA pages 2026-08-11T17:03:34. 🔴 THE HABIT: after any session that legitimately edits WordPress content, re-run tma posts=2026-08-05T21:55:48 pages=2026-08-11T16:17:01 links={} bwa posts=2026-08-11T20:26:44 pages=2026-08-12T03:32:13 links={'best-calisthenics-workout': 12, 'muscle-up-progression': 2, 'dips-progression': 2, 'handstand-push-ups-progression': 2, 'calisthenics-for-over-50': 2} ca posts=2017-09-27T13:44:04 pages=2026-08-11T17:03:34 links={} [staging-push-guard] baseline written /Volumes/T9/projects/the-movement-athlete/data/hosting/production_content_baseline.json so the baseline tracks real work — and NEVER re-snapshot to clear an alarm, because that blesses the loss instead of investigating it. The guard says so in its own alarm text. Also worth doing when the dev replies: if he confirms no staging DB push, note it against this row; if he cannot, raise the migration's urgency, because an install that can be overwritten this easily should not be the one we spend three more weeks improving.

FLEET5m●●●●○
46
🍎 SHIP THE STAGED iOS KEYWORD FIELD — the LIVE one wastes ~86 of its 100 characters, and the good one is ALREADY WRITTEN…

🍎 SHIP THE STAGED iOS KEYWORD FIELD — the LIVE one wastes ~86 of its 100 characters, and the good one is ALREADY WRITTEN and sitting unsubmitted. Read live from App Store Connect 11 Aug 2026. LIVE (v1.70.71, READY_FOR_SALE): 'ab,butt,beachbody,tracker,gym,exercise,diet,planner,trainer,buttock,calisthenics,ladder,routine,diet' — 'diet' appears TWICE (Apple ignores the duplicate), 'calisthenics' is ALREADY indexed free from the subtitle 'Calisthenics & Gymnastics' so it is 13 wasted characters, 'butt'+'buttock' are both off-brand, 'beachbody' is a competitor brand, and only ONE term describes what we sell. ALREADY STAGED on v1.70.72 (PREPARE_FOR_SUBMISSION): 'bodyweight,workout,plan,progression,home,beginner,strength,mobility,pull,push,handstand,planche,core' — no duplicates, nothing already-indexed, dramatically better. ✅ SO THE ASK IS SIMPLY: confirm v1.70.72 is actually going out, and tell us roughly when. If it is stuck, say what on. This matters because 87.3% of iOS installs come from App Store SEARCH and 74.3% install WITHOUT ever opening the product page — the keyword field and subtitle ARE the conversion surface, and this costs GBP 0. Optional further gain, our proposal, 92/100 chars, skill-intent over generics: 'bodyweight,pullup,pushup,handstand,muscleup,planche,lever,dips,mobility,strength,progression'.

NIC10m●●●●○
47
🤖 FLEET — 24h RE-READ of the Google Ads Conversions column. Aga demoted the 4 non-sale + 5 stale $297 actions to Seconda…

🤖 FLEET — 24h RE-READ of the Google Ads Conversions column. Aga demoted the 4 non-sale + 5 stale $297 actions to Secondary on 11 Aug, but at the 10 Aug 21:20 UTC pull metrics.conversions STILL counted 77 bid-counted lead-forms. Google recomputes that column against current settings with a lag. Re-run tools/analytics/remarketing_playbook_pull.py and confirm metrics.conversions has fallen to roughly the PURCHASE count while all_conversions stays high. 🔴 IF IT HAS NOT MOVED, the demotion did not take the way we think and the next step is setting biddable=false on the account-level CustomerConversionGoal for each non-sale category — say so rather than assuming. Also confirm action 7663033877 has stopped stamping £297 (it added £1,188 of phantom value on 4 conversions, 3 of them on 10 Aug); if it stamps again, disable it outright rather than leaving it Secondary. Everything else in the remarketing playbook is gated on this.

FLEET15m●●●●○
48
🔴 REMOVE THE THIRD-PARTY GTM CONTAINER FROM THE CHECKOUT — GTM-PPGJXHH is hardcoded in app/apps/templates/base.html and…

🔴 REMOVE THE THIRD-PARTY GTM CONTAINER FROM THE CHECKOUT — GTM-PPGJXHH is hardcoded in app/apps/templates/base.html and is NOT ours. Aga checked all 7 GTM accounts / 12 containers on 11 Aug: no match. It loads on every legacy /register/ checkout — the page that holds a live Stripe key — alongside our own GTM-TKGDZR9, and we cannot see what it fires. DELETE two blocks in that one file: the <script> at lines ~12-18 (head) and the <noscript> iframe at ~52-55 (body). Leave GTM-TKGDZR9 untouched. While in there, also delete the dead Universal Analytics tag UA-104067894-1 (line ~20) — UA was sunset by Google in Jul 2023 and sends nothing. Nothing else in the file changes. AFTER DEPLOY: load /register/yearly3/ and confirm only GTM-TKGDZR9 loads.

NIC15m●●●●○
49
🔴 NIC — STOP PMax BUYING PLACEMENTS THAT HAVE NEVER CONVERTED. 'Quiz Funnel | PMax | US | Sales OBJ' is the only LIVE ca…

🔴 NIC — STOP PMax BUYING PLACEMENTS THAT HAVE NEVER CONVERTED. 'Quiz Funnel | PMax | US | Sales OBJ' is the only LIVE campaign breaching the settled 'Category Search ONLY — no Demand Gen, no YouTube' ruling, and the breach is measurable: over the last 30 days its non-Search arms took £60.85 across 280 clicks and returned ZERO conversions — CONTENT/Display £28.37 (39,067 impressions, 210 clicks, 0 conv), SEARCH_PARTNERS £28.17 (48 clicks, 0 conv), YOUTUBE £3.28 (17 clicks, 0 conv), DISCOVER £1.03 (5 clicks, 0 conv). That is 40%% of the campaign's £150.32 spend buying nothing. 🔴 DO NOT PAUSE THE CAMPAIGN — its SEARCH arm took £93.07 and returned 78 conversions at £0.53/click, the lowest cost-per-conversion in the account. THE ASK: keep the Search delivery, stop the rest. PMax gives no clean channel toggle, so pick whichever you judge best and tell us which: (1) Account-level Excluded Placements + Content Suitability to cut Display/YouTube inventory; (2) campaign-level negative keywords + turn OFF Final URL expansion; or (3) the clean structural answer — retire PMax and move its £5/day into a standard Search campaign, which is what the ruling actually asks for. TWO CAVEATS TO CARRY, not decorations: (a) 86%% of this account's 'conversions' are email addresses, not sales — 30d the account booked 59 Leads-GTM + 46 generate_lead + 4 add_to_cart + 4 Android installs against only 14 Purchase + 4 Lifetime-promo — so PMax's 78 are leads; (b) PMax self-attributes generously (78 conversions from 174 clicks is a 45%% rate), so treat its Search figure as directional, not proven. VALIDATION (5 min): after the change, re-open the campaign's 'Where ads showed'/placement report 3 days later and confirm Display/YouTube impressions have gone to ~0 while Search impressions and conversions hold.

NIC15m●●●●○
50
✅ REASSIGNED 31 Jul — the WP Engine security deletions moved to the EXTERNAL DEV (now Step 0 of the migration brief), no… ASSIGNED-DEV

✅ REASSIGNED 31 Jul — the WP Engine security deletions moved to the EXTERNAL DEV (now Step 0 of the migration brief), not Nic. Nic's only remaining involvement in the hosting migration is dropping DNS TTL to 300s ~48h before cutover. Original detail: `docs/company/HOSTING_MIGRATION_2026-08/NIC_BRIEF_DELETE_EXPOSED_FILES.md`.

NIC25m●●●●○
51
🤖 FLEET — ROTATE THE META TOKEN (same scopes) AND SPEC THE COMMENT/DM REPLY LANE. Aga reversed the shrink: she WANTS ins…

🤖 FLEET — ROTATE THE META TOKEN (same scopes) AND SPEC THE COMMENT/DM REPLY LANE. Aga reversed the shrink: she WANTS instagram_manage_comments / instagram_manage_messages / pages_manage_engagement because she wants us replying to comments and messages. So keep the scope set. But the current string never expires, sits in .env.local and was pasted into a chat transcript — anyone holding it can post as the brand. DO: (1) rotate once, identical permissions, new secret; (2) never paste a token into chat again; (3) set a rotation reminder; (4) spec the reply lane itself — what the fleet may answer unaided vs what routes to Aga, since replying publicly as the brand is member-facing.

FLEET30m●●●●○
52
🤖 FLEET — TWO LIVE DEFECTS INSIDE THE PAID APP (was three; item 1 STRUCK on Aga's ruling). ⛔ STRUCK 12 Aug — the old ite…

🤖 FLEET — TWO LIVE DEFECTS INSIDE THE PAID APP (was three; item 1 STRUCK on Aga's ruling). ⛔ STRUCK 12 Aug — the old item (1) was '/getstarted/ redirects to /start-training/ which renders 4.9, fix to 4.8'. That is the SAME defect Aga backlogged as NIC-98 ('leave this alone, backlog this') and NIC-104 ('I never want to hear about this again'). Her ruling covers the string wherever it appears, including as a sub-item inside another row — do NOT re-raise it here or anywhere. REMAINING AND STILL LIVE: (2) 🔴 app.themovementathlete.com/profile/subscriptions prints 'Monthly 70% Off $24.99 Expires on 23.08.26 $0 / Week' — the per-week figure computes to $0, a display bug on the exact screen where a member decides whether to upgrade. Needs Nic (Django template). (3) /start-training/ still advertises 'LIFETIME $997 >> $497' — check against the 29 Jul promo-estate retirement; if the $997 anchor is dead, the strike-through is a false anchor and must go. NOTE: item 3 touches the same PAGE as the struck item but is a DIFFERENT claim (a price anchor, not the star rating), so it stands.

FLEET30m●●●●○
53
🤖 FLEET — CAPTION AUDIT ON EVERY COMPOSITED TESTIMONIAL IMAGE (replaces the cancelled strip task). Aga approved the life…

🤖 FLEET — CAPTION AUDIT ON EVERY COMPOSITED TESTIMONIAL IMAGE (replaces the cancelled strip task). Aga approved the lifetime library on 4 Aug knowing LT-01..LT-20 are composited (built 1 Jul, faces from the member face pool) and that 02_proof-walls + LIFETIME_PROOF_BANNER derive from them. Her two limits are the whole remaining exposure and they are now law. DO: (1) sweep every live and staged surface using a composited image — 967-leads-welcome-indoctrination (LIVE), 967-lead-magnet-quiz-arc, july4-lifetime-2026, quiz-checkout-abandon-2026-08, plus any page/ad — and remove any caption, alt text or adjacent copy asserting 'real screenshot', 'unedited', 'actual capture', 'screenshot from a member' or equivalent; proof framing is fine, capture claims are not. (2) Tag the assets in ALL_ASSETS_INDEX.json and the TESTIMONIALS-DATABASE with provenance real_capture vs composited, so no future agent has to re-derive it from CATALOG.json. (3) Where a surface needs a genuine capture — ad review, app store, press, regulator — route to Aga's own LIFETIME TESTIMONILS WALL .png, confirmed by her 4 Aug as assembled from real screenshots. 967 is LIVE so caption edits are SINGLE-SLOT under the EVOLUTION LAW.

FLEET40m●●●●○
54
🤖 FLEET (Claude) — REPOINT ALL 40 PINNED YOUTUBE COMMENTS AT THE QUIZ ROOT. Measured live 6 Aug with tools/youtube-analy…

🤖 FLEET (Claude) — REPOINT ALL 40 PINNED YOUTUBE COMMENTS AT THE QUIZ ROOT. Measured live 6 Aug with tools/youtube-analytics/comment_audit.py: 40/40 back-catalogue videos carry our pinned comment and every single one links to https://themovementathlete.com/calisthenics-assessment/?utm_source=youtube&utm_medium=organic&utm_campaign=yt_pinned&utm_content=<slug> — the doorway Aga's 3 Aug ruling removed from the YouTube path. The comments were written in July; the quiz-root retrofit rewrote DESCRIPTIONS ONLY, so comments (and end screens, and the channel About text) were silently out of scope. THIS IS MINE, NOT THE VA'S: comments.update works on our own comments. DO: rewrite each comment body swapping the doorway for https://quiz.themovementathlete.com/?utm_source=youtube&utm_medium=organic&utm_campaign=yt_pinned&utm_content=<same slug>, preserving the rest of the text verbatim. COST: 50 units x 40 = 2,000 — will not fit alongside the 9,800-unit retrofit run, so schedule it for 9 Aug once the retrofit finishes (8 Aug) and the full 10,000 is free. VERIFY AFTER with comment_audit.py, which reads live at zero quota and must show 0 on the retired doorway.

FLEET40m●●●●○
55
🤖 FLEET — TMA (themovementathlete.com): PROVE WHERE THE 10th MAGNET'S LEADS ACTUALLY GO. Continues AGA-69, which the fle…

🤖 FLEET — TMA (themovementathlete.com): PROVE WHERE THE 10th MAGNET'S LEADS ACTUALLY GO. Continues AGA-69, which the fleet took back. get-started-with-calisthenics (page 252941) uses a Spectra uagb/forms block whose 36 attributes are ALL styling — no afterSubmitAction, no confirmationType, no webhook, no email target. No Spectra entry post type exists (/wp/v2/types shows only spectra-popup, 0 items); no AC list or tag matches the magnet (100 lists + 200 tags searched); no Code Snippet hooks the form (11 read). STRONG EVIDENCE THE FORM IS DARK — if so, 'no UTM capture' is the lesser half and this magnet has been losing leads outright, not just their source. DO: (1) submit a canary through the live form with a unique address and watch AC, the WP admin email and any entry store for 15 min — that single test settles it; (2) if it IS dark, decide the destination (AC form-endpoint POST vs a snippet hook vs move it to Leadpages like the other 9) and build it with UTM hidden fields from the start; (3) if it is NOT dark, find the delivery path and add the UTM fields there. NOT READABLE FROM HERE (state honestly in the writeup): Spectra global settings and any server-side plugin such as WP Fusion are wp-admin UI, not REST.

FLEET45m●●●●○
56
🤖 FLEET — MAKE SPAM COMPLAINTS VISIBLE. 🔴 THE ORIGINAL METHOD IS A DEAD END, PROVEN 6 Aug: ActiveCampaign's campaign end…

🤖 FLEET — MAKE SPAM COMPLAINTS VISIBLE. 🔴 THE ORIGINAL METHOD IS A DEAD END, PROVEN 6 Aug: ActiveCampaign's campaign endpoint returns send_amt, opens, clicks, unsubscribes, hardbounces and softbounces but NO complaint field at all, so collect_metrics.py cannot be extended to pull what AC does not expose. THE GOAL IS NOW SERVED BY GOOGLE POSTMASTER instead — Aga verified themovementathlete.com on 6 Aug and the 120-day spam-rate series is recorded at data/email-analytics/postmaster/SPAM_RATE_SERIES.json, readable via tools/analytics/postmaster_read.py. REMAINING WORK: once the two Postmaster API grants land (AGA-122), switch the reader to live mode, wire the daily pull into collect_metrics.py, and connect the weekly safety sweep's 0.10% hard-stop to that series so the rule can finally fire.

FLEET45m●●●●○
57
🤖 FLEET — STEP 0 OF THE APP-DOWNLOAD TEST: instrument the paywall-exit app links, which already exist and are already ta…

🤖 FLEET — STEP 0 OF THE APP-DOWNLOAD TEST: instrument the paywall-exit app links, which already exist and are already tagged. The live v1 quiz bundle carries apps.apple.com/...?ct=paywall_exit and play.google.com/...&referrer=utm_source=quiz&utm_medium=paywall_exit, but GA4 receives NO click or outbound event of any kind on quiz.themovementathlete.com (all 10 event names enumerated 1-10 Aug), so take-up is NOT KNOWABLE. This is the cheapest measurement in the whole doc and it answers Aga's app-download question before anything is built. DOABLE WITHOUT NIC: GTM-TKGDZR9 loads on the quiz host and the fleet holds publish rights, so this is a GTM click-trigger + GA4 event tag, not a quiz code change. 🔴 Run getStatus() FIRST — publishing ships the WHOLE workspace and workspaces 132 (Dikesh) and 124 (Google Optimize) hold other people's pending changes; use a fresh Default Workspace and prove the event on the wire with headless Chromium reading /g/collect, never from the tag config.

FLEET45m●●●●○
58
🤖 FLEET — WIRE PINTEREST SO THE BOARD CAN SCORE IT (Aga: 'I am trying to wire it'). Create the Pinterest developer app +…

🤖 FLEET — WIRE PINTEREST SO THE BOARD CAN SCORE IT (Aga: 'I am trying to wire it'). Create the Pinterest developer app + OAuth, then score OUTBOUND CLICKS — Pinterest's real currency, judged over 90 days, never weekly impressions (~3.7-month content half-life). Acceptance: platform_registry.pinterest.lane flips DARK->AUTO in tools/social-pipeline/social_status.json and clicks render on the board. Aga may need to approve the app inside her Pinterest account — ask for exactly that ONE step and nothing more.

FLEET60m●●●●○
59
🔧 976 Cancelled Win-Back CARRIES THE WRONG OFFER — downgraded 11 Aug from a safety defect to an offer defect, after meas…

🔧 976 Cancelled Win-Back CARRIES THE WRONG OFFER — downgraded 11 Aug from a safety defect to an offer defect, after measuring the trigger. WHAT IS TRUE: msg 13204 'Your calibration data is still in there.' carries /30trial/ and HAS SENT to 219 people (the row's original 'never fired, no harm done' was wrong on both counts); msg 13169 carries it unsent. ✅ BUT THE DOUBLE-BILL HAZARD IS NOT REAL FOR THIS ARC: the automation fires at ACCESS-END, not at cancel — measured by joining AC entry dates to Stripe, entry MINUS access-end = 0 days for 14 of 14 sampled (gap to cancel-date 3-347 days), corroborated by ZERO overlap with the live cancel queue. Nobody in it holds a live subscription, which is why the sweep found 0 double-bills across 648 active subs and the link has 0 human clicks. ⇒ IT IS THE WRONG OFFER, NOT A HAZARD. The fix is the plan-aware offer in CANCELLATION_AND_WINBACK_STRATEGY_2026-08-11.md §2: ANNUAL leavers (84 of 115 cancellers) get ANNUAL AT 50% — $78.50/yr, which is $41.38 CHEAPER for them than $9.99/mo ($119.88/yr) and ~2.9x the cash for us — via checkouts-v3/50off/12month/ which is LIVE and needs no build; monthly/quarterly keep $9.99/mo, reply-handled since no self-serve door exists. Gated on Aga's D2. Single-slot per the EVOLUTION LAW; this arc is Tier C so it is arc-cohort only.

FLEET60m●●●●○
60
🤖 FLEET — RUN THE FREE-MEMBER AUDIT. Aga supplied the account (app.themovementathlete.com/login, rayariley87@gmail.com;… BLOCKED

🤖 FLEET — RUN THE FREE-MEMBER AUDIT. Aga supplied the account (app.themovementathlete.com/login, rayariley87@gmail.com; password in .env.local, never in a doc). Answer the three login-walled questions: (1) which upgrade CTAs a free member actually sees and where, (2) what the paywall state looks like from inside a free account, (3) whether the $9.99 step-down is reachable at all. Capture screens, then map against the F2 app-install funnel where the assessment REQUIRES the upgrade.

FLEET60m●●●●○
61
🟡 BUILD THE $97 WARM RETARGETING TEST — sequenced AFTER the 45-min sitting (keyword surgery + NIC-97 + MOF pause) and th…

🟡 BUILD THE $97 WARM RETARGETING TEST — sequenced AFTER the 45-min sitting (keyword surgery + NIC-97 + MOF pause) and the 17-Aug CPL report. Spec: ONE Meta campaign, objective OUTCOME_SALES, ~$5/day (~$150/mo from the freed budget), WARM audiences only (site visitors 30d · quiz-starters · quiz-checkout abandoners; EXCLUDE payers via the ever-paid set), creative = the $97 offer straight (no promo framing), destination = quiz root, keep url_tags. Judged ONLY on stamped Stripe sales (checkout_version=quiz_checkout + fbclid), 4-week read. Brief = tma-remarketing-playbook.netlify.app — use its corrected economics (£67.48 full-life per purchase during promos; the £2.41 is withdrawn), so expectations are honest: evergreen-$97 retargeting is UNTESTED, this is a test not a scale-up. Strategic kicker: the Nov BF retargeting push is Nic's build anyway — this warms the audiences, pixel events and creative learnings for it.

NIC60m●●●●○
62
🤖 ANDROID: 32% OF USERS NEVER SUCCESSFULLY SIGN IN — and it is NOT a crash. RE-DIAGNOSED 11 Aug with Play vitals + a geo… ASSIGNED-DEV

🤖 ANDROID: 32% OF USERS NEVER SUCCESSFULLY SIGN IN — and it is NOT a crash. RE-DIAGNOSED 11 Aug with Play vitals + a geo-controlled GA4 split. 🔴 THE CRASH THEORY IS REFUTED: Play Developer Reporting API says crash rate 0.00% and ANR 0.10% over 25 Jul-9 Aug. 🔴 IT IS ALSO NOT THE CHEAP-GEO PAID WAVE: holding geography constant to BUYER countries only (US/UK/CA/DE/AU/FR/NL...), Android still runs onboarding-done 125 -> first workout 57 = 45.6%, against iOS 242 -> 269 = 111% in the SAME countries. So it is the Android app, not the audience. 🔎 WHERE IT BREAKS: sign-in. Buyer-geo login iOS 239/242 = 98.8% vs Android 85/125 = 68.0%. And the smoking gun: 'social_login_attempted' fires 103x on iOS and ZERO on Android across 28 days, while Android alone emits 'signed_in' (18) and 'signed_up' (6). ❓ THE 2-MINUTE QUESTION FOR YOU: does the Android build actually offer Google / social sign-in on the auth screen, or is it email+password only? If social sign-in is MISSING on Android that alone explains a 31-point login gap (Google Sign-In is the default expectation on Android). If it IS present, then it is firing no analytics event and the drop has another cause -- either way your answer decides the fix. Please also confirm whether workout_started/start_workout are wired identically on both platforms.

FLEET60m●●●●○
63
🤖 FLEET — BUILD THE AC ADAPTER SO THE 756/757 ARC IS PERSONALISED (the engine's second surface). The renderer already pr…

🤖 FLEET — BUILD THE AC ADAPTER SO THE 756/757 ARC IS PERSONALISED (the engine's second surface). The renderer already produces per-person sentences (assemble() in quiz_abandon_manual_notes.py); this writes them into AC custom fields so each email carries ONE merge tag per slot. 🔴 STEP ONE IS A PROOF, NOT A BUILD: all 54 AC custom fields are type=text and there are ZERO textarea fields in the account — our sentences run 100-200 chars. Write ONE full sentence to ONE test contact, read it back, confirm no truncation. If it truncates, mint as textarea. FREE field ids (live census 7 Aug): 57, 72, 73, 74, 75, 76. Then: mint 3 fields (goal_line, objection_line, ps_line), write via PUT /api/3/contacts/{cid} with a fieldValues array (ONE call, proven at 11,500 contacts in funnel_stage_export.py:200, ~4-5 req/s, retry 429/5xx, abort >200 errors), and collapse E1's 7 fake data-ac-condition divs + E2's 8 into ~3 merge tags. FOUR LAWS, each already responsible for a defect elsewhere: (1) EVERY slot always written with a non-empty default — an unset AC field renders as an empty string, it does not skip the sentence; (2) slots FREEZE at enrol, one writer, no mid-arc rewrites, or E3 contradicts what E1 promised; (3) read back a sample live — the write is not the truth; (4) the email must render sensibly with every tag empty. DO NOT arm anything: the arc still needs Aga's shells + the sentinel.

FLEET90m●●●●○
64
🤖 FLEET WORK — DRAFT the Job-7 annual push NOW so it is ready the day the gates clear: the annual offer to the 6,038 eng…

🤖 FLEET WORK — DRAFT the Job-7 annual push NOW so it is ready the day the gates clear: the annual offer to the 6,038 engaged-reachable (the plan calls it the cheapest clean test of the warm end; P2's +$500–900/mo basis). Blocked from SENDING by the unsub gate (967 tripped 1.07% vs 0.5%) and worth full value only after Stripe-UTM (29 Aug gate) — but WRITING it is blocked by nothing: /email-fleet full pass (angle audit → 07 → formatter → lint → 08r), lands as drafts for Aga review. Send date is hers, at gate-clear.

FLEET120m●●●●○
65
🤖 FLEET — FUNNEL-STAGE EXPORT (Intercom→AC nightly): stamp WHERE EACH PERSON STOPPED onto their AC contact. D1 APPROVED…

🤖 FLEET — FUNNEL-STAGE EXPORT (Intercom→AC nightly): stamp WHERE EACH PERSON STOPPED onto their AC contact. D1 APPROVED by Aga 7 Aug ('you can do it, no Nic needed'); segment D (checkout-abandon) carved out to the Abandonment Fleet — lanes are A survey-unfinished / B no-workout / C no-trial only. Intercom holds the whole funnel state per contact WITH email (95,698 contacts) — zero Nic, no app release. Phase 1 read-only census running; Phase 2 (create 2 AC fields + backfill + nightly launchd job, register in AUTOMATION_JOB_REGISTER.md) waits on Aga's D2 GO after she reads the census. Nothing sends from this build — the recovery emails go through /email-fleet with Aga's separate approval.

FLEET120m●●●●○
66
🤖 FLEET — WIRE PERSONALISATION ENFORCEMENT INTO /email-fleet (Phase 4 of WELCOME_PERSONALISATION_ENGINE_EXPANSION_2026-0…

🤖 FLEET — WIRE PERSONALISATION ENFORCEMENT INTO /email-fleet (Phase 4 of WELCOME_PERSONALISATION_ENGINE_EXPANSION_2026-08-07.md — the 7 Aug architecture sweep measured the law STATED in 29 seat briefings and ENFORCED by zero pipeline checks). (1) Agent 02b gets a real runbook step in Step 3 + _briefs/02b-personalisation-brief.json added to OUTPUT CONVENTION and DONE WHEN — today the only personalisation artifact reaching Agent 07 is made by an agent the runbook never invokes; (2) email_lint.py checks 18–21: every %TMA_*% tag exists in LEAD_SIGNAL_CONTRACT §8 or the rendered-slot registry · BLANK-RENDER test (strip all tags → no broken sentence, no empty styled block) · a RESULTS-tier tag requires a declared results-seen audience header · data-ac-condition/%IF% = instant FAIL; (3) email-variable-auditor wired as a BLOCKING Step 7 evaluator for any email carrying %TMA_*% beyond FIRSTNAME, at EVERY tier (08b runs FULL-tier only — FAST currently ships personalisation unaudited); (4) Agent 18 pre-upload check 6: slot fields exist (live read) + enrol-writer registered and stamping + defaults verified on a sample; (5) SPEC-WELCOME rewritten against the expansion doc (it predates the signals — 12 Jul) · _SPECIALIST_COMMON_CORE gains the how-a-specialist-requests-slots block · 07-MASTER-WRITER + 18-DEPLOYMENT get the lead-signal block they currently lack. Also fix the email-variable-auditor internal contradiction (life_context on the Tier-4 ban list AND listed as a real RESULTS field in the same file).

FLEET180m●●●●○
67
🤖 FLEET WORK — TRUST_AUDIT_2026-07-31 hardening block: (1) collision-proof id allocation + row-hash guard on SEO_HUMAN_Q…

🤖 FLEET WORK — TRUST_AUDIT_2026-07-31 hardening block: (1) collision-proof id allocation + row-hash guard on SEO_HUMAN_QUEUE (F1 root cause — two sessions minted the same ids); (2) close the four proven gate blind spots (F3): estate checker passes an inflated honest-sum · brief-sync passes a garbage page with bare ids · queue-drift discharged by any id mention · charter --check passes a rotted source_file; (3) content-fingerprinted brief cards; (4) post-sync verifier diffing DEPLOYED cockpit + AGA_TODO surfaces against sources; (5) F4 stale AGA_TODO_NOW gating; (6) minors: moved-to-aga double-listing · NIC-20/E11 impact-5 rubric check · age column on BRIEF gate tasks · indent law contradiction in aga.md · YT sessions dual-source (3,695 vs 3,786 — name one source). No Aga decisions inside; work top-down.

FLEET300m●●●●○
68
Comp Pablo Mendoza free premium — Jesse's drafted reply promises it NOW
why this matters + step-by-step

What: Pablo (pmendozacaballero@gmail.com) left over rebuild bugs + the price, and offered us a detailed bug list. Jesse's reply is drafted in his thread and promises full premium, free, until the bugs are fixed — 'nothing for you to do'. Someone has to actually switch that on.

Why: The reply engine's first draft answered only the price line of his 8-paragraph email; the real reply is now drafted (send it from hello@ Drafts). But its comp promise has no owner — an unfulfilled promise to the exact member who offered to help us debug is worse than no reply.

Steps

  1. Send Jesse's drafted reply in Pablo's thread (hello@ → Drafts → search mendozacaballero)
  2. Comp his account: admin access grant, or one line to Nic to set it in the backend
  3. When he sends the bug list, it flows to hello@ — the reply-watcher will surface it

Done when: Reply sent, premium active on his account without charge, and he's confirmed he's in.

AGA5m●●●○○
69
Rule the day-5 trial reminder: keep/change/kill — and make Nic name the rail NOW
why this matters + step-by-step

What: One ruling plus one question. Rule whether the day-5 trial reminder stays; ask Nic which rail actually sends it (Django, ActiveCampaign or Stripe).

Why: The checkout page promises buyers a pre-renewal reminder, and you verified a day-5 reminder exists (10 Jul) — but nobody has ever established which system sends it, so we cannot say whether trial-enders are actually covered. Killing it would break a promise printed on the checkout; keeping it unverified leaves a silent gap. I searched the AC automation list via the API — no day-5 automation exists there, which makes the rail question real, not paranoia.

Steps

  1. Ruling: keep (recommended — the promise is on the page)
  2. One line to Nic: “which rail sends the day-5 trial reminder — Django, AC or Stripe?”
  3. I verify the answer against the named system and close the row

Done when: The rail is named and verified, or the reminder is consciously rebuilt where we can see it.

AGA10m●●●○○
70
Exclude the 766 lead-form list from promo broadcasts — the cold band that bled July NOW
why this matters + step-by-step

What: Add the 766 Facebook Lead Form | LM: Building Muscle After 40 audience as an exclusion on promo broadcast segments.

Why: Re-verified 6 Aug: 766 is ACTIVE with 913 entered — cold lead-form contacts. July’s burst unsubscribed at 0.451%/send, 4.8× worse than May on the same shape, and the damage came from exactly this cold band being included in promo sends. Audience exclusions on future broadcasts are a builder setting the API cannot preset.

Steps

  1. AC → the promo broadcast segment/template → add exclusion: contacts from the 766 lead-form list (or its tag)
  2. Tell me the segment name — I verify the next promo’s audience count drops accordingly

Done when: The next promo broadcast’s audience provably excludes the 766 cold band; unsub-per-send is compared against July’s 0.451%.

AGA10m●●●○○
71
GTM-PPGJXHH — is that container yours under a different Google login?
why this matters + step-by-step

What: One login check: is Google Tag Manager container GTM-PPGJXHH owned by an account of yours (agency, old account, a previous contractor)?

Why: The legacy checkout page app.themovementathlete.com/register/yearly3/ is still live (verified 5 Aug: HTTP 200, titled “Register and pay”, carrying a live Stripe key) and it loads two GTM containers — GTM-TKGDZR9 (ours, readable) and GTM-PPGJXHH (not in the account our credentials can see). ✅ The urgency is low and that is measured, not assumed: Stripe subscriptions created in the last 30d split v3 115 / quiz_checkout 58 / unattributed 48, and the unattributed cohort ran 1–4/day all July then stopped — last one 2 Aug, zero on 3, 4 and 5 Aug. The money has already moved off that door; your redirect worked. What is left is simply not knowing who is firing tags on a page that holds a live payment key.

Steps

  1. Sign in to tagmanager.google.com — try each Google account you have, including any old or agency one
  2. Look for container GTM-PPGJXHH
  3. If it is there: Admin → User Management → add google-analytics-claude-access@the-movement-athlete.iam.gserviceaccount.com as a Viewer. The whole question closes and the fleet can read it
  4. If it is not there: tell me — that means a third party is firing tags on our checkout, which is the version worth acting on

Done when: You can say either “it is mine, access granted” or “it is not mine”. Nothing else depends on this today.

AGA10m●●●○○
72
Pick how we measure clicks on the transactional emails — A or B
why this matters + step-by-step

What: Right now we measure zero clicks on any transactional email. Click tracking in SendGrid is switched OFF at the account level, so all 1,106 emails delivered in the last 14 days recorded no clicks by construction — there is nothing to look at.

Why: The one that matters is the abandon email 'Your login is in this email' — it goes out 11–14 times a day, gets opened 29.3% of the time, and its entire job is walking someone back to the checkout. We cannot say whether a single person has ever clicked it. That is money we can neither prove nor improve. I did not just switch tracking on, because doing so rewrites the links in password-reset and activation emails too — and a mail-security scanner that pre-fetches a rewritten one-time link can burn the token and lock a real member out of their account. That risk is yours to accept or decline, so it is a decision, not a chore.

Steps

  1. Option A — recommended, zero risk, no SendGrid change. We put UTMs on that email's links pointing at the quiz root, and read the clicks in GA4. It measures what we actually care about — people arriving at the checkout — not pixel fires. Costs one Django template change from Nic.
  2. Option B. Flip SendGrid → Settings → Tracking → Click Tracking to ON. One click, covers every transactional email at once — but carries the lockout risk above.
  3. If you want B anyway, the safe form is click tracking on the abandon email only, not account-wide. That is also a Nic change, so it is no faster than A.
  4. Reply A or B. I write the brief and hand it to Nic the same day.

Done when: You have said A or B, and the corresponding change is on Nic's approved list.

AGA10m●●●○○
73
Do not read August's numbers yet — a note, not a job
why this matters + step-by-step

What: Nothing to do. Just do not quote August's mix to anyone until around 13 August.

Why: Annual share currently reads 57.1% against July's 13.8%, which looks like the new pricing page working beautifully. It is 4 sales out of 7, on day 3 of the month. At that size the number is equally consistent with “no change at all” and “huge win”. The same applies to retention's “4 cancel-ends” against July's 110. The direction is encouraging and the pricing page did ship on 31 July, so this is genuinely its first read — it is just not a result yet.

Steps

  1. Do not put these figures in front of Nic, the board, or any buyer
  2. At roughly 30–40 sales — about 13 August at the current 2.3/day — it becomes decision-grade
  3. I will bring you the real number then

Done when: 13 August passes and the number is read properly.

AGA1m●●●○○
74
Watch hello@ for listicle replies
why this matters + step-by-step

What: Keep an eye on hello@ for three outbound pitches.

Why: Three went out today (fitbudd, gymnasetips, thehybridathlete), each offering free full access plus an optional commission arrangement. If one says yes we need to provision the free account promptly — a slow reply to an inbound yes wastes the placement.

Steps

  1. Watch hello@themovementathlete.com over the next few days
  2. Forward me any reply and I'll draft the response + provisioning steps

Done when: Each pitch has a reply or is aged out. Log: marketing/seo/listicle_outreach_log.json.

AGA5m●●●○○
75
Ruling: strip the affiliate-programme links from a nurture sequence?
why this matters + step-by-step

What: One decision — should the BECOME AN AMBASSADOR / affiliate-programme links stay in the nurture emails?

Why: They send a subscriber who is being nurtured toward buying away from the offer and into a programme that pays out. Whether that trade is worth it is a judgement about the business, not a number I can settle.

Steps

  1. Reply strip them or leave them.
  2. If strip: the email fleet removes them and the lint gate keeps them out.

Done when: One answer, and the sequence matches it.

AGA5m●●●○○
76
Make a free test account — 10 minutes, unblocks a whole audit BLOCKED
why this matters + step-by-step

What: Create an ordinary free account on the app and send me the login.

Why: Three questions cannot be answered from outside a login, and they all matter: which upgrade prompts a free member actually sees, what the paywall looks like from inside, and whether the $9.99 step-down is even reachable. Until the account exists the free-member audit cannot start at all.

Steps

  1. Sign up as a normal free user with any address you control
  2. Send me the email and password (or add me to a password manager entry)
  3. I run the audit from inside

Done when: I can log in as a free member and the audit report follows.

AGA10m●●●○○
77
Hide the staging and beta sites from Google — Cloudflare, no deploy
why this matters + step-by-step

What: Add one Cloudflare rule so test sites stop appearing in search, then clear what is already indexed.

Why: staging. and beta. are being served to Google like real sites. Neither has a working robots.txt, and both return a normal 200 with nothing telling search engines to stay away. Test copies of your site competing with the real one is bad; indexed promo pages are worse.

Steps

  1. Cloudflare → RulesTransform RulesModify Response Header
  2. Add X-Robots-Tag: noindex, nofollow for hostname staging.themovementathlete.com, then the same for beta.
  3. That is step 1 done — instant, no deploy, one click to undo
  4. 🔴 STOP — wait for Nic before the next step. It removes app.themovementathlete.com/, which depends on Nic's noindex header on app. (NIC-43) — not the Cloudflare rule you just set, which only covers staging and beta.
  5. Then Search Console → Removals → “Remove all URLs with this prefix” → app.themovementathlete.com/ as ONE entry

Done when: Both hosts return the noindex header, and the already-indexed promo URLs disappear within about a day.

AGA25m●●●○○
78
🤖 Fleet: the 5 'B' variants in 967 use a non-canonical footer
why this matters + step-by-step

What: Fleet work — no action from you. Messages 13549, 13551, 13553, 13555 and 13557 in 967 TMA | Welcome Sequence After LEAD MAGNET fail two lint checks that their A variants pass.

Why: They are missing the locked social-proof row (badge image + ‘100,000+ members · 4.8 stars’), and their body/P.S. repeats the footer's proof, so the reader is told the same social proof twice. Pre-existing and inherited from whatever builder produced the B arm — the 11 Aug E1 rewrite took 13549 from 4 lint failures down to these 2 but deliberately left the shell untouched.

Steps

  1. Paste the locked footer into all 5 messages
  2. Remove the duplicated proof line from the body
  3. Plaintext regenerated in the same PUT, then the upload-integrity gate
  4. Bundled with FLEET-59 — same messages, one pass

Done when: All 5 B variants pass the footer and duplicate-proof lint checks, and read back correct from the API.

FLEET40m●●●○○
79
🤖 Fleet: 12 of 15 messages in 967 have a preview line that contradicts the email
why this matters + step-by-step

What: Fleet work — no action from you. In 967 TMA | Welcome Sequence After LEAD MAGNET, the preheader_text field and the baked hidden preview div disagree on 12 of 15 live messages.

Why: Several disagree materially. 13555's field promises ‘Marcus… 100 burpees destroyed Gareth's spine (here's what saved him)’ over a body about 20-minute sessions; 13549's promises ‘Your exact roadmap to abilities you thought were years away’; 13557's ‘Heavy weights make you weaker (I have proof)’.

This is the false-promise class — a preview promising what the body cannot deliver. It is pre-existing, not caused by the 11 Aug repair.

Steps

  1. Per message, decide which line is actually true of the body
  2. Write ONE line into both surfaces — the API field and the baked div
  3. Re-run the integrity gate

Done when: Every live message in 967 has one preview line, and it is true of the email underneath it.

FLEET45m●●●○○
80
🤖 Fleet: all 17 messages in 992 carry a preheader from a different sequence
why this matters + step-by-step

What: Fleet work — no action from you. In 992 TMA | Welcome Sequence AFTER APPSIGNUP AB TEST Aug4th, the baked preview and the API preheader field disagree on every single message — and the field text is 967 lead-magnet copy.

Why: 13651's field reads ‘Fifty-two and starting over, forty-seven and unfit…’ against a body about your workouts being everyone else's. 13638's reads ‘A warm hello, and the real reason bodyweight training never stuck.’

The preview line is the most-read copy in an email after the subject, so 17 readers' first impression is a promise the email never makes. Verified pre-existing against the pre-write backups — neither the door repair nor its round-2 fix touched this third surface.

Steps

  1. Per message, decide which line is true of the body
  2. Write ONE line into BOTH surfaces (field + baked div)
  3. Plaintext regen in the same PUT, then the integrity gate

Done when: All 17 live messages in 992 carry one preview line that matches their own body.

FLEET50m●●●○○
81
🤖 Fleet: 18 of 24 live messages in 750 fail the email formatting gate
why this matters + step-by-step

What: Fleet work — no action from you. A formatting-only pass over 750 TMA | Welcome Sequence After Quiz.

Why: 18 of its 24 live messages fail the mandatory formatting gate — missing bold and italic emphasis, no underline, and W7 has no visual-break block. Proven pre-existing: the pre-write backups fail identically.

It was invisible until 10 Aug because email_lint.py --ac had a short-circuit bug that linted exactly one message per series — a guard reporting success over work it could not see. That bug is now fixed, which is why the real number appeared.

Steps

  1. Run the formatter seat over the live arc
  2. ONE Evolution-Law-clean formatting-only pass — no copy changes
  3. Upload through the integrity gate

Done when: All 24 live messages in 750 pass the formatting gate, with no copy altered.

FLEET60m●●●○○
82
⏳ Not now, by your own ruling — approve the 48h enforcement when Nic's queue clears
why this matters + step-by-step

What: This is a reminder, not a task. You ruled the $97 window binding on 7 Aug and said Nic is not to be interrupted for it. This row exists so it reaches him later rather than getting lost.

Why: What he'll do (~45 min): enforce the window at charge time, not just in the UI — once an email has had a window, it never gets a second one. Acceptance test: an address 48h+ old sees $157 and Stripe charges $157.

What it unblocks: until it ships, no recovery email may claim the deadline — the server never returns expired today, and a lapsed visitor simply gets a fresh 48 hours. That is why the abandonment arc's E3 ‘your window closes tonight’ beat cannot ship at all.

Steps

  1. Leave it until Nic's queue clears — that was your call and it still stands
  2. When it clears, approve it and it goes onto his brief
  3. Approve → the abandonment arc gets its third email. Leave it → the arc runs E1-E2-E4 honestly, which is a perfectly good sequence

Done when: Either the window is enforced at charge time and E3 can ship, or E3 stays retired and the arc runs as three honest emails.

AGA10m●●●○○
83
Confirm the PHP state — we genuinely can't see it ASSIGNED-DEV
why this matters + step-by-step

What: Answer two questions about PHP versions.

Why: The WP Engine activity log shows “PHP update from version 8.4.0 to …” at 04:50 on 30 July, and the portal separately reports “5 PHP outdated”. We cannot read PHP version from outside — WP Engine exposes it in neither headers nor REST — so the current state is genuinely unknown to us.

Steps

  1. Which environment did that 04:50 update apply to, and to what version? (if anything moved down from 8.4.0, that matters)
  2. Is BWA still on 7.4.33?

Done when: Both answered — a sentence or a screenshot is enough.

NIC10m●●●○○
84
BWA PHP 7.4.33 → 8.2 (with a separate dev) ASSIGNED-DEV
why this matters + step-by-step

What: Upgrade PHP on BWA and regression-test.

Why: 7.4.33 is end of life — no security updates, and WordPress will stop supporting it. Flagged by the WP dashboard itself.

Steps

  1. WP Engine portal change + regression test
  2. Target 8.2, not 8.3 — Divi is only tested to 8.2
  3. Brief: marketing/seo/DEV_BRIEF_bwa_php_upgrade_2026-07-29.md

Done when: BWA runs 8.2 and the site renders correctly.

NIC30m●●●○○
85
RECONCILE THE LIVE PAID-SPEND FIGURE: the fleet quoted ~$897/mo (cockpit) while the 10 Aug live pull said ~$2,310/mo (Me…

RECONCILE THE LIVE PAID-SPEND FIGURE: the fleet quoted ~$897/mo (cockpit) while the 10 Aug live pull said ~$2,310/mo (Meta $286.90 + Google £359.11 over 1-10 Aug) — a 2.5x gap. One fresh pull, both platforms, one stated window and label; until then the number carries [UNRECONCILED] and must not be quoted bare. Does NOT move the identity-resolution verdict ('everything that ever sold is paused' holds at either figure).

FLEET15m●●●○○
86
WATCH ROW (DEC-2026-08-11-no-for-now-to-the, review 15 Dec): US consumer identity-resolution vendor lane is DEAD unless…

WATCH ROW (DEC-2026-08-11-no-for-now-to-the, review 15 Dec): US consumer identity-resolution vendor lane is DEAD unless BOTH triggers fire — (a) the Nov BF first-party own+suppress holdout shows an ROI lift AND (b) counsel clears US-only anonymous-visitor resolution for a UK-established entity (Art 14 / DPIA / ICO third-party-list posture / CIPA pixel wave). If both clear: scope an ISOLATED pilot only (separate ESP + cousin domain, never the TMA AC account — AC's acceptable-use policy prohibits third-party-sourced addresses), Dec 2026/Jan 2027. Full verdict: quiz-funnel-versions/#sPAidr

FLEET20m●●●○○
87
🤖 FLEET — FINISH THE §8.4 RECONCILE OF LISTICLE_TARGET_SHEET_2026-07-25.md. Surfaced 11 Aug 2026 by doc_decision_drift.p…

🤖 FLEET — FINISH THE §8.4 RECONCILE OF LISTICLE_TARGET_SHEET_2026-07-25.md. Surfaced 11 Aug 2026 by doc_decision_drift.py after its extractor was fixed — the check had been BLIND since 5 Aug (it hardcoded '## 7. Open decisions'; the doc renumbered it to §8), and a bare-substring routing test then cleared §8.4 because '8.4' matched an unrelated queue row reading 'PHP update from version 8.4.0'. VERIFIED HALF-DONE on 4 Aug: the 4.9★ instruction IS retracted (the sheet now says 'NEVER quote a star rating'; real = 4.53★/297 iOS, 4.7★/374 Play) and rows 3+5 now carry 'NEVER re-offer a commission — they already have one'. STILL OPEN: the contact routing. Rows 3 and 5 are EXISTING Tapfiliate affiliates (Jari Dohmen / calisthenicsworldwide.com, Rick Donohoe / calisthenics-101.co.uk — 65 clicks, 2 customers, £37.47) but the Contact column still says 'Site contact form' / 'Contact page', while the sheet's own correction block states their real email addresses were sitting in our Tapfiliate export the whole time. DO: pull both emails from the affiliate export, replace the contact-column values, then mark §8.4 ✅ in OUTREACH_MASTER so the drift check clears. Commission TERMS stay OPEN (§8 item 3) — that one is Aga's ruling, do not invent terms.

FLEET25m●●●○○
88
P10 front-lever cluster 301s — FLEET EXECUTES (off Nic's list 7 Aug), ranked LAST: 3 x 301 (/improve-front-lever/, /how-…

P10 front-lever cluster 301s — FLEET EXECUTES (off Nic's list 7 Aug), ranked LAST: 3 x 301 (/improve-front-lever/, /how-to-do-a-front-lever/, /front-lever-variation/ → /front-lever-progression/) + 6 internal-link repoints via the Redirection REST API, ~20 min. NIC82 keyword map (6 Aug, Aga-approved) downgraded the lane: ≈+1.1 leads/28d [MODELLED] across all three clusters, zero-click share 62-72%, 8 live pages not 9, DO-NOT on the fourth merge. Live-checked 7 Aug: all 4 URLs still 200 — work real, value low.

NIC30m●●●○○
89
🤖 FLEET — 973 Nurture 1 BODY defects surfaced by the blind subject judges. The envelope is fixed (11 subjects+previews s…

🤖 FLEET — 973 Nurture 1 BODY defects surfaced by the blind subject judges. The envelope is fixed (11 subjects+previews shipped 11 Aug); the copy underneath is not. (1) JACQUES IS THREE DIFFERENT MEN: slot 7 = a decade of weightlifting, slot 8 = a powerlifter with a daughter and shoulder pain, slot 16 = a physicist. Same first name, contradictory biographies, one arc — a reader who gets all three learns the case studies are manufactured. (2) SIX OF SIX protagonists are male, on a list JESSE_VOICE_CORE defines as men AND women 35-60+. (3) The bill/invoice/tab metaphor sits in THREE bodies (8, 10, 16), and a body-keeps-an-accurate-journal line is near-verbatim in bodies 2 AND 3. (4) Slot 8's body promises members' answers will challenge everything you know, then gives not one answer. Each is a SINGLE-SLOT change under the EVOLUTION LAW — rename Jacques in two bodies, strip the duplicated metaphors, pay slot 8's promise. Not an arc rewrite.

FLEET45m●●●○○
90
🤖 FLEET WORK BLOCK — hello@ job-family hardening, the remaining open audit findings: O2 (HIGH: send_payment_drafts caps…

🤖 FLEET WORK BLOCK — hello@ job-family hardening, the remaining open audit findings: O2 (HIGH: send_payment_drafts caps at 100 drafts unpaginated — oldest fall off first and an approved email silently never sends) · O3 (r1_queue_emails fails open → two lanes can email the same person) · O4 (autosend no send-time spacing/re-check) · O5 (guardian false-MISSED on long jobs) · O7 (_lifetime_paid caps at 100 invoices) · O8 (973→758 duplicate on ambiguous timeout — job self-completes ~2 Aug) · O9 (crash can duplicate reply drafts) · O10 (cross-lane pairs unguarded) · O11 (R1 lifetime set never re-touches a repeat canceller) · O12 (LOW ×10 hygiene). Owner: the FLEET — none needs an Aga decision; O1 and O6 already have their own rows (done / AGA-49). Work them top-down (O2 first), same session-per-fix discipline as O1: fix → verify → strike through in the findings doc.

FLEET240m●●●○○
91
🤖 Fleet: 992 reports itself as up to three different campaigns in GA4
why this matters + step-by-step

What: Fleet work — no action from you. One convergent pass over the UTM tags in 992 TMA | Welcome Sequence AFTER APPSIGNUP AB TEST Aug4th.

Why: Three different utm_campaign values live inside single emails: the 45 quiz links and 2 checkout links carry 992-tma-welcome-after-appsignup (stamped by the door repair); the ~34 site links still carry the retired 968-app-signup-activation-jul2026; and neither matches the registry-derived slug the tagging tool would mint, 992-tma-welcome-sequence-after-appsignup-ab.

So one email reports itself as up to three campaigns, and the arc cannot be read as a unit. Partially pre-existing, partially introduced by the repair.

Steps

  1. One convergent pass settling on the registry slug across every link in the arc
  2. Re-run the UTM checker in --check mode
  3. Same class exists on 967, whose footer links carry utm_content slugs naming the RETIRED subject lines — fold it in

Done when: Every link in 992 carries the registry slug, and the arc reads as one campaign in GA4.

FLEET40m●●○○○
92
Go/no-go: bulk-delete 4,464 junk ActiveCampaign tags so the tag manager is usable
why this matters + step-by-step

What: A yes or no. If yes, I scope it and show you a dry-run list first — nothing is deleted without your sign-off on the actual list.

Why: 4,464 of 5,846 AC tags (76.4%) are one-person junk — the result of the add_tag_to_quiz_contact() bug that concatenated a field value into the tag name. 5,621 of them were minted in a single day, 29 Oct 2025.

Nothing is getting worse — the writer has been quiet since Nov 2025. This is purely about making the tag manager navigable again, which matters every time anyone builds a segment and has to find the real tags among the noise.

Steps

  1. Say go and I scope it
  2. I produce a dry-run list of exactly what would be deleted
  3. You sign off on that list — then, and only then, anything is removed

Done when: The tag manager shows roughly 1,400 real tags instead of 5,846, and every deletion was on a list you approved.

AGA5m●●○○○
93
🤖 Fleet (deferred by you): sweep the accelerator wording to canon — 32 occurrences
why this matters + step-by-step

What: Fleet work, and you already deferred it. 32 occurrences across 25 files read ‘Lead Sports Accelerator — led by Adidas and ex-Red Bull executives’.

Why: Canon is ‘the LEAD Sports Tech Accelerator — run by the Adidas family and ex-Red Bull executives’. The live wording drops ‘Tech’ and turns ‘run by the Adidas family’ into ‘led by Adidas’ — a corporate endorsement we cannot evidence.

🔴 I told you this was a one-line fix and it is not. It spans the free-workouts email, the buyer welcome email, the no-quiz welcome and the page.

Steps

  1. Deferred by you — it runs when the higher-value rows are clear
  2. Shipping blocker to resolve first: tma-paywall-spec is NOT in the deploy estate, so the corrected page cannot ship via the sanctioned path — either add it to the estate, or Nic copies canon by hand
  3. Do NOT fold the 3→[N] change into this pass — that number is your decision, separately

Done when: All 32 occurrences read the canonical accelerator line, and the page shipped through a sanctioned deploy path rather than by hand.

FLEET45m●●○○○
94
🤖 FLEET — GA4 SEES ZERO tma.thrivecart.com SESSIONS IN 28d, YET THE TAG DEMONSTRABLY FIRES THERE. Wire-tested 12 Aug: bo…

🤖 FLEET — GA4 SEES ZERO tma.thrivecart.com SESSIONS IN 28d, YET THE TAG DEMONSTRABLY FIRES THERE. Wire-tested 12 Aug: both ThriveCart carts (calisthenics-ultimate-guide + challenge2026) load GTM-TKGDZR9 and send GA4 hits on our own G-ZBQN3P8WKW. But a GA4 query on property 177471782 filtered to hostName CONTAINS 'thrivecart' returns ZERO rows over 28 days, while the identical query for 'calisthenicsacademy' returns 239 sessions — so the query is fine and the hostname genuinely is not in the property. Candidate causes, in order of likelihood: (a) the cart simply gets almost no traffic and 28d of near-zero rounds to no rows; (b) tma.thrivecart.com is not a configured domain on the data stream, so hits are dropped or mis-attributed; (c) an internal-traffic or unwanted-referral filter is excluding it; (d) consent/cookie state on that host blocks the hit before it lands. DO: check the GA4 data stream's configured domains and any active filters, then confirm with a realtime report while loading the cart by hand (realtime bypasses the 24-48h processing delay that makes a fresh test look like a zero). LOW PRIORITY AND SAY SO: the ebook these carts sell has 7 charges <=$35 across Stripe account 2's ENTIRE 79-charge history and ZERO in 90 days, so the traffic being measured is probably near-nil anyway — this is a data-hygiene question, not a revenue one. Do not let it displace anything on the capture-rate lane.

FLEET30m●●○○○
95
🤖 FLEET WORK — OUTREACH §7.4: reconcile LISTICLE_TARGET_SHEET_2026-07-25.md. It still carries the dead 4.9★ rule and the…

🤖 FLEET WORK — OUTREACH §7.4: reconcile LISTICLE_TARGET_SHEET_2026-07-25.md. It still carries the dead 4.9★ rule and the wrong "contact form / offer commission" routing that nearly re-offered existing partners their own commission. Rewrite rows against the affiliate export + the new gate rules (COLD vs PARTNER, 30% standard). No Aga minutes.

FLEET45m●●○○○
📍 The live task list has moved up this page
The consolidated, priority-ordered to-do — every open row for Aga, Nic and the fleet, generated from the tracked queue — is in the ✅ THE CONSOLIDATED TO-DO block above, alongside the ranked actions. What follows below is the original step-by-step detail, kept for its reasoning; each of those 34 tasks now carries a dated 🔎 VERIFIED badge.
The sequencing principle

Kill the junk → fix the broken → measure honestly → then optimise the hard thing. The landing screen is the biggest number but it is stable and hard; three cheaper items above it are either free money or actively bleeding.

PHASE 0 — Today (~40 minutes, mostly Aga)

Step 1 · Delete the 3 test leads from ActiveCampaign

Aga · 5 min · blocks nothing

  1. ActiveCampaign → Contacts.
  2. Search claude-qa-donotcontact
  3. Three contacts appear, form claude-qa-donotcontact+<timestamp>@themovementathlete.com
  4. Select all three → Delete.

Done when: that search returns zero contacts. They were created by driving the live funnel this morning and will otherwise enter live sequences.

Step 2 · Kill the four dead traffic sources

Aga (or Nic in Ads Manager) · 20 min · free money, do it today

These four sent 537 people who produced 4 buy-clicks between them, 95–99% leaving without answering one question.

  1. Meta Ads Manager → campaigns → Ad set → Placements. Switch from Advantage+ placements to Manual. Uncheck Audience Network (an). Note (29 Jul): AN already stopped on its own ~13 Jul — this is a lock against it returning, not a traffic event. Do not expect a ~10% traffic fall. Keep Facebook Feed, Instagram Feed, Stories, Reels.
  2. Google Ads → find the campaign serving googleads.g.doubleclick.net (136 users, zero leads — almost certainly Display or a Display-heavy PMax asset group). Display campaign → pause it. PMax → exclude Display, or pause and rebuild Search-only.
  3. Note the date of each change — needed for Step 12.

Done when: Audience Network unchecked on every live ad set, and Google “Competitive Non-Branded” paused. ⚠️ Hold the Display/PMax pause — a live GA4 pull contradicts its “zero leads” claim (task 6).
Expected effect: ~10% of quiz traffic disappears and your conversion rates go UP, because you stopped counting bots in the denominator. Do not read the traffic drop as a problem.

Step 3 · Re-read the landing-screen number correctly

Aga · 5 min · a framing correction, not a task

The "landing screen loses 54.5%" headline includes the junk from Step 2. For genuine humans it is 49.8%. Done when: you're using 49.8% in any conversation about the landing page.

PHASE 1 — This week (Nic: diagnostics before any building)

Step 4 · 🔴 Find when /api/quiz/config started 404ing

Nic · 30–60 min · the single most urgent item

The endpoint returns 404 (confirmed twice today) — the quiz runs on fallback config for every visitor. Separately the lead rate collapsed 36% in 6–12 Jul–30 and has not recovered. These may be the same event.

  1. Confirm: curl -i https://app.themovementathlete.com/api/quiz/config
  2. Find when the endpoint was removed/renamed/rerouted — deploy history + git log for the quiz/config route.
  3. Compare against the breakpoint: degradation begins 6–12 Jul ≈ 6–12 July 2026.
  4. Report: (a) broke in early July → we have our cause; (b) 404ing for months → different cause, keep looking.

Why first: a live, compounding loss of roughly 40 leads per week.

Step 5 · 🔴 Fix the silent bail-out on the checkout button

Nic · 1–2 h · do alongside Step 4

const N = P?.checkoutUrl || EM();
if (i !== "control" && !P?.checkoutUrl) return;   // ← silent: no error, no event, no fallback

For any non-control variant whose config lacks checkoutUrl, the checkout button does nothing at all. And checkoutUrl comes from config — which is 404ing (Step 4). Almost certainly the mechanism behind the dead downsell button. These users never fire add_to_cart, so we cannot even size the loss.

  1. Make the bail-out loud — fire e.g. checkout_blocked_no_url with the variant id before returning.
  2. Give it a real fallback — use EM() like the control path rather than dead-ending the user.
  3. Deploy, then check the new event's volume in GA4 after 48 h.

Done when: the button either always goes somewhere, or fires a countable event explaining why it didn't.

Step 6 · Fix the three mobile paywall defects

Nic · 1–3 h

79% of traffic is mobile and converts 22% worse. All three are mobile-viewport defects.

  1. Remove the "Report Bug" widget from production — it overlaps the primary CTA and its "$0 today · then $24.97/mo" line. Config/flag removal, not a build.
  2. Fix the header wordmark truncating to "THE MOVEME…".
  3. Fix the Funnelytics 403 — paywall tracking is currently dark.

Done when: at 390×844 the CTA and its reassurance line are fully unobstructed, the wordmark renders in full, Funnelytics returns 200.

Step 7 · Fix the copy and pricing faults

Nic · 30 min

  1. "96 progression levels" → "100+". Source of truth is 123; the quiz is understating the product with a wrong number.
  2. Check the two mispriced annual price objects — annual-interval subs charged $24.98 and $24.97. Confirm whether they are still purchasable.
  3. Test the 47:59:59 timer as a returning visitor. The paywall claims the rate closes permanently. Clear cookies, return after expiry. If it resets the claim is false — a trust and compliance exposure, not a copy nitpick.

PHASE 2 — Next two weeks (the mix, and the real optimisation)

Step 8 · 🔴 Put annual on the quiz paywall

Nic (build) + Aga (decision) · ½ day · the highest-cash single change available

Tiers are 1-Week trial / 4-Week $12.48 / 12-Week $24.98 — the ceiling. No annual. Yet annual is 35% of sales but 64% of cash, and a discounted annual banks $78.50 vs this paywall's best outcome of $24.98 — 3.1× on the same buyer, same click.

The annual checkout URLs already exist and work (/register/yearly_2026/, /register/yearly3/ both 200) — annual is already sold on other surfaces.

  1. Aga decides the annual price shown and whether it is default-selected.
  2. Nic adds the annual tier to this path's paywall config.
  3. Ship to one path first (Pain-Free/Recovery, the audited one), measure two weeks, then roll out.

Watch: total sales count may dip while cash per sale rises. Cash is the metric here, not sales count.

Step 9 · Resolve the two competing CTAs

Nic + Aga · 2 h · do with Step 8

Mid-page "Claim My Plan →" (charged today) vs sticky "Get My Recovery Plan Free →" ($0 then $24.97/mo). The sticky one is always visible, so the path of least resistance enrols at monthly — the lowest-cash plan ($20.21 realised). The higher-cash option scrolls away.

  1. Pick one primary offer for the sticky CTA.
  2. If the free trial stays primary, route it to annual or quarterly, not monthly.

Step 10 · Work the checkout page (CRO, not a bug hunt)

Nic + Aga · ongoing · after Steps 4–6 ship

356 clicked buy and never subscribed — but all destinations return 200, so this is ordinary abandonment. 41% completion on a card-required subscription checkout is roughly normal (typical cart abandonment ~70%). Incremental optimisation, not an emergency.

  1. Count the steps between CTA tap and card field. Remove any non-essential ones.
  2. Ensure price and terms on the checkout exactly match the paywall just left — mismatch is the classic killer.
  3. Confirm the checkout is as clean at 390px as the paywall should now be.
  4. Add a payment-abandonment email — the warmest list you have.

Done when: buy-click → subscription rises above 41%.

Step 11 · Attack the landing screen

Aga · ongoing · do LAST of the build items — deliberately

49.8% of genuine visitors leave without one tap — still the biggest single loss (~2,300 real people per 90 days).

It is last on purpose: it is the most stable number in the funnel (54.4% July → 54.5% now), which means a hard problem, not a broken one. Steps 2, 4, 5 and 8 are cheaper, newer, and more likely to be broken things rather than hard things.

Test in this order — one change at a time, two weeks each: 1. the headline · 2. the hero image · 3. shortening perceived commitment ("2 minutes", a progress indicator on screen 1). Re-baseline after Step 2 first — some of what you'd be "fixing" is bot traffic that no longer exists.

PHASE 3 — Measurement (so this doesn't go dark again)

Step 12 · Re-baseline after the junk traffic is gone

Either · 10 min · two weeks after Step 2

python3 tools/quiz-analytics/pull_quiz_deep.py 30daysAgo yesterday
python3 tools/quiz-analytics/pull_quiz_by_source.py 30daysAgo yesterday

Expect: fewer users, higher rates. Record the new landing-screen drop as the true baseline.

Step 13 · Fix the purchase event (CAPI)

Nic · already on the backlog — this raises its priority

GA4 cannot see purchases. Every conversion number here required manually cross-railing GA4 against Stripe — which is why the 356-person gap went unnoticed for 90 days.

Done when: purchase events appear in GA4 and reconcile to Stripe within ~5%.
Why it matters: until then nobody sees the funnel end-to-end without a manual pull, and Meta and Google are optimising delivery against add_to_cart instead of real revenue — very likely a contributor to the poor Meta traffic quality in §3.

Step 14 · Run the pulls monthly

Aga · 10 min/month

python3 tools/quiz-analytics/pull_quiz_deep.py 30daysAgo yesterday      # funnel
python3 tools/quiz-analytics/pull_quiz_by_source.py 30daysAgo yesterday # per source
python3 tools/finance/quiz_buys_90d.py 30                               # money

Watch three numbers: lead rate (should be ≥24%), buy-click rate (baseline 12.7%, target 16.5%), buy-click→subscription (currently 41%).

Step 15 · Walk the other quiz paths

Aga to authorise · ~1 h per path

Only Pain-Free/Recovery was audited. Every defect in the companion document is confirmed for that path only. The others are untested and may carry the same faults — or different ones. Say the word and I'll run it.

The list in one table

#StepOwnerTimePhase
1Delete 3 test leads from ACAga5 minToday
2Kill 4 dead traffic sourcesAga/Nic20 minToday
3Re-read landing number as 49.8%Aga5 minToday
4🔴 Date the /api/quiz/config 404Nic30–60 minThis week
5🔴 Fix the silent checkout bail-outNic1–2 hThis week
6Fix 3 mobile paywall defectsNic1–3 hThis week
7Copy + pricing faultsNic30 minThis week
8🔴 Put annual on the paywallNic + Aga½ day2 weeks
9Resolve the competing CTAsNic + Aga2 h2 weeks
10Work the checkout page (CRO)Nic + Agaongoing2 weeks
11Attack the landing screenAgaongoingLast
12Re-baseline after junk removedEither10 min+2 weeks
13Fix the purchase event (CAPI)NicbacklogOngoing
14Run the pulls monthlyAga10 min/moOngoing
15Walk the other quiz pathsAga authorises~1 h eachOn request
If you only do three things

Step 2 (free, today) · Step 4 (the bleeding) · Step 8 (the cash).

The Movement Athlete · Quiz Funnel Full Drop-Off Analytics · 26 July 2026
Canonical source: marketing/campaigns/quiz-funnel/QUIZ_FUNNEL_DROPOFF_ANALYTICS_2026-07-26.md — this HTML is its browsable twin.
Companion: QUIZ_LIVE_PAYWALL_AUDIT_AND_90D_REVENUE_2026-07-26.md

🔍 Verification

🔄 UPDATED 5 Aug 2026 — what has been re-verified since this table was written
Re-checked 5 Aug against live sources: cash pace $7,790 / gap $7,210 · MRR $11,225 · dark share 38.1%/28d · /api/quiz/config 200 (FIXED) · published rating 4.8★ · Google Ads first spend 27 Jun 2026 · Meta May spend £1,477 (not £457). Still unsettled and worth naming: the quiz variant-switch deploy date was never pulled (so the June causal chain stays "strong, not proven"), the Apple ASC + Play export is still open, and NIC-42 (one lead denominator) is still open.
⭐ The one thing to take from this tab
🔧 Corrected in this document — 27 Jul 2026
Claim as previously statedWasCorrectWhy it was wrong
Annual "realising" on new sales53.3%99.4%Compared a first-payment figure (50% off applied) against a per-term figure (full price). The coupon is duration: once, so it does not carry to renewal.
MRR glide on a flat subscriber count−39%+3.3%Followed from the same error — a one-off discount treated as a permanent price cut.
Annual share of new-sale cash64.7%48.9%Could not be reproduced by a second pull. Use the Stripe-recurring, 90-day trailing basis.
Date annual stopped selling~22 Jun19–20 JunWeekly bucket read as a date. The daily pull puts the last annual sale on 19 Jun, then 21 days at zero.
Method note worth keeping: a subscription's current discount object tells you nothing about what its first invoice charged — duration: once coupons are removed after use. Read the invoices, not the subscription.
Every headline number, its source, and how to reproduce it. Anything that could not be reproduced is marked, not quietly carried.

Every headline number, where it came from, how to reproduce it, and how much to trust it. Anything that could not be reproduced this session is marked, not quietly carried forward.

ClaimValueReproduce withConfidence
★ Repeatable net cash — THE number$7,570/mo · gap $7,430tools/finance/kpi_15k_sync.pykpi_15k.json · Stripe recurring NET (paced) + app NET (RC gross × calibrated store ratio) · one-time excludedLIVE
⚠️ two known basis issues, both flagged not hidden: (1) the app component is raw MTD while Stripe is paced to the full month — understates by ~$480; (2) the iOS gross→net ratio calibrates to 1.02×, which contradicts Apple's 15–30% cut, so the app portion may be ~15% high.
MRR, all rails (SECONDARY — not the operating number)$10,987refresh_cockpit_daily.py · discount-adjusted, excludes cancel queueCONFIRMED
Correct as a book value, but it is not cash. It sits ~$3.4K/mo above cash because annual/quarterly cohorts keep accruing MRR after their money landed. Never compare it to the $15K cash gate.
Monthly net revenue by railFeb 6,878 → Jul 22,117tools/finance/revenue_per_month_pull.pyCONFIRMED
July one-time vs recurring$19,997 / $7,957tools/finance/revenue_per_source_pull.pyCORRECTED 27 Jul
previously quoted as $3,757 — that figure is Stripe-only. combined.recurring sums only stripe_1+stripe_2; app_rc is added separately into all_rails, so both app stores were counted as zero. True all-rails recurring = Stripe $4,217 + iOS $2,657 + Play $1,083 = $7,957, because the app stores carry no lifetime product and are 100% recurring. The old figure understated the recurring engine by 2.1×. One-time is still ~71% of July cash, so the conclusion holds; the magnitude was wrong. Basis note (27 Jul): $7,957 is GROSS — the iOS/Play parts are RevenueCat gross with no store cut deducted. The headline $7,570 is the same engine measured NET and paced. Use the net figure; per Aga's standing convention every reported number is USD, net, all rails.
90-day funnel walk5,164 → 154tools/quiz-analytics/pull_quiz_deep.py 90daysAgo yesterdayCONFIRMED
New sub sales, cash, average154 · $7,091.97 · $46.05tools/finance/quiz_buys_90d.py 90CONFIRMED
Weekly adds/ends re-baseline16,080 subs, 2 yrsfull Stripe subscription pull, both accounts, bucketed by ISO weekCONFIRMED
Annual mix by month42.0% → 17.7% → 18.9%same pull, subscriptions created, by billing intervalCONFIRMED ×2
independently reproduced by a second session
Lifetime upgrader cancels10charges pull cross-referenced to cancels on email + customer IDLOWER BOUND
57/68 were guest checkouts; app-rail invisible
Junk traffic by sellerMeta 401 · Google 136pull_quiz_by_source.py / the by_source blockCONFIRMED
Email opens / clicks / click-to-open, 2015–20261,430 campaignsActiveCampaign /api/3/campaigns, ≥300 sends, grouped by send monthCONFIRMED
broadcasts only — automations are lifetime-cumulative and have no monthly series
"Leads click 0.2% vs members 3–4%"single July-4 promo comparisonNOT PROVEN
one campaign, not a time series — do not quote as a trend
Plan-level churn9.1% / 18.6% / 36.7%retention lead, full Stripe historyCONFIRMED
Paywall variant has no annuallive bundle read: /2026-v2-2/assets/index-DPkL72Wi.jsCONFIRMED
read from shipped code, not modelled
$97 charged-today vs trial-gated+53% vs −9%tools/finance/pricing_model_rerun.pyMODELLED
assumes 63:37 annual:monthly and 100% demand retention
/api/quiz/config 404 causes the lead collapseUNVERIFIED
timing not yet established — job 1
Every modelled £/mo value in the planMODELLED
assumptions stated inline; none are results

🔧 Corrections from the email seat — numbers in this document that were wrong tma-email-lead · 27 Jul 2026

Claim as first writtenCorrectedWhy it matters
"8,124 Engaged contacts"6,367 (90-day engagers ∩ active)the original omitted a status filter. 64.8% of the mailable list has shown no signal in 360 days.
"50% off survives in the welcome sequences"15 emails across 6 automations — 3 sending in 750 TMA | Welcome Sequence After Quiz, 1 in a 967 TMA | Welcome Sequence After LEAD MAGNET variant, 3 in 751 Nurture Sequence 1, 3 armed in 973 Nurture Sequence 1 NEW COPY FROM CLAUDE, 4 in 759 Nurture Sequence 3, 1 in 764 Nurture Sequence 4. 988 TMA | Welcome Sequence AFTER APPSIGNUP is clean.far wider than either of us thought. Aga believed one sequence carried it; it is six.
"the discount emails have the lowest open rates" (Aga's read)REFUTED. Neither subject line mentions a discount, so opens cannot be responding to it. The decay is positional — E1 10.99% → E10 5.75% — and identical across offer and non-offer emails.🔴 Do not delete them on that reasoning — they are the only ask in 750 TMA | Welcome Sequence After Quiz. Deleting them removes the sequence's only offer.
"annual is 48.9% of new-sale cash"Could not be reproduced. A Stripe-only 90-day cut gives 48.9% of cash, at an average of $115 against a $157 list.different denominators. Both are defensible; the disagreement is unresolved and should not be papered over. Annual is still the largest single cash share either way.
"~570 unasked paywall bouncers"Two populations: ~570 who never click buy, plus ~450 who click and never paythe second group is warmer and was already built for — the cart-abandon sequence has been dead 46 days.
"build a new paywall-bouncer sequence"Build it as a branch inside 750 TMA | Welcome Sequence After Quiz, at the existing decision point750 TMA | Welcome Sequence After Quiz already emails these people 5 minutes after they finish the quiz, and a lead is already on a 33-email, ~108-day conveyor. A new sequence would have stacked 6–7 touches in 72 hours.
"root SPF record missing"REFUTED — the record exists and resolves correctly on four public resolvers, with ActiveCampaign included.a truncated DNS lookup was read as a complete answer. The real, smaller issue is DMARC sp=none — every subdomain including quiz. is unprotected under an otherwise strict policy. 15 minutes.
"buyers may stay in nurture after purchase"REFUTED. 53 matched buyers all reach the sequence goal on their purchase date and exit.🔴 But the live version of the worry stands: if App Store / Google Play buyers arriving via RevenueCat are never marked as customers in AC, they keep receiving discount mail. One hour to test.
A process note worth keeping
Three separate seats made the same mistake in one session — one read a campaign name as the email, one read an automation as the journey, one read a truncated DNS answer as the record. Every case was a partial answer mistaken for a complete one.

The rule that comes out of it: when a query returns something reassuring, prove the query was complete before believing it. Check the sibling, the second resolver, the next block, the other 76 emails.

🛡️ The skeptic gate — every headline finding, adversarially tested tma-growth-skeptic · 27 Jul 2026

Each finding was handed to an adversarial seat whose job is to break it before it reaches a decision. Four went in. One was reversed outright, two were downgraded, one survived. This is what it ruled.

FindingVerdictWhat the attack found
The lead decline is real, not a tracking faultCONFIRMED
wording downgraded
Survives. AC and GA4 fell −32% and −30% across the same week, and a GA4 fault cannot move an ActiveCampaign number. But my "the two agree within 10% every week" was false — 7 of 13 weeks exceed it, and the early weeks diverge by up to 48%. The support is the parallel drop and a 0.90 correlation from week 22, not week-by-week equivalence. Proves the decline; does not diagnose the cause.
The annual collapse is a removed tierDESCRIPTIVE: CONFIRMED
CAUSAL: STRONG, not proven
Do not lean on the zero weeks. Under June's own 17.7% share, two zero weeks at n=20 has a 2.4% probability — only mildly surprising. The real discriminator is the asymmetry: quarterly and monthly sat at normal levels while annual hit exactly zero, and monthly later surged to 12 and 21 while annual limped. Also: Stripe is not channel-attributed, so it cannot prove the quiz paywall specifically. Kill date corrected to 19–20 June.
The list is growing faster than everREFUTED — reversedBroke cleanly. 79% of 2026's contacts are bulk imports. Strip them and organic capture is ~435/month and flat — which cross-checks against the quiz's own tagged series at ~409/month. The original headline does not ship. "Contacts created" is also the wrong yardstick when only 15.6% of the list is engaged.
Email is audience-driven, not send-size drivenMECHANISM: CONFIRMED
STRATEGIC LEAP: DOWNGRADED
The within-size comparison is the right design and holds. But "cold-lead email is weak" was absence of evidence dressed as proof — every cold data point was nurture content, every warm one was an offer. The July-4 natural experiment (same offer, both audiences: leads 0.30–2.00%, customers 4.63–12.93%) supplies the missing evidence and is now the load-bearing proof. Two link-dead emails were excluded — including them inflated the gap.
The pattern the skeptic named, and it is worth keeping
"The trap you were about to walk into is the same one from 8 July, mirror-imaged: the original said 'email works, revert' on warm-people clicks; the correction said 'cold-lead email is weak, don't revert' on nurture data that never contained an offer. Same overconfidence, opposite sign."

The calibrated position on the old-model question: it is unproven in both directions. The July-4 experiment is real evidence for caution, and it tested a lifetime offer — the hardest possible ask of someone who has never paid. Run one proper offer to a cold segment and measure trial starts, not clicks, before anyone decides.

Where our two live dashboards disagree — and which to believe

ItemGrowth Cockpit$15K Cash DocThis document
Annual share of sales"15% of 34 sales"35.7% of 154 sales (90d)
The cockpit figure is a 7-day, 34-sale window — small-sample noise. Use the 90-day figure for any decision; the cockpit's is fine as a daily pulse.
Average per sale$53$46.05
Same cause. The 90-day number is the one to model with.
The bucket"34 cancels/wk vs 13 new""cancels 34/wk → target 12/wk"23.8 ends vs 17.0 adds/wk (Jun–Jul)
Both dashboards carry the busiest-week figure. Both should be corrected to the re-baselined numbers. This is the single most consequential disagreement in the estate.
Subscriber base761 (543 web + 218 app)866 total / 654 active web761
Different bases, both defensible: 866 counts everything including the cancel queue; 761 excludes subs already cancelled and applies discounts. Quote 761 — it's the money that will actually arrive.

Known limits — what we still cannot see

  • Attribution is structurally dark. Subscription and invoice metadata are empty on all 154 sales; the same checkout URLs serve the quiz, standalone checkouts and email. Quiz-versus-other cannot be split, and roughly 70–80% of history is permanently unrecoverable. The fix (forwarding UTMs into Stripe) works going forward only.
  • Three of five lead sources capture nothing — TMA.com non-quiz pages, BWA, and in-app free sign-ups.
  • "Direct" is partly mis-attributed paid — in-app browsers strip referrers. The direct-vs-Meta gap is real; its size is soft.
  • Geography is confounded with source. The US looking worst is probably the US being where Meta spend lands.
  • No app-rail history before Feb 2026, and pre-May is backfill-contaminated.
  • The iOS proceeds ratio reads 1.02× where ~0.85 is expected — open question on the app rail; the net figure carries that uncertainty.
  • Only the Pain-Free / Recovery quiz path has been audited. The other paths are unwalked.
  • The quiz cannot be A/B tested until bucketing is added — every change is a sequential bet.
Prepared 27 July 2026. All figures USD, net of platform fees, all rails, window-labelled. Every headline re-pulled live this session and cross-checked against the Growth Cockpit and the $15K Cash Doc. Where a claim could not be reproduced it is marked UNVERIFIED rather than carried forward.

Standing context that governs every number here: Android billing migrated Stripe → Google Play around Feb–Mar 2026 · the quiz switched to a paywall model around Mar 2026 · RevenueCat holds no data before Feb 2026 · promo windows (BF Lifetime Nov–Dec, Memorial 50%-off late May, July-4 Lifetime 2–14 Jul) are excluded from baselines · never annualise a window shorter than four weeks.

📌 Status & updates

Everything that has changed since this plan was approved on 27 July — newest first. Each entry says what it changes for the reader, not just what happened. The plan itself is unchanged except where an entry says so.

✅ Current status — APPROVED, operating
This is the operating plan, on a 90-day timeline. Gated by the growth skeptic (four findings adversarially tested, one reversed outright), reviewed by the CMO (demand verdict and reorder), ruled final by the CEO (pricing confirmed, three strikes applied, timeline extended). Open questions are named as open rather than smoothed over.

5 August 2026 MASTER DOC

The full 5-Aug re-verification is folded in: the corrected June diagnosis (Aga's framing) at the top of 📖 What happened, the paid and email verdicts beside it, and the verified live to-do list in §12.

Evidence behind every claim: TMA_TURNAROUND_FINDINGS_AND_ACTIONS_2026-08-05.html. Finance stays on Aga's separate surface — never here.

4 August 2026 CLOSED

Sale attribution now works — NIC-16 is closed. Nic ran the 10-minute measurement first (tagged checkout links do write into Stripe), then shipped the one real residual it exposed: first-touch rehydrate on the quiz→checkout handoff, so tags survive a buyer who loses them off the URL mid-funnel.

Verified live in the served /static/checkouts_v3/attribution.js.

What this changes for you
“We can attribute a lead but never a sale” is no longer true — but read the clean-data clock below before quoting any per-channel sale figure.

3 August 2026 CAUSE CORRECTED

A code audit of the live repos disproved this document's own diagnosis. The original claim — “the quiz→checkout link does not forward the query string” — is FALSE.

handoffQuizCheckout2026.ts already copies utm_*, gclid and fbclid off location.search, and both Django estates already flatten them into Stripe metadata at create-intent.

Empty UTMs meant the checkout URL arrived empty — an upstream gap on bare landings, not a missing write. So NIC-16 was a measurement, never a rebuild.

Ground truth: CHECKOUT_ATTRIBUTION_CODE_AUDIT_GROUND_TRUTH_2026-08-03.md.

31 July 2026 TASK 1 SHIPPED

The new quiz pricing page is LIVE. Nic deployed it and redirected the whole quiz. subdomain onto it — so it takes hold on every quiz finisher instead of sitting on a side URL.

Live-verified the same day:

  • quiz.themovementathlete.com/2026-quiz-checkout-v1/ (200)
  • Annual $97 charged today; ramps at $24.98 / $12.48
  • 60-day guarantee and per-week maths present
  • addToCartValue populated (97 / 25 / 12); tma_ckt_out set on hand-off
  • Exit modal wired and firing; UTMs incl. gclid/fbclid forwarded into the checkout
  • The welcome email's “the password you chose” bug is fixed
What this changes for you
The largest single item in this plan — the one carrying 60–70% of achievable gap-closure — is no longer a forecast. It is an outcome with a measurement clock running.
⚠️ Still open on it
Kill-switch armed: revert if rolling 14-day RPV < $6.04, or demand retention lands under 65%. Four items stay open and are listed inside task 1 — including a test domain baked into the production bundle on the fallback register route. Task 34 was added: a buyer must never receive an abandonment email.

30 July 2026 PRICING RULING

The $157 law is WEB-SCOPED. The app stores charge $159.99 because they sell on fixed price points. Both are correct on their own surface.

SurfacePriceWe net
Web / Stripe$157~100%
App Store / Play$159.99$135.99 (15% commission)
⚠️ What this changes for you
A store signup is worth ~13% less than a web one — relevant to any plan that leans on app installs.
💰 ✅ SETTLED 6 Aug 2026 — and the earlier correction was itself wrong. App cash is NOT overstated.
This box previously read: “the figure entered as ‘proceeds’ was almost certainly gross … app cash is likely ~15% overstated.” That is now refuted, measured against Apple's own financial report (App Store Connect API — Aga supplied the vendor number 6 Aug; puller: tools/finance/asc_finance_reports.py). Both sides of the ratio are NET:
ASC “Total Estimated Proceeds” is NET. Apple's fiscal-May report totals £2,678.85 net vs £3,448.95 gross. The figure already stored for May was £2,684.010.19% from net, 28% from gross.
RevenueCat's App Store revenue is ALSO net. $3,844 May · $3,085 Jun · $3,089 Jul — within 2–7% of Apple net and a consistent 17–23% BELOW Apple gross, three months running.
So an iOS ratio near 1.0 is correct — it is two net figures agreeing, not an impossibility. The ~$350–500/mo of “phantom” app cash does not exist, and the cockpit's ⚠️ warning has been removed rather than left to mislead. 🔴 Do not “fix” the ratio to 0.85 on the belief that RevenueCat is gross — that would understate app cash by 15%. What DID change: July iOS was null, so the calibration ran without it; it is now filled from Apple at £2,365.68.
🟢 AND THE PLAY HALF IS FIXED TOO — same session. Aga granted the Play bulk-bucket read, so that is also automatic now (tools/finance/play_earnings_reports.py). The July Play figure in the file was £318.24; the true net payout is £730.65 — it was out by £412.41, exactly the half-month artefact predicted (it had been typed on 16 Jul, mid-month). May and June matched Google's report to the penny, which confirms the file's basis was right and only July was stale. The Play ratio moves 0.3184× → 0.7311×, and Google's fee is exactly 15.0% of charge in all three months. 🔴 Coverage limit, stated honestly: the bucket holds no Play earnings before May 2026 — so "Play revenue back to 2024" cannot be satisfied from here, by us or by anyone. Neither store needs a human again.

29 July 2026 MEASUREMENT ASSUMPTION CHANGED

This plan was written 26–27 Jul, when lead attribution was dark and content channels could not be judged. Attribution went live 29 Jul — Nic's quiz-root fix forwarding the query string, plus BWA's GTM un-delay (BWA had been under-counted in GA4 the whole time).

Two consequences for reading this document:

1 · A new number governs the funnel
The attribution-dark share — 38.1%/28d (was 42.9% when this was written; charter target ≤15% by 29 Oct). Until it falls, every per-channel figure in here is a floor, not the truth. Live on the Growth Cockpit under Funnel 1.
2 · Clean data starts 29 July
Any window in this document reaching earlier under-reports owned content and over-states “Direct”. First trustworthy per-page read: 12 August.
Everything else in this plan stands
Full detail: the SEO master's §12.12–§12.15 and the 🍎 ASO tab.