# Creating Products
Source: https://superwall.com/docs/web-checkout/web-checkout-adding-a-stripe-product
Create products in Stripe or Paddle (private beta) to show on your web paywalls.
Paddle support is currently in private beta. Contact your Superwall representative to enable it, then follow the [Paddle setup guide](/dashboard/web-checkout/web-checkout-paddle-setup).
### Adding products
Once your app is configured with Stripe or Paddle, you can create products in your provider of choice to show on your web paywalls. To get started, **click** on **Products** from the overview page:

Complete your provider setup first:
* **Stripe:** Follow the steps in [Configuring Stripe Keys and Settings](/web-checkout/web-checkout-configuring-stripe-keys-and-settings).
* **Paddle (private beta):** Follow the steps in [Configuring Paddle Keys and Settings](/web-checkout/web-checkout-paddle-setup).
Next, **click** on the **+ Import Products** button in the top right corner:

You'll be given a choice to add either a:
1. **Live Product:** These are for production purchases and flows.
2. **Sandbox Product:** These are for testing purchases and flows.

Superwall supports both sandbox and live products. To learn more about their differences, here's a
good overview from [Stripe's documentation](https://docs.stripe.com/test-mode).
### Using Stripe products
If you've already created products in Stripe, you can import them into Superwall now. All you need to do is select the "Product" and the rest of the fields should automatically populate with its data when you select them. You will need to choose which entitlement or entitlements a product should grant a user access to:

Once you're done **click** on the **Save** button and your product is ready to be used in a paywall.
### Creating new products in Stripe
To create new products, **click** on the **Create Product in Stripe** link:
{" "}
From there, fill in all of the fields presented to you in Stripe:
1. **Name:** The product name, i.e. "Pro", "Premium", etc.
2. **Description:** A description of the product, this will show up in checkout.
3. **Image:** An image representing the product, this will show up in checkout. Optional.
4. **Product tax code:** The tax code classification for the product. Refer to your territories tax codes for more information.
5. **Recurring vs One-off:** For subscriptions, choose "Recurring", whereas one time purchases or consumables should be "one-off" products.
6. **Amount:** The price of your product, and what it will renew at if it's recurring.
7. **Billing period:** The billing period for the product, i.e. "Monthly", "Yearly", etc.

Once you've finished filling out pricing details, product name and all other metadata, **click** on the **Add product** button at the bottom right of the form. You should be redirected to your Stripe products page:

Now, when you return to Superwall, select your product from the **Products** drop down, and when you select the other fields, Superwall will pull in the data for you (aside from trials, which you choose when adding a Stripe product). Here, the new "Scores Annual" product created in Stripe shows up in the products menu now:

Be sure to associate the correct entitlement to the product as well.
### Using Paddle products (private beta)
If you're part of the Paddle beta, the import flow mirrors Stripe. Choose **Paddle** as the provider when importing, then select the product to pull in its data. Paddle sandbox and live products are labeled so you can keep environments separate. For more specifics on Paddle credentials, see [Configuring Paddle Keys and Settings](/web-checkout/web-checkout-paddle-setup).
You can also create new products directly from Paddle by visiting the Paddle dashboard. Define subscription plans and prices there, then return to Superwall and import them into your paywall.
### Adding products to paywalls
Adding Stripe or Paddle products to web paywalls works the exact same way as it does for mobile paywalls. Check out the docs [here](/paywall-editor-products). For a quick overview:
1. Open the paywall editor.
2. On the left sidebar click on **Products**.
3. Choose the products to add, as in the image below:

Keep in mind that to test products, it's as simple as adding a test product to a paywall and performing the checkout flow. For more information, please refer to [Testing purchases](/web-checkout/web-checkout-testing-purchases).
### Sandbox products
Sandbox products are used to test purchases. When you create one, you can add it to any web paywall to test check out flows. You create sandbox products the same you create other products, just choose "Sandbox Product" when creating a product. You'll see a sandbox banner at the top of Stripe when you create these types of products:

Once you've created a sandbox product in Stripe, import them to Superwall the same way as you would a normal product, and then they are ready for use in a paywall. Within the products page, Superwall will show which environment each product belongs to:

When testing with sandbox products, you can see their details in the Overview page. **For this to work, all products on a paywall must be test products.** Put differently, the sandbox metrics won't show here if you mixed and matched live and sandbox products on the same paywall when testing:

### Free trials
Trials are controlled by Superwall, they are not set up in Stripe. When you go to add a product, you choose the terms. You can also reuse the same product ID multiple times to create different trial lengths. This is a powerful capability, as it avoids the need to create a similar product over and over just to offer different trial terms. For example, you can use the same product ID with a one week trial, no trial, 3 day trial, and any other terms you need — these will all be represented as individual products you can add to paywalls.
---
# Stripe Setup
Source: https://superwall.com/docs/web-checkout/web-checkout-configuring-stripe-keys-and-settings
Create your Stripe keys to connect Superwall to Stripe. Fill out some settings to configure your app.
Once you've created a [Stripe app](/web-checkout-creating-an-app), you'll need to configure it with your Stripe keys and fill in a few settings. This is a one-time setup that connects Superwall to Stripe. The easiest way to get started is to click on the link in your overview page, which will take you to your app's [Settings](/overview-settings) page:

### Application settings
Fill out metadata about your iOS app in this section.

1. **Icon:** An icon to represent your app, we recommend using the same one that your iOS app does. This will appear on the checkout and subscription management pages.
2. **Application Name:** The name of your app, we recommend using the same name as your iOS app.
3. **Support URL:** A URL to your support page. This will be shown on the checkout and subscription management pages.
4. **Support Email:** An email you provide customers for support questions and general reach out
5. **Redeemable on Desktop:** If your app is an iPad app on Mac, enable this option so that users can redeem products on their Mac. If you aren't using iPads Apps on the Mac, you can disable this. If this is disabled, Superwall enforces redemption on an iOS device.
Once you've filled out this information, **click** on the **Update Application** button.
### Post-Purchase Behavior
Configure what happens after a user completes a purchase on the web:

**Redeem (Default)**: Superwall manages the entire redemption flow. Users are automatically deep linked to your app with a redemption code, with fallback to the App Store/Play Store if the app isn't installed. This is recommended for most apps.
**Redirect**: Redirect users to your own custom URL with purchase information passed as query parameters. Use this when you need to:
* Show a custom success or onboarding page
* Perform additional verification or actions before redemption
* Integrate with your own deep linking infrastructure
When using Redirect mode, you'll need to provide a **Redirect URL** (must start with `https://`). Purchase data will be appended as query parameters:
* `app_user_id` - User's app identifier
* `email` - User's email address
* `stripe_subscription_id` - Stripe subscription ID
* Any custom placement parameters you've set
Learn more about [post-checkout redirecting](/sdk/guides/web-checkout/post-checkout-redirecting).
### Web Paywall Domain
This is the domain your paywalls will be shown from. This was set when the Stripe app was created, and cannot be changed.

### Stripe Live Configuration
This section allows you to connect Stripe keys with Superwall. You will need:
1. **Publishable Key:** A Stripe publishable key. Stripe creates this key for you, you don't need to generate it yourself.
2. **Secret Key:** A Stripe secret key that you create. Once you've made one, paste it here.
To access these, click on the **[API Keys](https://dashboard.stripe.com/apikeys)** link:

Under **Restricted Keys**, click on **+ Create restricted key**:

Choose "Providing this key to another website" and click **Continue ->**:

Use "Superwall" as the name and "superwall.com" as the URL, then click **Create restricted key**:

You'll get a modal of your restricted key, **copy this to your clipboard**, you won't be able to view it again:

From there, copy your **Publishable Key** and **copied key** from the Stripe dashboard to Superwall:

Once you've provided those two keys, **click** on **Update Configuration** to save your changes. This section should say "Configured" at the top right if setup was successful:

### Stripe Sandbox Configuration
For the sandbox configuration, you'll follow the same previous steps, **except you retrieve the keys from this link**: [Stripe Sandbox API Keys](https://dashboard.stripe.com/test/apikeys).
You should see something similar to this:

Paste the both the **Publishable Key** and **Secret Key** into Superwall for each respective field and **click** on the **Update Configuration** button. As before, this section should say "Configured" at the top right if setup was successful.
### iOS configuration
Superwall uses the details here to handle deep links back to your app after a purchase occurs. **All of this information is required.**

1. **Apple Custom URL Scheme:** Add your app's custom URL scheme. If you haven't set on up, read [here for instructions](/in-app-paywall-previews).
2. **Apple App ID:** Your iOS app's ID. If you're unsure of your app's ID, you find it in **[App Store Connect](https://appstoreconnect.apple.com) -> Select your App -> General -> App Information -> Apple ID**:

3. **Bundle ID:** Your iOS app's bundle ID. You can find this in Xcode -> Targets -> General -> Identity -> Bundle Identifier.
4. **Team ID:** The team ID that your iOS app belongs to. To find this, visit **[Apple Developer](https://developer.apple.com) -> Account -> Membership details -> Team ID**. It's obscured here, but it'll be where the arrow points in the image below:

### Confirm setup
Once you've filled out all of these fields, you should see **Configured** for each section:

Next, you'll need to create some products in Stripe.
---
# Creating an App
Source: https://superwall.com/docs/web-checkout/web-checkout-creating-an-app
Add a Stripe app to an existing project within Superwall.
### Adding a Stripe app to Superwall
Web checkout is represented in Superwall as a Stripe app. To create one, open any existing project and click on the Stripe logo at the top left:

Right now, web checkout is only available for iOS apps. Android support is coming soon.
You'll be presented with three fields to fill out:
1. **Platform:** This will default to Stripe — leave this unchanged.
2. **App Name:** Shown at checkout, we recommend using the same name as your app.
3. **Domain:** The URL your paywall will be shown from, and `superwall.app` will be appended to it. You cannot edit this once your app is created.

Once you've filled these out, **click** on **Add App ->**. You'll automatically be taken to your app's [overview](/overview-metrics) page. Next, it's time to [configure your app with Stripe](/web-checkout-configuring-stripe-keys-and-settings).
---
# Web Checkout Links
Source: https://superwall.com/docs/web-checkout/web-checkout-creating-campaigns-to-show-paywalls
Learn how to use campaigns and placements to present web paywalls using Superwall's web checkout links.
Once you've [created a Stripe app](/web-checkout-creating-an-app), [configured Stripe with Superwall](web-checkout-configuring-stripe-keys-and-settings) and have [created Stripe products](web-checkout-adding-a-stripe-product) — you're ready to configure a campaign to show a web paywall.
Before you proceed, recall that web checkout has all of the advantages of the Superwall platform. If you are unfamiliar with how to create campaigns or what a placement is — we recommend you read through the [introduction](/home) documentation and [campaigns doc](/campaigns) first.
### Understanding placements in web checkout
There are two primary differences between web checkout and the typical Superwall campaign flow:
1. **Placements become unique URLs** which, in turn, show your paywall. These are called *web checkout links*.
2. **User variables** are not available in audience filtering.
Other than that, everything operates as a normal Superwall campaign would. For example:

Here, the placement `black-friday-promo` presents a paywall. If the app's URL in [settings](/web-checkout-configuring-stripe-keys-and-settings) is `caffeinepal`, then the URL for this placement would be `https://caffeinepal.superwall.app/black-friday-promo`. Visiting that web checkout link presents a paywall:

Conceptually, you can think of these web checkout links performing a similar function as registering a placement does in our mobile SDK:
```swift
Superwall.shared.register(placement:"black-friday-promo") { _ in }
```
This means that you now can use web checkout with all of the same powerful features that Superwall offers, such as A/B testing, paywall targeting and more. Again, these work just like any other campaign would in Superwall. The interface is the same, so now you create placements, start creating audience filters and more:

Also, remember to create responsive paywalls. Users can view your checkout page on a laptop, phone and other varying sized viewports. For some quick tips, check out this blog post over adapting paywalls to look great on [iPad](https://superwall.com/blog/how-to-create-adaptable-paywalls-for-iphone-and-ipad-using-superwall).
### A note on the `$home` placement
Every campaign has a `$home` placement out of the box. This placement acts a "default" link, and isn't required to be part of the URL as other placements are. For example:
```plaintext
// This works
https://caffeinepal.superwall.app/$home
// And this also works, even though `$home` isn't in the URL
https://caffeinepal.superwall.app/
```
This is useful so that even if a user visits your web checkout link, and there isn't a placement in the URL — they'll still see a paywall.
### How query string parameters work
You can attach query string parameters to any web checkout link by appending them to the URL:
```html
https://caffeinepal.superwall.app/black-friday-promo?name=jordan
```
This will pass the `name` parameter to the placement, and you can use it in your audience filters. For example, you could create a filter that only shows the paywall if the `name` parameter is equal to `jordan`:

Or, you could access them in your paywall using the same flow as you would for [placement parameters](/sdk/guides/advanced/using-placement-parameters):
1. In the paywall editor, add a variable.
2. Make it a `parameter` type. Match the `name` to the query string parameter key (here, that would be `name`).
3. Set the value type, then click **Create**.
4. Now, you can use that variable in your paywall:
This makes it easy to show in your paywall:

Then, if the URL is visited, the audience filter matches from above — and we can see the value on the paywall, too:

Of course, this is a simplistic example — but this is useful for personalization, seasonal events, influencer campaigns and more. Any query string parameter you pass can be used in the paywall, and in audience filters.
### Automatically populating user emails in checkout flows
This section is Web2App only (starting from a web link). For App2Web (starting from an iOS paywall), see [App2Web](/web-checkout-direct-stripe-checkout#prefill-email).
There is a special query string parameter you can use to automatically populate the user's email in the checkout flow. This is useful for pre-filling the email field in the checkout form, so that users don't have to enter it manually. Simply add `email` and set the value to the user's email address:
```html
https://caffeinepal.superwall.app/black-friday-promo?email=myemail@yahoo.com
```
When the Stripe checkout flow launches, the email is now filled out automatically:

### Automatically populating appUserId in checkout flows
There is a set of special query string parameters which will set the appUserId for the subscription. This overrides the default behavior where Superwall will automatically assign an anonymous identifier. You may pass `uid`, `user`, or `app_user_id` to override the default.
```html
https://caffeinepal.superwall.app/black-friday-promo?app_user_id=my-custom-id
```
This identifier will show up in Stripe metadata & webhooks. The app\_user\_id will be put into the `client_reference_id` field on a Stripe Checkout Session and will be included on the subscription metadata under `_sw_app_user_id`
---
# App2Web
Source: https://superwall.com/docs/web-checkout/web-checkout-direct-stripe-checkout
Offer Stripe products directly from your iOS paywalls and perform checkout flows.
For customers in the United States, you can offer Stripe products directly from your iOS paywalls. This is a great way to streamline the checkout process and make it easier for users to purchase your products.

First, follow the [web checkout setup guide](/web-checkout-overview#getting-setup) to create a Stripe app and configure your web checkout settings. Specifically, you'll need to complete the first three steps. This includes setting up your Stripe keys and configuring your app's settings.
Select a paywall and add a Stripe product to it. This will allow users to purchase the product directly from the paywall. Stripe products are prepended with "stripe" in the product selector:

You can control whether or not Stripe checkout opens in your app via Safari, or externally in the Safari app:

Since the ruling only applies to customers in the United States, you can easily create a campaign filter that will match to those customers. Just create a filter where `storeFrontCountryCode` matches `USA`, like this:

From there, the flow works the same way as it would for web checkout. Once the payment succeeds, the [Superwall delegate](/using-the-superwall-delegate) functions `willRedeemLink()` and `didRedeemLink(result:)` will be called. You can use these functions to handle the deep link in your app if you need to show any specific UI as described in our [Post-Checkout Redirecting](/web-checkout-post-checkout-redirecting) docs.
Additionally, the subscription status will be updated automatically and the delegate callback `func subscriptionStatusDidChange(from oldValue: SubscriptionStatus, to newValue: SubscriptionStatus)` will be called. If you're using a `PurchaseController`, refer to [the docs here](/web-checkout-linking-membership-to-iOS-app#using-a-purchasecontroller).
If you need to test checkout, learn how [here](/web-checkout-testing-purchases).
### Prefill customer information
When starting checkout from an iOS paywall (App2Web), you can prefill customer information in two ways:
#### Email
Stripe will automatically prefill the email field if you set the user's `email` as a [User Attribute](/sdk/quickstart/setting-user-properties) in your app before initiating checkout.
#### Stripe Customer ID
If you already have a Stripe customer ID for your user, you can set it as the `stripe_customer_id` user attribute. This will associate the checkout session with the existing Stripe customer, automatically prefilling their saved information and payment methods:
```swift
Superwall.shared.setUserAttributes([
"email": user.email,
"stripe_customer_id": user.stripeCustomerId
])
```
When both `stripe_customer_id` and `email` are provided, the Stripe customer ID takes precedence. The checkout session will use the existing customer's information rather than creating a new customer.
---
# Web Checkout FAQ
Source: https://superwall.com/docs/web-checkout/web-checkout-faq
Frequently asked questions about web checkout.
### How does restoring memberships work on iOS when you've purchased via web checkout?
When the user taps on the restore link in the paywall, we'll do the normal restore flow for on-device subscriptions. However, if you've enabled web checkout and the restored
entitlements don't match the entitlements belonging to the products on the paywall, we'll present an alert asking the user if they'd like to check for subscriptions on the web. This will
take them out of your app to the [plan management screen](/web-checkout-managing-memberships) where they can get a redemption link to restore their subscriptions.
### What happens if a user taps the redemption link multiple times or shares it?
Redemption codes are single-use and tied to a specific device. Once a code has been redeemed, it cannot be used again on a different device.
However, users can visit the manage page and request a new redemption link. This generates a new code that can be used to activate access on another device.
#### Without accounts (`identify` not called)
If you're not using accounts with Superwall (i.e. you never call `identify`), we allow up to **five active devices** per user. When a sixth device redeems a code, the **first device** to have redeemed a code will automatically lose access. This helps prevent abuse while still supporting reasonable multi-device usage.
#### With accounts (`identify` called)
If you are using accounts with Superwall (i.e. you call `identify` with an `appUserId` when someone logs in), then entitlements are tied to the user ID, not the individual device.
* If two different `appUserIds` redeem codes, **only the most recently identified user will retain access**.
* If the **same `appUserId` is used across multiple devices**, all those devices will **automatically share access** without needing to redeem again.
This system ensures flexibility while protecting against unauthorized sharing of redemption codes.
### How do I associate a web checkout purchase with a user in my app?
The short answer — use Superwall's [user identification APIs](/identity-management#identified-users). When you configure Superwall, or a user signs in or out, you can always associate their login status to Superwall's SDK:
```swift
Superwall.shared.identify(userId: user.id)
```
This will ensure that the user is associated with the web checkout purchase.
### A user paid on the web and can't access their subscription in the app. What should I do?
Direct them to your app's plan management page so they can retrieve their redemption link or manage billing. For example: `http://yourapp.superwall.app/manage`
### When should I use Redirect mode instead of Redeem mode?
Use **Redirect mode** when you need to:
* Show a custom success or onboarding page after purchase
* Perform additional verification or collect more information before granting access
* Integrate with your own deep linking or authentication infrastructure
* Track conversions in your own analytics before redemption
Use **Redeem mode** (the default) when:
* You want Superwall to handle the entire redemption flow automatically
* You don't need custom post-purchase logic
* You want the simplest integration
Most apps should use Redeem mode. You can always switch between modes in your [Application Settings](/web-checkout-configuring-stripe-keys-and-settings#post-purchase-behavior).
### What data is passed to my redirect URL in Redirect mode?
When using Redirect mode, the following query parameters are automatically appended to your custom URL:
**Standard parameters**:
* `app_user_id` - The user's identifier from your app (if you called `identify`)
* `email` - The user's email address from checkout
* `stripe_subscription_id` - The Stripe subscription ID
**Custom parameters**: Any placement parameters you set when creating the web checkout link will also be included.
**Example redirect**:
```
https://yourapp.com/success?
app_user_id=user_123&
email=user@example.com&
stripe_subscription_id=sub_1234567890&
campaign_id=summer_sale
```
You can use this data to verify the purchase, link it to your user account, or perform custom onboarding. Learn more about [post-checkout redirecting](/sdk/guides/web-checkout/post-checkout-redirecting).
---
# Restoring & Managing Purchases
Source: https://superwall.com/docs/web-checkout/web-checkout-managing-memberships
Learn how users can manage their subscriptions from purchases made via the web.
When users purchase a subscription via the web, they can can access their account details via a plan management page. This url is included in their receipt which is sent to their email upon a successful purchase. To retrieve the link, users must enter in their email that was used during checkout. Otherwise, to offer this link manually you can use the following URL format:
```plaintext
https://{your URL in settings}.superwall.app/manage
```
When this page is visited, users enter in their email that used during checkout to receive a link to manage their subscription:

For the above example, the URL would be `https://caffeinepal.superwall.app/manage`. After entering their email, they will receive a link to manage their subscription, update payment methods, view their billing history, and more:

For situations where a user needs to restore their purchases, check out the answer in this [F.A.Q](/web-checkout-faq).
---
# Overview
Source: https://superwall.com/docs/web-checkout/web-checkout-overview
Let customers purchase products online via Stripe or Paddle (private beta), then link them to your iOS app with one seamless flow. No authentication required.
Superwall's web checkout integration makes it easy to set up purchasing funnels for your app via the web. Web checkout is powered by Stripe or Paddle (private beta). Once an online purchase is complete, the customer will be redirected back to your app with a deep link that can be used to unlock content or features in your app via any associated [entitlement](/products#entitlements).
Web checkout requires the Superwall iOS SDK 4.2.0 or later.
Visual learner? Go watch our web checkout tour over on YouTube
[here](https://youtu.be/eUSIySsN1ZU).
## How it works
Superwall presents paywalls via the concept of [campaigns](/campaigns), and each campaign has one or more [placements](/campaigns-placements). A paywall is shown in a campaign when a placement is triggered after your [audience filters](/campaigns-audience) are evaluated. This setup is Superwall's foundation, and the web checkout flow works the exact same way.
The core difference? Each placement becomes a unique URL that you can share, send or email to present a user with a paywall that leads to a Stripe checkout flow. And just like with Superwall on apps, you can create experiments, try out different paywalls, run price tests and more.

## Overall flow
Refer to the individual pages below to get started, but for a quick, high-level overview — here's how web checkout works from beginning to end:
1. A Web Checkout app is added to an existing iOS project in Superwall.
2. Your checkout provider is configured with Superwall.
3. iOS app details and post-purchase behavior are configured in the provider's settings page (within Superwall).
4. Products are created *in* your payment provider, and imported into Superwall.
5. Within a campaign (a default one is provided), you attach those products to a paywall.
6. A user visits a placement URL, and performs the checkout flow.
7. After a successful purchase, the user is redirected based on your [post-purchase behavior setting](/web-checkout-configuring-stripe-keys-and-settings#post-purchase-behavior):
* **Redeem mode** (default): User is directed to download the app and click the redemption link
* **Redirect mode**: User is redirected to your custom URL with purchase data
8. For Redeem mode: *On the device that they downloaded the app*, they click the redemption link.
9. Your iOS app is opened via a deep link (which means it must be set up with Superwall deep links, [docs here](/in-app-paywall-previews)).
10. In the `SuperwallDelegate`, `willRedeemLink()` is called, and then once it's fetched — `didRedeemLink(result:)` is called with the result of the redemption.
11. Finally, this user's account and details are managed via a link they find in their [email receipt or by visiting a URL manually](/web-checkout-managing-memberships).
## Getting setup
Before you start, you'll need to have a Superwall account and an account with your chosen provider. You can create a Stripe account [here](https://dashboard.stripe.com/register) or a Paddle account [here](https://vendors.paddle.com/register).
1. **[Creating an app](/web-checkout-creating-an-app):** First, you'll add a Web Checkout app to an existing project within Superwall.
2. Payment provider setup:
* **[Stripe setup](/web-checkout-configuring-stripe-keys-and-settings):**
* **[Paddle setup (private beta)](/web-checkout-paddle-setup):**
3. **[Managing products](/web-checkout-adding-a-stripe-product):** Create or import products to add to your web paywalls.
### Creating paywalls and campaigns
4. **[Presenting paywalls](/web-checkout-creating-campaigns-to-show-paywalls):** Set up a campaign, create some placements and add paywalls to begin showing them to customers.
### Associating entitlements to your iOS apps
5. **[Linking purchases to your iOS app](/web-checkout-linking-membership-to-iOS-app):** Once a purchase occurs, the user will be prompted to download your app and click on a redemption link.
6. **[Managing memberships](/web-checkout-managing-memberships):** Users can cancel, update or manage their memberships via Stripe or Paddle.
### Testing purchases
7. **[Testing purchases](/web-checkout-testing-purchases):** Test your web checkout flow with test purchases.
### App to Web
8. **[App to Web Checkout](/web-checkout-direct-stripe-checkout):** For customers in the United States, you can offer Stripe products directly from your iOS paywalls.
## Troubleshooting
If a user has issues accessing their subscription in your app after paying via web checkout, direct them to your plan management page to retrieve their subscription link or manage billing. For example: `http://yourapp.superwall.app/manage`
---
# Paddle Setup
Source: https://superwall.com/docs/web-checkout/web-checkout-paddle-setup
Connect Paddle to Superwall web checkout.
Paddle support is currently in private beta.
Once you've created a [Web Checkout app](/web-checkout/web-checkout-creating-an-app), you'll need to configure it with your Paddle keys and fill in a few settings. This is a one-time setup that connects Superwall to Paddle. The easiest way to get started is to click on the link in your overview page, which will take you to your app's [Settings](/overview-settings) page:
## Application settings
Fill out the metadata about your iOS app just like you do for Stripe. These fields control the branding and support details that appear on the checkout and subscription management pages.
1. **Icon:** Use the same marketing icon that appears in your Paddle checkout. Square PNG files work best.
2. **Application Name:** We recommend matching the App Store name so customers recognize it instantly.
3. **Support URL:** A URL where customers can self-serve billing questions. Paddle will link to this from receipts and the customer hub.
4. **Support Email:** The inbox your support team monitors for billing issues.
5. **Redeemable on Desktop:** Enable this if customers can redeem subscriptions on macOS via Catalyst or iPad on Mac. Otherwise leave it disabled so redemptions happen on iOS only.
Once you've filled out this information, click **Update Application**.
## Web Paywall Domain
The domain you set when creating the Paddle app is used for every Paddle checkout flow. It cannot be changed once the app is created.
## Live configuration
### Step 1: API keys
In your [Paddle dashboard](https://vendors.paddle.com/), go to **Developers → [API Keys](https://vendors.paddle.com/)**. Copy the values for:
1. **Publishable Key**
2. **API Key**
Paste both keys into Superwall and click **Update Configuration**.
### Step 2: Redirect URL
Copy the **Paddle Redirect URL** shown in the Superwall dashboard and paste it into your Paddle webhook settings. This allows Superwall to receive post-checkout events.
### Step 3: Hosted Checkout URL
Enter the **Hosted Checkout URL** from **Checkout → Hosted Checkouts** in Paddle. This URL is required for processing Paddle payments, so double-check that you're using the correct environment (live vs sandbox).
Hosted checkout URLs are environment-specific. Make sure you copy the live URL when configuring the live environment.
## Sandbox configuration
Repeat the same steps for the sandbox environment using the [sandbox Paddle dashboard](https://sandbox-vendors.paddle.com/). Use the sandbox API keys, redirect URL, and hosted checkout URL, then click **Save** to finish the sandbox setup.
## iOS configuration
These settings control the deep link handoff back to your iOS app, and they are identical whether you use Stripe or Paddle.
1. **Apple Custom URL Scheme:** Add the scheme you registered in Xcode. If you need help, review [Setting up deep links](/sdk/quickstart/in-app-paywall-previews).
2. **Apple App ID:** Find this in [App Store Connect](https://appstoreconnect.apple.com) under **General → App Information**.
3. **Bundle ID:** Located in Xcode under **Targets → General → Identity**.
4. **Team ID:** Available in the [Apple Developer account portal](https://developer.apple.com/account/#/membership/).
After saving, all configuration sections should display **Configured**. You're now ready to [create products](/dashboard/web-checkout/web-checkout-adding-a-stripe-product) in Paddle and import them into Superwall paywalls.
## Next steps
* **Add Paddle products:** Follow the combined [product guide](/web-checkout/web-checkout-adding-a-stripe-product) for Stripe and Paddle.
* **Build paywalls and campaigns:** Continue with [Creating campaigns to show paywalls](/web-checkout/web-checkout-creating-campaigns-to-show-paywalls).
* **Test purchases:** Use the Paddle sandbox credentials with [Testing purchases](/web-checkout/web-checkout-testing-purchases).
---
# Sandbox Purchases
Source: https://superwall.com/docs/web-checkout/web-checkout-testing-purchases
Test with your web paywalls by using sandbox products.
### Purchase flow overview
When a user clicks on a button to purchase a product, the process will switch over to Stripe's checkout flow:

Once the purchase goes through successfully, they'll be taken to a page where Superwall prompts them to:
1. Download the app.
2. Click the redemption link.
Users should click the redemption link *on the device where the app is installed*. If the setting for "Redeemable on Desktop" is diabled, they'll be prompted to continue on an iOS device.


From there, the [redemption flow](/web-checkout-linking-membership-to-iOS-app) occurs.
### Testing a purchase
To test a purchase:
1. Add a [sandbox product](/web-checkout-adding-a-stripe-product#creating-sandbox-products-to-test-with) to a paywall.
2. Visit the paywall URL and checkout.
3. Choose "Card" for the payment method.
4. For the card number, use `4242 4242 4242 4242` with any expiration date later than today, any CVC and fill out the name and zip code.

This will allow you to checkout and go through the entire flow to debug issues, test it out on a device and more.