Skip to main content

Attribution & revenue

Why this matters for your business

Most merchants are flying blind on which channel actually drives revenue. Google Ads says "we drove 40% of orders." Meta says "we drove 60% of orders." Klaviyo says "email drove 30%." Add it up and you're attributing 130% of revenue. Each tool measures only its own touchpoints, claims credit for the conversion, and ignores everything else that happened on the way.

Attribution on this platform fixes that by joining the customer journey end-to-end inside one profile. Every storefront visit, every email open, every WhatsApp click, every ad click that arrives with our pixel installed — they're all on the same timeline as the order. When the order completes, the system can see all the touchpoints that led to it and credit them proportionally.

The practical implication: your marketing budget stops being a zero-sum political debate between channel teams and starts being an ROI question with an actual answer. Channels that look great in their own dashboards but don't move the unified number get wound down. Channels that quietly compound (especially the "middle of the funnel" workhorses like email + push) finally get credit.

What this typically unlocks

OutcomeTypical result
Confidence in ROAS by channel+90% — same-platform attribution beats UTM-only
Campaigns retired because they don't earn30–40% of historical campaign spend recovered
Ad budget reallocated to actual top performers+22% ROAS at constant spend
"Which channel drove this $?" answered in secondsvs. days of manual joining
Holdout-based incrementality availableAgency+ — proves causal lift, not just attribution

What you actually get

Six attribution models, side by side, plus optional holdout-based incrementality on top. You pick one as your primary number; the others are visible for reference so you can sanity-check.

ModelLogicWhen to use
Last touch100% credit to the most recent touchpoint before purchaseDefault. Easy to explain, matches Shopify's reporting.
First touch100% credit to the very first touchpointWhen you want to credit acquisition channels.
LinearCredit split equally across all touchpoints in the windowFair-but-naive baseline.
Time decayRecent touchpoints get more credit, older ones less (half-life configurable)Best for short consideration cycles (impulse buys).
Position-based (U-shape)40% first, 40% last, 20% spread across the middleBalanced acquisition + close credit.
Data-driven (DDA) (Pro+)Machine-learned weights per channel based on conversion liftWhen you have enough data (~5K+ orders/month).

Plus: optional holdout-based incrementality (Agency+) — the gold standard. A held-out subset of an audience gets no campaign messages; lift = treated revenue per customer minus holdout revenue per customer. That's the causal number, not just attributed.

How it powers every part of your store

Decision the data unlocksMechanism
"Should we keep running this email campaign?"Per-campaign revenue with holdout-based lift
"Is WhatsApp paying for itself?"Per-channel revenue table with cost overlay
"Which segment is most valuable to retarget?"Segment × revenue × ROAS breakdown
"Did the journey we built actually earn?"Per-journey attributed revenue + exit-reason mix
"Are our ads cannibalizing organic?"Ad-only customers vs. multi-touch customers split
"Should we shift budget from Meta to Google?"Multi-touch view across both, not Meta-vs-Meta-only
"Is this product driving repeat orders?"Product → first-order → 2nd-order revenue path

How it works (without the technical bits)

Three things make attribution accurate on this platform:

  1. Identity is unified. Because Customer 360 merges identifiers across email, phone, web sessions, and marketplace IDs, we know "this email open, this ad click, and this checkout were the same person" — even when they happened on different devices.
  2. Touchpoints are timestamped. Every email open, click, WhatsApp read, ad click (when our pixel is on the landing page), and storefront visit is recorded with millisecond timestamps to a single timeline per customer.
  3. The window is configurable. Default 14 days post-touchpoint; anything earlier is excluded from credit. You can change this per campaign (e.g. 7 days for a flash sale, 30 days for a high-AOV brand).

The attribution window

Default 14 days. Why this length:

  • Short enough that "I clicked an ad 3 months ago" doesn't stay credited
  • Long enough to capture realistic consideration cycles for most product categories

Tune it per campaign for product-specific context: 7 days for flash deals, 21 days for fashion (try-and-decide), 60 days for furniture or other high-AOV.

How a credit is computed (per model)

