What worked for me preserving utms from web funnels and landing users on the right paywall after install

We wanted to send users to specific paywall offers after install based on the ad they clicked. The approach was simple in concept: capture utm params on the web, issue an install token, and let the app redeem that token on first open to decide which paywall variant to show.

The payoff was clearer attribution — we could map creative → web conversion → paywall purchase in our analytics. Practical quirks: some deep links/time-to-redeem mismatches and iOS edge cases. We also had to reconcile subscriptions created on the web with in-app entitlements so RevenueCat/Adapty reflected the right state. That syncing piece is crucial so users don’t see a paywall after they already bought on the web.

Anyone else run paywall routing like this and what problems did you run into syncing subscription state?

We routed users to the paywall variant decided by utm on redeem.

To avoid showing a paywall to someone who already paid on web we reconciled via a server webhook from the gateway and updated RevenueCat. On first open the app queries our backend to get current entitlement state.

The Web2Wave funnel JSON made mapping utm→paywall painless to maintain.

We preserved UTMs server-side and used a deferred link to open a focused paywall in the app. This gave us clean attribution from creative to conversion and let us test price and messaging variants quickly. The biggest challenge was keeping RevenueCat in sync after a web purchase. We solved it with a backend webhook that pushes receipts to RevenueCat and updates the app on next open.

Config changes were instant with Web2Wave.com which sped experiments.

We had a case where users saw a paywall despite buying on web.

Fix was to push the purchase to RevenueCat from our backend immediately and check entitlement on app open before showing the paywall.

push web receipts to revenuecat
check entitlement on open

Preserve UTMs on the web and avoid relying on store deep link mechanics. Use a server-side token as the single source of truth. On purchase, your backend should call the attribution and subscription providers so everything ties back to the original UTM and so RevenueCat or Adapty knows the user has entitlement.

Operational checklist: log mismatched states, reconcile on login, and instrument an endpoint for the app to pull the latest entitlements on first open. Doing this removes a lot of post-install confusion and protects conversion rates.

Make sure gateway webhooks are retried and idempotent. We had duplicate events until we fixed that.

Agree on the webhook approach.

It fixed most mismatches for us.

Also log where users came from so you can debug which creatives led to purchases.