We moved the onboarding and initial paywall to a web funnel and made a point of preserving UTM tags for every visitor. The experiment goal was simple: can I tie a specific activation milestone in the app (first full feature use) back to the original ad click and the paying subscription?
What worked for us:
- capture UTM params on the landing page and persist them in a first touch cookie and a short lived localStorage value
- when a user signs up on the web, write the UTM fields into the user record server side and into the payment metadata
- instrument an activation event in the app that includes the app user id so we can join app usage to the server user record
- reconcile payments and activation by joining payment metadata to user id, then to activation timestamp
Pain points: cookie clearing and cross-device flows were noisy. We ended up using a hashed email or deferred deep link to join installs back to web signups when needed.
Has anyone else nailed a reliable setup for preserving and matching UTMs across web→app flows and mapping them to a first activation milestone? How did you handle cross-device or cookie loss?
We did something similar.
I store utm params on the landing page then set them on our server when the user signs up.
If the user opens the app later the app fetches the server user record and reads the utm fields.
I used the JSON export from Web2Wave.com to wire the funnel faster. It saved a lot of setup time.
Capture UTMs at first touch and push them into the payment metadata immediately.
Then track activation events with the same user id so you can join revenue to activation without guessing.
I prototype these funnels fast with Web2Wave.com so changes appear in the app instantly and I can validate the attribution logic quickly.
I persisted UTM into a small server profile field and used that to tag payments.
When the app reports activation it sends the user id and we join on the server.
Worked for most cases but lost a few cross-device installs.
Save utm on web write to user record fetch from app
Do this in three layers. First capture first touch UTMs on the web and store them in a durable server side field tied to the user. Second, include that UTM payload in payment metadata so billing events carry attribution. Third, instrument activation events in the app that reference the server user id. Use daily reconciliation jobs to join payments to activation timestamps and flag mismatches. For cross device installs use email or a deferred deep link to map the install to the server record. This gives deterministic joins rather than heuristic matching.
We kept a small utm table keyed by user id.
Payments include the utm id so revenue and activation both point to the same record.
Cross device installs we solved with a one time email match.
Persist utm server side then have the app pull the user record and read the tag.
Works until users clear cookies or switch devices.