# Flow 7 — Payments · Paywall & Upgrade · ~8 min · Oli=Chrome · Oscar=Firefox > When a free user runs out, the paywall must appear; paying must unlock the feature; "Maybe later" must charge nothing. This proves we can take money — and that we don't take it by accident. > ⚠️ **Before anyone tests real payment:** confirm we're in **Stripe TEST mode** (or a test path) so no one is charged real money. In test mode, the only card that works is **`4242 4242 4242 4242`**, any future expiry, any CVC, any ZIP. If you see a real charge prompt, **stop and tell Jorge** — do not enter a real card. **▶ Start here** - **Link:** no direct link — the **paywall** appears when you hit a **paid action** (Optimize/Download, Customize, or a 2nd interview) after your free runs are spent. Easiest trigger: start at `…/?startflow=ats`, optimize, and push to **Download**. - **Lands on:** the **paywall / upgrade modal**. - **Voice:** none in this flow. ## Preconditions - [ ] **P1.** Fresh Incognito window; sign up a brand-new user (Gmail +alias, e.g. `you+pay1@gmail.com`). - [ ] **P2.** Know the current free allowance: **prod = 0** (paywall on the *first* use). If you were given a build with 1 free run, the paywall appears on the *second* use instead — note which you saw. - [ ] **P3.** Have a **.docx résumé** ready (to trigger the ATS optimize, the easiest paid action). - [ ] **P4.** DevTools → Console open (F12). ## Stage 1 — The paywall appears ⭐ (P0) | # | Action | Expected result | |---|--------|-----------------| | 1 ⭐ | Go to **Fix my résumé (ATS)**, upload your .docx, let it score. | ATS score + four-pillar breakdown appears. | | 2 ⭐ | Click **Optimize / Download** (the paid action). | **Paywall modal** appears: **"You have used all your ATS Scans."** | | 3 ⭐ | Read the modal. | Three options: **Upgrade to Pro – $19.99/mo** · **Pay $5.00 for this ATS Scans** · **Maybe later**. Usage row shows **ATS Scans 0 left**. | | | | **RED FLAG** | the feature just *runs/downloads for free* with no paywall → report immediately (⭐). | ## Stage 2 — "Maybe later" charges nothing ⭐ (P0) | # | Action | Expected result | |---|--------|-----------------| | 4 ⭐ | Click **Maybe later**. | Modal closes. **No charge, no download, no unlock.** You're back where you were. | | | | **RED FLAG** | anything unlocks or downloads after "Maybe later". | ## Stage 3 — Pay-per-use ($5) unlocks once | # | Action | Expected result | |---|--------|-----------------| | 5 | Re-open the paywall → **Pay $5.00 for this ATS Scans**. | A choice card: **"Just this feature $5"** or **"Go Pro $19.99/mo"**. | | 6 | Choose **Just this feature $5**. | **Stripe Checkout** opens. **It must say `TEST MODE`** at the top, "$5.00 · Pay per use: ATS Scans", with a card form. | | 7 | Enter test card **`4242 4242 4242 4242`**, any future date, any CVC/ZIP → **Pay**. | Payment succeeds; you're returned to the app and the **ATS optimize completes / the download works**. | | 8 | Check the usage (avatar menu). | The feature is now usable for this run; the meter reflects the purchase. | | | | **RED FLAG** | no `TEST MODE` badge; card form asks for a real card; payment "succeeds" but the feature stays locked. | ## Stage 4 — Upgrade to Pro unlocks everything | # | Action | Expected result | |---|--------|-----------------| | 9 | Trigger the paywall again → **Upgrade to Pro – $19.99/mo** → Stripe (TEST) → pay with `4242…`. | Returns to the app; a **Pro / "Unlimited"** welcome shows. | | 10 ⭐ | Open the avatar menu. | Subscription reads **Pro**; the per-feature counters show the Pro allowance (not "0 left"). | | 11 | Use ATS / Customize / Interview again. | They run **without** a paywall (within the Pro plan). | | | | **RED FLAG** | still says "Free" / still paywalled after a successful Pro payment. | ## Stage 5 — It can't be bypassed (quick checks) | # | Action | Expected result | |---|--------|-----------------| | 12 | While **logged out** (Incognito, no account), try to reach a paid result. | You're stopped — sign-up/paywall, never a free paid result. | | 13 | Log out and back in as the Pro user. | Still Pro (the upgrade stuck). | | | | **RED FLAG** | a logged-out/anonymous user gets a paid result; Pro status lost after re-login. | ## Report 🐞 **Found a bug?** on any screen (talk or type) — or **Submit a run** with: **step # · browser · expected · actual · screenshot.** ⭐ = P0, report immediately. Note your free-allowance variant (0 vs 1) and your browser. --- *Automated mirror (for the dev/QA side, not testers): `node scripts/paywall-gate-check.js` (paywall fires), `node scripts/paywall-pay-check.js ats` (paying unlocks), `node scripts/paywall-anon-probe.js` (no anonymous bypass). Status board: `/dashboard` → 💳 Payments.*