Dashboard Checklist
- Stripe live onboarding complete (Managed: Express details submitted; BYOS: Standard account connected and authorized)
- Live publishable key generated (
zs_pk_live_...) - Products created with correct web prices
- Checkout branding configured (logo, app icon, brand colors)
- Checkout type set per jurisdiction (
webviewrecommended for US) - Web checkout enabled for target jurisdictions
Code Checklist
- Using live publishable key (not
zs_pk_test_) - Universal link handler configured (required for Safari checkout flow)
-
restoreEntitlements()called on app launch (or viabootstrap()) - Purchase error handling implemented in delegate
- Entitlement delegate callback updating UI (
zeroSettleEntitlementsDidUpdate) - Fallback to StoreKit / Play Billing when
isWebCheckoutEnabledisfalse
App Store / Play Store Checklist
- External Purchase Link entitlement approved by Apple (required for US)
- Disclosure modal implemented (Apple requires showing a modal before link-out in Safari flows)
- Google Play alternative billing option configured
- App review submitted with external purchase flow documented
The disclosure modal is only required for the Safari checkout flow. If you’re using the payment sheet (
webview) exclusively, you can skip this step.Final Testing
- Full purchase tested end-to-end in sandbox with a test card
- Tested on a physical device (not just simulator)
- Tested restore on a fresh install / new device
- Tested cancel and refund flows
- Tested with web checkout disabled (StoreKit / Play Billing fallback works correctly)
Going Live
Once all checklists are complete:- Switch your key — replace
zs_pk_test_...withzs_pk_live_...in your app configuration - Deploy your update — ship the app update through the App Store or Play Store
- Verify your first transaction — make a real purchase and confirm it appears in the dashboard under live mode
- Monitor — watch the dashboard for transaction volume, errors, and webhook delivery
The key prefix is the only thing that changes between sandbox and live. No other code changes are needed.

