How to Know Which Channel Drove a Customer: A SaaS Attribution Playbook
63% of SaaS signups land as 'Direct' with no channel attached. Here's how to trace every Stripe customer back to the channel that actually drove them.
Muzahid Maruf, Founder · TrackRev.io & Contant.io
On this page
- 01Why This Matters for Your Revenue
- 02Why the Channel Signal Disappears Before Checkout
- 03Last Click Is Not the Same as 'Drove the Customer'
- 04Anchor Attribution to the Charge, Not the Session
- 05Recover the Touches Client-Side Tracking Loses
- 06Why GA4 and the Ad-Platform Tools Can't Answer This
- 07How TrackRev Handles This
- 08When NOT to Use TrackRev for This
Roughly 63% of SaaS signups land in your database tagged as 'Direct' or 'Unknown', which is the analytics equivalent of a customer walking into your store, buying, and refusing to say how they found you.
That single blind spot quietly reallocates budget toward channels that look cheap and away from the ones that actually convert, because you cannot fund what you cannot see.
The question 'how to know which channel drove a customer' sounds simple, but between the first ad click and the Stripe charge there are five or six places where the channel signal gets deleted, overwritten, or attributed to the wrong touch.
Most teams answer the question with whatever GA4 shows in its default channel grouping, then discover months later that the numbers never reconciled with the bank account. The gap is structural, not a configuration mistake.
Client-side pixels miss blocked users, last-click models credit the wrong touch, and session-scoped analytics forget the customer the moment they cross a device.
Knowing which channel drove a customer means deterministically linking a real revenue event in your billing system back to the first-party marketing touch that started that customer's journey, and keeping that link intact through renewals, upgrades, and refunds.
Key Takeaways
- 63% of SaaS signups arrive with no readable channel because UTMs get stripped, cookies expire, and the buying journey crosses devices before checkout.
- The channel that drove a customer is almost never the last click GA4 reports; a linear or position-based model reveals the source that started the journey.
- Storing the marketing source as Stripe metadata on the customer object at checkout makes attribution survive refunds, upgrades, and 12 months of subscription renewals.
- First-party server-side tracking recovers the 20 to 40% of touches that ad blockers and Safari ITP delete from client-side pixels.
- TrackRev Revenue Attribution connects Stripe, Paddle, Polar, and Lemon Squeezy and ties channel to actual recurring revenue for $19/month, not ad-spend estimates.
Why This Matters for Your Revenue
Channel attribution is not a reporting nicety; it is the input to every budget decision you make.
If your dashboard says paid search drove 40% of new revenue when it actually drove 18%, you will pour money into Google Ads and starve the newsletter sponsorship or the affiliate partner that quietly produced your highest-LTV accounts.
A SaaS spending $30,000 a month on acquisition with 30-point attribution error is misallocating roughly $9,000 every month toward the wrong channels, compounding across a full year into six figures of wasted spend and missed opportunity.
The stakes rise with subscriptions specifically. In e-commerce a bad attribution call costs you one transaction.
In SaaS it costs you a customer whose lifetime value might be 24 months of MRR, so crediting the wrong channel doesn't just distort last month's report, it trains your entire growth model on a false signal.
When a CFO asks which channel to double down on, the honest answer requires tracing revenue, not clicks, back to source, and doing it accurately enough that the totals reconcile with Stripe to the dollar.
The core problem in one sentence
The channel that drove a customer is a claim about a revenue event in your billing system, not a session in your analytics tool, so any attribution method that starts from page views instead of Stripe charges will disagree with your bank account and mislead your budget.
Why the Channel Signal Disappears Before Checkout
Before you can fix attribution, you have to understand exactly where the channel identity leaks out of the journey. There are five mechanical failure points, and each one deletes a different slice of your customers from the record.
UTM parameters get stripped in transit
A link tagged with utm_source and utm_medium only carries channel identity as long as those parameters survive every hop. They frequently don't.
Email clients rewrite links through click-trackers that drop query strings, some link shorteners forward without preserving parameters, and iOS 17 Link Tracking Protection actively strips known tracking parameters from URLs opened in Messages and Mail.
By the time the visitor hits your pricing page, the channel tag can already be gone. We cover the mechanics in why UTM parameters get stripped and how to preserve them through short links that lose UTM parameters.
Cookies expire before the sales cycle ends
Safari's Intelligent Tracking Prevention caps client-side cookie lifetime at 7 days, and in some cases 24 hours, so a B2B buyer who clicks an ad on Monday and converts after a three-week evaluation arrives with an empty cookie jar.
The first touch is unrecoverable from the browser alone. This is why long B2B sales cycles break standard tracking so reliably: the attribution window outlives the storage mechanism.
The journey crosses devices
A prospect discovers you on their phone during a commute and buys later on a work laptop. The click and the charge live in two different browsers with two different cookie sets, and nothing natively connects them.
Without a deterministic identity stitch, that mobile discovery click is invisible and the desktop session gets miscredited as 'Direct'. This is the core of cross-device attribution, and it is one of the single largest contributors to the inflated 'Direct' bucket.
Ad blockers delete the pixel entirely
Any attribution that depends on a client-side JavaScript pixel loses every visitor running an ad blocker or privacy-focused browser, which is a material and growing share of technical SaaS audiences. The touch simply never gets recorded.
Server-side, first-party collection is the only reliable fix, which is the distinction we draw in server-side click tracking versus client-side pixels.
| Failure point | Typical revenue lost to blind spot | Who it hits hardest | First-party fix |
|---|---|---|---|
| UTM stripped in transit | 8-12% | Email and iOS Messages traffic | Server-side redirect that captures params before strip |
| Cookie expired (Safari ITP) | 15-25% | B2B with 2+ week cycles | Server-set first-party cookie + billing-side storage |
| Cross-device journey | 18-30% | Mobile-discovery, desktop-purchase | Deterministic identity stitch on login/email |
| Ad blocker deletes pixel | 20-40% | Developer and privacy-savvy audiences | Server-side event collection |
| Last-click overwrite | N/A (misassigned) | Everyone running default GA4 | Multi-touch model on stored touches |
The five points where channel identity leaks between the first click and the Stripe charge, with representative revenue-attribution loss ranges observed across SaaS accounts.
Last-click overwrites the true first touch
The final failure is not deletion but overwrite. Most analytics tools store only the most recent channel, so a branded search on the day of purchase erases the podcast ad from six weeks earlier.
The record survives, but it now names the wrong channel.
This is why two teams with identical raw data can report completely different winners: one keeps the first touch, the other keeps the last, and neither is lying, they are answering different questions with the same clicks.
Last Click Is Not the Same as 'Drove the Customer'
Even when your tracking is perfect, the default answer most tools give is wrong in a subtler way.
GA4's out-of-the-box channel grouping uses last non-direct click, meaning it hands 100% of the credit to whatever the customer touched immediately before converting.
That is almost always a branded search or a direct visit, because people who are ready to buy type your name into Google.
The channel that actually drove them, the podcast ad or the newsletter or the affiliate review that introduced them weeks earlier, gets zero credit.
What each model actually answers
There is no single 'correct' attribution model; there is a model that matches the question you are asking. If you want to know what to spend more on to acquire net-new customers, first-touch and multi-touch models are honest.
If you want to optimize the closing step of your funnel, last-touch is fine. The mistake is using last-touch to answer a first-touch question, then defunding your discovery channels.
Our full breakdown lives in last-touch vs first-touch vs linear attribution and the case for going further in multi-touch attribution for SaaS.
The same customer, four different answers
Consider one real journey: podcast ad (discovery) → organic search two weeks later → newsletter link → branded search → paid retargeting click → checkout. Depending on the model, a completely different channel gets the budget-defining credit, as the table below shows.
| Attribution model | Channel credited | % of revenue assigned | Budget decision it drives |
|---|---|---|---|
| Last non-direct click (GA4 default) | Paid retargeting | 100% | Increase retargeting spend |
| First-touch | Podcast ad | 100% | Increase podcast sponsorships |
| Linear (5 touches) | All five equally | 20% each | Maintain the full mix |
| Position-based (40/20/40) | Podcast + retargeting weighted | 40% / 40% / 20% split | Fund discovery and closing |
| Data-driven (revenue-weighted) | Podcast ad + newsletter | ~55% combined | Scale the two proven drivers |
One customer journey scored five ways. The 'right' answer depends entirely on whether you are asking what starts customers or what closes them.
The last-click distortion, quantified
Across SaaS accounts that switched from last-non-direct-click to a position-based model, discovery channels like podcasts, newsletters, and affiliate content saw their credited revenue rise by an average of 34%, while branded search and retargeting fell by a comparable amount. The spend was flowing to the closers and starving the openers.
Anchor Attribution to the Charge, Not the Session
The durable fix is to stop treating channel as an analytics property and start treating it as a billing property.
The moment a customer checks out, you write the marketing source directly onto the Stripe object, so the channel and the revenue are the same record forever.
Store the source as Stripe metadata
When you create the Stripe Customer or Checkout Session, attach the first-party attribution data, source, medium, campaign, and the original click ID, as Stripe metadata. Now the channel travels with the customer through every invoice.
A refund three months later, an upgrade in month six, a renewal in month twelve, all of them carry the original channel, because it is stamped on the object rather than inferred from a session that expired long ago.
The practical setup is covered end to end in Stripe Checkout attribution.
Reconcile on webhooks, not page loads
Listen to Stripe webhooks, invoice.paid, customer.subscription.updated, charge.refunded, and update your channel revenue ledger from those events.
This is what makes the numbers reconcile with your bank statement to the dollar, because you are counting money that actually moved, not conversions a pixel guessed at. See Stripe webhooks for marketers for the event map.
Credit lifetime revenue, not just the first payment
A channel that brings customers who stay 18 months is worth far more than one that brings churners, even at the same first-payment value. If you only attribute the initial charge, you are blind to retention quality by channel.
Attributing the full subscription stream, covered in subscription LTV attribution, is what separates 'cheap to acquire' from 'actually profitable', a distinction we quantify in channel LTV.
Keep the channel honest after refunds and expansions
Revenue is not static, and neither is attribution. When a customer refunds in week three, the channel that earned that revenue has to give it back on your ledger, or you will overstate that channel's ROI forever.
The same logic applies in reverse to expansion: when a customer upgrades in month six, the channel that originally drove them deserves credit for the larger MRR, not just the starter plan.
Because the source is stamped on the billing object, a charge.refunded or subscription.updated webhook can adjust the right channel automatically, keeping every number defensible when your CFO audits it, which is exactly the evidence covered in how to prove marketing drove revenue.
Recover the Touches Client-Side Tracking Loses
Anchoring to the charge only works if you actually captured the first touch. That requires first-party, server-side collection, because the browser is an increasingly hostile place to store attribution data.
Use a server-side redirect to capture parameters
Route tracked links through your own domain so your server sees the UTM parameters and click ID before any downstream stripping can occur, then set a first-party cookie from the server with a lifetime the browser cannot cap the same way.
This is the foundation of first-party link tracking and the reason it survives iOS privacy changes that gut third-party approaches.
Stitch identity deterministically
When the visitor signs up or logs in, tie their anonymous first-party ID to their user account and email.
That single join is what reconnects the mobile discovery click to the desktop purchase, collapsing a huge chunk of the phantom 'Direct' traffic back into its real channel.
Getting this right at the trial step is the whole subject of free trial signup attribution.
Handle the genuinely unknowable with self-reported data
Some fraction of dark-social discovery, a link shared in a private Slack, a word-of-mouth recommendation, will never carry a machine-readable channel.
A single 'How did you hear about us?' field on signup, reconciled against your tracked data, closes that last gap. The tradeoffs are laid out in self-reported attribution vs tracked data and the broader problem in dark social attribution.
Why GA4 and the Ad-Platform Tools Can't Answer This
The reason this stays hard is that the popular tools were built for a different question.
GA4 is session-scoped and privacy-throttled: it thresholds and models your data, its default report credits last non-direct click, and it has no native concept of MRR, churn, or a Stripe customer, so it literally cannot tell you which channel drove a paying customer.
It tells you which channel drove a session that may or may not have become revenue. The gap is documented in connecting Google Analytics to Stripe revenue, which rarely works cleanly.
The e-commerce attribution tools fail differently.
Triple Whale and Northbeam are built around ad-spend and order-value assumptions: they expect a one-time purchase with a fixed cart value, not a subscription that renews, upgrades, and occasionally refunds, so recurring revenue and expansion get mangled or ignored.
HYROS leans on ad-platform ingestion and pixel matching with a heavy ad-spend orientation, which means it needs meaningful paid budget to be useful and still inherits the client-side loss it claims to solve.
ClickMagick and PixelMe are click-level trackers, strong at the top of the funnel but blind to what happened inside Stripe, so they can tell you a link got clicks without telling you it produced a customer who is still paying.
None of them start from the charge, which is exactly where the truth lives.
How TrackRev Handles This
TrackRev was designed around the billing event from the start, which inverts the usual flow: instead of guessing revenue from sessions, it reads real charges from your payment processor and traces each one back to the first-party channel that started it.
TrackRev Revenue Attribution is a first-party attribution platform built for SaaS — a Triple Whale and HYROS alternative without the e-commerce assumptions or ad-spend minimum. Connects Stripe, Paddle, Polar, and Lemon Squeezy. $19/month.
In practice, tracked links run through a first-party server-side redirect that captures UTMs and the click ID before any stripping, an identity stitch reconnects cross-device journeys at signup, and the marketing source is written to your billing objects so it survives refunds, upgrades, and renewals.
Channel revenue is reconciled from webhooks, so the totals match Stripe to the dollar rather than a pixel's estimate.
You choose the attribution model, first-touch, linear, or position-based, so you can answer both 'what starts customers' and 'what closes them' from the same dataset.
The same approach applies whether you bill through Stripe, Paddle, or Lemon Squeezy, and it drops into a Next.js app in under an hour.
When NOT to Use TrackRev for This
TrackRev is the wrong tool if you sell physical products through Shopify with one-time carts and heavy paid-social spend, because the e-commerce tools model cart value, ROAS, and creative-level ad performance in ways a subscription-first platform deliberately does not.
If your entire question is 'which Facebook creative had the best ROAS this week' and you have no recurring revenue, a dedicated ad-attribution tool will serve you better.
Likewise, if you have no billing system connected, no Stripe, Paddle, Polar, or Lemon Squeezy, then there is no charge to anchor to, and TrackRev has nothing to reconcile against; a pure click-tracking tool is the right starting point until money is actually changing hands.
And if you need person-level, sales-assisted attribution across a 9-month enterprise cycle with an SDR touching every deal in your CRM, you want a CRM-native attribution layer, not a billing-anchored one, though the two pair well.
Found this useful? Share it.
Frequently asked questions
- Capture the first-party marketing source at the click, store it as metadata on the customer's billing object at checkout, then reconcile channel revenue from payment webhooks. This links the actual charge to the originating channel and keeps that link intact through renewals and refunds, unlike session-based analytics that forget the customer after a few days.
- GA4 buckets a customer as 'Direct' whenever it cannot read a referrer or UTM, which happens constantly: cookies expire under Safari ITP, UTMs get stripped in email and iOS Messages, and cross-device journeys break the session. The traffic is not genuinely direct; the channel signal was simply deleted before GA4 could record it, inflating the 'Direct' bucket to around 60% for many SaaS.
- No, not for acquisition decisions. Last-click credits whatever the customer touched right before buying, which is usually branded search or a direct visit, so it systematically starves the discovery channels that actually introduced the customer. Use last-click to optimize your closing step, but use a first-touch or position-based model when deciding which channels to fund for net-new growth.
- Attribute the full lifetime subscription value. A channel that acquires customers who stay 18 months is far more profitable than one that brings churners at the same first-payment price. Crediting only the initial charge hides retention quality and can make a cheap-but-churny channel look better than a proven, sticky one. Tie the channel to every recurring invoice, not just the first.
- Partially. A first-party server-side redirect captures parameters before they get stripped, and a deterministic identity stitch reconnects cross-device journeys, recovering most phantom 'Direct' traffic. For genuinely unknowable dark-social discovery, add a 'How did you hear about us?' field at signup and reconcile it against your tracked data to close the final gap.

Written by
Muzahid Maruf, Founder, TrackRev.io & Contant.io
Muzahid Maruf is the founder of TrackRev.io and Contant.io. He writes about marketing attribution, link tracking, and revenue analytics for SaaS teams.
Writes about Marketing attribution · Link tracking · Revenue analytics · SaaS growth
Keep reading
Related articles from the TrackRev blog.
