Subscription Checkout
The Subscription Checkout page is the embedded in-concorbit payment form you land on after clicking a plan's "Continue to checkout" button. It mounts Stripe's PaymentElement directly inside the app. Your customer never leaves the concorbit URL, never sees a Stripe-branded redirect page, and card details go straight to Stripe's servers (concorbit only ever sees a payment-method reference).
URL: /settings/subscription/checkout (rendered via POST to /subscription/start-checkout, not a bookmarkable link)
Required permission: settings.tenant
How to get there
You don't navigate here directly. The flow is:
Go to Settings → Subscription.
Click Change plan (or Choose a plan during a trial).
Pick a tier and click Continue to checkout.
This POSTs to /subscription/start-checkout, which creates a Stripe subscription in incomplete or trialing state and hands back a client_secret. The checkout page is then rendered with that secret and the Stripe PaymentElement is mounted.
Attempting to GET the URL directly or refreshing mid-checkout will kick you back to the Subscription page, as the page is session-bound to a specific Stripe checkout session.
What you see
Order summary (top)
A simple card showing:
Plan: the tier you selected (concorbit, Pro, or Agency).
Billing:
monthlyorannual.Currency: usually GBP for UK tenants; taken from the product.
Today's charge: the amount that will be taken when you confirm. Displayed in the accent colour, large and central.
The three branches
The page renders one of three states depending on the Stripe response.
1. Payment required
The usual case. You see the Payment details card with Stripe's PaymentElement embedded, a unified form that accepts card, Apple Pay, Google Pay, Link, and other methods depending on your region and the customer's browser.
The form styles itself to match the concorbit dark UI automatically.
By confirming, you authorise concorbit to charge the card. Card details are sent directly to Stripe and never touch our servers; only a payment-method ID is stored on our side.
Click Pay £X to confirm. The button shows "Confirming…" while Stripe processes.
On success, you're redirected to
/settings/subscription?checkout=success. Webhooks update the tenant tier in the background.On failure (declined card, 3DS rejection, network blip), the error message is shown inline and you can retry without losing the payment form.
2. Trial extended: no payment needed
If you're on a trial and Stripe decides no payment is due today (the trial is extended and the first charge is later), the page shows a green "Your trial is active" card and a Back to subscription button. No card is required.
3. Stripe not configured
If the platform admin hasn't set STRIPE_KEY and STRIPE_SECRET in the environment, you see a red error card telling you exactly which env vars are missing. Contact the platform admin, as this is a platform-level configuration issue, not a workspace-level one.
Security
PCI scope is Stripe's, not ours. Card details are collected by Stripe's JavaScript running inside an iframe on our page. concorbit's servers receive only a Stripe
PaymentMethodID.3D Secure / Strong Customer Authentication is handled automatically. If the customer's bank requires SCA, Stripe surfaces the challenge inline before finishing the confirmation.
The client_secret in the session is single-use and expires. Refreshing the page creates a new session.
concorbit stores the Stripe customer ID and subscription ID against your tenant; no card data is persisted.
Cancelling mid-checkout
Click Cancel at the bottom-left (or the ← Back to subscription link at the top) to abandon checkout. The Stripe subscription in incomplete state will be automatically cleaned up by Stripe after a few hours if you never confirm. No charge is made.
Notes and gotchas
The return URL is fixed to
/settings/subscription?checkout=successso the Subscription page can show a confirmation flash after Stripe redirects back.Webhooks do the real work. The tier change in the tenant record, the invoice creation, and the seat count are all applied by Stripe webhook handlers, not by this page directly. There can be a few seconds of lag between "payment confirmed" and "workspace tier updated". The Subscription page will show the new tier on next load.
Declined cards can be retried right there on the form without having to start over.
Platform-owner workspaces cannot reach this page. They see an error saying their account doesn't require billing.
See Subscription & Billing for the broader plan-management flow, and Payments for connecting your own Stripe account to charge your customers.