Web paywall

Important

Before you begin, make sure you have the required Adapty SDK version installed:

  • Paywall Builder or custom paywalls: 3.6.1 or later (iOS), 3.15 or later (Android and cross-platform)
  • Flow & Paywall Builder: 4.0 or later (all platforms)

With Adapty, you can create a paywall or flow with a button that redirects your app users to their browser for payment. Then, when they return to your app after a successful purchase, the subscription activates. On the US App Store storefront, this lets you avoid the store commission while Adapty still tracks user payments.

Web paywall demo
Tip

On the App Store, web paywalls work without extra requirements or Apple commission only on the US storefront. For other regions, see Other App Store regions.

To use a paywall exclusively for the US, duplicate your current paywall and set up a web paywall. This way, you will have two almost identical paywalls in use: one for the US, and another for everybody else.

How it works

A web paywall is a unique URL generated for each of your in-app paywalls. It opens in the browser for payment and works with different payment providers (Stripe, Paddle, and others), supporting both a simple page with an Apple Pay button and more complex flows with additional offers.

Web paywall overview

Web paywalls work in the following way:

  1. Configure how the web paywall page will look and work in the web paywall editor.
  2. Link the web paywall in the paywall settings.
  3. In your app paywall, add a button redirecting users to the browser.
  4. Once users tap the button, Adapty SDK generates a unique URL that includes the user’s Adapty profile ID.
  5. Users go to the web paywall page and pay for a subscription using an external payment method.
  6. When they return to the app, Adapty SDK polls for profile updates to confirm the subscription activated.
  7. Adapty records the purchase and monitors the subscription for status changes, such as renewals or cancellations.

The profile ID in the URL links the web purchase to the app user. The purchase lands on the profile your app already uses, so you don’t have to call Adapty.identify() for a web buyer.

Step 1. Create a web paywall

  1. Get a paywall to work with:
    • To enable external payments for an existing paywall, duplicate it. This lets you show the web paywall to your target segment and the original to everyone else.
    • To start from scratch, create a new paywall.
  2. On the Paywall page, switch to the Web paywall tab and click Create web paywall. You will be redirected to a new page.
Web paywall tab in paywall settings
  1. Set up the web paywall and connect a payment method.
Tip

For help setting up the external editor and connecting a payment provider, see the quickstart guide.

  1. Return to the Web paywall page and paste the paywall link.
Important

When launching your paywall to the production environment, make sure you use the correct link generated after publishing your web paywall. The link format is paywalls-....fnlfx.com.

  1. Click Save.
Pasting the web paywall link and saving

Step 2. Trigger the paywall

To use your web paywall, you need to trigger it, and the way you do it depends on your setup:

  • If you are using the Flow & Paywall Builder, you only need to add a new button that will use the link you’ve provided to track purchases and send the data back to Adapty.
  • If you are using the SDK, you must set up the openWebPaywall method to handle web paywalls.

Step 2a. Add a web purchase button

If you are using the Flow & Paywall Builder, you need to add a web paywall button. The button will use the link you’ve provided to track purchases and send the data back to Adapty.

  1. Open the flow and add a button.

    If you are using a template or an existing paywall, add a web paywall button alongside the existing purchase button. You can configure it the same way.

  2. In the Interactions panel on the right, click Add trigger. Then, assign the Purchase action to this trigger.

    on-tap-purchase.webp
  3. In the action settings, switch to the Web payment tab. There, select a product and—optionally—an offer to associate with the web purchase button.

  4. Paste the web paywall link to the Web paywall URL field.

  5. By default, web paywalls open in an in-app browser so that users don’t need to leave your app. If you want to open them in an external browser, select Open in external browser.

web-payment-action.webp

Step 2b. Call the SDK method

If you are working with a paywall you developed yourself, you need to handle web paywalls using the SDK method. Read the framework-specific guides:

Step 3. Set up a placement

Since the App Store allows web paywalls without extra requirements only on the US storefront, create a separate user segment for iOS users in the US and set up a placement to target different paywalls at different segments. For Android users, no geographic restriction applies — create a separate Android segment without a country filter.

  1. Create a new segment that will have the following attributes:
    • Country from store account: United States
    • Platform: iOS and iPadOS
    • App version: The latest one that uses the Adapty SDK.
Segment attributes for web paywall targeting
  1. Create a placement or edit an existing one. Add a new audience with the web paywall and the segment created.
Placement with web paywall audience

Other App Store regions

The European Union, Japan, and Brazil also allow apps to link to purchases on the web, with these conditions:

  • Your developer account needs Apple’s entitlement for the region.
  • Before your app opens the link, it must show Apple’s disclosure sheet. The Adapty SDK doesn’t show this sheet.
  • Apple charges a commission of 15% on purchases made within 7 days of the link tap. The reduced rate for Small Business Program members and for subscriptions after their first year is 10%.
  • In Japan and Brazil, your app must also offer In-App Purchase on the same screen.

For the full rules, see Apple’s pages for the European Union, Japan, and Brazil.

Add a cancellation funnel

A cancellation funnel is a web page that a subscriber opens to cancel their subscription. Before the cancellation goes through, the funnel can offer a pause, a discounted plan, or a free period. You build it in the same editor as your web paywall, and your app opens it by URL. The funnel cancels the subscription with your payment provider, so your app makes no cancellation API call.

To create a cancellation funnel, in the web paywall editor, open the Cancellation tab. Retention actions are available only in cancellation funnels, so you can’t add them to the funnel that serves your web paywall. For the funnel itself, see FunnelFox’s guide to cancellation funnels.

Cancellation tab in the web paywall editor

Get the subscriber’s FunnelFox profile ID

A cancellation funnel identifies the subscriber by their FunnelFox profile ID. After a web subscription purchase, FunnelFox writes that ID to the Adapty profile as the fnlfx_profile_id custom attribute, together with fnlfx_funnel_id, fnlfx_session_id, vendor_profile_id, and vendor.

FunnelFox writes these attributes once, on the first web subscription purchase. Later purchases leave them as they are. For a consumable purchase, FunnelFox writes them only when the checkout element has a custom access level.

Your app reads fnlfx_profile_id from customAttributes on the user’s profile. To see the same value in Adapty, open Profiles and find the user’s profile.

Note

Adapty stores up to 30 custom attributes per profile. When a profile is full, Adapty drops the extra attributes without returning an error, and FunnelFox doesn’t send them again. If your app sets custom attributes of its own, leave room for the five FunnelFox ones.

Open the funnel from your app

Your app builds the cancellation URL itself. It doesn’t go in the Web paywall URL field — that field belongs to a paywall that sells a product, and Adapty appends adapty_profile_id to it, not fpid.

Combine your published cancellation funnel URL with the subscriber’s fnlfx_profile_id:

https://<your-project>.fnlfx.com/cancel?fpid=<fnlfx_profile_id>

Pass the attribute value as stored, with no prefix. Open the URL when the user taps your cancel button.

Users can close the page at any point, including after the funnel cancels the subscription. Don’t treat their return to the app as confirmation. Fetch the profile to get the current state. A cancelled subscription keeps its access level until the paid period ends.