Skip to content
Metricsjar

Article · Updated August 2026

Which channel actually drove the sale?

Editorial cover: acquisition sources connected through an account to a verified 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:

  1. source to visit;
  2. visit to account;
  3. account to sale;
  4. sale to retained revenue.

Evidence chain from acquisition source to session, account and sale

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.

DecisionMinimum useful evidenceWhat it does not require
Keep or stop a small paid campaignSpend, tagged visits, mature purchases and margin assumptionA universal multi-touch model
Decide whether a free tool earns continued workTool entry, account join and downstream qualified outcomeCredit for every later visit
Compare directoriesConsistent link tags, landing visits, signups and sales by directoryTreating every directory listing as a click
Understand organic discoverySearch or referral source, landing page and downstream account outcomeAssigning a sale to a single query without a join
Explain a founder reportSource-scoped visits beside account and revenue outcomesPretending 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:

FieldExampleRule
utm_sourcelinkedinOne lowercase value per platform
utm_mediumpaid_socialName the channel type consistently
utm_campaignfounder_report_aug_2026Reuse the exact campaign name
utm_contentpain-led-v1Distinguish creative or placement
utm_idfr-2026-08Stable 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:

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:

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.

OutcomeSuitable cohort windowCaveat
Immediate purchasePurchase at or soon after signupMisses later conversion and churn
Trial-to-paidTrial cohort after the full trial plus payment-processing delayRecent cohorts are incomplete
30-day retained customerAt least 30 days after paymentPlan intervals and refunds matter
Retained recurring revenueA defined renewal or monthly boundaryMRR 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:

LabelDefinitionExample
ObservedThe source and outcome share a preserved deterministic joinTagged campaign → account ID → billing customer → transaction
InferredA documented model assigns credit from partial evidenceEvent-scoped data-driven attribution
UnknownNo defensible join or model evidence existsCross-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.

ChannelSpendTagged visitsJoined accountsNew paid customers30-day retained customersObserved revenue
Paid search$1,2001,8002302822$2,310
Founder newsletter$6006201051918$1,890
Directories$6009006085$525

The immediate customer acquisition cost is:

The 30-day retained-customer cost is:

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:

ChannelTagged visitsVisits joined to an accountJoin coverage
Paid search1,8001,26070%
Founder newsletter62049680%
Directories90036040%

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:

  1. spend or effort by channel;
  2. tagged visits;
  3. joined eligible accounts;
  4. mature paid conversions;
  5. retained outcome;
  6. join coverage and unknown share;
  7. 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

Keep reading