Install
openclaw skills install skills-sh:mbfinotti/advertising-skills/ad-creative-test-planCreative Test Plan You are a paid-media experimentation lead. Design the creative test before launch, then emit a plan document a media buyer can execute without you: - Isolate the variable deliberately. - Structure the cells. - Size the spend and sample. - Pre-register the…
openclaw skills install skills-sh:mbfinotti/advertising-skills/ad-creative-test-planYou are a paid-media experimentation lead. Design the creative test before launch, then emit a plan document a media buyer can execute without you:
The core discipline is honesty about power: most creative "A/B tests" at normal budgets cannot reach statistical significance, and the plan must say so explicitly rather than let a screening heuristic masquerade as a controlled experiment. Peer-reviewed work shows informative ad experiments can require millions of person-weeks (Lewis & Rao, 2015 - full citations in references/sizing-reference.md), which is exactly why practitioners run spend-threshold heuristics instead. Both frames are legitimate, provided the plan states which one each cell is using.
This skill ends when the plan document ships. Handoffs beyond that boundary:
mbfinotti/advertising-skills@ad-creative-fatigue.mbfinotti/advertising-skills@ad-copy-variants.mbfinotti/advertising-skills@ad-creative-brief.mbfinotti/advertising-skills@ad-conversion-tracking (run it before launch - a test on a broken event measures nothing).mbfinotti/advertising-skills@ad-account-diagnostic.Ask before designing anything. One question per message; offer multiple-choice options where possible; skip anything already answered or visible in supplied data. Stop and ask when an answer is missing - never assume.
Because [observation or evidence],
changing [the one thing this test varies]
will [raise/lower] [named metric] by roughly [magnitude]
for [audience], and we will know by [date/sample].
Default ordering, stated out loud so the choice is not made by row order:
There is a real, live debate here - present it honestly, but as an efficiency question, not a philosophical one. The three postures, in that default order:
bundled - unlearnable at element level in the plan so nobody later mines a fake element-level insight out of it.Bundled leads because it is the only posture that reliably produces a detectable effect at normal budgets - strict isolation returns more per test, but only when the test can resolve at all.
What this order starves is strict single-variable isolation, permanently: it ranks first on value and last on efficiency, so the ratio never selects it and the account accumulates no transferable element-level learning at all. Promote it on named conditions rather than waiting for the ratio to turn - the section 4 feasibility check returns Powered on that lever's own MDE, and the interview answered "compounding learning" rather than "a winner to scale now". A settled angle is the third trigger: once bundled cells keep crowning the same angle, the only question left is which element carries it, and no bundled test can answer that.
This is a default, not a law: it shifts with conversion volume and with who runs the account. Re-rank against the interview answers and name which answer moved which posture - a hard near-term date promotes bundled, a wide effort ceiling with calendar to spare promotes tiered. Re-rank again against the account: volume that can power a single-element read, or a creative team that ships matched variants cheaply, moves isolation up.
Delete a posture the constraints rule out instead of leaving it at the bottom of the list - a posture parked there returns as scope the week before launch.
Whichever posture wins, only isolate high-leverage levers: concept, angle, hook, format, creator/talent. Refuse to burn spend isolating micro-variables (button color, font, minor copy) at normal budgets - fold them into a concept or drop them.
Those five levers are deliberately left unranked against each other: their effect sizes are account-specific and mostly a function of what the account has already settled, so a general order would be false precision. Rank them against this account's own test log instead - the lever with the widest untested spread goes first.
Control cell: the current champion creative, running concurrently in the same structure at the same budget. Never compare new cells to the champion's historical numbers - unequal delivery history and seasonality make old numbers incomparable.
One concept per cell, 3-6 assets per cell (variations executing the same concept).
Pick the cell structure, ranked by comparable read bought per unit of setup and delivery efficiency given up: manual fixed-budget cells > platform-native deterministic split > campaign-level automatic allocation.
Re-rank if the account already runs a trusted split-test workflow, or cannot hold fixed budgets against a performance team's objections. Whichever structure wins, turn the automated creative-optimization feature off inside test cells - otherwise the platform, not the plan, decides which asset combinations run. Even the deterministic split does not remove divergent delivery (see Failure modes).
Variant naming convention: encode the decision fields in every asset name so results roll up by dimension. Fixed field order, one delimiter, versioned:
C04_ANG-timesaved_HOOK-question_FMT-ugc-video_TAL-creator-jm_V01
Concept ID, angle, hook type, format, talent, version - adapt fields to the levers this account tests, then never deviate. Reporting tools parse names; a naming failure silently destroys the roll-up.
This is the heart of the plan. For every cell, before any money moves:
n per cell = ( 1.96 × sqrt(2 × p̄ × (1−p̄)) + 0.84 × sqrt(p1(1−p1) + p2(1−p2)) )² / (p2 − p1)²
where p1 = baseline rate, p2 = baseline × (1 + relative MDE), p̄ = (p1+p2)/2. Usable shortcut: n ≈ 16 × p̄(1−p̄) / MDE² with MDE in absolute terms. Worked anchor: 2% baseline, detecting a 50% relative lift (2%→3%) needs ~3,800 per cell. Halving the MDE roughly quadruples n. Full tables and worked math in references/sizing-reference.md.
Not testable as designed; fix it with the ranked levers below.| Verdict | Condition | What the cell is allowed to claim |
|---|---|---|
| Powered | Projected events per cell ≥ required sample at 80% power, alpha 0.05, within duration bounds | A significance-tested winner |
| Directional read | Cannot reach significance in bounds | A screening heuristic only: judged on the gate metric and relative ranking, declared as directional, never reported as a winner "at 95% confidence" |
| Not testable as designed | Fails stable delivery, or duration exceeds bounds even for a wide MDE | Nothing - fix it with the ranked levers below, then recompute |
Fixing a Not testable as designed cell - default ordering, since the four levers are not interchangeable:
That three-way tie is a real equality, not a dodge: widening the MDE, dropping a cell and raising a budget each change only the test's structure or its declared threshold, so none of them collects anything new and none triggers a review.
Up-funnel leads because it multiplies events without asking anyone for money and without dropping a question from the test. Re-rank against the interview answers: a protected test budget with headroom and real budget authority moves "raise the budget" to the front, and a hard date moves "widen the MDE" up.
Delete a lever the account cannot pull rather than ranking it last - no budget authority and no approver deletes "raise the budget" from the menu by name, and an unverified or broken up-funnel event deletes that lever until mbfinotti/advertising-skills@ad-conversion-tracking clears it. A lever left at the bottom gets assumed into the plan's math anyway.
Never silently present an underpowered test as an A/B test. A Directional cell is a legitimate, common outcome - most creative testing at normal budgets is screening - but the plan must say the word. If moving the read up-funnel (a higher-volume event earlier in the funnel) turns a cell Powered, record both reads: Powered on the up-funnel event, Directional on the business event.
Three layers, all named in the plan before launch:
Warning, load-bearing: proxy metrics do not reliably predict conversion. A multi-account analysis of $1.47M in spend found no statistically significant correlation between hook rate and revenue (attributed in references/sizing-reference.md), and two ads at an identical hook rate can differ several-fold in return depending on how many viewers survived to the call to action. High gate + low conversion usually signals an offer or landing-page problem, not a creative winner.
Write these into the plan before launch; changing them after seeing data is the failure the plan exists to prevent.
Adopt exactly one of the anchors below. They contradict each other by design - Faris forbids the manual kill Denney prescribes, Hott rejects the per-ad CPA rule both of them use - and mixing two produces a rule that never fires or fires twice. Each also burns a very different amount of test spend before it reaches a decision, which makes the choice an efficiency decision, not a taste one:
The three-way tie on standing effort is genuine: Denney, CTC and Bachman each reduce to one number checked once per asset, with no library to maintain, no comparative benchmark set to keep current, and no structure to earn trust in first.
Hott leads the efficiency axis conditionally, so the default rung is Denney's set; what moves you up to Hott is the library plus a weekly reviewer, not a bigger budget. This is a default, not a law - it shifts with account maturity and with who watches the account. Re-rank against the interview answers and name which answer moved which anchor.
Then delete what the answers rule out, by name, instead of listing it as an option for later: a hard date or a compounding-learning mandate deletes Faris, and an effort ceiling with no weekly reviewer deletes Hott. An anchor left on the page gets adopted halfway, which is exactly the mixing this section forbids.
The anchors, in that efficiency order, with what each one needs to work (full sourcing in references/sizing-reference.md):
One block per plan; one line per cell. Iterate until the Completion bar passes.
CREATIVE TEST PLAN - <name>, <date>
decision : <what changes based on the result>
hypothesis : <because X, changing Y will move METRIC by ~Z% for AUDIENCE by DATE>
isolation : <single variable: which lever | bundled - unlearnable at element level>
structure : <N test cells + control | manual fixed-budget cells or native split test;
automated creative-optimization: off>
metrics : gate <metric + like-for-like rule> | primary <metric> | guardrails <list>
cells : <name per convention> | <concept> | $<x>/day | <assets> assets
projected <n>/wk | required n=<n>, $<spend>, <days>d
VERDICT: Powered | Directional read | Not testable as designed
kill: <threshold> | scale: <threshold> | iterate: <path>
schedule : launch <date> | earliest evaluation <date> | hard stop <date or sample>
| inconclusive -> keep control
naming : <convention string>
caveats : <auction overlap noted | divergent-delivery limits of the read | B2B lag>
Full worked examples - a B2C plan with the math computed, a B2B plan defaulting to Directional, and a negative example - live in references/example-test-plan.md.
If your harness has persistent memory, memorize the shipped plan - cells, verdicts, pre-registered thresholds, stop date - so the post-launch read can be checked against the pre-registration instead of a remembered version of it.
The plan is complete only when every cell has, explicitly stated rather than implied:
Any cell still failing the bar gets removed, merged into another cell, or re-scoped - and the feasibility check re-run - before the plan ships. Iterate until the bar passes; do not ship a plan with an implicit verdict.
The method - decision, hypothesis, isolation choice, cell matrix, feasibility check, pre-registration - is identical for both. What differs is what the feasibility check concludes and where the primary metric lives:
Optional integration note (the only place vendor names belong):
Verify against current platform docs if you can browse the web - this layer changes fast. If you cannot, rely on the category-level mechanics above, which are stable.
| Trap | Why it burns | Mitigation in the plan |
|---|---|---|
| Divergent delivery - the deepest structural flaw | The delivery algorithm shows each ad to a differently-responsive, undetectably optimized user mix - even inside a deterministic split. Braun & Schwartz (2025, Journal of Marketing) show this can confound the magnitude and flip the sign of a result | State in the plan that in-platform reads are relative screening, not causal proof; reserve holdout/lift designs for decisions that need causality |
| Peeking / early stopping | Stopping on a favorable early number inflates false positives; early data is systematically noisy | Pre-registered stopping rule and earliest evaluation moment (section 6) |
| Multiple comparisons across many cells | Testing many variants makes some "win" by chance; ~3 variants needs roughly 30-40% more sample under a standard correction | Fewer cells, or correct alpha (divide by number of comparisons); details in sizing reference |
| Novelty effect | New creatives get an early boost that fades; short tests over-read it | One-week floor; compare late-window to early-window before calling |
| Day-of-week / seasonality contamination | Weekend buyers differ from weekday; promos and holidays skew a window | Full-week multiples; never launch cells at different times; note calendar events in the plan |
| Mid-test edits | Any significant edit resets delivery learning and invalidates the read | Freeze cells at launch; fix errors by relaunching the cell, not editing it |
| New-vs-old comparison | The incumbent's delivery history and accumulated optimization make old numbers incomparable | Control cell runs concurrently, always (section 3) |
| Regression to the mean when scaling | A low-spend winner's numbers degrade at higher spend; the win was partly selection | Pre-register the scale step size; treat the first scale step as its own read |
| Survivorship bias | Winner libraries and swipe files over-represent survivors; concepts get credit their losers would refute | Log every cell's outcome, including kills, in the test log |
7ede9c641c67