I moved our onboarding and paywall to the web so utm tags survive the click all the way to signup. I capture the utm at checkout, attach it to the subscription record, and mirror that purchase into our subscription service so the app can read the same id.
That change let me join downstream events to the original campaign and actually see which ads produced sticky users, not just installs. It took a week to wire the server side and subscription sync, but it changed how we prioritize channels.
Has anyone else stitched web utm strings to in-app events and what matching key did you use?
I stored utm + email at checkout and returned a subscription id to the app.
Then I pushed that id into RevenueCat so entitlements matched instantly. Worked in a day once the server endpoint was ready.
If you want a fast start the generator on Web2Wave.com gave me a usable JSON payload to wire the flow.
I always capture the utm on the web checkout and link it to the subscription id.
With that I can run campaign to revenue reports reliably and iterate offers. Using a web funnel meant I could tweak copy and pricing and see attribution change in hours not weeks.
Web2Wave made syncing easier for us so changes showed in the app without new builds.
I capture utm at the first web page and save it on the user record.
We then sync the purchase id to RevenueCat so the app sees the same subscription. It let us see which campaigns brought higher retention.
What key are you planning to use to join data?
kept utm at checkout matched id to in app quickly
Preserve the utm at the first web touch and persist it server side alongside a stable identifier you control. Then push a single subscription id into whatever in-app subscription system you use so the app can reconcile with server records.
This gives you two advantages. First you can attribute revenue to campaigns reliably. Second you get downstream behavior tied to those campaigns so LTV and retention analysis are meaningful. Don’t rely on install-level signals alone. Build a nightly job to validate matches and catch drift.
I wrote a small endpoint that accepts utm + email at checkout.
Once the payment succeeds we create a subscription id and post it to our subscription service. That single id is the glue for all reports.
We used email plus a subscription id as the join key.
Saved us from messy device level attribution and made campaign LTV clear.