The system records one Attribution row per (order, touchpoint, model) combination. Six models = six rows per touchpoint per order, all calculated upfront, all queryable.

The merchant UI shows you whichever model you've selected as primary, with the others one click away for cross-check.

Holdout-based incrementality (the gold standard)

Attribution answers "of all my marketing, how should I split the credit for this order?" Holdouts answer the deeper question: "would this order have happened without my marketing at all?"

The mechanism:

Holdout assignment is stable per customer across campaigns — the same person in the holdout for one campaign can be in treatment for another. Over time, you build a credible picture of incrementality across your whole marketing program.

What "stale" looks like

Attribution updates as orders complete and as the windows close. A campaign-revenue dashboard shows three states per order:

StateMeaning
PendingOrder is within attribution window — credits may still arrive
FinalWindow closed — credits won't change
DisputedDifferent models disagree by > 50% on credit assignment

"Disputed" rows are surfaced for review — usually means the customer journey was unusually long or the touchpoint mix was ambiguous (e.g. last-touch and first-touch both have 100% credit to different channels, time-decay sides with last-touch). The merchant decides which interpretation is right for their business.

Real merchant scenarios

Scenario A — DTC brand discovers email's hidden value

Setup. $4M/year DTC brand. Looking at Klaviyo (last-touch attribution), email "drove 18% of revenue" — Meta dashboard said Meta drove 62%. CEO was about to cut email spend.

What attribution showed.

ModelEmail's share of revenue
Last touch18% (matches Klaviyo)
First touch12%
Linear31%
Time decay24%
Position-based (U-shape)28%
Data-driven (DDA)34%

Email's true role was middle-funnel: opened by 4 of every 5 customers in the 14 days before purchase, but rarely the last click. Cutting email would have killed the conversion rate of ad-clicked customers.

Decision. Kept email. Slowed Meta acquisition spend. ROAS improved 28% in the next quarter at flat budget.

Scenario B — Agency proves journey ROI to skeptical client

Setup. Agency manages a $20M brand. Client questions whether the post-purchase journey (5 emails over 30 days) is actually driving the 2nd order, or whether customers would have ordered anyway.

Method. Set up a 10% holdout on the post-purchase journey for one quarter.

CohortCustomers60d 2nd-order rateAvg 2nd-order revenue
Treatment (received journey)8,40024.1%$87
Holdout (received nothing)94014.6%$79
Lift+9.5pp+$8

That's $8 × 8,400 customers = $67K incremental revenue from one journey in one quarter, on top of what the customers would have spent anyway. Causal number, not just attributed.

Client kept paying the agency.

Scenario C — Mid-market brand finds a "cannibalizing" ad campaign

Setup. $10M brand running a "loyalty-customer retargeting" ad campaign on Meta. Campaign reported 4.2× ROAS — looked like a winner.

Holdout test. 20% of the targeted segment held out from the ad campaign for 8 weeks.

CohortCustomersSpend per customer (8 wks)
Treatment6,400$42
Holdout1,600$39

Lift = $3 per customer × 6,400 = $19K. Ad spend = $84K.

Real ROAS = 0.23×, not 4.2×. The campaign was attribution-stealing — customers were going to order anyway; the ad just happened to be the last touch.

Decision. Killed the campaign. Reallocated $84K/quarter to new-customer acquisition. The "lost revenue" was the $19K, not $268K (the attributed number).

Scenario D — Subscription brand tunes its acquisition mix

Setup. Subscription brand, complicated multi-channel acquisition. Wants to know which channels deliver high-LTV customers vs. one-and-done ones.

Approach. First-touch attribution joined to LTV.

First touch channelCustomers acquiredLTV (12mo)CACLTV:CAC
Google Ads3,200$148$423.5×
Meta retargeting2,800$72$381.9×
Influencer1,400$186$583.2×
Email referral800$214$923×
Organic1,100$174$0
TikTok1,800$52$301.7×

Decision. Doubled influencer spend (high LTV, mid CAC). Cut TikTok in half (low LTV, mid CAC). Built a referral program (highest LTV:CAC) — the data showed referral was the best acquisition channel they had and they were under-investing.

