Billing
Capacitor uses Stripe for subscription billing. Upgrade your tier to unlock more chargers, higher API limits, advanced OCPP commands, and webhook events.
Tiers
| Tier | Price | Chargers | API calls/day | OCPP Commands | Webhooks |
|---|---|---|---|---|---|
| Free | £0 | 1 | 50 | Basic | No |
| Starter | £29/mo | 5 | 1,000 | All | Yes |
| Growth | £159/mo | 100 | 10,000 | All | Yes |
| Scale | Custom | Unlimited | Unlimited | All | Yes |
Free tier includes: register/list/delete chargers, view status, remote start/stop, and list transactions. Upgrade to Starter for full OCPP command access and webhook events.
Create checkout session
/api/v1/billing/checkoutCreate a Stripe Checkout session to upgrade your tier. Returns a URL to redirect the user to.
{"tier": "starter"}
{"url": "https://checkout.stripe.com/c/pay/cs_test_..."}
starter, growth. This endpoint requires Firebase Auth (portal only). Redirect the user to the returned URL to complete payment.Customer portal
/api/v1/billing/portalCreate a Stripe Customer Portal session. Users can manage their subscription, switch plans, update payment method, cancel, and view invoices.
{"url": "https://billing.stripe.com/p/session/..."}
Billing status
/api/v1/billing/statusGet the current billing status for your organisation.
{"tier": "starter","stripeCustomerId": "cus_abc123","hasSubscription": true,"currentPeriodEnd": "2026-03-10T00:00:00.000Z"}
Stripe webhooks
/api/v1/billing/stripe-webhookReceives Stripe webhook events. This is a public endpoint — no authentication required, but the Stripe signature is verified.
Handled events:
| Event | Action |
|---|---|
checkout.session.completed | Upgrade tier, sync API keys, send confirmation email |
customer.subscription.updated | Sync tier on plan change (e.g. Starter → Growth) |
customer.subscription.deleted | Revert to Free tier, send downgrade email |
invoice.payment_failed | Log warning, send payment failed email |
Cancellation
Subscriptions are cancelled at the end of the current billing period (not immediately). During the remaining period, users retain access to paid features. When the period ends, Stripe fires customer.subscription.deleted and the account reverts to the Free tier.
Payment failures
When a payment fails, Stripe automatically retries over ~3 weeks (dunning). The account is not immediately downgraded. If all retries fail, the subscription is cancelled and the account reverts to Free. A payment failed email is sent to the account owner with a link to update their payment method.