Appearance
No-card trial playbook
Who this is for: Anyone copying SchoolRota signup and billing into another product (Inclusion Loop and later apps)
What you'll achieve: A trial that starts without a card, then converts from the owner billing screen
Canonical copy for other repos: docs/NO_CARD_TRIAL_PLAYBOOK.md. Slide version: docs/NO_CARD_TRIAL_BRIEFING.md. End-user SchoolRota steps: Sign up and start your trial.
Why
Card-at-signup stops organisation trials. Finance owns the card. The person who wants to try the product does not. This offer removes that gate:
Start a 30-day free trial. No card required. One trial per organisation.
Signup proves an organisation email and starts a workspace. Payment is later, in the owner billing screen. There is no automatic charge.
Do not put “no card required” on a clone’s public site until that clone’s signup, expiry, reminders, owner billing, and conversion all work.
Journey
/signupstores a pending signup and reserves the portal. No Stripe. No tenant.- Verify email (opening the link does not start the trial).
- Set a password. That creates the tenant, starts the 30-day clock, and signs them in.
- Owner continues in Admin → Billing with a card (usual path) or a purchase-order request (backup).
- During the trial, saving a card keeps the remaining free days. The first charge is the stored end date. After expiry, checkout charges when payment is confirmed.
- If they do not pay, they can still view and export. Editing and publishing pause. Billing stays open.
Rules every clone must keep
- Organisation email only. Personal inboxes are rejected on the public form.
- One trial per organisation. Colleagues are invited in.
- Consent names the plan, price, renewal, and first charge date.
- Invoice price is 12 times the monthly list. The annual-card saving is card-only.
- A purchase-order request does not restore editing.
- Checkout never creates a tenant.
- Production absolute links use
APP_URL, not a spoofable Host header.
Where it lives in SchoolRota
| Piece | Place |
|---|---|
| Trial length and reminder windows | packages/domain/src/billing-tiers.ts |
| Signup and activate | apps/web/src/app/api/signup/* |
| Conversion | apps/web/src/server/services/billing-conversion.ts |
| Access after expiry | apps/web/src/server/services/tenant-access.ts |
| Owner UI | Admin → Billing, ChoosePlanCard |
| Emails | packages/emails welcome + trial reminders |
| Cron | /api/cron/trial-lifecycle |
Do not copy duty-rota import or the setup wizard into Inclusion Loop. Copy only this control-plane path.

