WTF is AI BuildersInternal

Plans · updated 2026-09-13

PRD 002 - Sunday, September 13, 2026

Status: Working document for one day. Written 2026-09-13, morning. Updated midday, see section 10. Owner: Sheila. Builder: Claude Code, in the wtf-app and wtfisai-web repos. Where things are: web app on staging at staging.wtfisai.co, admin at /admin, website live at wtfisai.co with the new brand.

1What today is for

By tonight, six things are true:

#GoalDone looks like
G1The content is evaluatedEvery item in the Library has its final name, its price, and its status. The manifest is the only list.
G2Paid playbooks take moneyA signed-in person can buy a playbook with a card in Stripe test mode, and it flips to Yours.
G3The email situation is decidedOne tool chosen, one place every capture lands, opt-in wording agreed.
G4The website is revisedEvery offer on wtfisai.co points at the app, except 1:1 coaching, which has a qualifying form.
G5Production existsapp.wtfisai.co answers, with its own Supabase project, secrets, and the same code as staging.
G6The admin page is understoodYou have used it, said what is wrong, and the fixes are in.

Running order: G1 first because everything downstream needs the names and prices. G5 can run in parallel any time you are in dashboards. G4 last because it depends on what G1 and G3 decide.

2G1 - Evaluate the content

Where: staging.wtfisai.co/library and the 101 page behind it.

What you decide, per card:

What I do: edit content/manifest.json, remove the Source lines once names are settled, push. The Library changes on every device with no release.

Rule from earlier: module 0 of every course is free and is the pitch, not part of the course. Modules 1 onward are behind the purchase.

Time: 45 minutes of your reading, 20 minutes of my editing.

3G2 - Stripe on the paid playbooks

Model, decided: one item per checkout, no cart. Playbooks are one-time purchases with no expiry. Courses are one-time purchases with one year of access and one year in the Slack community. Purchases happen on the web only. iOS is US only and links out to app.wtfisai.co to buy.

What gets built:

  1. A purchases table: who, which item, Stripe session, amount paid, code used, referred by, bought at, expires at.
  2. Stripe Checkout from the Buy button, in test mode first, with promotion codes enabled so discount codes work from day one.
  3. A webhook the Worker listens to. When Stripe says paid, the purchase is recorded and the item flips to Yours for that person.
  4. Paid files move out of the public bundle into a private Cloudflare R2 bucket. Downloads become short-lived links handed out only to buyers.
  5. Admin People cards show purchases and code used.
  6. The Community, gated and instant. A Library item on the Courses shelf, and the first subscription: $10 a month, cancel any time, or included for one year with any course. Locked until an entitlement exists, then Yours with a join button that hands over the Slack invite link on the spot, no human in the loop. The link lives in a settings table editable from the admin page, because Slack invite links expire on a schedule set by the Slack plan. Entitlement is "paid through": the later of any course purchase plus one year, or a live subscription. Renewals and cancellations arrive by webhook. Removals from Slack at expiry are a monthly list in admin, since Slack's API only automates that on enterprise plans. Web only: iOS shows the community as something you have, never something you buy. Launch it with a weekly rhythm already running, one office hour or one post a week, and say so on the card. A quiet paid room churns in a month.

What you do, in Stripe (the Tandem account):

Open question for you: the referral kickback. Is it a flat $25 or $50 per course sale, or a percentage? The ledger needs one rule.

Time: half a day of build. Playbook checkout end to end is the test that closes G2.

4G3 - The email situation

What exists today: sign-in captures the email. Waitlists capture per item into our own table. Nothing goes to any email tool yet. Transactional mail (codes) goes through Resend.

What is missing: a marketing opt-in at sign-up, and a home for the list.

The decision: which tool holds the marketing list.

