Products Not Loading
Symptom:fetchProducts() returns an empty array or throws an error.
Wrong API key prefix
Wrong API key prefix
- Sandbox:
zs_pk_test_... - Live:
zs_pk_live_...
No products created in the current environment
No products created in the current environment
Products not checkout-ready
Products not checkout-ready
fetchProducts().Fix: On the dashboard, check that each product has a web price configured. For BYOS users, ensure your Stripe catalog mapping is complete — see Stripe Catalog.Network or authentication error
Network or authentication error
- Invalid or expired API key
- Network connectivity issues
- Backend server temporarily unavailable
Payment Sheet Not Appearing
Symptom: CallingcheckoutSheet or triggering a purchase does nothing — no payment UI is shown.
Web checkout disabled for jurisdiction
Web checkout disabled for jurisdiction
isWebCheckoutEnabled on the product or call fetchProducts() and inspect the jurisdictionConfig. Enable web checkout for the target jurisdiction on the dashboard.Missing product selection
Missing product selection
checkoutSheet modifier requires a non-nil item binding. If selectedProduct is never set, the sheet won’t present.PaymentIntent creation failed
PaymentIntent creation failed
- The product doesn’t have a valid Stripe price mapping
- The Stripe account isn’t fully onboarded
- The API key doesn’t match the product’s environment
Apple Pay Not Working
Symptom: The payment sheet appears but Apple Pay is not available as a payment option.Payment method domain not registered
Payment method domain not registered
Device or simulator limitations
Device or simulator limitations
- A real device (not the iOS Simulator for web-based Apple Pay)
- Apple Pay configured with at least one card in Wallet
- A supported region
Country mismatch
Country mismatch
merchant_country parameter must match the Stripe connected account’s country. A mismatch will cause Apple Pay to silently fail.Fix: This is handled automatically by ZeroSettle — the backend resolves the country from your Stripe account. If you suspect an issue, check your Stripe account country in the Stripe dashboard.Entitlements Not Updating
Symptom: After a successful purchase,restoreEntitlements() doesn’t return the new entitlement.
Webhook not yet delivered
Webhook not yet delivered
payment_intent.succeeded. There can be a short delay (usually under 5 seconds).Fix: Call restoreEntitlements() again after a brief delay, or use the delegate callback zeroSettleEntitlementsDidUpdate for real-time updates.User ID mismatch
User ID mismatch
userId passed during checkout. If you use a different user ID when restoring, the entitlements won’t match.Fix: Ensure the same userId is used consistently across bootstrap(), checkoutSheet, and restoreEntitlements().Sandbox/Live environment mismatch
Sandbox/Live environment mismatch
Checkout URL Not Loading
Symptom: The payment sheet opens but shows a blank page or loading error.Network connectivity
Network connectivity
WKWebView restrictions
WKWebView restrictions
Stripe account not fully onboarded
Stripe account not fully onboarded
Universal Links Not Working
Symptom: After completing checkout in Safari, the app doesn’t reopen or the transaction result is lost.apple-app-site-association not configured
apple-app-site-association not configured
apple-app-site-association file hosted at your domain.Fix: Follow the complete Universal Links setup guide.App not installed from App Store or TestFlight
App not installed from App Store or TestFlight
Associated Domains capability includes applinks:yourdomain.com.Missing .zeroSettleHandler()
Missing .zeroSettleHandler()
iOS caching
iOS caching
swcutil on a Mac to clear the cache.Delegate Not Called
Symptom: Purchase succeeds butzeroSettleCheckoutDidComplete is never called.
Delegate not set
Delegate not set
Delegate object deallocated
Delegate object deallocated
@StateObject or a singleton pattern to prevent deallocation.Using Safari checkout without universal links
Using Safari checkout without universal links
StoreKit Sync Issues
Symptom: StoreKit purchases aren’t being tracked in the ZeroSettle dashboard.syncStoreKitTransactions disabled
syncStoreKitTransactions disabled
syncStoreKitTransactions: false during configuration (e.g., because you’re using RevenueCat), StoreKit transactions won’t be forwarded to ZeroSettle.Fix: If you want ZeroSettle to track StoreKit purchases, set syncStoreKitTransactions: true (the default).JWS verification failure
JWS verification failure
Debug Logging
Enable verbose SDK logging to diagnose issues:[ZeroSettle]— General SDK events (configure, bootstrap, product fetch)[ZSCheckout]— Checkout flow events (PaymentIntent creation, sheet presentation, callbacks)[ZSMigrateTipView Business Logic]— Switch & Save visibility decisions[ZSStoreKit]— StoreKit sync events (transaction forwarding, verification)