Scenario E — Catching ad fatigue early

Setup. Ad spend on Meta was stable at $50K/month, ROAS gradually drifting from 4.5× → 3.1× over six months. Meta's own dashboard showed fluctuations but no clear "fatigue" signal.

What multi-touch attribution showed.

The drop was concentrated in return customers — Meta was "closing" customers who would have come back via email anyway. First-time-buyer ROAS was steady at ~4.0×; returning-customer ROAS had collapsed to 1.4×.

Decision. Excluded already-converted customers from the ad audience. Focused Meta spend on net-new acquisition. Result:

  • Meta ROAS recovered to 3.9× in one month
  • Email engagement up (returning customers re-engaged via email instead)
  • Total customer acquisition cost down 18%

The data was always there; multi-touch attribution made it legible.

Best practices

Pick a primary model and stick with it for reporting. Switching between models week-to-week makes trends meaningless. Most stores: time-decay or position-based. Larger stores with ML data volume: data-driven.

Run a holdout on every recurring campaign. Even 5% gives you a credible lift number after a few months. The attribution number alone always overstates impact.

Tune attribution windows by category. 7d for flash sales, 14d default, 30d for fashion, 60d for furniture or B2B.

Watch the "disputed" pile. When models disagree by > 50% on credit assignment, your customer journey has unusual patterns. Reading 5–10 of these per month teaches you about your buyers.

Combine attribution with cohort analysis. Last-touch might say "Meta drove this order"; cohort says "but this customer was a March 2026 first-orderer who was about to repeat anyway." Both views matter.

Don't compare attributed revenue across tools. Klaviyo's last-touch ≠ this platform's last-touch ≠ Meta's last-touch. They define touchpoints differently. Use one source of truth for cross-channel decisions.

Don't kill a low-attributed-revenue channel without checking holdout incrementality. Email is the classic example — low last-touch, high incrementality. Cut it on attribution alone and you'll see total revenue drop.

Don't trust 100% attribution claims. If a channel dashboard says "we drove 45% of orders" and another says "we drove 50%", they're double-counting. Multi-touch (position- based or time-decay) is honest.

Don't change attribution models mid-campaign. Mark the date you switched and only compare same-model periods.

Plan tiers

CapabilityFreeStarterProAgencyEnterprise
Last-touch + first-touch
Linear + time-decay + position-based
Data-driven (DDA)
Custom attribution windows
Holdouts (causal incrementality)
Per-segment revenue breakdown
Per-journey revenue attribution
Ad cost overlay (ROAS)
Cohort × LTV × first-touch
Disputed-credits review
Programmatic API access

Frequently asked

Why don't your numbers match Klaviyo / Meta / Shopify? Each platform measures only its own touchpoints. This platform measures all of them on a unified timeline. Trust the unified number for cross-channel decisions; trust the platform-specific numbers for diagnosing within that platform.

What about iOS 14 / privacy changes? Affects Meta and Google's pixel-based tracking. Doesn't affect this platform's attribution, because we use first-party data: the customer's identifiable email/phone, the storefront pixel (your domain), and orders (Shopify). Apple's privacy changes break Meta's view of Meta-attributed revenue; they don't break our view of all-channel revenue.

Can I see attribution for a specific campaign? Yes — every campaign detail page shows attributed revenue per model, per channel branch, per recipient cohort, with the holdout lift if configured.

Can I export raw attribution data? Pro+ plans expose /api/v1/attribution with full row-level detail (one row per order × touchpoint × model). See v1 admin API.

How long is the data retained? 36 months by default for Free/Starter plans, configurable (up to 7 years) for Pro+. Influences which historical cohort analyses are available.

What's the difference between attribution and incrementality? Attribution = "how should we credit this order across the touchpoints that influenced it?" Incrementality = "would this order have happened without that touchpoint?" Holdouts measure incrementality. Multi-touch models measure attribution.

Why are some orders showing $0 attributed revenue? The customer had no touchpoints in the attribution window — they're "dark traffic" from the platform's view. Common for walk-in (POS) orders or customers who came directly without opening an email or clicking an ad in the prior 14 days.

See also