Plan changes
Upgrades, downgrades, cancelling at period end, and how limits roll out.
Upgrades
Upgrades invoke Stripe proration. LogoRouter persists the mapped plan id immediately when customer.subscription.updated lands. Usage meters keyed to the Stripe billing anchor inherit the elevated limits as soon as the webhook updates Postgres + busts KV.
Downgrades
Downgrades can be effective next cycle (cancel_at_period_end, swap schedule) or immediate depending on Stripe configuration. LogoRouter computes feature access from the stored plan row — downgrade delays are honoured when Stripe emits the schedule events.
Edge cases
- Meter carry-over — previous cycle counts do not rewind; budgets reset based on metering rules (UTC day anchors + Worker DO counters).
- Batch-heavy workloads — if you downgrade batch limits mid-period, queued jobs may partially fail — bake defensive checks clientside.
Cancellations
| Intent | Behaviour |
|---|---|
Cancel future renewals (cancel_at_period_end) | Entitlement stays paid until Stripe marks invoice paid for final period window |
| Immediate cancel | Ends subscription now; downgrade follows webhook ingestion |
Always confirm with Stripe invoices rather than dashboards alone — Stripe data remains canonical.
Plan compare matrix
Prefer live numbers on /pricing — this docs page focuses on entitlement resolution ordering.
Related: Billing overview · Payment failures