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:
| # | Goal | Done looks like |
|---|---|---|
| G1 | The content is evaluated | Every item in the Library has its final name, its price, and its status. The manifest is the only list. |
| G2 | Paid playbooks take money | A signed-in person can buy a playbook with a card in Stripe test mode, and it flips to Yours. |
| G3 | The email situation is decided | One tool chosen, one place every capture lands, opt-in wording agreed. |
| G4 | The website is revised | Every offer on wtfisai.co points at the app, except 1:1 coaching, which has a qualifying form. |
| G5 | Production exists | app.wtfisai.co answers, with its own Supabase project, secrets, and the same code as staging. |
| G6 | The admin page is understood | You 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:
- The name that survives. Two known collisions: Playbook 01 WTF is Context versus Prompt vs Context vs Knowledge Base. Playbook 02 Which AI Tool versus Top 5 AI Tools.
- Free, priced, or coming. Price in dollars.
- Shelf it belongs on. Free, Playbooks, Courses, Work with Sheila.
- Whether the three career playbooks ship on day one.
- The blurb, if the current one reads wrong.
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:
- A
purchasestable: who, which item, Stripe session, amount paid, code used, referred by, bought at, expires at. - Stripe Checkout from the Buy button, in test mode first, with promotion codes enabled so discount codes work from day one.
- A webhook the Worker listens to. When Stripe says paid, the purchase is recorded and the item flips to Yours for that person.
- Paid files move out of the public bundle into a private Cloudflare R2 bucket. Downloads become short-lived links handed out only to buyers.
- Admin People cards show purchases and code used.
- 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):
- Create the products and prices for each paid item from G1. Test mode first.
- Create two promotion codes to test the affiliate pattern:
jessica-personal-50(50% off, restricted to one email) andjess-friend-50($50 off a course). - Give me the test secret key and the webhook signing secret, by adding them to the keys document, not in chat. I put them in the Worker as secrets.
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.
| Option | For | Against |
|---|---|---|
| Kit (the PRD's assumption) | Tags per path and per asset, sequences, creator-friendly | Another monthly bill, another login |
| Flodesk | Prettier emails, flat price | Weaker tagging and automation |
| Resend Broadcasts | Already set up for codes, one vendor, cheap | Young 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:
- Opt-in checkbox on the welcome screen, on by default with plain wording. Stored on the account. Shown in Admin.
- Every capture is synced to the tool with tags:
path:business,wait:course-101,bought:pb-02, and so on. - 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:
| Section | Today | Becomes |
|---|---|---|
| Hero CTA | Join the waitlist | Build my free plan -> app.wtfisai.co |
| Four ways | Community, 101, Office Hours, Training | Same four, but each card's button goes to the matching Library item in the app. Office Hours goes to the coaching form. |
| Waitlist modal | Five-step form | Kept only as Notify me when the 101 opens, feeding G3's tool |
| Our story CTA | Join the waitlist | Build my free plan |
| Footer | Done | Done |
| 1:1 coaching | A card | A 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:
- Supabase: create
wtfisai-prodin the same org. Then, exactly as on staging: Authentication -> Emails -> SMTP Settings with a new Resend key namedsupabase-production, senderhello@wtfisai.co. Both templates get the code body. Rate limit to 100. Site URLhttps://app.wtfisai.co. Leave sign-ups on. Run migrations0001and0002in the SQL editor. - Keys document: add the production Project URL, publishable key, and secret key.
- Cloudflare: Workers & Pages -> Create -> Import repository ->
wtf-app. Namewtf-app, branchmain, buildnpm run build:production, deploynpx wrangler deploy --env production, non-production branch builds off. - 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
- The plan agent's copy and the "Prepare for the AI economy" pass on the app screens
- The iOS app
- Course video (Storylane recordings are days away)
- Emailing the plan, and the intro video
- Merch, and any cart
- Slack automation for community access
10Done by midday, and what is waiting on you
Shipped to staging this morning, beyond the six goals:
- Desktop shell: collapsible left sidebar, full mark open and starburst mark closed, submenus, Profile and Settings at the bottom, avatar menu top right with Profile, Settings, Admin, Sign out
- Community as a primary menu item with its own landing page ("We built the table. Your seat is ready.") and an Open Slack submenu link for admins
- Settings screen: email, avatar colour picker (cyan, pink, light purple, dark purple), marketing opt-in placeholder, purchases placeholder
- Profile captures last name; avatar shows one letter until both names exist
- Testimonials section with three placeholders (Michelle Rubin, Wisers, Ashleigh) on the welcome screen and the community page, feeding the website later
- Admin: renamed Administrative CRM, submenu Staging and Live CRM, blank fields as a grey dash, name fields on every card, admin routes switched off in production by policy
- Copy: path screen headline and cards, founder line removed, Tandem footer line, share card "Education to prepare for the AI economy", unf*ck glitched on the Free shelf
- Website: Tandem footer line, proceeds wording, chart fixed on phones
Waiting on you, in the order they unblock things:
- 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 fromsupabase/migrations/0004_avatar_color.sql. Until these run, Notify me, last name, and avatar colour do not save. - G1: names and prices per Library card.
- G2: Stripe products and two test codes, keys in the document, the kickback rule.
- G3: the email tool.
- G4: the three coaching qualifying questions.
- G5: the production dashboards, section 6.
- Testimonials: the three quotes, roles, and approvals.
- Slack workspace address, if it is not wtfisai.slack.com.
11Checklist
- G1 Names and prices decided, manifest updated, Source lines removed
- G2 Stripe products created in test mode, keys in the document
- G2 Purchases table, Checkout, webhook, R2 gating built and tested end to end
- G2 Referral kickback rule decided
- G2 The Community item: $10/month subscription or included with a course, instant Slack link, editable in admin
- G3 Email tool decided
- G3 Opt-in on welcome, sync with tags, website form connected
- G4 Site CTAs point at the app, coaching form live
- G5 Production Supabase created and configured, migrations run
- G5 Production Worker deployed,
app.wtfisai.coanswers, signed in once - G5 Gate decision made
- G6 Admin feedback given and fixed, Michelle added if wanted