0.Read this first
The point of v1 is hands-on experience. We are going to hand this whole operation to AI agents later, and we will do a bad job of that if nobody on the team has personally built an ad, written an advertorial, shipped a sales page, taken a test order and watched the money land. So v1 is built by people, by hand, end to end, once.
Three things are non-negotiable:
- Nothing goes live and no money is spent without Ben's explicit approval. Not a campaign, not a budget increase, not a product order. Build it, show him, then launch.
- Every factual claim in an ad or on a page cites a source. The brand's own site, a real review, a published study, a supplier label. We do not invent ingredients, awards, numbers, locations or testimonials. Fabricating a testimonial is illegal in the US under the FTC Rule on Consumer Reviews and Testimonials, 16 CFR Part 465. That one is law, not a preference.
- Read section 1 before you touch anything. There is one step in the setup order that cannot be undone if you get it wrong, and it is step A1.
1.The business in one page
We sell physical supplements direct to consumer, on paid social, through single-product funnels. No catalogue, no browsing, no cart. One product, one story, one page, one checkout.
The economics we are testing: buy attention on Meta, send it to a long-form page that does the selling, convert at a cost per acquisition the product margin can carry, and make the real money on the second and third bottle (subscription or multi-bottle packs).
Two offers are on the table right now:
| Offer | Product | Status |
|---|---|---|
| Menopause | Supliful "Ashwagandha Plus" (JTP32APLU) — KSM-66 ashwagandha 600 mg at 5% withanolides, vegan capsule, every dose disclosed |
Product choice still open with Ben. See section 14. |
| Magnesium / sleep | A magnesium glycinate or multi-form blend, supplier TBC | Go |
Why the menopause product looks good: the category leader, O Positiv MENO, sells at 41.99 USD on KSM-66 at 300 mg. This SKU carries 600 mg — twice the hero ingredient — in a vegetable capsule, at a wholesale cost of 4.75 to 10.25 USD per bottle with zero minimum order. KSM-66 is licensable royalty-free with no minimum volume, so the branded claim comes to us through the manufacturer. Panel verified from the label image, not from a vendor summary.
What we are not doing in v1: multiple brands, multiple countries, TikTok, inventory purchases, or a Shopify store.
2.Funnel anatomy
This is the whole thing. Everything in this document is one of these boxes.
Meta ad (image or video + primary text + headline)
|
| click
v
Advertorial OPTIONAL. An article, not a pitch. Earns the click
brand.com/the-2am-... and pre-sells the mechanism. Ends in a CTA to ->
|
v
Sales page The long one. 19-ish sections, ~1,900 words,
brand.com/meno ~17,000 px tall. This does the selling.
|
v
Order form Whop embedded checkout, rendered INSIDE our page.
(same URL) Customer never leaves the domain. Bumps + upsell here.
|
v
Whop order webhook -> our Cloudflare Worker -> fulfilment + dashboard
|
v
Supplier ships White-label bottle with our branding, from the US.
Two routes are worth testing against each other: ad straight to sales page, and ad to advertorial to sales page. The advertorial costs more to produce and usually earns a cheaper click and a warmer visitor. Test both; do not assume.
3.The stack, and who owns what
| Layer | Tool | Why |
|---|---|---|
| Meta ad account | Whop Ads | Whop provisions it at Platinum-tier agency status: prioritised bidding, higher spend limits, direct Meta support, no spend limit. No application, waitlist, setup fee, monthly fee or minimum spend. |
| Product, price, plan | Whop products API | Source of truth for money, tax and entitlement. |
| Checkout / order form | Whop embedded checkout | Merchant of record. Whop handles VAT, sales tax, fraud. 100-plus local payment methods, multi-currency. Embeds into our page so the customer never leaves the URL. |
| Attribution | Whop pixel + Events API | Whop builds attribution from payment data, not browser signals — which is the part that still works after iOS tracking loss. The Events API accepts conversions reported in from outside funnels, which is exactly our shape. |
| Advertorials and sales pages | Our own repo, on Cloudflare Pages | Deliberate carve-out. See below. |
| Fulfilment | ShipOffers primary, Supliful for SKUs ShipOffers lacks | On demand, no minimum order quantity, no inventory outlay, white labelled with our branding, shipped from Denver / Nashville / EU six days a week. |
Why pages are not in Whop. Whop's API has no landing page, advertorial or funnel endpoint — page building is not a thing it does, so this costs us nothing from the one-API upside. And a page in a visual builder cannot be A/B tested one variable at a time or diffed in version control. Whop documents this split as a supported pattern: their Events API names "funnel builders" among the platforms expected to report conversions in from outside. We are using it as designed.
Known costs. Whop's fee stack is not one number. Domestic card 2.7% plus 30 cents; international adds 1.5%; FX adds 1%; ACH 1.5% capped at 5.00 USD; orchestration adds 0.8%; billing automation adds 0.5%; tax collection and remittance adds 2% when enabled and tax is actually collected. Everything on is roughly 6% plus 30 cents. Payouts: next-day ACH 2.50 USD, instant RTP 4% plus 1.00 USD, wire 23.00 USD. Disputes 15.00 USD. Model this per SKU before anyone commits to a price point — on a physical product with COGS and shipping it is a real line item, not a rounding error.
One ad account per Whop business. Multiple brands means multiple Whop businesses. Plan the brand before you create the business.
4.Part A — accounts and plumbing, in this exact order
A1.Create the Meta pixel yourself. FIRST. Before you touch Whop.
This is the irreversible step. Read it twice.
A Meta dataset (pixel) is owned by exactly one Business Portfolio, and ownership cannot be transferred between portfolios — only access can be shared. That is Meta's asset model, not a Whop policy, so nobody can waive it for us later.
Whop automatically provisions a pixel for your business, seeded with existing Whop sales data. If that pixel is created inside Whop's Business Portfolio, it can never be moved into ours. Every conversion event we ever record against it would live permanently on Whop's side of the line. If we leave Whop, we leave the learning behind.
Do this:
- Create a Meta Business Portfolio in Ben's name, owned by us.
- Create the dataset / pixel inside that portfolio.
- Only then connect Whop, and connect our existing pixel rather than accepting the auto-provisioned one. Whop's Meta launch release says businesses "can connect their existing social accounts and pixels", so this path exists.
- Share the pixel into Whop's ad account. Access shared, ownership kept.
Done in that order it costs nothing. Done in the wrong order it is structurally unrecoverable. This is the single cheapest risk mitigation in the entire plan and it expires the moment someone clicks "set up ads".
A2.Whop business and ad account
Create the Whop business. Open the Ads tab. Whop provisions the Meta ad account and Whop owns it, not us — that is the trade for Platinum-tier access, and it is a trade worth making, but know that it is a trade.
Fund it. There is no processing fee on funding.
A3.Facebook Page and Instagram
Whop's setup documentation says: connect your Facebook Page and Instagram via OAuth, and optionally import custom audiences. Whop's marketing copy says you can "create social pages and ad accounts in under a minute". Those two do not reconcile from public sources and we have not resolved it.
Ask Whop support two questions and write the answers into this doc:
- Can Whop create the Facebook Page, or must we connect an existing one?
- If Whop creates it, whose Business Portfolio owns it — ours or Whop's?
Question 2 is the same structural question as the pixel, and it probably has the same answer. If in doubt: create the Page ourselves, in our own portfolio, and connect it. Same logic as A1.
A4.Domain and wallet verification
Use one domain, with advertorials as paths. Like this:
brand.com/the-2am-problem advertorial
brand.com/why-i-stopped-melatonin advertorial
brand.com/magnesium sales page + embedded checkout
Why: the domain that needs wallet verification is the one the checkout renders on. One domain means one verification covers every advertorial we ever write. A new angle costs a path, not a domain plus a DNS record plus a verification.
Do not split advertorials across separate domains "to be safe". A brand-new domain with no history attracts more scrutiny from ad review and fraud scoring, not less. Domain age and reputation are inputs. Spreading across many young domains raises average suspicion.
A5.Product and checkout in Whop
Create the product and the pricing options in Whop. Physical goods are supported through merchant-of-record plus custom fields on the pricing option to collect the shipping address — Whop has no inventory model, no stock per variant and no shipping rates by weight or zone. We do the shipping logic; Whop does the money.
Then embed the checkout into our sales page. The customer stays on our URL.
Build the offer ladder in the checkout:
- Order bump — a second item toggled on at checkout. Supported.
- Post-purchase one-click upsell — supported, and this is where the margin is.
- Set up the bump and upsell before launch, not after. Retro-fitting an upsell into a running funnel means relearning the whole funnel.
A6.Fulfilment
ShipOffers is the primary route: pay on demand, no minimum order quantity, no inventory outlay, 50-plus on-demand health and beauty products white-labelled with our branding, shipped from Denver, Nashville and the EU six days a week. US domestic shipping speed means subscription is viable from day one.
The trade is margin — on-demand per-unit pricing runs higher than a bulk private label run. Expect gross margin nearer 65 to 80% than 85-plus. We need their actual price list before any offer arithmetic means anything.
Supliful is a product source, not an integration — use it for SKUs ShipOffers does not carry (the KSM-66 Ashwagandha Plus is a Supliful SKU). Zero MOQ.
Known limitation, do not design around a guess: ShipOffers advertises "API integrations for streamlined order syncing" but publishes no API documentation, developer portal or webhook spec anywhere. It reads as a talk-to-your-rep API. Ben is already a ShipOffers customer — one email to his account manager asking for API docs and sandbox credentials beats another week of searching. If there is no real API, direct-response fulfilment houses almost always accept a scheduled CSV or SFTP order drop, which is perfectly serviceable at test volume.
For v1, orders can be placed by hand. The automation requirement bites at scale, not during a test. Do not build an integration before an offer has proven out.
5.Part B — buyer research comes first. This is a gate, not a phase.
No hook, headline, ad concept or page section gets written for an offer until that offer has a Buyer Brain.
A Buyer Brain is a corpus of real customer sentences, with sources, built from the customer side — reviews, forums, Reddit, YouTube comments, Amazon one-star reviews, Facebook group posts. Competitor ads and clinical evidence do not substitute for it. Competitor ads tell you what another marketer guessed. Reviews tell you what the buyer actually said.
It must contain:
- The buyable moment — the specific event that made someone start searching. Not "women over 45 experience symptoms". More like "I woke up at 3am drenched for the fourth night and googled it on my phone."
- The pain hierarchy — ranked by how often it is mentioned and how much heat is in the language, not by what we assume matters.
- What they already tried and why it failed — this is where the mechanism argument lives. If every review says "melatonin left me groggy", that sentence is the hook.
- Objections, verbatim — in their words, not paraphrased.
- Vocabulary in and out — the words they use, and the words that mark you as an outsider or a marketer.
- The real consideration set — what they compare us against, which is usually not what we think.
Rules: every line is a real sentence from a real source with a link. No composites. No "a customer might say". If you cannot cite it, it does not go in.
Then every hook and every page section names the Buyer Brain line it answers. If a section cannot name one, it is decoration and it comes out.
Full method: docs/buyer-research-playbook.md.
Output goes to clients/<slug>/buyer-brain.md.
6.Part C — competitor teardown: how we decide what the page looks like
We do not design sales pages from taste. We measure pages that are already selling and build to those numbers.
There is a corpus already built: 20 competitor pages torn down, chosen because
they have been running paid traffic for 400 to 900 days. A page that has been
buying traffic for two years is a page that converts; nobody funds a loser that
long. Targets live in repos/ad-growth-pages/teardown/targets.json.
What the teardown produced, and what it means in practice:
| Measured target (menopause corpus) | Value | Why it is that |
|---|---|---|
| Page height | ~17,300 px | Median. Short pages are the single biggest tell of a page nobody optimised. |
| Words | ~1,900 | Same. |
| Content width | 1,180 px | Mode — they cluster hard. |
| Body type | 18 px / 29 px line-height | Larger than a web app. These are read, not scanned. |
| Display-to-body ratio | 2.78 | Big headlines carry these pages. |
| CTA | 30 px radius, 46 px tall, 17 px type | A pill, not a rectangle. |
| CTA count | 8 | Buy-shaped verbs throughout, not one button at the bottom. |
| First CTA depth | 6.3% down the page | Above the fold, always. |
| Sections | 19 | The number people miss by the widest margin. |
Also built: 281 section screenshots cut out of 15 competitor pages, sorted into
13 kinds (body 95, reviews 29, evidence 29, offer 25, footer 24, results 18, hero
17, guarantee 15, nav 11, faq 6, logistics 5, mechanism 4, trust 3), with an index
at repos/ad-growth-pages/kit/library/index.json.
This is what "model it on the best" means in practice: open the real thing and
look at it. Before you build a hero, open kit/library/hero/ and look at 17 of
them from pages that have been selling for two years.
7.Part D — building the pages in Claude Code
The repo
repos/ad-growth-pages/
src/ the pages themselves. Plain HTML + CSS, one file per page.
kit/
kit.css 257 lines. Tokens + 17 blocks. Every token carries a comment
naming the competitor measurement it came from.
blocks.html specimen sheet — all 17 blocks with purpose, source page, days
live, link to the reference crop. OPEN THIS FIRST.
library/ the 281 reference section screenshots, sorted by kind.
bin/ the measurement and scoring tools (below).
teardown/ competitor measurements, the derived spec, and audit output.
Plain HTML and CSS. No framework, no build step for the pages themselves. That is deliberate: a page is a file you can read, diff and copy.
The loop
The novel part is not the CSS. It is that the same probe measures a competitor's page and one of ours, so the gap between them is a number instead of an opinion.
node bin/teardown.mjs capture competitor pages, run the probe inside them
bin/probe.mjs the probe itself — one definition, used on both sides
node bin/spec.mjs derive medians -> teardown/design-spec.json
node bin/crop-sections.mjs cut the captures into kit/library/
node bin/audit.mjs run the same probe on src/*.html, score vs the spec
Day to day you only need three commands:
cd repos/ad-growth-pages
# 1. preview locally while you build
cd src && python3 -m http.server 8811 # then open http://localhost:8811/your-page.html
# kill it with: lsof -ti:8811 | xargs kill -9
# 2. screenshot it and look at it, at desktop and phone width
node bin/snap.mjs http://localhost:8811/your-page.html shots/your-page.png
node bin/snap.mjs http://localhost:8811/your-page.html shots/your-page-m.png 390
# 3. score it against the measured competitor spec
node bin/audit.mjs your-page.html
audit.mjs writes teardown/audit.json and a readable teardown/audit.md.
Read the markdown, not the JSON — the JSON does not store the per-check target
and actual values, the markdown tables do.
snap.mjs writes a full-page shot plus 1400 px tiles at <out>-t<N>.png, so you
can actually critique a 17,000 px page instead of squinting at a thumbnail. Note:
fixed and sticky elements land mid-page in a full-page capture. That is a capture
artefact, not a page bug.
Requires Node 22 (v22.23.1 on the mini) and playwright-core's Chromium, already installed.
How to actually work with Claude Code on a page
- Give it the buyer brain and the reference, not adjectives. "Make it
premium" produces generic output. "Build section 4 answering this Buyer Brain
line, modelled on
kit/library/mechanism/mag-bioptimizers-07.png, using the measured tokens in kit.css" produces something usable. - Work section by section, not whole-page. A 19-section page written in one shot is 19 mediocre sections.
- Screenshot and critique every pass. Minimum twice. A picture is worth a thousand tokens, and Claude is much better at fixing a page it can see than one it only wrote.
- Run the audit before you show anyone. If it scores badly, the argument is with the measurement and the measurement is reproducible.
- Check the CSS specificity. This is the single most common breakage:
.nav ahas higher specificity than.btn-navy, so your button styling silently loses. Generated CSS cancels itself out constantly, especially on section padding and margins.
House rules so the pages do not look AI-made
Ben's repeated and correct criticism of early attempts was that they "all look so Claudey". These are the specific tells. Avoid all of them unless the competitor page we are modelling genuinely does it.
Palette and layout tells:
- Warm cream background near
#F4F1EAwith a high-contrast serif display and a terracotta accent near#D97757. That accent is Anthropic's own interface colour. It reads as a signature. - Near-black background with one acid-green or vermilion accent.
- Content chopped into identical rounded cards, one border-radius on everything
regardless of hierarchy, the same soft grey
rgba(0,0,0,.1)shadow under each, gradient washes used as decoration. - Hairline rules, zero border-radius, dense newspaper columns.
Typography tells:
- A tracked-out ALL-CAPS eyebrow label above every heading.
- Accenting one single word in a headline in bold, italic or a different colour.
- Meta strings joined with middle dots:
A · B · C. WORD — fragmentlabels with a spaced em dash.- Tinted near-black (
#0B0B0B,#111) standing in for black. - A monospace face for small data labels.
- An arrow appended to button and link text.
- Numbered markers
01 / 02 / 03on content that is not a sequence.
Motion tells:
- Fade-and-slide-up entrance on every section.
- Hover transition on every card.
One orchestrated moment beats scattered effects. Spend your boldness in one place and keep everything around it quiet.
The real fix for all of this is not a checklist, it is the corpus. Open the reference crop. Copy the measured value. The competitor page is the brief.
The close-rip method — the thing we proved works
We tested whether we could build a page as good as a competitor's by rebuilding it closely. Result: yes.
src/meno-rip-bbco.html— close rip ofthebbco.com/pages/pp-provitalize-j. Renders 1440 x 15,124. Scores 15 out of 16 on the audit. 2,624 words against BBCo's 2,717.src/mag-rip-biopt.html— close rip ofbioptimizers.com/products/magnesium-breakthrough. Renders 1440 x 11,790. Scores 13 of 15. 2,501 words against their 2,284.
The method: node bin/rip.mjs <id> <url> captures the competitor page as 1400 px
tiles plus dom.json — an outline of every visible block with its computed
styles. So the rebuild copies measured values instead of guessing from a
screenshot. Then rewrite the copy for our product against our Buyer Brain, keeping
the structure and the design.
Where the line is. Copy structure, layout, section order, rhythm, type scale, CTA treatment. Do not copy their words, their images, their brand name, their class names, or their testimonials. Rebuilding the shape of a page is normal competitive practice. Lifting the text is a copyright problem and lifting the testimonials is the FTC problem from section 0.
A reasonable gate: no shared run of 8-plus words with the reference, no reference images, no reference brand name or domain anywhere in our file.
8.Part E — the order form
Mockups exist at src/order-form.html and src/order-form-mag.html, built to
match what a Whop embedded checkout will look like in place. Use them to design
the surrounding page; replace with the real Whop embed when A5 is done.
What the order form has to do:
- Render inside our sales page, same URL, no redirect at the moment of peak intent.
- Collect the shipping address via Whop custom fields on the pricing option.
- Present the pack choice (1 / 3 / 6 bottles) with the multi-bottle option pre-selected and the per-bottle saving shown.
- Carry the order bump.
- Hand straight to the post-purchase one-click upsell.
Two things to confirm with Whop before building the real one — both one support ticket, not research:
- Exact behaviour of custom fields on a physical pricing option.
- Whether the post-purchase upsell can be a different physical SKU.
9.Part F — the ads
What to produce per offer
- 4 to 6 image ads, one angle each.
- 2 to 3 video ads, scripted shot by shot. Two are already written (
MA-3,GA-2) and unrendered. - Primary text, headline and description for each.
- For every single one: the Buyer Brain line it answers, named. No exceptions.
Drafts and the ad CSS live in repos/ad-growth-pages/src/ads/.
Image and video generation
We use kie.ai. repos/ad-growth-tools/scripts/kie-gen.mjs <jobs.json> <outdir>.
Best photoreal model is gpt-image-2-5-flare-text-to-image at 10 credits for 2K —
it beat the more expensive options in a head-to-head, so do not assume spending
more buys better. Use nano-banana-pro when the image needs legible type.
aspect_ratio accepts 16:9, 3:4 and 1:1 and rejects 4:5.
Current blocker: the Kie account is out of credit — API returns
812 Insufficient corporate funds. Video ads are blocked on this. Needs topping
up before creative production starts.
The one-variable rule
Every test changes one thing. One hook, or one image, or one headline — never two. If you change two things and the ad wins, you have learned nothing and you cannot carry the lesson to the next product.
This is also why pages live in a git repo: a page variant has to be expressible as a diff. If you cannot say in one line what differs between variant A and variant B, it is not a test.
Angle, not aesthetic
The ad's job is the click, and the click comes from the angle. Draw the angle out of the Buyer Brain:
- The failed alternative: "melatonin left me groggy" becomes a hook.
- The buyable moment: 3am, fourth night.
- The mechanism: why this is different, in one sentence a tired person understands.
- The dose comparison: 600 mg against the leader's 300 mg is a genuinely strong, verifiable, specific claim. Specific beats clever.
Campaign build
Whop's Ads API covers campaigns, ad groups, ads and audiences, with creative
upload, pause and resume, lead forms, and reporting on impressions, clicks, spend,
CTR, ROAS and conversion events. It is published under a /beta/ path.
One line in their API reference is now our approval rule:
Any campaign status other than
draftlaunches the campaign, which requires an ads payment method on the account.
So: build the whole campaign in draft. A complete, reviewable, fully
specified campaign that is structurally incapable of launching itself. Then Ben
reviews it and flips it. The approval rule stops depending on anybody remembering
it.
10.Part G — publishing to Cloudflare Pages
Pages deploy through the dashboard repo's build, which copies
ad-growth-pages/src/ into dist/p/:
cd repos/ad-growth-dashboard
./bin/rebuild.sh
That script sources ../ad-growth-tools/.env for CLOUDFLARE_API_TOKEN, runs
node build.mjs, then:
npx wrangler@4 pages deploy dist --project-name ad-growth --branch main --commit-dirty=true
Published pages land at https://ad-growth.pages.dev/p/<file>.html. The two rip
pages are live there now.
Three things to know:
build.mjsvalidates before it deploys and will refuse. Every page listed indata/builds.jsonlmust exist on disk and must carrymodelled_onandcopy_doesfields. Every build needs pricing rows and a testimonial policy. Every non-noteissue needs options attached. This is intentional — it stops a half-described page reaching the dashboard.- Everything is behind Cloudflare Access, scoped to ben@clicktrix.com only. Unauthenticated requests get a 302 to the login. The team will need their emails added to the Access policy before they can open anything. Do that first or you will spend a morning debugging a working deployment.
- Never publish research publicly. Competitor teardowns, buyer research, supplier pricing — all of it stays behind Access.
Secrets live in repos/ad-growth-tools/.env and never go into docs/, data/,
work/, a page, a screenshot or a commit.
11.Part H — tracking, and what we actually measure
Set this up before launch, not after. A funnel you cannot read is a funnel you cannot improve.
- Pixel — ours, in our portfolio, shared into Whop's ad account. See A1.
- Server-side conversions — Whop builds attribution from payment data rather than browser signals, and its Events API accepts conversions from outside funnels. Use both; browser-only attribution undercounts badly post-iOS 14.
- UTMs on every single ad link, with a fixed naming convention written down before the first ad is built. Decide it once. Changing it mid-flight destroys comparability.
- Per-page analytics on the advertorial and sales page: scroll depth, time on page, CTA clicks by position. The reason an 8-CTA page works is that different people are ready at different depths — you cannot know which CTA earns its place without measuring by position.
- Measurement plan goes in
clients/<slug>/tracking/.
The numbers that decide whether v1 worked:
| Metric | What it tells you |
|---|---|
| CPM, CTR, CPC | Is the creative earning attention |
| Advertorial to sales-page click rate | Is the advertorial earning the handoff |
| Sales page conversion rate | Is the page selling |
| Average order value | Is the pack ladder and bump working |
| CPA against product margin | Whether any of it is a business |
| 30-day repeat / subscription rate | Whether it is a good business |
12.Compliance — the short, hard list
Not optional, and not a matter of taste.
- No fabricated testimonials or reviews. FTC Rule on Consumer Reviews and Testimonials, 16 CFR Part 465. Illegal in the US. Where we need social proof before we have our own customers, the honest route is a clearly-labelled substitution — sourced reviews of the same formula sold under another brand, attributed as such — not invented quotes. Agreed approach; follow it.
- No disease claims. Supplements do not treat, cure or prevent. Structure and function claims only, and keep the FDA disclaimer on the page.
- Meta ad policy on personal attributes. Do not imply you know something about the viewer. "Struggling with hot flushes?" is a problem. "Hot flushes keeping women awake?" is not.
- Hormone-adjacent ingredients are an ad-policy risk. This is one reason the ODF menopause formula ranked below the KSM-66 one: it contains DHEA, which is prescription-only in Canada, Australia and the UK, so international targeting would be out.
- Every claim carries its source in the page source as a comment, so a reviewer can check it without asking the writer.
- Advertorials get a compliance pass before they go live. An advertorial that reads as editorial is exactly the asset a regulator or a competitor complains about, so the bar is higher there, not lower.
If you find yourself writing something that needs a caveat to be defensible, the problem is usually the claim, not the caveat.
13.v1 definition of done
Work top to bottom. Nothing below the line starts before everything above it is checked.
Plumbing
- Meta Business Portfolio created, owned by us
- Pixel created inside our portfolio (A1 — do not skip, do not reorder)
- Whop business created, ad account provisioned, funded
- Facebook Page and Instagram connected; the two ownership questions answered in writing and written into this doc
- Domain bought, DNS on Cloudflare, wallet-verified
- Team emails added to the Cloudflare Access policy
- ShipOffers price list in hand; fulfilment route confirmed for the chosen SKU
Research
- Buyer Brain complete for the offer, every line sourced and linked
- Competitor teardown reviewed; the reference page chosen and named
- Offer arithmetic modelled: COGS, Whop fees, shipping, target CPA, breakeven
Build
- Sales page built, audited at 13-plus out of 16, screenshotted desktop and phone, critiqued twice
- One advertorial built
- Whop product and pricing options live, with shipping address custom fields
- Checkout embedded in the sales page; order bump and post-purchase upsell configured
- 4 to 6 image ads and 2 video ads, each naming its Buyer Brain line
- UTM convention written down
- Tracking live and verified with a real test order end to end
Launch
- Compliance pass on every asset
- Campaign built in Whop in
draft - Ben reviews and approves
- Launch
14.Open questions, and who answers them
Nobody should be researching these. Each is one message to one person.
| Question | Ask | Why it matters |
|---|---|---|
| Can Whop create the Facebook Page, and whose portfolio owns it? | Whop support | Same structural trap as the pixel |
| Exact behaviour of custom fields on a physical pricing option | Whop support | Blocks the real order form |
| Can the post-purchase upsell be a different physical SKU? | Whop support | Decides the offer ladder |
| ShipOffers API docs and sandbox credentials | brennen@shipoffers.com — Ben is already a customer | Decides whether fulfilment can ever be automated |
| Can ShipOffers stock or source a menopause SKU? | Same email | Would consolidate fulfilment to one vendor |
| Actual ShipOffers price list | Same email | No offer arithmetic is real without it |
And one decision only Ben can make — the menopause product. Three options:
- Park menopause, run magnesium only for v1.
- Switch to the KSM-66 angle — Supliful Ashwagandha Plus, 600 mg, vegan, every dose disclosed, branded claim available. Keep the menopause demand thesis, change the product.
- Run the ODF / Vox "Menopause Support" formula as written — vegan capsule, no soy, but everything is a proprietary blend so we can make no individual ingredient claim; it contains DHEA (Meta risk, no international targeting); and the panel names a 40 Billion probiotic blend then declares 8 Billion CFU.
Growth Lead's recommendation: option 2. Switch the product, keep the thesis.
Note on option 3: my reluctance to put our brand on a label that cannot add up its
own probiotic count is a taste judgement, not a standard — it is recorded as
flag F14 in docs/flags-and-considerations.md. It cost ODF the top ranking in my
write-up. Plenty of durable competitors sell proprietary blends and do fine. If
the demand and the margin are there, that call is Ben's, not mine.
15.Two blockers for handing this to people
Found while writing this, both real:
- The repos have no git remote.
ad-growth-pages,ad-growth-dashboardandad-growth-toolsexist only on the mac mini. Nobody can clone them. Push them to a private GitHub org before onboarding anyone, or the team is working over screen-share on one machine. - Every Meta credential in
.envis an empty placeholder.META_SYSTEM_USER_TOKEN,META_APP_ID,META_APP_SECRET,META_BUSINESS_ID,META_AD_ACCOUNT_ID,META_PAGE_ID,META_INSTAGRAM_ACTOR_ID,META_PIXEL_ID— all blank. Nothing Meta-side exists yet. Section A1 really is starting from zero, which is good news: there is no wrongly-owned pixel to unwind.
16.Where everything lives
~/OpenMausBot/Businesses/ad-growth/
CLAUDE.md how this business works; read it
clients/<slug>/
brand-brain.md brand, voice, audience, offers, compliance rules,
winning hooks, failed angles. Single source of truth.
buyer-brain.md the sourced customer corpus. Section 5.
research/ creative/ tracking/ reports/
docs/
buyer-research-playbook.md the method for section 5
flags-and-considerations.md every derived constraint, its evidence, and what
would override it
2026-09-29-whop-assessment.md the full Whop analysis this doc summarises
2026-09-29-fulfilment-options.md
2026-09-29-menopause-sourcing.md
2026-09-29-vendor-recheck.md one base catalogue, five storefronts
access-and-credentials.md what needs which credential
repos/
ad-growth-pages/ the pages, the kit, the measurement tools
ad-growth-dashboard/ the dashboard and the deploy
ad-growth-tools/ scripts and .env
work/ dated working output
Two conventions, because they save arguments later: files and folders are
lowercase-with-hyphens, and a date goes first when order matters
(2026-10-05-lead-list.csv).
17.One rule worth repeating
Only Ben's decisions and the law restrict what we can propose here. Nobody
invents a rule. If your work produces a constraint — a creative rule, a testing
threshold, a "never do X" — it is a flag, not a rule, and it goes in
docs/flags-and-considerations.md with three things written down: what it says,
what evidence it rests on, and what would override it. If you cannot state what
would override it, it is not a flag and it does not get written.
Every flag carries this clause: if doing the thing anyway could raise conversion rate or profit, consider it and bring it to Ben to decide. A flag is never a reason to silently drop an option.
And when a flag costs us something — you dropped, downranked or reshaped an option because of one — say so, naming the flag and what it cost. A flag nobody sees working has quietly become a rule again, which is the exact failure this replaces.