Skip to main content
The ZeroSettle dashboard is where you manage everything that doesn’t require a code change — products, pricing, checkout behavior, promotions, and migration campaigns. Changes take effect immediately without an app update.
New to ZeroSettle? Start with Account Setup for a step-by-step walkthrough of creating your account, connecting Stripe, and adding your first product.

API Keys

Your dashboard provides two publishable keys:
Key prefixModeDescription
zs_pk_test_SandboxNo real charges. Use during development.
zs_pk_live_LiveReal payments processed via Stripe.
Pass your key to the SDK at launch:
ZeroSettle.shared.configure(.init(
    publishableKey: "zs_pk_live_..."
))
The key prefix determines sandbox vs live mode — there is no separate environment setting.

Products

Create and manage your product catalog from the dashboard. Each product has:
FieldDescription
Product IDMust match your App Store Connect product identifier (e.g., com.app.premium_monthly)
Display nameShown to users in the checkout UI
DescriptionProduct description
TypeAuto-renewable subscription, non-renewing subscription, consumable, or non-consumable
Web priceThe price charged via web checkout (independent from App Store pricing)
Synced to ASCWhether this product also exists in App Store Connect for StoreKit purchases
Products are fetched by the SDK via fetchProducts() and returned as a ProductCatalog:
let catalog = try await ZeroSettle.shared.fetchProducts(userId: user.id)

for product in catalog.products {
    print("\(product.displayName): \(product.webPrice.formatted)")
}

Dual Pricing

Web prices are set independently from store prices. This lets you pass platform fee savings on to customers (or keep the margin). The SDK provides both prices so you can show a comparison in your paywall:
  • product.webPrice — the web checkout price you set on the dashboard
  • product.storeKitPrice — the App Store price, fetched from StoreKit on-device (iOS)
  • product.playStorePrice — the Google Play price (Android)

Checkout Configuration

Control how the checkout UI is presented — no code change required. The SDK reads this configuration automatically when you call fetchProducts().

Checkout Branding

Customize the look of your checkout — upload your logo, app icon, and set your brand colors.

Checkout Type

Choose one of three checkout modes:
ModeValueDescription
Payment SheetwebviewEmbedded WKWebView inside your app. Best conversion rates.
In-App Safarisafari_vcSFSafariViewController within your app.
External SafarisafariOpens the user’s default browser. Requires universal links.

Jurisdiction Overrides

Override the checkout type and enable/disable web checkout per jurisdiction:
JurisdictionCountries
USUnited States
EUEU member states
ROWRest of world (default)
The SDK automatically detects the user’s jurisdiction via StoreKit’s Storefront.current and applies the matching override. If no override is set, the global default is used. For example, you might use webview globally but disable web checkout in the EU:
// The SDK handles this automatically — no code needed.
// Just configure it on the dashboard.

// In your app, check before showing web checkout UI:
if ZeroSettle.shared.isWebCheckoutEnabled {
    // Show web checkout button
} else {
    // Fall back to StoreKit
}

Enable / Disable

You can disable web checkout entirely (globally or per jurisdiction) from the dashboard. When disabled, isWebCheckoutEnabled returns false and calling purchase() throws webCheckoutDisabledForJurisdiction. Use this to gracefully fall back to StoreKit.

Promotions

Create promotional pricing for any product. The SDK returns active promotions alongside products, so your app can display them automatically. Each promotion has:
FieldDescription
Display nameLabel shown to users (e.g., “Launch Sale”)
Typepercent_off, fixed_amount, or free_trial
Promotional priceThe discounted price during the promotion
ExpirationOptional expiry date (nil = no expiration)
Access promotions via the product:
if let promo = product.promotion {
    print("\(promo.displayName): \(promo.promotionalPrice.formatted)")
}

Migration Campaigns

If your app currently uses StoreKit subscriptions and you want to migrate users to web checkout, the dashboard lets you create a migration campaign.

How It Works

  1. Enable migration on the dashboard and configure the campaign
  2. Set the offer — choose the product and discount percentage
  3. Customize messaging — set the title and message shown to eligible users
  4. The SDK identifies eligible users (those with active StoreKit subscriptions) and returns the campaign data in ProductCatalog.config.migration

Campaign Fields

FieldDescription
Product IDThe product to offer for migration
Discount %Discount off the web price (e.g., 20 for 20% off)
TitlePrompt heading (e.g., “Save 20% on your subscription”)
MessagePrompt body explaining the offer

Using Migration Data

The SDK provides a built-in ZSMigrateTipView widget, or you can build your own UI:
let catalog = try await ZeroSettle.shared.fetchProducts(userId: user.id)

if let migration = catalog.config?.migration {
    // Show migration prompt to eligible users
    print("\(migration.title): \(migration.discountPercent)% off")
}
After a successful migration purchase, track the conversion:
try await ZeroSettle.shared.trackMigrationConversion(userId: user.id)
See StoreKit Integration for the full migration guide. For detailed dashboard configuration options — rollout percentage, eligibility targeting, and analytics — see Campaigns & Offers.

Stripe Integration

ZeroSettle supports two payment modes. Choose one during onboarding:

Managed (Default)

Connect via Stripe Express. ZeroSettle creates and manages Stripe products and prices for you automatically. Payouts go directly to your bank account. This is the fastest way to get started — no Stripe product setup required.

Bring Your Own Stripe (BYOS)

Connect your own standard Stripe account via OAuth. Use your existing Stripe products and prices, and retain full access to your Stripe dashboard for reporting, analytics, and customer management. In BYOS mode, you must map each ZeroSettle product to its corresponding Stripe product and price using the Stripe Catalog. Without a mapping, ZeroSettle won’t know which Stripe price to charge at checkout.

Stripe Catalog

Map your Stripe products and prices to their ZeroSettle counterparts (BYOS only).
You can switch between Managed and BYOS modes at any time from your tenant settings. Existing Stripe Catalog mappings are preserved when switching back.

What Requires a Code Change?

Most configuration is dashboard-driven. Here’s a quick reference:
ChangeDashboardCode
Switch checkout typeYesNo
Change web pricingYesNo
Create/end promotionsYesNo
Enable/disable web checkoutYesNo
Launch migration campaignYesNo
Add a new productYesNo
Add the SDK to your appNoYes
Choose isPresented: vs item: APINoYes
Handle purchase resultsNoYes
Set up universal links (Safari flow)NoYes

Cancel Flow

Configure cancellation questionnaires and retention offers to reduce churn — all from the dashboard.

Cancel Flow Configuration

Set up questions, retention offers, and pause options from the dashboard.
For SDK integration, see Cancel Flow UI — Cancel Flow.