# Plans and Checkout — BrandApp Playground

> Plan catalog, hosted checkout, entitlement verification, and subscription cancellation.

- Canonical page: https://brandapp-playground.vercel.app/plans
- Markdown: https://brandapp-playground.vercel.app/plans.md
- SDK module: `@reopt-ai/brandapp-sdk/plans`

## Flow

1. `sdk.plans.list()` — the catalog, Basic Auth, fetched server-side.
2. `sdk.plans.getMyPlan()` — the signed-in customer's current plan, Bearer.
3. `sdk.plans.createCheckout()` — redirects to a checkout page on `id.reopt.ai`.
4. The browser returns to `/plans/return`, where the entitlement is verified.
5. `sdk.plans.cancel()` — reports the provider, the remaining access period, and whether
   the provider-side cancellation succeeded.

## Payment modes

With real payment disabled (the default), checkout returns a sandbox virtual-payment page,
so the whole list → subscribe → pay → entitlement loop runs with no payment provider
setup at all.

Against a hosted BrandApp in `live` mode, Paddle handles both recurring subscriptions
(`monthly`, `yearly`) and one-time purchases (`once`, `lifetime`) through an overlay on
`id.reopt.ai`. Zero-amount plans keep using the virtual checkout even in live mode. Toss
live mode is not supported by SDK checkout and returns `LIVE_MODE_UNSUPPORTED`.

## Related

- [Terms and Consents](https://brandapp-playground.vercel.app/terms.md)
- [Authentication](https://brandapp-playground.vercel.app/auth.md)
- [Health Check](https://brandapp-playground.vercel.app/health.md)

---

Index of every document: https://brandapp-playground.vercel.app/llms.txt
Single-file copy: https://brandapp-playground.vercel.app/llms-full.txt
HTTP API description: https://brandapp-playground.vercel.app/openapi.json
