Plans and billing
Sandbox is free and has small limits. Production is $29 a month, paid through Stripe, and the switch only happens once the payment does.
Every account starts on Sandbox: every module, small limits, no card. When Glow Salon's app is ready for real customers, Sarah's developer moves the account to Production — more capacity, soft enforcement, and a bill.
Two plans
| Sandbox | Production | |
|---|---|---|
| Price | Free | $29 / month |
| Enforcement | Hard — writes over a limit are refused | Soft — warned by header, never refused mid-request |
| Capacity | Small (10 users, 1 location, 10k custom-data records, 1 GB files…) | Meaningful (1M API requests, 5k clients, 1M records, 50 GB…) |
The exact numbers, and what your account has used of them, are on the console's Billing page.
Going to Production
On Billing, choose Switch to Production and confirm Continue to checkout. You're taken to Stripe Checkout; nothing about the account changes until Stripe confirms the payment. When it does, the subscription switches, the limits change, and the plan card shows Production with its renewal date.
One card, one account
Billing is per account, not per application or environment. Every application you build under the account shares the plan and its limits.
Managing the card and invoices
Manage billing on the plan card opens the Stripe billing portal — update the card, download invoices, cancel. The link is short-lived; open it again when you need it.
Going back to Sandbox
Switch to Sandbox doesn't cut you off: a paid subscription ends at the close of the period you've paid for, and the account moves to Sandbox then. The plan card shows the date. The usual downgrade rule applies now, though: if the account's current usage (active locations, clients, records, storage…) doesn't fit Sandbox's limits, the switch is refused with what to reduce first. We never put an account onto a plan it is already over.
When a payment fails
Stripe retries over a few days. Meanwhile the Billing page shows a Payment failed notice, and the account's owners get an email with the portal link. Nothing else changes yet — the API keeps working on Production limits.
If Stripe gives up, the subscription ends and the account lands on Sandbox with a Subscription ended notice; the owners are told. Subscribing again is the same Checkout flow.
From code
The platform SDK exposes the same actions for your own tooling: platform.plans(),
platform.subscription.get(), platform.subscription.change(plan) — which answers with
a Checkout URL for a paid plan or a scheduled date when leaving one — and
platform.billing.portal().