OptionForAgainst
Kit (the PRD's assumption)Tags per path and per asset, sequences, creator-friendlyAnother monthly bill, another login
FlodeskPrettier emails, flat priceWeaker tagging and automation
Resend BroadcastsAlready set up for codes, one vendor, cheapYoung product, basic segmentation

Recommendation: Kit, because tags are the whole point. The waitlists are already shaped as tags: path plus item. If you are already paying for Flodesk, say so and the recommendation flips.

What gets built once decided:

  1. Opt-in checkbox on the welcome screen, on by default with plain wording. Stored on the account. Shown in Admin.
  2. Every capture is synced to the tool with tags: path:business, wait:course-101, bought:pb-02, and so on.
  3. Website waitlist form feeds the same tool with the same tags.

Opt-in wording, proposed: "Send me the good stuff: new modules, new free tools, and the occasional honest email. Leave any time."

Time: one hour of decision, two hours of build.

5G4 - Revise the website

Principle, decided: the app is the product, the site is the front door. Every offer on the site points at the app, except 1:1 coaching.

Changes:

SectionTodayBecomes
Hero CTAJoin the waitlistBuild my free plan -> app.wtfisai.co
Four waysCommunity, 101, Office Hours, TrainingSame four, but each card's button goes to the matching Library item in the app. Office Hours goes to the coaching form.
Waitlist modalFive-step formKept only as Notify me when the 101 opens, feeding G3's tool
Our story CTAJoin the waitlistBuild my free plan
FooterDoneDone
1:1 coachingA cardA qualifying form: business, size, what you want to build, budget range. Qualified answers see a booking link. Everyone else gets a kind no and the app.

Not today: rewriting section copy beyond the CTAs. That waits for the "Prepare for the AI economy" pass with Michelle.

Decision for you: the qualifying questions and what "qualifies" means. Three questions is enough.

6G5 - Production

Principle: production is staging with different secrets. Same code, same branch flow: staging deploys staging, main deploys production.

Your steps, in dashboards:

  1. Supabase: create wtfisai-prod in the same org. Then, exactly as on staging: Authentication -> Emails -> SMTP Settings with a new Resend key named supabase-production, sender hello@wtfisai.co. Both templates get the code body. Rate limit to 100. Site URL https://app.wtfisai.co. Leave sign-ups on. Run migrations 0001 and 0002 in the SQL editor.
  2. Keys document: add the production Project URL, publishable key, and secret key.
  3. Cloudflare: Workers & Pages -> Create -> Import repository -> wtf-app. Name wtf-app, branch main, build npm run build:production, deploy npx wrangler deploy --env production, non-production branch builds off.
  4. Anthropic: a second API key named wtf-app-production, into the keys document.

My steps: fill .env.production and the production vars, push the secrets, confirm app.wtfisai.co answers, sign in once, then lock the gate until launch by turning sign-ups off if you want a soft launch.

Admin policy, decided 2026-09-13: the administrative platform is only accessible through staging, and it carries real production data. So: the admin routes are switched off in production, and the staging Worker gets read access to the production database for the admin routes only (two extra secrets on staging: the production Supabase URL and secret key). Everyone with a staging login is an admin. That makes the staging allowlist the admin list, so staging sign-ups stay off and the four accounts stay the whole list until you add someone.

Decision for you: does production stay open to anyone the moment it exists, or gated like staging until launch day?

7G6 - The admin page

Where: staging.wtfisai.co/admin, or the Admin button on the You tab.

What it does today: People with search, Waitlists with copy-emails, Codes as a placeholder for G2.

What I need from you: ten minutes of clicking and a list. Likely candidates: sort order, what the People card should lead with, whether you want a table on desktop, and who else gets access. Michelle is one line in the config.

What lands today from G2 and G3: purchases, code used, referred by, and opt-in stop reading "none yet".

8Found today, built next

The plan finds gaps and points at what fills them. Two more intake questions: "What have you actually done with AI so far?" (multi-select) and "What do you wish you could do, but can't?" (her words). A new plan section, "Where you are, and what fills the gap": for each gap she gave evidence for, what it costs her and the Library item that closes it, by id, rendered as real cards with real prices. Free first where a free item fits, then the 101 module by number, then coaching. Same honesty rule as the numbers. Needs G1's final names and a copy pass, so it is the first build after today.

Decided: shared Slack invite link, instant and automated, editable in admin. Open: eight intake questions versus folding "done so far" into the profile after the first plan.

9Not today

10Done by midday, and what is waiting on you

Shipped to staging this morning, beyond the six goals:

Waiting on you, in the order they unblock things:

  1. Three SQL lines on staging Supabase (SQL Editor): the waitlists table from section 7, plus alter table public.profiles add column if not exists last_name text; and the avatar colour column from supabase/migrations/0004_avatar_color.sql. Until these run, Notify me, last name, and avatar colour do not save.
  2. G1: names and prices per Library card.
  3. G2: Stripe products and two test codes, keys in the document, the kickback rule.
  4. G3: the email tool.
  5. G4: the three coaching qualifying questions.
  6. G5: the production dashboards, section 6.
  7. Testimonials: the three quotes, roles, and approvals.
  8. Slack workspace address, if it is not wtfisai.slack.com.

11Checklist