DreamPro Coaching — ClickBank Front-End + QR "Start a Plan"
The cheap front-end product that funnels into the recurring back-end of The DreamPro Coaching System. A book / digital product John (and his affiliates) promote on ClickBank, whose QR codes & deep links one-tap-instantiate a real DreamPro program and carry referral attribution into the subscription. Closes the loop: product sale → executable action plan → recurring subscription → channel override.
Status: Spec / not yet built. Depends on the Phase-2 attribution graph (DREAMPRO_COACHING_CHANNEL_SCHEMA.md) and the DreamPro template/clone engine. SQL is a draft — don't apply until greenlit.
Status (2026-06-14): the
/startdeep-link + enrollment SHIPPED. Migration 371 addsdreams.public_slug;coaching-onboarding.tsenrollClient()resolves a coach referral code → real membership → program clone → auto-created Coach Seat;POST /api/coaching/start; the/start/[slug]landing is the QR/deep-link front door (free, no Stripe). The/go/<id>durable redirect +coaching_links+ QR generation SHIPPED too (migration 372;/go/[id]/route.ts→ resolve + 302; super-admin "QR / deep links" panel on /dashboard/coaching creates links + renders QR via theqrcodelib + tracks scans). Still to build: the ClickBank thank-you page (only needed if/when ClickBank is used).The strategic point: John is a ClickBank operator and an author. The ClickBank playbook is a cheap front-end to acquire buyers + fund ads, and a recurring back-end for profit. This plan is the front-end. Most fitness books are inert ("do this workout"); this one's action plans are executable — scan, and the plan is live in your pocket with squad accountability + an AI coach.
0. The funnel shape + the two attribution layers
ClickBank sale (book / digital product) ← front-end commission, ClickBank-handled
│ buyer lands on the ClickBank "thank-you" page hosted on dreampro.io
▼
QR / deep link → dreampro.io/start/<template>?ref=<code>
│ attribution captured · template cloned · into Workout Window + AI coach
▼
Subscribe to DreamPro Coaching ← recurring BACK-END
│
▼
Channel override paid to John (Phase 2) ← the real LTV
Two attribution layers that must not be conflated:
- ClickBank HopLink — tracks who sold the book and pays the front-end commission. ClickBank owns this; we build nothing for it.
- Our
?ref=<code>(coaching_referral_codes, Phase 2) — tracks the back-end subscription so the recurring override routes to John (or the selling coach). The thank-you page bakes in the rightrefso the two layers line up: the person who earned the ClickBank sale also earns the back-end.
1. The lead product
Recommendation: lead with a digital "challenge in a box" built on the
"30-Day Reset" template (already seeded by
).scripts/seed-dreampro-coaching.ts
Why this as the front-end:
- ClickBank-native: instant digital delivery, low production cost, fast to list.
- The QR→clone loop is the demo — a 30-day, self-contained commitment is the ideal tripwire scope (not a 12-week ask).
- It stands alone (critical for ClickBank refund rates — see §6) and gets dramatically better when you scan: the inert PDF becomes a live program with a squad + AI coach.
Sequencing: digital bundle first (prove the loop converts) → John's authored book as the authority play that scales it (leverages that he's a published author; print needs the durable redirect layer in §3 so codes never break).
John's call (flag, don't assume): the lead product/angle may be a signature program of his own rather than "30-Day Reset," and the price points are his to set. The contract below is program-agnostic — any DreamPro template with a public slug drops in. Treat "30-Day Reset" as the default placeholder.
2. The "start a plan" deep-link contract
Canonical action URL:
https://dreampro.io/start/<template-slug>?ref=<code>[&utm_*=...]
Behavior (/start/[slug] route):
- Resolve + record attribution — look up
<code>incoaching_referral_codes(Phase 2) → its coach/partner. Persist it (cookie + carried query) so it survives an auth redirect. - Resolve the template by
public_slug(§4) → itsdreamid. - Branch on auth:
- Logged in: call
POST /api/dreampro/templates/:id/clone(the real, shipped endpoint) → land on the new clone at/dashboard/dreampro/[cloneId]with the first step + an "add to Workout Window" CTA. - Not logged in: route to signup/login carrying
{ ref, template_slug }; after auth, run the same clone + create thecoaching_membershipsrow stamped withreferral_code = <code>(this is what wires the back-end override).
- Logged in: call
- Idempotency: if the user already has a clone of this template, route to the existing clone instead of duplicating.
This needs no new clone logic — it orchestrates the shipped clone endpoint + the Phase-2 attribution write.
3. The durable redirect layer + QR
Printed QR codes are permanent; destinations are not. So never put /start/...
directly on print — put a short, stable redirect:
https://dreampro.io/go/<link-id> → 302 → current /start/<slug>?ref=<code>&utm_*=...
/go/[id]resolves acoaching_linksrow (§4) to its current destination and logs the scan. The book can be reprinted, the campaign re-targeted, the template swapped — the printed code never changes.- QR generation: render a QR (e.g. a
qrcodelib) pointing at/go/<id>for print, or directly at/start/...for digital surfaces where the URL can change. - Each program/chapter in the book gets its own
coaching_linksrow → its own QR.
4. Schema (draft)
Add a public slug to templates
Templates are addressed by id today; durable/memorable URLs need a slug.
alter table dreams
add column if not exists public_slug text;
-- Unique among templates only (clones don't need slugs).
create unique index if not exists uq_dreams_public_slug
on dreams (public_slug) where public_slug is not null;
Backfill the seeded coaching templates with slugs (couch-to-5k,
12-week-strength, 30-day-reset).
coaching_links — the durable redirect + QR target
create table if not exists coaching_links (
id text primary key, -- short, URL-safe (e.g. 8-char, Lovio gen)
destination_kind text not null default 'start_template'
check (destination_kind in ('start_template')),
template_slug text references dreams(public_slug), -- what to start
referral_code text references coaching_referral_codes(code), -- baked-in attribution
utm jsonb, -- campaign params merged into the redirect
label text, -- "Book ch.3 — 30-Day Reset", "Back cover"
is_active boolean not null default true,
scan_count integer not null default 0, -- denormalized; precise analytics via PostHog
created_by_user_id uuid references auth.users(id) on delete set null,
created_at timestamptz not null default now()
);
create index if not exists idx_coaching_links_active on coaching_links (is_active) where is_active;
- Scan tracking: bump
scan_count+ emit a PostHogcoaching_link_scannedevent (withlink_id,template_slug,ref) on every/go/<id>hit — that's the top of the funnel, feeding the existing monetization funnel analytics. - No separate scans table needed for v1; add one only if you need per-scan rows.
5. Attribution tie-in (how John actually gets paid)
The whole chain rides the Phase-2 graph:
/go/<id> or /start/?ref=<code>
→ coaching_referral_codes resolves <code> → coach (and coach.channel_partner = John)
→ on clone+signup, coaching_memberships row written with that referral_code
→ on subscribe, invoice.paid splits 3 ways (coach + John override + platform)
→ creator_earnings rows + Stripe transfers (DREAMPRO_COACHING_CHANNEL_SCHEMA.md §4–5)
So a book sale becomes a tracked entry into the recurring funnel — not a one-time commission that ends at checkout. Every QR is an attributed front door.
6. ClickBank specifics & discipline
- Thank-you page on dreampro.io. ClickBank posts the buyer to a vendor
thank-you URL — host it on dreampro.io with the QR/deep-link + account creation,
and bake in the
refmatching the selling party so the back-end attributes correctly. - HopLink ≠ our ref. Front-end commission is ClickBank's HopLink; back-end
override is our
?ref=. Keep them aligned but distinct (§0). - Refund discipline. ClickBank tolerates high refund rates; an info-product that's a thin bait-and-switch tripwire will get refunded into oblivion and tank the listing. The product must deliver standalone value even if nobody scans.
- Health-claims discipline. Wellness/accountability framing only — no medical or guaranteed-results claims (same posture as Throughline + the AI-coach guardrail). FTC scrutiny on fitness ClickBank products is real.
7. Build checklist
- Migration:
dreams.public_slug+ unique index; backfill seeded templates - Migration:
coaching_linkstable - Frontend route
/start/[slug]— attribution capture → clone → land on clone (auth + post-auth paths); idempotent re-clone guard - Frontend/backend route
/go/[id]— resolvecoaching_links→ 302 →/start, bumpscan_count, emitcoaching_link_scannedPostHog event - QR generation utility (point at
/go/<id>for print,/startfor digital) - Admin: create/manage
coaching_links(per book chapter / campaign) + QR export - ClickBank thank-you page on dreampro.io (deep link + account creation + ref)
— SHIPPED 2026-06-14:
/30-day-reset/welcome(carries seller?ref=→ account →/start). The native product surface/30-day-reset+ its guide content (content/coaching/30-day-reset.ts) shipped alongside. - Wire signup-with-template post-auth clone +
coaching_membershipswrite (ties to Phase 2) - Docs sync: INDEX.md, API.md,
POSTHOG_EVENTS.md (
coaching_link_scanned, start/clone events)
8. Open decisions for John
- Format — digital "challenge in a box" first (recommended) vs. authored book vs. both in sequence.
- Lead product / angle — "30-Day Reset" placeholder vs. John's signature program.
- Price points — front-end ($9–$47 typical ClickBank range) + how it ladders into the subscription tiers (the AI-coach Tier 1 is the natural low-price entry — see Coach Seat §7).
- Affiliate terms — ClickBank commission % for his affiliate army (front-end), separate from the back-end override he keeps.