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
| Outcome | Typical result |
|---|---|
| Confidence in ROAS by channel | +90% — same-platform attribution beats UTM-only |
| Campaigns retired because they don't earn | 30–40% of historical campaign spend recovered |
| Ad budget reallocated to actual top performers | +22% ROAS at constant spend |
| "Which channel drove this $?" answered in seconds | vs. days of manual joining |
| Holdout-based incrementality available | Agency+ — 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.
| Model | Logic | When to use |
|---|---|---|
| Last touch | 100% credit to the most recent touchpoint before purchase | Default. Easy to explain, matches Shopify's reporting. |
| First touch | 100% credit to the very first touchpoint | When you want to credit acquisition channels. |
| Linear | Credit split equally across all touchpoints in the window | Fair-but-naive baseline. |
| Time decay | Recent 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 middle | Balanced acquisition + close credit. |
| Data-driven (DDA) (Pro+) | Machine-learned weights per channel based on conversion lift | When 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 unlocks | Mechanism |
|---|---|
| "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:
- 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.
- 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.
- 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:
| State | Meaning |
|---|---|
| Pending | Order is within attribution window — credits may still arrive |
| Final | Window closed — credits won't change |
| Disputed | Different 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.
| Model | Email's share of revenue |
|---|---|
| Last touch | 18% (matches Klaviyo) |
| First touch | 12% |
| Linear | 31% |
| Time decay | 24% |
| 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.
| Cohort | Customers | 60d 2nd-order rate | Avg 2nd-order revenue |
|---|---|---|---|
| Treatment (received journey) | 8,400 | 24.1% | $87 |
| Holdout (received nothing) | 940 | 14.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.
| Cohort | Customers | Spend per customer (8 wks) |
|---|---|---|
| Treatment | 6,400 | $42 |
| Holdout | 1,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 channel | Customers acquired | LTV (12mo) | CAC | LTV:CAC |
|---|---|---|---|---|
| Google Ads | 3,200 | $148 | $42 | 3.5× |
| Meta retargeting | 2,800 | $72 | $38 | 1.9× |
| Influencer | 1,400 | $186 | $58 | 3.2× |
| Email referral | 800 | $214 | $9 | 23× |
| Organic | 1,100 | $174 | $0 | ∞ |
| TikTok | 1,800 | $52 | $30 | 1.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
| Capability | Free | Starter | Pro | Agency | Enterprise |
|---|---|---|---|---|---|
| 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
- Customer 360 — the unified identity that makes attribution possible
- Campaigns — per-campaign attributed revenue
- Journeys & automations — per- journey attributed revenue
- Experiments & holdouts — formal causal-lift measurement
- Predictive LTV — pairing attribution with forward-looking value
- Sales engine overview