Billing & paywall — Regression Test
Prerequisites
- To reach trial-ended / paywall states quickly, use the QA short-trial links (1-min / 5-min trials) described in Test the trial-ended experience. To reach a usage-quota paywall fast in a non-prod build, open Settings → QA: under QA Entitlements set the plan to Free (the Basic tier) and click Apply, then under Seed usage near limit pick the feature you want to test (meetings captured, voice memos, note AI suggestions, etc.) and click Set count to limit - 2 — this puts you two actions below the cap. (Limits only enforce when QA Entitlements shows
enforcement=true— it is gated per environment, so a local dev backend may have it off.) - Use Stripe test cards for the checkout steps.
Steps
Changed in 5.0.0. A new signup starts on Free — there is no automatic trial any more. The free month is claimed with a card, and paywalls close only via the X (the "Not now" link is gone). Steps 1–4 are new; run them on a brand-new account.
- Sign up as a brand-new account and let the workspace paint. You do not need a new Google address —
reset the one you have with the four steps in
First run to first payment, and use
a private window if you are testing the web app.
- The sidebar card reads Basic Plan — no trial label and no countdown
- A full-screen welcome offer appears a beat after home paints, offering a free month
- Dismissing it with the X leaves the app usable, and relaunching does not ask again on this machine
- Re-open the offer with the Start your trial for $0 button on the Basic Plan card.
- The offer is still available — dismissing never withdraws it
- The badge, the call to action and the timeline all say the same number of free days (30), and the timeline names the date the plan begins
- Take the claim and complete it with a Stripe test card.
- The payment pane says $0 today and names the first charge date, matching the timeline
- A success/celebration state lands and the Basic Plan card disappears — a trialing subscription is premium-granting, so the pill hides rather than relabelling. Confirm Premium in Settings → Plans and Billing
- Stripe dashboard: one subscription in trialing, first invoice deferred 30 days, amount 0
- Relaunching shows no further offer — no welcome ask, no popup, no CTA pill
- On a separate Free account, open Settings → Usage.
- Rows read Meetings, Dictation, Voice memos, Mono, History
- Counts match what you have used, and renewal dates are your local calendar day
- On an account with an active trial (claimed above, or a QA short-trial link), look at the sidebar card.
- It shows the plan name with a "· Trial" label and days-remaining
- An Upgrade action is present
- Trigger a quota limit on Basic (e.g. exceed the monthly meeting limit, or hit the voice-memo / AI-suggestion limit — seed it via QA Entitlements → Seed usage near limit as above, then perform a couple more actions to cross the cap).
- A paywall modal appears with a feature-specific title and value prop
- It closes only via the X — there is no "Not now" link, and the action stays blocked
- From the paywall (or Settings → Plans and Billing), click View plans / Upgrade.
- The Basic (Free) and Premium ($14/month) plan cards are shown (Member is a gifted tier, not a purchasable card), with an Upgrade to Premium action
- Start the upgrade and complete Stripe checkout with a test card.
- The "Secure checkout" flow processes, then a "You're Premium now" success dialog shows
- After closing, the sidebar no longer offers an upgrade, and the premium-success banner appears
- (Premium) Open Settings → Plans and Billing and click Manage subscription.
- The Stripe billing portal opens in the browser
- The renewal date / next charge is shown
Variations
- Let a 1-minute QA trial expire, then try a Premium-gated action.
- The trial badge clears and the paywall blocks the gated feature
- (Free tier) Open a meeting note older than 30 days. (Seed one in a non-prod build via Settings → QA → Seed backdated note; see the Notes management regression test for the full QA setup, including the
enforcement=truerequirement.)
- The note is locked with an "Unlock all notes" prompt
- On desktop, complete a Stripe checkout but interrupt connectivity right after paying, before the
app confirms it (e.g. disconnect the network for a few seconds during the return from checkout).
- A failure toast with a Retry button appears, instead of the account being silently left unconfirmed
- Retry completes the confirmation once connectivity returns, and the account lands on Premium