screens.qonversion.io and checkout runs through Stripe.
Prerequisites
- Stripe connected to your project: Project Settings → Stores → Stripe → Connect Stripe (Stripe OAuth — no API keys to paste). Web Funnels require Stripe; the Publish button stays disabled until Stripe is connected.
- A product mapped to a Stripe Price ID — set up below.
- A Stripe webhook with its signing secret added on the Stripe store card — see Set up the Stripe webhook.
Map a product to a Stripe Price
The checkout charges a Stripe Price (price_...), not a Product (prod_...). Connect one to a Qonversion product:
- In the Stripe Dashboard of your connected Stripe account (live mode), open Product catalog → Add product, set a recurring price, and save. (An existing product works too — every price lives on a product’s page, in the Pricing section.)
- Copy the Price ID — it looks like
price_.... - In the Qonversion dashboard, open Products in the left menu and open the product you want to sell on the web (or create one — for subscriptions pick the matching duration).
- Paste the Price ID into the Stripe Price ID field and save.
The price must live in the same Stripe account you connected to Qonversion — prices from any other account can’t be resolved at checkout. Mobile store IDs (App Store / Play) on the same product are unrelated and can stay as they are.
prod_... id is enough for that. A Web Funnel flips this: Qonversion runs the checkout for you, and Stripe requires an exact Price to start a checkout session. A Stripe product can carry many prices (monthly, annual, currencies), so you pin the one to sell in the Stripe Price ID field.
Set up the Stripe webhook
Qonversion records your web purchases by listening to events from your Stripe account — payment confirmations, subscription renewals, refunds. Every incoming event is verified with a webhook signing secret unique to your endpoint. Without it, purchase events can’t be verified, and Web Funnel purchases won’t reach your users. Stripe keeps live and test traffic fully separate: a live-mode endpoint and a test-mode endpoint are two different endpoints with two different signing secrets. Qonversion mirrors this — the Stripe store card has a Production webhook signing secret field and, once you connect Stripe in sandbox, a separate Sandbox webhook signing secret field. This section sets up the production one; the sandbox secret is covered in Test with a sandbox purchase. You never share Stripe API keys (sk_...) with Qonversion — account access is granted through Stripe Connect, and the signing secret can only be used to verify that events are authentic. Anyone with access to the Developers section of your Stripe Dashboard can set this up.
Step 1 — Create the webhook endpoint in Stripe
- Open your Stripe Dashboard → Developers → Webhooks → Add endpoint (in the newer Workbench UI: Add destination → Webhook endpoint).
- If asked for the destination scope, choose Your account (not Connected accounts).
- Set the endpoint URL to
https://api.qonversion.io/v1/stripe-s2s/. - Select the following events:
checkout.session.completed— confirms the purchase (required)customer.subscription.created,customer.subscription.updated,customer.subscription.deleted— subscription lifecycle (required)invoice.paid— renewals and trial conversions (required)charge.refunded— refundscharge.dispute.created,charge.dispute.funds_withdrawn,charge.dispute.closed— chargebacks
- Create the endpoint.
Create this endpoint in live mode (Test mode toggle off) — it handles your production purchases. For sandbox testing you’ll add a separate test-mode endpoint; see Test with a sandbox purchase.
Step 2 — Add the signing secret to Qonversion
- On the endpoint page in Stripe, click Reveal under Signing secret and copy the
whsec_...value. - In the Qonversion dashboard, open Project Settings → Stores and on the Stripe card paste it into the Production webhook signing secret field, then save.
1. Create a Web Funnel
- Go to No-Codes → Create Screen.
- Choose Web Funnel as the screen type.
- Design the screen in the Builder as usual (headings, products, buttons).
- Add a Product component to the screen, then bind it: open Settings → Products in the Builder and pick your Stripe-priced product from the dropdown for the screen’s product slot. This is what the checkout charges — a funnel without a Stripe-priced product cannot check out.
- Set the purchase button’s action to Make a purchase. On the web this opens the Stripe checkout for the bound product.
- Add a success page the buyer sees after paying (this is also where you can remind them to open the redemption email).
A Web Funnel is served on the web, so a few in-app-only actions don’t apply:
- Navigation actions (
Navigate to the screen) are no-ops on the web — use Go to page to move between funnel steps. Restoreis not supported on the web.
2. Publish
Open the Publish dialog. The readiness checklist confirms the funnel is ready:- Stripe connected — required (blocking).
- Success page and other checks — recommended.
prod_key) and the public checkout URL:
3. The purchase → redemption flow
- A user opens the funnel URL and completes the Stripe checkout. The email field on the Stripe payment page is where the buyer’s address is collected — there is no separate email step; the redemption email goes to that address.
- Qonversion emails them a one-time redemption link (
https://screens.qonversion.io/r/{project_uid}/{token}). - The user taps the link on their phone → your app opens and the purchase is redeemed, activating the entitlement.
The redemption email
After a successful payment, Qonversion automatically sends the buyer a redemption email — you don’t send anything yourself.- Trigger: sent once, right after the payment is confirmed. The buyer enters their email during checkout.
- Contents: a call-to-action button and a fallback link to
https://screens.qonversion.io/r/{project_uid}/{token}. - One-time & time-limited: the link works once and expires 30 days after purchase. After it’s used (or expires), it can’t be reused.
- Lost or expired link: the buyer can request a fresh one from your app, which sends a new email with a new link and a new 30-day window. See the redemption guide.
Sender & branding. The email is currently sent from Qonversion. Per-merchant branding (your app’s name / sender) is on the roadmap. If a buyer doesn’t see the email, ask them to check spam.
Testing
Test with a sandbox purchase
You can run the whole funnel end to end in Stripe test mode — no real charge — before going live.- Connect Stripe in sandbox. In Project Settings → Stores on the Stripe card, click Connect Sandbox. This is separate from your live connection and links your Stripe test account.
-
Add a test-mode Stripe webhook. Stripe keeps live and test events separate, so your live webhook won’t receive sandbox purchases. In your Stripe Dashboard with Test mode on, add a second endpoint at
https://api.qonversion.io/v1/stripe-s2s/with the same events as your live endpoint (Step 1 above). -
Add the sandbox signing secret. The test-mode endpoint has its own
whsec_...signing secret — your production secret won’t verify sandbox events. Reveal and copy it from the endpoint page in Stripe (Test mode on), then in Project Settings → Stores paste it into the Sandbox webhook signing secret field on the Stripe card. Without it, sandbox purchase events fail signature verification and test purchases won’t reach your users. -
Open the sandbox link. In the Publish dialog, below the production link, you’ll find a Sandbox link:
The same published funnel serves both URLs, so there’s nothing extra to publish.
-
Check out with a Stripe test card — for example
4242 4242 4242 4242(see Stripe’s test cards). The checkout runs in Stripe test mode against your sandbox account, so no real money is charged.
QEnvironment.Sandbox) to see it after redeeming. Sandbox purchases never appear in your production revenue or analytics.
Testing the redemption link on Android
You can test redemption with a debug build from Android Studio — on a real device or an emulator with Google Play services:- Register the debug signing key. Debug builds are signed with the debug keystore, and Android verifies App Links against the certificate of the installed build. Get the fingerprint with
./gradlew signingReport(theSHA-256line underVariant: debug) and add it in Connect Apps — the fingerprints field accepts multiple values, so keep both your debug and release/Play App Signing keys there. - Match the application ID. If your debug build uses
applicationIdSuffix(e.g..debug), register the suffixed ID — otherwise verification won’t match the installed package. - Wait for the manifest, then (re)install. After you add or change an app in Connect Apps, allow a few minutes for
https://screens.qonversion.io/.well-known/assetlinks.jsonto refresh, then reinstall the app — Android checks App Links at install time. To force a re-check without reinstalling:
- Open a redemption link without the email. You can fire the link straight from the terminal to check that it opens your app (not the browser):