The flow
One Worker sits between Whop and everything downstream. It knows what was bought at the moment of the charge, so nothing after it has to guess.
payment.succeededTier, cart, funnel, affiliate cookie and all five UTMs were stamped on before the charge.POST /contacts/{id}/workflow/{id}. A bumped cart enters two — base tier and upgrade.GHL workflows no longer decide anything about the purchase.
They branched on order amount to work out the tier. There is no GHL order now, so those branches read nothing. Emails, SMS, waits and tag conditions all stay — they just stop guessing.
Plans
Twelve live plans, all hidden from the storefront — reachable only through a checkout page. A price that steps on 20 Sep needs two plans, because a Whop plan carries one price.
| Plan | Price | Sells | Plan ID |
|---|---|---|---|
| Early Bird | $47 | to 13 Sep | plan_NWlCLuu4NotNr |
| General Admission | $97 | 13 Sep → close | plan_mtHkdjlQbvkHX |
| VIP | $197 | to 20 Sep | plan_vo09qNeR1gNKf |
| VIP | $297 | 20 Sep → close | plan_bgTK8oeOyv1up |
| Platinum | $397 | all launch | plan_pNNTBm1uvAmB4 |
| EB → VIP | $150 | to 20 Sep | plan_GzR4MwQNIv42l |
| EB → VIP | $250 | 20 Sep → close | plan_NjHgKCFXKRlzK |
| EB → Platinum | $350 | all launch | plan_f5bsCu7Z7iyrS |
| GA → VIP | $100 | 13–20 Sep | plan_MbBsqny6AWqxZ |
| GA → VIP | $200 | 20 Sep → close | plan_0XxN2EAjEKK7P |
| GA → Platinum | $300 | 13 Sep → close | plan_xiPbxrH89tmRU |
| VIP → Platinum | $200 | all launch | plan_RDxBErVUsQ3oB |
| VIP $297 → Platinum | $100 | on hold | not created |
Needs Lex VIP → Platinum exists at $200, per 14 Aug. The $100 rung is deliberately not built: pricing it off today's VIP price means a $197 buyer upgrading on 21 Sep pays $100 for a $200 gap. Nothing sells it before 20 Sep.
Affiliates
Sales reach FirstPromoter directly from the Worker. Eight GHL workflows are gone.
Capture
- Block reads the
_fprom_tid/_fprom_refcookies at page load, falling back to?fpr=. - Cookies first:
?fpr=only exists on the landing hop and is gone by checkout.
What the eight workflows did
- Clear a field → write
{{order.total_price}}→ ×100 → POST the sale. - The first three steps existed only because GHL cannot multiply inline. The Worker holds cents already.
{{order.total_price}}does not exist without a GHL order, so those workflows are dead, not redundant.
Two fixes came out of it
- No more duplicate commissions. Every sale carries
event_id= the Whop payment ID. FirstPromoter requires it to dedupe; all eight workflows omitted it, so one retry paid twice. - Amounts were about to be 100× wrong. Whop reports dollars, FirstPromoter wants cents. Caught pre-launch.
One deletion still owed
- The
#2 Math operationstep in the eight FirstPromoter workflows. The Worker sends cents — leave it in and every sale reports at 100×.
Your side Tracking is on every funnel already and carries to checkout. Outstanding: add the bootcamp link to the promoter signup, so promoters have one to share.
Attribution
Organic, ads and tripwire are one attribute on the page. No logic to build.
- Each block declares
data-funnel="organic" | "ads" | "tripwire". It rides the payment; the Worker turns it into a tag. - New funnel page = copy the block, change
data-tieranddata-funnel. Nothing else. - Declared, not inferred, because two bootcamp funnels share one page URL.
- The exact page slug also lands in
aieb_page, so GHL conditions can target one ad page without a code change. - Tripwire is a real third value. GHL only ever wired ads and organic.
Upgrades never re-run attribution.
Re-tagging an upgrade would credit the funnel the upgrade page sits on and overwrite the source that won the original sale. Funnel tag applies on first purchase only.
GHL changes
Tier workflows stay separate, one per tier. Each loses its payment trigger and its price branching, and keeps everything that speaks to the buyer.
Remove
- Every Payment received trigger — keys on a GHL order that no longer exists
- The price branch block and its tag nodes
- Ads / Organic / Tripwire, its three branches and two tag nodes
- The duplicate n8n webhook — keep one, on the main line
- Any Go to that only existed to rejoin a deleted branch
Keep
- Aevent, disable DND, the waits, Wisernotify
- Every SMS and email, and add-to-WF4
- The email-opened branch — engagement, not purchase
- Any branch reading a tag, prior purchase or contact state
- WF3's 180 / 195 Platinum seat notifications
Rule for anything ambiguous
Branch reads Amount, Workflow trigger or Funnel → delete. The Worker knows, and the branch now reads a value that never arrives.
Branch reads tags, prior purchases or email opens → keep. That is contact state and still works.
One addition per workflow: the n8n webhook's custom data gains whop_payment_id. It replaces ghl_order_id as the dedupe key and is the same value Supabase stores as processor_ref.
One exception: the Is Free? branch
- It reads Amount, so the rule says delete — but its output,
aieb-fall26_free, is how a free seat is identified downstream. The Worker does not write that tag today. - Unresolved until we know which route free seats take. See Open.
Fields & tags
Written to the contact on every purchase, before any workflow runs.
| Field | Holds |
|---|---|
| whop_payment_id | The Whop payment. The join key across GHL, n8n, Supabase and FirstPromoter. |
| aieb_tier | ga · vip · platinum |
| aieb_offer | The exact rung, e.g. ga-to-platinum |
| aieb_funnel | organic · ads · tripwire |
| aieb_page | The page slug they checked out on |
| aieb_cohort | fall26 |
| fp_plan | FirstPromoter plan string, for plan-level reward rates |
| fp_amount_cents | Sale amount in cents, stamped at charge time |
| firstpromoter_bid | Referral tracking ID, when there is one |
| utm_source … utm_term | All five, carried from the landing page |
Tags, in order
An upgraded buyer keeps the tag from the tier they started on as well as the one they moved to. Hub gating reads the entitlement; the dashboard reads the trail.
Checkout map
data-tier and data-funnel are the only two things that differ between one checkout and the next.
AI Employee Bootcamp — main funnel
| Page | Sells | data-tier | data-funnel |
|---|---|---|---|
| /general-admission-2026 | Early Bird $47 + 2 bumps | eb-ga,ga | organic |
| /vip-admission-2026 | VIP $197 + Platinum bump | vip | organic |
| /platinum-admission-2026 | Platinum $397 | platinum | organic |
| /vip-admission-upgrade | EB → VIP $150 | eb-ga-to-vip | organic |
| /platinum-admission-upgrade | EB → Platinum $350 | eb-ga-to-platinum | organic |
| /vip-platinum-admission-upgrade | VIP → Platinum $200 | vip197-to-platinum | organic |
| /bootcamp-2026-confirmation | Receipt block | — | — |
AI Employee Bootcamp Ads — rebuilt 15 Aug, new slugs
| Page | Sells | data-tier | data-funnel |
|---|---|---|---|
| /general-admission-2026-5280 | Early Bird $47 + 2 bumps | eb-ga,ga | ads |
| /vip-admission-2026-9281 | VIP $197 + Platinum bump | vip | ads |
| /platinum-admission-2026-9922 | Platinum $397 | platinum | ads |
| /vip-upgrade-eb-5042 | EB → VIP $150 | eb-ga-to-vip | ads |
| /vip-upgrade-g-2170 | GA → VIP $100 | ga-to-vip | ads |
| /bootcamp-2026-confirmation-2847 | Receipt block | — | — |
Source: live GHL funnel pull, 15 Aug 2026, 15:10 ET.
Two things to watch
Two ads funnels exist
- AI Employee Bootcamp Ads is the live one, rebuilt 15 Aug. 2026 - Bootcamp - ads has not been touched since May and still carries
/general-admission-2026-ads-checkout. Anything pointing at the old slugs is pointing at the wrong funnel.
Newsletter, advertorial, extended enrollment
- Still on the old checkout, so they sell nothing until a block is pasted. That is the tripwire route.
Pasted once, never again.
A page holds two lines — a <div> with its tier and funnel, and a script tag. Fields, bumps, summary, payment element, terms and button are all served by the Worker.
Wording and styling change in worker/src/copy.js, one wrangler deploy, all twelve checkouts at once. Prices, the terms link and the confirmation URL were already dynamic — all three changed today without touching a page.
The GHL page still owns the headline, body copy and images. Those stay editable in the page editor.
Supabase
- Scott's n8n endpoint receives the purchase and writes to Postgres directly. Whop points at it; nothing of ours sits between.
- That keeps
salesprivate — reaching it over the API would have meant exposing all 17 tables for one insert. - Failures land in n8n's execution history with alerting already attached.
- Rows land as
processor = 'whop',processor_ref= the Whop payment ID — the same shape as the 25,000 GHL rows, so reporting spans both. Plan ID stored alongside.
Open
How free seats are sold at all
The mechanism is not decided yet — a 100%-off promo code, a separate checkout page, or the existing $0 GHL form. Each behaves differently and needs a different fix, so this is the first thing to settle. Groundwork is in: a 100%-off Whop checkout already gets aieb-fall26_free from the Worker, applied at charge time. A comp seat through the $0 GHL form never reaches Whop at all, so it gets nothing and enters no workflow. Roughly 400–600 UCL members ride on this.
Promo code naming
None exist yet. Test codes must end in TEST so they archive out of launch numbers. Free and UCL codes need your convention so reporting splits.
Bootcamp link in FirstPromoter
Promoter links generate on signup and tracking is on every funnel, but the bootcamp is not added yet — so there is no link to share.
The 200-seat Platinum cap
Set on the plan, but the plan reports unlimited stock. Treat as not working until confirmed in the dashboard. WF3's 180/195 notifications are unaffected.
Financing on or off
Card and PayPal only today, platform defaults off, so no BNPL can appear on its own. ClarityPay is US-only and needs Whop Support to enable. The largest purchase here is $397; ClarityPay is built for $30,000.
VIP → Platinum after 20 Sep
Does a $197 VIP buyer pay $200 or $100 to upgrade on 21 Sep? By date it is $100, which gives away the difference. Not urgent — nothing sells it before 20 Sep.