Key concepts
- We use multiple payment systems, including Stripe, Paddle, PayPal, Primer, Solidgate, Unlimit
- After the payment a user receives a link to download the app
- In the app you resolve their web2wave
user_id— either through an MMP deeplink (AppsFlyer, Adjust, Branch, …) or through web2wave deferred deeplinks if you do not use an MMP - Then use that
user_idto tier the user in the app with their web subscription - We manage the rest – multiple payment systems, cancellations, RevenueCat, Adapty, etc
Can web2wave handle just Quizes and Paywalls, and Stripe will be used from our side?
To integrate Stripe with web2wave effectively, access to your Stripe keys is mandatory. This is crucial for the following reasons:
- Fetching Prices: We need to retrieve price information via the Stripe API.
- Discount Management: Creating and managing discounts for your products.
- Customer & Payment Handling: Creating customers, payment methods, and managing subscription schedules like trials and introductory offers.
- Subscription Analytics: Gathering invoice details for better analytics, such as calculating customer lifetime value (LTV).
- Webhook Handling: Receiving webhooks for subscription status updates.
- Payment Processing: Managing subscription payments and schedules directly.
Can we just give you Stripe Checkout link from our Stripe?
The proposed approach using Stripe Checkout will not work efficiently for the following reasons:
- Stripe Checkout doesn't support subscription schedules, and buttons like Apple Pay cannot be placed directly on paywalls but are redirected to Stripe's external form.
- Stripe Price details (currency, amount, period) still require Stripe keys for access.
- It lacks PayPal integration, which can boost revenue by 10-15%.
Can we pass user_id to the app without AppsFlyer, Adjust, or Branch?
user_id to the app without AppsFlyer, Adjust, or Branch?Yes. If you do not use a mobile measurement partner (MMP), web2wave provides deferred deeplinks built into every Mobile SDK — an alternative to installing and configuring AppsFlyer, Adjust, Branch, or similar attribution tools.
On first app launch, call identify(). The SDK sends device signals (platform, screen_size, timezone, os_version) to GET /api/user/identify. web2wave matches the device against the user's recent quiz or paywall session on the same project and returns user_id. No MMP SDK, no install deeplink handler, no "revisit the link after install" step.
| MMP (AppsFlyer, Adjust, Branch, …) | web2wave deferred deeplinks | |
|---|---|---|
| Extra SDK in the app | Yes | No — included in web2wave SDK |
How user_id arrives | Install / deferred deeplink | identify() on first launch |
| Typical setup | MMP dashboard + deeplink in project settings | Initialize web2wave SDK + call identify() |
MMP and web2wave deferred deeplinks are alternatives, not backups for each other. If you already use an MMP, keep reading
user_idfrom the deeplink — see the guides below. If you do not use an MMP, deferred deeplinks are the simplest path.
Full setup and code examples (Flutter, Swift, Kotlin, Java, React Native, Unity): web2wave deferred deeplinks.
User and tech flows

General Flow of deeplinks
- The user purchases a subscription on the web.
- Receives a link and instructions for installation.
- With MMP: AppsFlyer / Adjust / Branch passes
user_idinto the app via install deeplink. - Without MMP (custom deeplink): instructions say "Install the app via the link and then REVISIT the link."
- Without MMP (deferred deeplinks): no deeplink handling — call
identify()on first app open. See web2wave deferred deeplinks.
- With MMP: AppsFlyer / Adjust / Branch passes
- In the mobile app, the
user_idis obtained and saved. - Then, the obtained
user_idis used:- Either for user identification in billing (Adapty/AppHud/your own billing system).
- Or for direct requests to the web2wave API.
Passing user_id to the app
With AppsFlyer, Adjust, Branch, etc. (MMP)
- RevenueCat integration
- Adapty Integration
- If you don't use RevenueCat or Adapty – Direct integration in mobile app with web2wave API
Without MMP — web2wave deferred deeplinks
If you do not use AppsFlyer, Adjust, Branch, or similar tools, call identify() from the web2wave SDK on first app launch. The backend matches the device against the user's recent web session and returns user_id — no install deeplink or third-party attribution SDK required.
See web2wave deferred deeplinks for setup and code examples across all SDKs.
Without MMP — custom deeplink page
After a purchase, the user receives an app installation link in the format:
https://quiz.YOURDOMAIN.com/deeplink?user_id={GUID}&email={EMAIL}
Example: https://quiz.momslab.app/deeplink
This link:
- If the user opens the page on the web, displays a QR code for the same page.
- If the app is not installed, redirects them to the AppStore/Google Play based on the platform.
- If the app is installed, passes their user_id and email to the app via a custom URL scheme, e.g.,
yourappscheme://web2wave?user_id={GUID}&email={EMAIL}
In the app, you create a handler for your scheme and extract data from the provided URL.
For iOS – Defining a Custom URL Scheme
For Android – Deep Linking
You can also add handling for deep links like https://quiz.YOURDOMAIN.com/deeplink along with the scheme.
Billing integrations
Integration with Our API from the App (Without Server Integration)
- RevenueCat integration
- Adapty integration
- If you don't use RevenueCat or Adapty – Direct integration in mobile app with web2wave API
Receiving Subscription Information via Webhook to Your Backend
You can receive subscription information from web2wave through a webhook to your backend – Webhook Formats - Subscription Type and apply the subscription to the user in your backend.