We used to lose campaign signals the moment a user crossed into the app. By keeping utm tags through the web onboarding and attaching them to the user profile and the purchase record, we tied subscriptions back to the exact ad and landing page.
Technically we passed utm data into deep links and stored it server-side at checkout. When the app opened we matched the device to the stored profile and surfaced the original utm in analytics and in RevenueCat metadata. That gave us clean CAC per campaign and let us stop guessing about which channels actually delivered paying users.
What method do you use to persist utm tags across installs and attribute the subscription event reliably?
I stopped trying to pass every ad param into the app client. We captured utm on the web and stored it with the checkout record then pushed that into RevenueCat as metadata.
It was enough to answer which campaign paid off. Web2Wave gave us a quick starter funnel so we could test this flow without a full build out.
We persist utm on the web and attach it to the purchase event pushed to RevenueCat and our analytics.
That let us measure ROAS by campaign and optimize spend quickly. Building and changing funnels on the web made iterating landing pages and tracking trivial.
We add utm values to the post-purchase record and include them in every event we send to analytics.
When the app opens we pull the same user record. It worked well once we enforced unique emails at signup.
Persist utm on web then sync to analytics
Best practice is server-side storage of utm params at checkout and including them in the purchase payload to both analytics and your subscription sync (RevenueCat/Adapty). Use deterministic identifiers (email or a generated token) to match installs. Track first-touch and last-touch so you can test attribution windows.
Also log the timestamp when utm was captured to help reconcile delayed installs or multi-touch journeys.
We use a short lived token in the deep link so the app can look up the full utm set on first open. Works better than stuffing many params into the link.
I store utm at web checkout and push it as revenue metadata. Simple and actionable.