Article · Updated August 2026
Which channel actually drove the sale?

The channel that “drove the sale” depends on what you mean by drove. One channel may introduce the person, another may bring them back, and a third may receive credit under the reporting model. The sale itself belongs to a customer and transaction in the billing source.
For a small SaaS, the useful goal is not perfect attribution. It is an auditable evidence chain that distinguishes what was observed, what was inferred and what remains unknown.
That chain has four joins:
- source to visit;
- visit to account;
- account to sale;
- sale to retained revenue.

If one join is missing, do not hide the gap inside a model. Preserve the evidence you have, label the confidence and decide whether the missing join is worth repairing.
Start with the decision
Different decisions need different attribution evidence.
| Decision | Minimum useful evidence | What it does not require |
|---|---|---|
| Keep or stop a small paid campaign | Spend, tagged visits, mature purchases and margin assumption | A universal multi-touch model |
| Decide whether a free tool earns continued work | Tool entry, account join and downstream qualified outcome | Credit for every later visit |
| Compare directories | Consistent link tags, landing visits, signups and sales by directory | Treating every directory listing as a click |
| Understand organic discovery | Search or referral source, landing page and downstream account outcome | Assigning a sale to a single query without a join |
| Explain a founder report | Source-scoped visits beside account and revenue outcomes | Pretending adjacent totals form one deterministic funnel |
Write the budget or product decision first. Then specify the observation window and the evidence required to change it.
Build the evidence chain
1. Source to visit
For links you control, use a consistent campaign naming scheme. Google
recommends setting the relevant UTM parameters—especially utm_source,
utm_medium, utm_campaign, utm_id and utm_source_platform—and notes that
parameter values are case-sensitive (Google).
A small dictionary is enough:
| Field | Example | Rule |
|---|---|---|
utm_source | linkedin | One lowercase value per platform |
utm_medium | paid_social | Name the channel type consistently |
utm_campaign | founder_report_aug_2026 | Reuse the exact campaign name |
utm_content | pain-led-v1 | Distinguish creative or placement |
utm_id | fr-2026-08 | Stable ID that can join campaign records |
Store the original landing-page URL or parsed campaign fields on the first
measured visit. Test redirects and link shorteners. Google lists missing UTMs,
redirects and ad blockers among the reasons traffic can appear as
(direct) / (none) (Google).
An untagged visit is not necessarily direct demand. It is a visit without a clear referral source in that reporting system.
2. Visit to account
The critical handoff usually occurs when an anonymous visitor signs up. Preserve the first-touch and latest known campaign context, then join the anonymous identifier to the stable account or user ID when the product can do so lawfully.
Record:
- anonymous/session identifier;
- stable account or user identifier;
- first observed source and campaign;
- most recent non-direct source before signup;
- signup timestamp;
- landing page;
- consent or privacy state that affects collection.
Cross-device signups, cookie loss and privacy controls can break the join. If a person reads an article on a phone and signs up later on a laptop, the correct result may be unknown. Do not join people by weak fingerprinting simply to improve a report.
3. Account to sale
Create an explicit mapping between the product account and the billing customer wherever the architecture allows it. Preserve the billing customer ID and transaction/subscription ID in your own application records; do not put sensitive personal data into campaign fields.
The purchase record should answer:
- which account purchased;
- when the commercial event occurred;
- whether it was a trial start, first payment, renewal, refund or failure;
- which product and plan were involved;
- which currency and revenue basis the report uses.
For an app-store purchase, identity and attribution can be constrained by the platform. App Store Connect can attribute downloads and subsequent sales or subscriptions to its recorded acquisition source, but a redownload resets that source and usage data has privacy constraints (Apple). Keep Apple’s attribution separate from a website or product account join unless you have a valid shared identifier.
4. Sale to retained revenue
A channel that creates many first payments can still produce weak retained revenue. Extend the observation window far enough to see the outcome the decision requires.
| Outcome | Suitable cohort window | Caveat |
|---|---|---|
| Immediate purchase | Purchase at or soon after signup | Misses later conversion and churn |
| Trial-to-paid | Trial cohort after the full trial plus payment-processing delay | Recent cohorts are incomplete |
| 30-day retained customer | At least 30 days after payment | Plan intervals and refunds matter |
| Retained recurring revenue | A defined renewal or monthly boundary | MRR is normalized, not cash collected |
Do not compare a seven-day-old campaign with a 60-day-old campaign on retained revenue without marking cohort maturity.
Separate evidence from credit
The evidence chain describes events and joins. An attribution model assigns credit across the observed interactions. Those are different operations.
GA4, for example, exposes user-, session- and event-scoped traffic-source dimensions. Google says user and session scopes use paid-and-organic last click, while event-scoped dimensions use the selected attribution model and default to data-driven attribution (Google). The same revenue metric can therefore appear beside different source dimensions without either report being defective.
Use three confidence labels:
| Label | Definition | Example |
|---|---|---|
| Observed | The source and outcome share a preserved deterministic join | Tagged campaign → account ID → billing customer → transaction |
| Inferred | A documented model assigns credit from partial evidence | Event-scoped data-driven attribution |
| Unknown | No defensible join or model evidence exists | Cross-device signup with no shared identity |
Do not relabel inferred attribution as an observed sale.
Choose a simple model deliberately
First-touch
Use first-touch when the decision is about discovery: which source first introduced measured accounts? It is stable and easy to explain, but ignores later interactions and depends on capturing the first visit.
Last non-direct touch
Use last non-direct touch when the decision concerns the final known acquisition interaction before an outcome. It is easy to operate but can over-credit branded search, email or retargeting.
Multi-touch or data-driven
Use a multi-touch or data-driven model only when the volume, path quality and decision justify the complexity. Google currently offers data-driven, paid-and-organic last click and Google-paid-channels last click in GA4 attribution reports (Google). A more complex model is not automatically more truthful for a small dataset.
Keep one primary model for recurring decisions and show a comparison model only when the difference changes action.
A worked example
The following figures are fictional.
Acme Notes spends $2,400 across three channels during July. It waits until every trial cohort has had 21 days to convert.
| Channel | Spend | Tagged visits | Joined accounts | New paid customers | 30-day retained customers | Observed revenue |
|---|---|---|---|---|---|---|
| Paid search | $1,200 | 1,800 | 230 | 28 | 22 | $2,310 |
| Founder newsletter | $600 | 620 | 105 | 19 | 18 | $1,890 |
| Directories | $600 | 900 | 60 | 8 | 5 | $525 |
The immediate customer acquisition cost is:
- paid search:
$1,200 / 28 = $42.86; - founder newsletter:
$600 / 19 = $31.58; - directories:
$600 / 8 = $75.00.
The 30-day retained-customer cost is:
- paid search:
$1,200 / 22 = $54.55; - founder newsletter:
$600 / 18 = $33.33; - directories:
$600 / 5 = $120.00.
The newsletter looks strongest under both views. Directories look weaker after retention. That is enough to investigate the directory mix and landing-page fit. It does not prove that the newsletter caused every sale credited to it.
Now add join coverage:
| Channel | Tagged visits | Visits joined to an account | Join coverage |
|---|---|---|---|
| Paid search | 1,800 | 1,260 | 70% |
| Founder newsletter | 620 | 496 | 80% |
| Directories | 900 | 360 | 40% |
The lower directory coverage weakens the comparison. Report the observed result and the coverage beside it rather than scaling the five retained customers into an invented total.
Common attribution mistakes
Comparing different scopes
First-user source, session source and event-scoped attributed source answer different questions. Name the scope in the chart title.
Treating direct as a channel campaign
Direct often means the system lacks a clear referrer. It can include typed URLs, bookmarks, offline documents, stripped parameters and blocked tracking.
Letting campaign names fragment
LinkedIn, linkedin and linked_in become separate values. Use a
controlled dictionary and test every destination.
Counting recent trials as failed conversion
Hide or mark cohorts that have not completed the conversion window.
Optimizing to first payment only
Include refunds, failed renewals and retained revenue when the channel decision is long-term.
Claiming causation from attribution
Attribution assigns credit within a model. It does not prove the counterfactual: whether the sale would have happened without the channel.
The weekly channel report
Keep the recurring view small:
- spend or effort by channel;
- tagged visits;
- joined eligible accounts;
- mature paid conversions;
- retained outcome;
- join coverage and unknown share;
- one next investigation.
Put web, product and billing metrics together only after preserving their entities and definitions. The method in put web, app and revenue metrics on one page explains that reporting layer.
Frequently asked questions
Which attribution model should a small SaaS use?
Use the simplest model that matches the decision and can be explained consistently. First-touch is useful for discovery; last non-direct touch is useful for the final known acquisition interaction. Compare models only when the difference changes a budget decision.
Can UTMs tell me which channel made the sale?
UTMs preserve campaign context on the visit. You still need a lawful visit-to-account join and an account-to-purchase mapping. UTMs alone do not identify the buyer.
Why does GA4 show so much direct traffic?
Direct means there was no clear referral source for that traffic in GA4. Missing tags, redirects, shortened links, blockers, bookmarks and typed URLs can all contribute.
How should app-store sales be attributed?
Use the platform’s first-party acquisition and subscription definitions, then add your own account evidence only when a valid join exists. Do not force website and app-store identities together without support.
What if only half of sales can be joined?
Report the deterministically joined half, the join coverage and the unknown remainder. Do not allocate the unknown sales proportionally unless you label that operation as a model and test its sensitivity.
Sources
- Google Analytics URL builders and UTM parameters
- Google Analytics traffic-source dimensions
- Google Analytics traffic-source scopes
- Google Analytics attribution models
- Google Analytics direct traffic
- Apple App Store Connect acquisition
- Free-tool acquisition discussion
- ChatGPT traffic-source discussion
- SaaS directory attribution discussion