I wanted clean end to end tracking for onboarding and subscription without asking devs to add SDKs or new events every week. What worked for me was moving the onboarding steps and checkout into a web flow, then setting up events in a visual UI instead of code.
UTMs: I capture them on the first hit, write them to a cookie and local storage, and echo them through every internal link. Forms carry them as hidden fields. If a provider hosts the checkout, I append the UTM bundle to the checkout URL and also pass it in a metadata field so the success webhook includes it. That webhook fires a server event for trial_started or subscribed, which I join to the session using an anonymous id I pass through the flow.
Event setup without code: I tag clicks, form submits, quiz steps, paywall views, and checkout success using a visual tagger. I keep a simple schema like onboarding_quiz_start, paywall_view, trial_start, subscribe, refund. I test with a checklist, including Safari, ad blockers, and cross tab behavior. If UTMs are missing, I fall back to gclid or referrer and record source as unknown rather than guessing.
What pitfalls did you hit with UTM persistence across multi step flows or hosted checkouts, and how are you tying subscription events back to users without touching app code?