Trial-to-Paid Attribution for SaaS: A Setup Guide
Connect trial signups to paid conversions, channel by channel — and survive the multi-week conversion lag that breaks naive SaaS reporting.
Audience: SaaS / subscription businesses. This guide is about attributing trial signups → paid conversions to the marketing channels that earned them. It is not an e-commerce checkout-tracking guide — there are no carts or orders here, only trials, subscriptions, and MRR. If you run a Shopify store, our ecom install material is the right starting point instead.
The hardest thing about SaaS attribution is not the signup — it is the gap between the signup and the money. A visitor clicks an ad, starts a free trial, disappears for two or three weeks, and then converts to paid (or doesn't). By the time the MRR arrives, the click that started it all is long gone from any short attribution window, and the paying customer looks anonymous unless you deliberately stitched their identity at signup. This guide shows you how to close that gap end to end.
What you'll set up
By the end you'll have:
- First-touch channel capture — the acquisition source recorded the moment a visitor first lands.
- Identity stitch at signup — the anonymous visitor linked to a durable customer identity so later events inherit the channel.
- Funnel events for the SaaS lifecycle (signup → trial started → trial converted).
- Billing-truth connection so MRR, trial-to-paid, and churn flow in automatically.
- A reporting view that survives the multi-week conversion lag and reports trial-to-paid by channel.
Step 1 — Capture the acquisition channel at first touch
Attribution starts before the signup. On the first landing, capture and persist the channel signals you'll later want to credit:
- UTM parameters (
utm_source,utm_medium,utm_campaign) — first-party analytics conventions that arrive intact on your landing page. - Platform click IDs where present (the ad-click identifiers some platforms append to the landing URL).
- First-touch referrer as a fallback for organic and referral traffic.
Persist these to the visitor's session and, critically, carry them forward to the user record at signup. The durable rule: first touch decides the acquisition channel for trial-to-paid analysis, because the channel that earned the trial is the one you want to credit with the eventual paid conversion. (Last-touch is a defensible secondary view, but lead with first-touch for acquisition.)
If you use the platform pixel, first-touch capture is automatic once the snippet is in your site <head> — see SaaS analytics setup for the install.
Step 2 — Stitch identity at signup (the step everything depends on)
This is the single step that makes SaaS attribution work. When a user creates an account, link the anonymous, channel-tagged visitor to a durable identifier so every future event — including the paid conversion weeks later — inherits the acquisition channel:
// Fire this the moment the account is created.
// It links the anonymous ad-clicker to the customer identity,
// so the channel that drove the trial also earns the later MRR.
admaxxer.identify(userEmail);
admaxxer('Signup', { plan: 'starter' });
Without this stitch, the paying customer who converts three weeks later looks brand-new and anonymous, and the channel that earned the trial gets zero credit. With it, the link is permanent: the conversion event, fired weeks later, still resolves back to the original channel. Note that identity stitching attributes events going forward from the identify call — it cannot retroactively re-attribute subscriptions that predate it, so wire this in before you start judging channels.
Step 3 — Fire the SaaS funnel events
Track the lifecycle with the standard SaaS funnel events. The headline event is the trial-to-paid conversion:
// When the free trial begins (fire from the pixel for a no-card trial;
// a card-on-file trial can be driven from your billing webhooks instead).
admaxxer('Trial Started', { plan: 'starter' });
// The headline SaaS event — trial converts to a paying subscription.
admaxxer('Trial Converted', { plan: 'pro' });
A key nuance that trips teams up: who fires the conversion depends on your trial type. For a no-card trial, the user actively upgrades in your app, so the pixel fires Trial Converted at that moment. For a card-on-file trial, the conversion happens silently when the first charge succeeds at the end of the trial — there's no in-app click — so the conversion is best driven from your billing connection (Step 4), not the browser. Wiring both paths is what makes the funnel complete.
Step 4 — Connect your billing source of truth for MRR
Channel attribution tells you where customers came from; your billing system tells you how much they're worth. Connect billing with a read-only restricted key so MRR/ARR (including annual plans), trial-to-paid conversions, and churn flow in automatically and join to the channel you stitched in Step 2:
- Recurring revenue is read from billing, not entered by hand or inferred from pixel events.
- Card-on-file trial conversions and churn are captured server-side from billing lifecycle events, closing the gap the browser can't see.
- Every billing event resolves to a channel via the identity stitch.
See SaaS analytics setup for the exact restricted-key connection walkthrough.
Step 5 — Handle the multi-week conversion lag in your reporting
This is where SaaS attribution most often goes wrong, and it deserves its own step. The conversion-lag problem is structural:
- A trial that starts today may convert in two, three, or four weeks — or after the trial extends.
- Any short reporting window (the kind that works for e-commerce) will show a trial signup with no conversion yet, making a perfectly healthy channel look like it converts nobody.
- If you judge a channel on last week's conversions, you are judging it on trials that started weeks earlier — a different, older cohort.
The fix is to report trial-to-paid as a cohort, not a same-period rate:
- Cohort by signup week (or month). Group trials by when they started.
- Let each cohort mature. A cohort's trial-to-paid rate is not final until enough time has passed for that cohort's trials to convert — judging it too early understates every channel.
- Read the conversion curve, not a point. Plot cumulative trial-to-paid rate by cohort age (week 1, week 2, week 3…). Channels reveal their true rate only once the curve flattens.
- Compare channels at equal cohort maturity. Never compare a 1-week-old cohort from one channel to an 8-week-old cohort from another — equal-age comparison is the only fair one.
Practically: don't ask "what was each channel's trial-to-paid rate last week?" Ask "for trials that started in a given week, what share had converted by the time the cohort matured, split by channel?" That question is answerable and fair; the same-period version is neither.
Step 6 — Read the result: trial-to-paid by channel
With identity stitched, funnel events firing, billing connected, and cohorts maturing, you can finally answer the questions that matter for a SaaS:
- Trial-to-paid rate by channel (at equal cohort maturity).
- MRR by acquisition channel, attributed back to first touch.
- Time-to-convert by channel — how long each channel's trials take to mature.
- CAC payback by channel, the natural next step — covered in depth in our companion post, SaaS CAC payback by channel.
Common pitfalls
- Skipping the identify() call. The single most common cause of "all my paid customers show as direct/unattributed." Without the signup-time stitch, the conversion can't resolve to a channel.
- Judging channels on a same-period window. Treating SaaS like ecom and reading last week's conversions makes lagging-but-healthy channels look dead. Always cohort.
- Crediting last touch for acquisition. The conversion often happens on a later direct/branded visit; crediting that visit robs the channel that earned the trial. Lead with first-touch for acquisition.
- Inferring revenue from pixel events. Recurring revenue — especially card-on-file conversions, annual plans, and churn — belongs to your billing connection, not browser events.
- Comparing unequal cohort ages. A young cohort always looks worse; compare like-for-like maturity.
FAQ
Why is trial-to-paid attribution harder than e-commerce attribution?
Because the value and the conversion are both delayed and detached from the click. In e-commerce the order completes within days of the click in the same session, so a short window and last-click attribution work. In SaaS, a click creates an anonymous trial that may convert weeks later, often on a different visit, and the revenue then accrues monthly. Without an identity stitch at signup and cohort-based reporting, the channel that earned the trial gets no credit and the conversion lag makes healthy channels look dead.
What is the single most important step?
The identity stitch at signup — calling identify(userEmail) (or the equivalent for your stack) the moment the account is created. It permanently links the anonymous, channel-tagged visitor to the customer, so the paid conversion weeks later still resolves to the original acquisition channel. Skip it and most of your paying customers will show as "direct" or "unattributed."
Should I attribute trials to first touch or last touch?
For acquisition analysis, lead with first touch — the channel that earned the trial is the one you want to credit with the eventual paid conversion, because the later converting visit is frequently a direct or branded session that the original channel set up. Last touch is a reasonable secondary lens, but first-touch is the honest default for "which channel acquired this customer."
How long should I wait before judging a channel's trial-to-paid rate?
Until the cohort has matured — long enough for that channel's trials to convert. The right wait depends on your trial length and sales cycle; the way to find it is to plot cumulative trial-to-paid rate by cohort age and wait for the curve to flatten. Judging a 1-week-old cohort understates every channel. Always compare channels at equal cohort maturity.
Does identity stitching back-fill my existing subscriptions?
No. Identity stitching attributes events going forward from the identify call — it links new conversions to channels but cannot retroactively re-attribute subscriptions that existed before you wired it in. That's why you should set up the stitch before you begin judging channel performance, so the attribution history is intact when you need it.
Where does my MRR number come from — the pixel or my billing system?
Your billing system, connected via a read-only restricted key. Recurring revenue — including annual plans, silent card-on-file trial conversions, and churn — is read from billing, not inferred from browser pixel events. The pixel's job is identity and funnel-stage events; billing's job is the money. The identity stitch is what joins the two so MRR carries a channel. See SaaS analytics setup.
How do I handle a no-card trial vs a card-on-file trial?
Differently, and you should wire both. A no-card trial converts when the user actively upgrades in your app, so the pixel fires the conversion event at that click. A card-on-file trial converts silently when the first charge succeeds at trial end — there's no in-app action — so that conversion is best captured from your billing connection. Handling both paths is what makes the trial-to-paid funnel complete rather than missing the silent conversions.
Frequently Asked Questions
Why is trial-to-paid attribution harder than e-commerce attribution?
Because the value and the conversion are both delayed and detached from the click. In e-commerce the order completes within days of the click in the same session, so a short window and last-click attribution work. In SaaS, a click creates an anonymous trial that may convert weeks later, often on a different visit, and the revenue then accrues monthly. Without an identity stitch at signup and cohort-based reporting, the channel that earned the trial gets no credit and the conversion lag makes healthy channels look dead.
What is the single most important step?
The identity stitch at signup — calling identify(userEmail) (or the equivalent for your stack) the moment the account is created. It permanently links the anonymous, channel-tagged visitor to the customer, so the paid conversion weeks later still resolves to the original acquisition channel. Skip it and most of your paying customers will show as direct or unattributed.
Should I attribute trials to first touch or last touch?
For acquisition analysis, lead with first touch — the channel that earned the trial is the one you want to credit with the eventual paid conversion, because the later converting visit is frequently a direct or branded session that the original channel set up. Last touch is a reasonable secondary lens, but first-touch is the honest default for which channel acquired this customer.
How long should I wait before judging a channel's trial-to-paid rate?
Until the cohort has matured — long enough for that channel's trials to convert. The right wait depends on your trial length and sales cycle; the way to find it is to plot cumulative trial-to-paid rate by cohort age and wait for the curve to flatten. Judging a 1-week-old cohort understates every channel. Always compare channels at equal cohort maturity.
Does identity stitching back-fill my existing subscriptions?
No. Identity stitching attributes events going forward from the identify call — it links new conversions to channels but cannot retroactively re-attribute subscriptions that existed before you wired it in. That is why you should set up the stitch before you begin judging channel performance, so the attribution history is intact when you need it.
Where does my MRR number come from — the pixel or my billing system?
Your billing system, connected via a read-only restricted key. Recurring revenue — including annual plans, silent card-on-file trial conversions, and churn — is read from billing, not inferred from browser pixel events. The pixel's job is identity and funnel-stage events; billing's job is the money. The identity stitch is what joins the two so MRR carries a channel.
How do I handle a no-card trial vs a card-on-file trial?
Differently, and you should wire both. A no-card trial converts when the user actively upgrades in your app, so the pixel fires the conversion event at that click. A card-on-file trial converts silently when the first charge succeeds at trial end — there is no in-app action — so that conversion is best captured from your billing connection. Handling both paths is what makes the trial-to-paid funnel complete rather than missing the silent conversions.
Put This Knowledge Into Action
Bring Meta and Google ads into one self-hosted workspace.
Get Started Free