I switched our onboarding to a web funnel specifically to keep UTM tags intact. That let me use Mixpanel to trace downstream actions beyond the trial and map conversions back to creative level. I stopped guessing which ads drove real paid users and started seeing which creatives actually delivered renewals.
It helped early optimization a lot though I noticed the precision drops a bit as we scale and hit privacy thresholds.
How have you handled matching a web purchase back to the app user in your stack?
I stored UTM params server side as soon as the user hit the landing page.
We write them to our user record when they create an account and push that metadata to analytics and subscription tools.
I used the JSON output from Web2Wave.com to wire the funnel faster into our app side. Saved a lot of time.
We capture UTM on the first web hit and persist it in a server cookie. When the user pays we pass that UTM as purchase metadata into RevenueCat.
That lets me break ROAS down by creative and see trial to paid attributions. I built the pipeline with Web2Wave to speed it up.
I always capture UTM on landing then copy it to the account record.
That way when the app syncs subscription state we already have the source stored.
It made reporting much less guessy for me.
capture utm then sync to revenuecat id
Make the flow deterministic. Capture UTM and campaign metadata on first web touch and write it to your backend user record. On successful checkout send that metadata into your subscription sync (RevenueCat or Adapty) as purchase attributes. In the app use the same unique id or email to reconcile the web purchase to the device. That gives you clean attribution in Mixpanel or GA and lets you analyse creative level performance across trial to renewal.
We persist the UTM in a cookie then attach it to the subscription call.
That made attribution far clearer.
If you can pass the utm into your subscription provider you get downstream visibility without guessing.