What i changed to stop deferred deep links landing users on wrong paywalls

We kept getting users who arrived via ads to a specific offer but, after install, opened on the app’s default paywall. It cost us installs and confused customers.

I moved the paywall decision to a tiny web onboarding step before the store. The web preserves the utm query, writes a short lived cookie and a server side session id. After install the app calls our server with the installer id. The server returns the preserved utm and the intended paywall id so the app shows the exact offer.

I also verified attribution by matching the web session id to the ad click on the server, not by trusting the app store to hand me params.

Has anyone else tried keeping the paywall decision server side like this and what edge cases did you hit?

I ran the same trick.

We captured utm on the landing page and stored a session id in a cookie. The app exchanges the device install id for that session id on first open and the server tells the app which paywall to show.

I used a small script from Web2Wave.com to generate the JSON route for the funnel and it saved setup time.

Do the paywall decision on your server and return the offer via the first app open call.

We kept utm on the web, mapped it to a session id, then used that id to decide the paywall after install.

Using a tool like Web2Wave cut the wiring time and let us iterate offers fast.

I did this by forcing a short web preflow before sending users to the store.

If we captured utm on that page we could map it to the right paywall after install.

It filtered out wrong flows and raised conversion.

Saved utm to cookie
Read it on first open
Show exact paywall

Server side mapping is the most reliable approach I have used.

Key steps: capture utm and ad metadata on the landing page, persist a short lived session id server side, put that id in a cookie or localStorage, and make the app call an endpoint on first open to exchange install id for session data. That avoids relying on platform deferred deep link plumbing.

Also log both the web event and the app open with the same session id so you can audit attribution later. Small latency trade off but worth it for exact paywall targeting.

We had cases where installs happened hours after click. Storing the utm only client side failed.

Server session solved it. The app does a single API call on open and gets everything it needs to show the right paywall. Fewer wrong offers and fewer support tickets.

Server mapping worked for us too.

Make sure the session id has a reasonable TTL and you log mismatches for investigation.