Why this exists: we have strong creative and real spend, but three things aren't consistent across the team, and that's what's making the account hard to read and optimize. Lock these three first — tracking, landing-page funnels, and how new ads enter campaigns — and everyone works off the same rules. Then we lean into creative diversity on a stable base, where it pays off instead of getting lost in noise.
The economics everyone uses(agreed, Aug 10 call — don't relitigate): AOV $36.50 · contribution ~$23.20/order · break-even CPA ~$23 / break-even ROAS 1.57. The four CPA bars: proven/scale ≤$19 · graduation ≤$24 (over ≥10 conversions) · test-in-learning ≤$30 · account blended $22 (hard stop $23). (Q4 auction is running hot right now, so live CPAs are temporarily above these — judge ads against the bars, not against each other on a bad-CPM week.)
1 · Tracking — so every click is readable (fix first)
The issue, plainly: the account tags ads two different ways — the right way (utm_content=<ad id>, source=meta) and an old way (utm_content=<ad name>, source=facebook). Ad names in tags go stale when an ad is renamed, and one creative scatters across several tags. The result: we can't read per-ad on-site performance for our biggest spenders. Nothing else in this playbook can be measured until this is consistent.
The numbers (last 14 days) — show these to the team:
What we found
The number
Meta-paid sessions on the old name/facebook tag
10,188 of ~18,700 (54%) — only 8,515 use the correct id/meta tag
Stale-name example
our #2 spender's live name is gen__cross-section__9/28/2026, but its tag still says …8/4/2026 — it wouldn't match at all
Scatter example
gen__layers 8/1 shows 3,461 ad clicks in Meta but only 977 sessions join to its tag — the rest land under other tags, so its funnel can't be read
So more than half of paid spend is effectively unattributable at the ad level. That's the problem to fix first. (And the same old ads also send their clicks to the wrong place — see §3.)
The rule — one template, on every new ad, set in the URL-parameters field (never baked into the link): `` utm_source=meta&utm_medium=paid_social&utm_campaign={{campaign.id}}&utm_term={{adset.id}}&utm_content={{ad.id}}&utm_placement={{placement}}&utm_site={{site_source_name}} ``
IDs, never names or dates. Names change; IDs don't.
Verify by read-back after every create/edit/reactivation. Unverified = broken. No untracked spend, ever.
Re-tagging a live ad force-pauses it and resets its learning — so re-tag a few at a time, off-peak, and let them re-stabilize. Don't re-tag the whole account at once mid-week. Proven winners: don't edit them — copy, don't edit (see §3).
2 · Landing pages — clean funnels, matched to the ad
The issue, plainly: most paid traffic lands on the homepage, a generic catch-all. For the cold traffic we actually buy, the homepage and product page convert about the same — so there's no quick "send everyone to the product page" win. The real lever is message match: the page should continue the exact promise the ad made.
The numbers (last 14 days) — where paid traffic lands and how it converts:
Landing page
Sessions
Converts at
Homepage /
16,293
3.34% (all sources)
Product page /products/coffee-chews
5,177
3.65% (all sources)
ACV page
1,253
1.44%
The clean, like-for-like read (cold paid-social only, both pages): homepage 3.13% vs product page 2.90% — essentially tied. Routing cold traffic to the product page is not a clear win, so we test before we move it.
Why the product page's blended 3.65% looks higher: it's lifted by its "direct" visitors — returning customers who already know us (4.51% CVR) — not cold shoppers. The homepage is 82% cold ads. Same-promise matched pages are the lever; chasing the PDP's fan-inflated number is not.
The rule:
Match the landing page's carousel hero image to the ad — as closely as we can, either the ingredients / cross-section creative or the persona person in that ad. A visitor who clicks an ingredients ad should see the ingredients image first; a visitor who clicks a persona ad should see that persona. Same promise, continued — this is our leading hypothesis for lifting conversion, to prove with an A/B (same ad, split by destination) before we scale spend behind it.
One page per angle beats one page serving every ad. Build message-matched pages for the angles/personas we spend on; the creative engine already makes the visuals, so they're cheap.
Measure each page by its URL against our own ~3% cold baseline. Keeping a page that holds ~3% costs us nothing; declaring a winner to pour spend behind needs real volume (~1,500–2,000 sessions) — a few hundred can't tell 3% from 4%. Build several, prove with an A/B (same ad, split by destination) before scaling.
Every ad set's funnel should read cleanly end-to-end: impression → click → session → add-to-cart → checkout → order. Once tracking (§1) is fixed, we watch that funnel per ad and fix the leakiest step.
3 · Fix the existing ads — the cleanup
Brett's hunch, confirmed (single-source read, Shopify utm_source=facebook): the old ads aren't just mis-tagged — they also send their traffic to the homepage, not a matched page. The old facebook-tagged ads put ~10,027 sessions on the homepage vs just 148 on the product page — effectively all of it on the generic homepage. So the biggest-spending ads are mis-tagged AND not message-matched. One cleanup pass can fix both.
🔴 This is Carlos's to execute — his campaigns, his manual buying. Most of these ads live in his campaigns, which are read-only to our side; everything below is a plan to flag for Brett to raise with Carlos, never an edit we make. Our side rebuilds any creatives that need re-tagging or re-routing and hands them over.
How to do it safely:
Fix both at once, in one new creative, for any ad being rebuilt. Editing an ad's tag or link force-pauses it and resets its learning (Meta creatives are immutable), so doing tracking now and destination later would reset the same ad twice. If it's being rebuilt, ship the correct tag and the correct destination together — one reset, not two. (Tracking-only, in place, is fine for an ad we're not also re-routing.)
Never bulk-edit the account — that's a mass learning reset, and weeks before the holiday peak it would hurt. Stage it: a few ads at a time, off-peak, each allowed to re-stabilize (~7 days).
Don't blind-switch everyone to the product page. Cold traffic converts about the same on the homepage and the PDP (§2), so the destination win comes from message-matched pages, proven by A/B — not a mass redirect.
Protect the proven winners — do NOT edit them (editing resets a winner). Test the clean (correctly-tagged, correctly-routed) version as a mutually-exclusive A/B split-test against the original — Meta's split-test tool, audiences carved so the two never bid against each other (not a second always-on duplicate, which would self-compete). Keep the original live as the control until the clean version proves out, then retire the old one to ZZ SUPERSEDED.
The order: start the tracking fix now on non-winners (staged) · build the matched landing pages · then re-route via A/B, winners last and most carefully (clean copy vs original, split-tested, never edited in place).
4 · Campaign management — how new ads enter, and how winners scale
Two boundaries set the frame before any rule:
Media buying stays manual — Carlos publishes and manages spend. Our side is read-only analysis, creative, and verification; everything we build lands paused for him to review and launch.
Our campaign vs Carlos's. New concepts are tested in our campaign, PROVING GROUND (CBO, broad US). Carlos's scale campaigns (Core | Broad, the Nurse CBO, the TEST ABO) are read-only to us — never edit, rename, pause, rebudget, or graduate anything into them. Anything worth changing there is a flag for Brett, never an edit.
The buckets (one model)
CHALLENGER — the test bucket. Every new concept starts in PROVING GROUND's one broad ad set. All concepts compete; Meta starves the weak ones automatically — that's the filter, and it beats our opinion.
WINNER — scale. The default is to graduate in place: PROVING GROUND is CBO, so budget flows to the winner automatically — that is the promotion, nothing copied or moved. Only if new tests start crowding a proven winner do we stand up a second scale campaign that we create (funded above the learning floor), move the winner there, keep the original live as the control, and turn off the test duplicate so nothing bids against itself. Never graduate into Carlos's campaigns.
How new ads go in — the numbers
4–6 genuinely different concepts per round (up to 8). "Different" means a different concept, not a new headline on the same photo — two title tweaks add nothing; ten distinct ideas add everything.
One all-formats ad per concept — 4:5 + 1:1 + 9:16 in a single ad (placement-customized), url_tags set at creation. Never one ad per format; never a new ad set or campaign for a test.
One variable per test. No self-competition (same concept in two places). No video mixed into a statics-only test.
Ad count is NOT the constraint — a bucket can hold 10–50 ads; genuine diversity is what matters, not trimming count. (A rough read-speed heuristic is ~$50 of spend per concept to get a verdict — that only sets how fast WE can judge one ad, never whether the bucket can exit learning.)
Budget — the one number that decides everything
A bucket's minimum daily budget = (the CPA you'll actually pay) × 50 ÷ 7 — Meta needs 50 purchases/week per ad set to exit "learning."
At our proven $19 CPA that's ~$134/day; with Q4 CPMs hot and live CPA ~$38, today's floor is ~$271/day. Below it a bucket never stabilizes — it just pays the 20–50% still-learning tax. (Every past $60/day persona set lost money and never exited.)
1–3 ad sets per campaign, never more than 5. Don't split a bucket to organize creative — split only to fund a genuinely different audience.
Challenger → Winner, and scaling
Judge on purchases, never the calendar — ≥10 purchases (or spend = 5–10× target CPA) before any verdict.
Graduate a concept that clears ≤$24 CPA over ≥10 conversions — in place by default (see buckets above).
Scale winners in small steps — ≤20% at a time, once stable, letting each raise settle before the next. Never move a proven performer without leaving the original live as the control.
Kill a loser after a fair read → pause and rename ZZ SUPERSEDED — (keeps the history, stops it bidding).
After any restructure, freeze ~7 days. New ads, big budget jumps, and targeting/placement changes all reset the learning clock — change deliberately, then leave it alone.
Still open — Brett + Carlos only (not settled by this doc)
Advantage+ / ASC — the single biggest untested lever in the account (we qualify: 50+ purchases/wk, catalog connected, AOV <$200). A Brett + Carlos call.
CBO vs ABO doctrine, exact starting budgets, scale-speed and kill dates — Carlos owns these; this playbook uses his current rules until he sharpens them.
5 · Then — lean into creative diversity
Once §1–§4 are consistent, creative becomes the growth engine, because we can finally read it. Meta's 2026 model makes creative the targeting — you reach the nurse by showing a nurse ad into broad, not by building a nurse audience. So the base above is what lets our real advantage — creative velocity and diversity, the persona engine, the non-derivative premium bar — actually compound: every new concept flows into the Challenger bucket cleanly tagged, lands on a matched page, and graduates on its numbers. Stable system first, then creative all-gas.
The one-line version for the team
Tag every ad with IDs (not names) and verify it · fix the existing ads too — they're mis-tagged AND sending nearly all their clicks to the homepage (re-tag + re-route, staged, winners via a split-tested clean copy, never edited in place) · match each landing page's hero image to its ad · launch 4–6 distinct concepts as one all-formats ad each into one broad test bucket (PROVING GROUND) funded above the learning floor (CPA×50÷7 — ~$271/day at today's CPA) · graduate at ≤$24 CPA over ≥10 sales in place, scale winners ≤20% at a time once stable, kill losers to ZZ SUPERSEDED, freeze ~7 days after changes · media buying stays Carlos's · then pour on creative diversity.
Sources (agreed, in-repo): CAMPAIGN_ARCHITECTURE.md (learning bar, ad-set/concept structure, graduation, resets), CARLOS_PLAYBOOK.md (tracking template, CPA bars, economics, testing method). Live diagnosis behind §1–§2: the Meta→Shopify funnel audit. Judge all CPAs against the four bars, not a single blended number.