Documentation · Attribution · Models, explained in plain English

Attribution models explained — which one should you use?

Attribution is how you decide which marketing touch gets credit when someone buys. Ten models, one honest 3-way view, and a plain-English guide to picking the right one. We start from first-party truth — your real store revenue and your own pixel — instead of taking each ad platform's word for what it drove, because every platform is wired to over-credit itself. Pick the model that fits your funnel, set a window from 1 to 90 days, and let the Reconciliation Panel show you exactly why Meta, your pixel, and your store never quite agree.

What is attribution? Truth vs. platform-reported 10 attribution models One journey, every model How coverage works FAQ

What is attribution? (start here)

Almost nobody sees one ad and buys instantly. A real buyer might watch a video on social, get retargeted a few days later, click an email, search your brand name, and finally check out — five touches over a week. Attribution is the rule you use to share the credit for that sale across those touches. Change the rule and the "winner" changes: last-click hands it all to the final touch; first-click hands it all to the discovery touch; multi-touch models spread it around.

This matters because attribution decides where your next ad dollar goes. If your model over-credits the closing channel, you'll starve the prospecting that actually fills the top of the funnel — and slowly wonder why growth stalls. There is no single "true" model; there's the model that best matches your funnel and the decision you're trying to make. This page explains each one in plain English, shows the same journey scored under all of them, and helps you choose.

One principle runs through everything below: Admaxxer anchors to first-party truth. The headline revenue comes from your own store ledger and your own first-party pixel — data you own — not from an ad platform's self-graded report card. Platforms have every incentive to claim credit (it makes their ads look better), so we treat their numbers as one opinion to reconcile against, never as the source of truth.

Truth vs. platform-reported — the three-number problem

Why we don't just trust the ad platform's number: each platform only sees its own ads, and it's graded on making those ads look good. So it counts generously — it credits people who merely saw an ad (view-through), it fills gaps with modeled (estimated) conversions when privacy rules hide the sale, and it happily claims a buyer that email and search also touched. Your first-party pixel and your store ledger don't have that incentive, which is why we anchor to them.

Every DTC operator has been here. You open Meta Ads Manager and it says you spent $10,000 and made $40,000 — a clean 4x ROAS. You open your Admaxxer pixel and it says you spent $10,000 and tracked $20,000 of attributed revenue — 2x. You open Shopify Total Sales and it says you made $25,000 across all channels in the same window. Three numbers, three different stories. Which one is right?

The honest answer: all three are right, in their own coordinate system. Meta is reporting what Meta thinks Meta drove, including 7-day-click + 1-day-view conversions plus modeled (i.e., guessed) post-iOS-14.5 conversions. Your pixel is reporting what your pixel actually saw — strict client-side attribution against the visitor's UTM-tagged path. Shopify is reporting raw revenue across every channel, attributed to nobody in particular. Each number answers a different question:

Community consensus on the gap: Meta routinely overreports by 26%+ against pixel-side measurement, even before iOS 14.5. 30-60% Meta-vs-Shopify gap is normal for DTC stores spending more than $10K/mo on paid social. iOS 14.5 broke 30-50% of click-attribution — Meta backfills with modeled conversions; your pixel doesn't. The gap isn't a bug. It's structural. The right question isn't "which number is true?" but "what's the gap between them, and what does that gap tell me?"

That's what the Reconciliation Panel is built for.

10 attribution models

The active model determines how Admaxxer splits credit across the touches in a buyer's path. They fall into three families: single-touch rules (give it all to one touch — last click, first click, last non-direct), multi-touch rules (spread credit by a fixed recipe — linear, position-based, time decay), and data-driven models that learn the split from your own data (Markov and Shapley). The tenth — Reconciled · Total Impact — is a BETA blend that produces one reconciled number per channel (its own section below). Time decay (7-day half-life) is the recommended default for most DTC stores — it matches the typical 5–21 day consideration window and is the industry-standard time-decay model. Switch models from the model-pill bar at the top of /marketing-acquisition; the table re-computes instantly.

Model Formula Best for Watch out for Min orders When to switch
Last-click 100% credit to the touch closest to conversion. Bottom-funnel optimization, retargeting, brand-search, anything where the last paid touch is the deciding push. Penalizes top-of-funnel campaigns (TOF prospecting, paid social, video views) that warm the visitor weeks before checkout. 20+ orders / mo Switch when paid-social ROAS reads below 1.5x and you suspect the model is undercrediting prospecting.
First-click 100% credit to the first touch in the visitor's journey. TOF prospecting, audience-building, podcast / influencer campaigns where discovery is the goal. Penalizes retargeting and brand-search; first-touch can be weeks-old and have nothing to do with the actual purchase. 30+ orders / mo Switch when retargeting ROAS reads below 2x and you suspect the model is overcrediting cold reach.
Linear (all touches) Credit split equally across every touch in the path: 1/n per touch. Long DTC funnels (skincare, supplements, considered-purchase apparel) where 5+ touches over 7-21 days is normal. Treats a 30-second video view the same as a brand-search click. Position and time information is discarded. 50+ orders / mo Use when you want a fairness-as-default baseline before reaching for time-decay or position-based.
Linear (paid only) Credit split equally across paid touches only; organic / direct touches get 0. Pure paid-traffic operators who want platform comparisons (Meta vs Google) uncontaminated by organic. Hides organic contribution entirely; useless for measuring brand health or content marketing. 50+ orders / mo Switch when comparing paid platforms head-to-head and organic is consistent enough to set aside.
Time-decay (H=7d) Credit weight = pow(0.5, days_since_touch / 7). Touch from yesterday gets ~0.91; touch 7 days back gets 0.5; 14 days back gets 0.25. Mid-funnel optimization where recency matters but you don't want to discard older awareness touches entirely. Half-life is fixed at 7 days (industry standard). Long DTC funnels (subscription, B2B trial) may want 14d or 30d — coming in v1.5. 75+ orders / mo The recommended default for DTC stores with 5-21 day consideration windows. Industry standard.
Position-based (40/20/40) First touch + last touch each get 40%; middle touches share 20%. Single-touch = 100%; two-touch = 50/50; 3+ = 40/20/40. Stores that value both discovery (first touch) AND closing (last touch) and have meaningful middle-funnel campaigns. Middle 20% can dilute the picture when there are 5+ middle touches; consider time-decay if recency matters more than position. 100+ orders / mo Switch when you want to balance prospecting and retargeting credit explicitly without time-weighting.
Last non-direct click 100% credit to the last NON-direct touch. Direct/typed-in visits are skipped over, and the marketing touch before them gets the credit. Stores with lots of direct/typed-in traffic (strong brand, app re-opens, bookmarks) where pure last-click would dump credit on 'Direct' and hide the marketing that actually started the journey. Still a single-touch rule — it only fixes the 'Direct ate my credit' problem; it doesn't spread credit across the whole path the way multi-touch models do. 20+ orders / mo Switch from last-click when 'Direct' is unrealistically your #1 'channel' and you know those buyers first arrived from an ad, email, or search.
Markov (data-driven, removal effect) Builds a map of how buyers move between channels, then asks of each channel: 'if we deleted it, how many sales would we lose?' That drop = the channel's fair credit. Learned from your data, not a fixed rule. Operators who want a defensible, data-driven answer — credit that reflects how channels actually assist each other, not a hand-picked split. The standard data-driven attribution approach. Needs volume to be stable — about 1,000+ converting journeys in the date range. Below that, Admaxxer falls back to a simpler model and tells you why with a small chip. 1,000+ journeys in range Reach for it once you have the volume and want a credit split the data earned rather than one you chose. Lives on its own page too.
Shapley (data-driven, fair-share) Borrowed from game theory (the Nobel-winning Shapley value). It tries every order channels could have teamed up in and gives each channel its average contribution across all of those combinations — the mathematically 'fair' share for a team effort. When you want the fairest possible split across a handful of channels that work together, and you care more about even-handed credit than about modeling exact journey order. The number of combinations grows fast, so it's best with a manageable set of channels; very long, very fragmented paths are better served by Markov. Like Markov, it's data-driven, so it wants enough conversions to be trustworthy. 1,000+ journeys in range Pick it over Markov when you want a 'split it fairly between the players' answer; pick Markov when you care most about the assist structure of long journeys.
Reconciled · Total Impact (BETA) Blends multi-touch attribution + marketing-mix modeling + incrementality + your post-purchase survey, then reconciles so the channel totals sum to your actual revenue. Returns one number per channel with a confidence range. When you want a single, trustworthy number per channel for a budget call — not three numbers to argue over. Opt-in, not the default. BETA. It's a modeled blend, so it carries a confidence range — read the band, not just the point estimate. Needs enough survey responses + spend history for the modeling layers to settle; thin data widens the band. 200+ orders / mo + survey running Turn it on as a single-number lens once your three sources keep disagreeing and you want a reconciled view that ties to ledger revenue.

The two data-driven models — Markov and Shapley — are the newest additions. Instead of you choosing a fixed recipe, they let your own conversion data decide each channel's fair share: Markov measures how much you'd lose if a channel disappeared (its "removal effect"), and Shapley borrows the Nobel-winning fair-division math from game theory to average each channel's contribution across every possible team-up. Both want volume to be trustworthy (about 1,000+ converting journeys in the date range); below that, Admaxxer falls back to a simpler model and tells you why. Every model respects your attribution window, paid-only, new-customers-only, and platform filters, and they always read de-duplicated data so a re-sync never double-counts. Markov gets its own deep dive at /documentation/markov-attribution.

One journey, every model (worked example)

The fastest way to feel the difference is to score the same journey under each model. Meet a $100 sale with a 3-touch path:

  1. Touch 1 — day 0: a paid social ad (cold prospecting) introduces the brand.
  2. Touch 2 — day 3: a retargeting ad brings them back.
  3. Touch 3 — day 6: a brand-name search click right before they buy.

Here is how each model splits that $100 of credit across the three touches:

Model Touch 1 — Paid social (day 0) Touch 2 — Retargeting (day 3) Touch 3 — Brand search (day 6) In one line
Last click$0$0$100All to the final touch.
First click$100$0$0All to the discovery touch.
Last non-direct click$0$0$100Same as last click here (no Direct touch to skip). If touch 3 had been a direct/typed-in visit, the $100 would jump back to the retargeting ad.
Linear$33.33$33.33$33.33Split evenly across all touches.
Position-based (40/20/40)$40$20$40Discovery + closing favored; middle gets the rest.
Time decay (7-day half-life)~$23~$33~$44Recent touches weigh more; the day-6 click wins, day-0 fades.
Markov (data-driven)Learned from your data — not a fixed split. If your data shows retargeting is the assist you can least afford to lose, it earns the biggest share; a channel that rarely changes the outcome earns little. (Illustrative: $30 / $45 / $25.)Credit = how much you'd lose without each channel.
Shapley (data-driven)Also learned from your data — the "fair team-up" split. It averages each channel's contribution across every order the three could have combined in, so no channel is over- or under-rewarded for happening to be first or last. (Illustrative: $34 / $33 / $33.)Credit = each channel's fair average contribution.

Notice the pattern: the single-touch rules (last/first/last-non-direct) crown one winner and zero out the rest; the fixed multi-touch rules (linear, position-based, time decay) spread the same $100 by a recipe you can predict on paper; and the data-driven models (Markov, Shapley) decide the split from how your channels actually behave — which is why their numbers can't be hand-computed and need enough conversions to be stable. Every model totals exactly $100, because credit is shared, never invented. Whatever model you pick, the Reconciled · Total Impact lens (next) can then tie those per-channel numbers back to your real store revenue.

Reconciled · Total Impact (BETA)

The models above each answer the same question a different way — and they rarely agree. Total Impact is a different kind of answer: one reconciled number per channel that you can take into a budget meeting without three tabs open. It is opt-in, not the default — you turn it on as a lens when you want a single trustworthy figure instead of a spread.

It blends four independent signals and then reconciles them:

The reconciliation step is what makes it usable: the channel totals are scaled so they sum to your actual revenue (your store ledger), so you never get a model that "adds up" to more than you actually made. The result is shown as a point estimate and a confidence range, plus a plain-English "how this was computed" breakdown so you can see which layer moved the number and by how much.

Worked example — Meta for one month

  1. Start: multi-touch attribution credits Meta with $5,000 of last-touch-weighted revenue.
  2. MMM adjusts down: the spend-response curve says Meta was into diminishing returns this month, so some of that $5,000 would have converted anyway → −$700.
  3. Incrementality adjusts down: the global paid-vs-organic lift test trims another −$450 as not-truly-caused-by-paid.
  4. Survey adds back: buyers who said "a friend told me" on the post-purchase survey move +$300 of credit toward word-of-mouth (and away from over-credited paid).
  5. Reconcile to ledger: totals are scaled so every channel sums to your real monthly revenue.

Total Impact for Meta: ~$4,150, with a confidence range of roughly $3,800–$4,500. One reconciled number instead of four arguing ones — and the band tells you how much to trust it.

Honest about the limits. Total Impact is a modeled estimate, not a deterministic count. The incrementality layer is a global paid-vs-organic lift (not yet a per-channel causal test), and the MMM + survey layers need enough history and responses to settle — thin data widens the confidence band. We keep it opt-in and clearly labeled BETA so it never quietly replaces the deterministic numbers you can audit. Use it as a single-number tiebreaker, and keep the deterministic models + the Reconciliation Panel for the row-by-row audit trail.

Attribution windows

The window is the lookback period — how far back before a purchase a touch is still allowed to earn credit. It's independent of the model: pick the model (how credit is split) and the window (how far back to look) separately. A shorter window is stricter and more conservative; a longer window captures considered, slow-burn purchases.

The 90-day window is new — added alongside the existing 1 / 7 / 14 / 28-day and Lifetime windows specifically for considered, high-AOV catalogs where a buyer might see your ad in week one and not check out until week ten. If your 7-day window keeps under-crediting top-of-funnel because your customers take a month to decide, widen the window before you blame the model.

How coverage works — honest credit, no guessing

Every model above can only assign credit to a touch it can actually see. So before any model runs, each visit has to resolve to a real channel. We credit a channel only when a genuine signal lines up, in roughly this order:

If none of those resolve — someone typed your URL straight in, arrived with tags stripped, or used a browser that blocked the signal — we do not guess. That visit is shown honestly as Direct or Unknown rather than being quietly handed to whichever paid channel would flatter the dashboard. This is the opposite of how ad platforms behave, and it's deliberate: a smaller number you can trust beats a bigger number you can't.

This is also why your first-party numbers can read lower than an ad platform's claim. Some signals are genuinely lost to privacy controls and ad-blockers (Apple's iOS tracking prompt alone removes a big slice of click-level data). Admaxxer narrows that gap two ways — by persisting click IDs so a click still counts long after a third-party cookie would have expired, and (when you connect the platform) by reading the platform's own server-side match data — but anything still unresolved stays in Direct/Unknown. The honest Direct/Unknown bucket is a feature: when it's unrealistically large while you're spending on ads, that's your cue to fix UTM tags (see UTM best practices) or switch to the last non-direct model so the marketing before the direct visit gets the credit.

The Reconciliation Panel

This is the marquee feature of Phase 1. The Reconciliation Panel sits right below the AttributionDrilldownCard on /marketing-acquisition and shows you, per channel:

Pre-computed reasonings include:

The panel is built on a single analytics pipeline — an internal report — that does a FULL OUTER JOIN of pixel-side, platform-side, and Shopify-side rows per channel. FULL OUTER (not INNER) is critical: it means a channel that exists in only one source still shows up, with the missing columns marked as a "missing" data-coverage chip instead of silently dropping the row. That's the source-additive principle (GL#256 + GL#313) at the SQL layer.

The card UI is at client/src/components/marketing-acquisition/ReconciliationCard.tsx — premium card chrome matching AttributionDrilldownCard's vocabulary (rounded-2xl border + emerald gradient rail + framer-motion entrance + theme tokens). Mounted right below the AttributionDrilldownCard so it's the second card on the page after the model-pill bar.

The Meta first-conversion lens

One thing the Reconciliation Panel surfaces that nothing else can replicate from pixel alone: Meta's deterministic first-conversion data behind ATT and iOS 14.5. Meta operates the conversion API (CAPI) on the server side and has direct access to the deterministic match between an ad impression and a purchase event — a match that survives Apple's App Tracking Transparency framework because it never leaves Meta's infrastructure.

Concretely, the omni_purchase deduped action type from Meta's /v25.0/<ad-account-id>/insights endpoint is the canonical first-conversion count Meta itself uses internally. It's NOT what the Meta pixel would see if you installed it on your storefront — it's the Meta-internal deduped count that includes server-side matches you have no other way to access. The dailyAdSpendSync cron (GL#378) now captures this column on every level=ad pull and surfaces it in the Reconciliation Panel as the "Meta first-conversion" line within the Platform-reported column.

This is the server-side match-rate signal done right: instead of forcing a months-long server-side identity-stitching setup, Admaxxer pulls Meta's own first-conversion data via the same insights API every other tool already calls. Free signal, no extra integration, no customer setup work.

Source-additive philosophy

Most attribution tools force you into a binary: either a heavy full setup before you see anything (months of implementation, server-side identity stitching, a custom domain) or a no-platform-data shrug (UTM-only, doesn't ingest Meta or Google). Admaxxer is built on a third philosophy: source-additive.

Connect what you have today. See what's possible. Add more sources when ready.

Each source you add fills in another column. Each missing source shows a "missing" data-coverage chip instead of breaking the page. This is enforced at the code level by the source-additive guardrail canary (GL#381): every JOIN to a source-attached stream (ad spend, Shopify-reported metrics, enriched orders, visitor payments) must be a LEFT JOIN (or LEFT ANY / LEFT ASOF / FULL OUTER). INNER JOIN = build violation. The canary walks the query SQL and fails the postbuild if anyone accidentally writes an INNER JOIN against an ad-spend source; sister rule to GL#368/371 (token-chain canary) and GL#256/313 (source-additive principle).

You can never get into a state where adding more data makes things worse. That's the structural promise.

How to pick your model — 4 steps

  1. Step 1. Connect at least one source. Open /integrations and connect what you have today. Pixel-only works (UTM-driven). Add Shopify if you have it. Meta + Google unlock platform-side data and first-conversion (Meta's deterministic match data). Source-additive: each source fills in another column in the Reconciliation Panel — missing sources show a chip, not a break.
  2. Step 2. Open /marketing-acquisition and look at AttributionDrilldownCard. The Channel -> campaign -> adset -> ad drill-down is the first card on /marketing-acquisition. Above it is the model-pill bar with every attribution model — the rule-based ones plus data-driven Markov and Shapley and the Reconciled · Total Impact lens (BETA). Below it is the Reconciliation Panel showing the 3-way gap.
  3. Step 3. Pick a model that matches your funnel. Default to time-decay (H=7d) — the industry default, fits 5-21 day DTC funnels. Switch to last-click for bottom-funnel-only, first-click for TOF-heavy (podcast / influencer), linear (all touches) for long consideration, position-based (40/20/40) when you want to credit discovery + closing equally.
  4. Step 4. Read the Reconciliation Panel reasoning. The panel surfaces the gap between Meta-reported, pixel-tracked, and Shopify-reconciled conversions per channel. Each row carries a pre-computed 'reasoning' line: 'Platform claims much more than pixel — likely iOS 14.5 view-through', 'High direct/untagged share — likely UTM hygiene issue', or 'Within 10% — reconciliation clean'. Trust the latter; investigate the former two.

FAQ

Why does Meta show 4x ROAS but my pixel shows 2x?
Two different coordinate systems, both technically correct. The platform uses modeled conversions plus view-through credit and a 7-day-click + 1-day-view default window — anyone who saw your ad and purchased within 7 days counts, even if the ad wasn't the deciding touch. Pixel relies on click-attribution and iOS 14.5+ ATT broke 30-50% of those signals deterministically. Both numbers are real, both are different lookback choices. The widely-shared operator consensus lands on the same answer: stop trusting one source and look at all of them — open the Reconciliation Panel on /marketing-acquisition to see platform-reported, pixel-tracked, and Shopify-reconciled side-by-side. The gap itself is the most useful signal: under 10% means your model is clean; over 30% almost always means iOS 14.5 view-through or UTM hygiene drift.
What's iOS 14.5 attribution loss and how does Admaxxer handle it?
Apple's App Tracking Transparency (ATT) framework, shipped in iOS 14.5 (April 2021), prompts every iOS user with 'Allow [App] to track your activity across other companies' apps and websites?' — and ~70-80% of users decline. That decline blocks deterministic click-attribution for ~30-50% of all DTC traffic. The platform's response was to fill the gap with modeled conversions: ML extrapolation from a small consenting cohort to the broader audience. It's controversial because it's unverifiable from the outside, and operators argue it systematically over-credits the platform vs. earned/organic. Admaxxer's first-party pixel sidesteps the third-party-cookie path entirely, click-ID persistence (GL#361, 90-day cookie/localStorage retention) preserves attribution even after the platform's third-party cookies expire, and Meta CAPI _fbc synthesis recovers most of the iOS 14.5 deterministic gap server-side. The Reconciliation Panel still shows you the platform-vs-pixel gap so you can audit transparently — we don't try to hide the loss, we just give you a deterministic floor.
How is Admaxxer's attribution transparent — can I verify the math myself?
Yes — transparency is the whole design. Every attribution model has a published formula (see the Models table above), so you can reproduce the credit split by hand on any single journey. Every API endpoint is curl-testable, so you can pull the same numbers the dashboard renders and diff them yourself. Every Reconciliation Panel row carries a pre-computed 'reasoning' string explaining the gap between sources in plain English, so you're never left guessing why two numbers disagree. And the data-driven models (Markov removal-effect, Shapley fair-share) use standard, documented algorithms rather than an opaque 'AI' black box. Nothing here asks you to take a number on faith: the formulas are public, the API is open to inspection, and every gap is explained per row.
Which attribution model should I pick?
Default to time decay (7-day half-life) for most DTC stores — it's the industry default and matches the typical 5-21 day consideration window. Switch to last-click if you optimize for bottom-funnel only, first-click if you're a top-of-funnel-heavy operator (podcast, influencer), last non-direct if 'Direct' is unrealistically your #1 channel, linear if your customers do 5+ touches over weeks, or position-based if you explicitly want to credit both discovery and closing. Once you have volume (about 1,000+ converting journeys in the range), reach for a data-driven model — Markov (credit by how much you'd lose without each channel) or Shapley (the fair team-up split) — when you want a credit split the data earned rather than one you chose. And if you'd rather have one number per channel than a spread to argue over, turn on the Reconciled · Total Impact lens (BETA), which blends multi-touch + marketing-mix modeling + incrementality + your post-purchase survey and reconciles the totals to your actual store revenue. There is no single 'true' model — pick the one that matches your funnel and the decision you're making.
What's the difference between Markov and Shapley attribution?
Both are data-driven — they learn the credit split from your own conversion paths instead of using a fixed recipe, and both want roughly 1,000+ converting journeys to be stable. They differ in the question they ask. Markov asks 'how much would we lose if this channel disappeared?' — it builds a map of how buyers move between channels and credits each one by that removal effect, so it shines at valuing the assists in long, winding journeys. Shapley asks 'what's each channel's fair share of a team effort?' — borrowing the Nobel-winning Shapley value from game theory, it averages each channel's contribution across every order the channels could have combined in, so no channel is over- or under-rewarded just for happening to be first or last. Rule of thumb: choose Markov when you care most about the assist structure of long paths; choose Shapley when you want the fairest even-handed split across a manageable set of channels. Markov has its own deep-dive page at /documentation/markov-attribution.
What does 'data-driven attribution' mean, and is it better?
Data-driven means the model figures out each channel's credit from your real conversion data, rather than you picking a fixed rule like 'all to the last click' or '40/20/40'. Admaxxer's two data-driven models are Markov (removal effect) and Shapley (fair-share) — the standard data-driven attribution approaches. It's more defensible because the split reflects how your channels actually assist each other, not a guess. The catch is volume: with too few conversions the math swings around, so below about 1,000 converting journeys in your date range Admaxxer automatically falls back to a simpler model and shows a small chip explaining why. So 'better' is conditional — data-driven wins once you have the data to feed it; until then a clear heuristic like time decay is the honest choice.
Why are my first-party numbers lower than what the ad platform claims?
Because we only credit a channel when a real signal resolves the visit — a UTM tag, a platform click ID, or a known first touch — and we never guess. Ad platforms count generously: they credit people who only saw an ad (view-through), fill privacy gaps with modeled/estimated conversions, and claim buyers that email and search also touched. Your first-party pixel and store ledger don't have that incentive, so their number is the conservative, trustworthy floor. Some signals are genuinely lost to privacy controls and ad-blockers (Apple's iOS tracking prompt removes a big slice of click data); Admaxxer narrows that gap by persisting click IDs so a click counts long after a cookie would expire, and by reading the platform's own server-side match data when you connect it — but anything still unresolved stays honestly in Direct/Unknown rather than inflating a paid channel. A smaller number you can trust beats a bigger number you can't.
What is the Reconciled · Total Impact model and is it the default?
No — it is opt-in, not the default, and it's currently in BETA. Total Impact is a single reconciled number per channel built by blending four signals: multi-touch attribution (your deterministic click-level baseline), marketing-mix modeling (the spend-vs-revenue curve including diminishing returns), incrementality (a global paid-vs-organic lift estimate), and your post-purchase survey (word-of-mouth and offline channels no pixel sees). The channel totals are then scaled so they sum to your actual store revenue, and the result is shown as a point estimate plus a confidence range with a plain-English 'how this was computed' breakdown. Worked example: multi-touch credits Meta with $5,000; marketing-mix modeling trims $700 for diminishing returns; incrementality trims $450 as not-truly-caused-by-paid; your survey moves $300 toward word-of-mouth; after reconciling to ledger revenue, Total Impact for Meta lands around $4,150 with a roughly $3,800-$4,500 band. Because it's a modeled blend, read the band — not just the point — and keep the deterministic models for the audit trail.
What attribution windows can I choose, and why was a 90-day window added?
The window is the lookback period — how far back before a purchase a touch can still earn credit — and it's independent of the model. Admaxxer offers 1-day, 7-day (the DTC default), 14-day, 28-day, the new 90-day window, and Lifetime. The 90-day window was added for considered, high-AOV catalogs (furniture, electronics, jewelry, courses) where a buyer might see your ad in week one and not check out until week ten. If a shorter window keeps under-crediting top-of-funnel because your customers take a month or more to decide, widen the window before you blame the model. Shorter windows are stricter and more conservative; longer windows capture slow-burn purchases.
What if I haven't connected my ad accounts yet?
Admaxxer's attribution is source-additive — it works with any subset of (pixel, Meta, Google, Shopify). With pixel-only you get UTM-driven attribution and every rule-based model against pixel-tracked conversions (the data-driven Markov and Shapley models switch on once you have enough converting journeys). Add Shopify and you unlock the pixel-vs-Shopify reconciliation. Add Meta and you unlock the platform-vs-pixel comparison plus Meta's first-conversion data (Meta's deterministic match data behind ATT/iOS 14.5 that no pixel can replicate). Add Google and the same expands to Google Ads. Each source you add fills in another column in the Reconciliation Panel; missing sources show a 'data coverage' chip instead of breaking the page. We ramp with you — connect what you have today and add the rest when you're ready.
How does the reconciliation panel handle direct/untagged traffic?
The panel surfaces direct/untagged traffic as its own row with a pre-computed 'reasoning' column explaining the gap. Common reasonings: 'Platform claims much more than pixel — likely iOS 14.5 view-through' (Meta is reporting view-through conversions your pixel can't see), 'High direct/untagged share — likely UTM hygiene issue' (you're missing UTM tags on a paid surface and the click is landing as direct), 'Within 10% — reconciliation clean' (the three sources agree; trust the model). Direct traffic itself isn't a problem; high direct share when you're spending heavily on paid IS a problem (likely UTM hygiene). The Reconciliation Panel surfaces the latter explicitly.
Can I see different attribution models side-by-side?
Yes — the AttributionTab at the top of /marketing-acquisition has a model-pill bar with every model (the rule-based ones plus data-driven Markov and Shapley), plus the Reconciled · Total Impact lens (BETA). Click any pill to switch the active model; the table below re-computes in <500ms (analytics pipeline params change, not a re-fetch from raw rows). To compare two models side-by-side, open /marketing-acquisition in two browser tabs and pick a different model in each. A future enhancement (v1.5) will let you pin two models for in-page comparison; for now the two-tab pattern is the canonical workflow.
How often does Meta data refresh?
Once per day. The dailyAdSpendSync cron runs at 04:00 UTC and pulls (a) campaign + adset + ad-level insights via level=ad with the immutable campaign_id / adset_id / ad_id columns, (b) three breakdown calls (age_gender, region, placement), and (c) Meta's omni_purchase deduped first-conversion data (the deterministic match data that survives ATT). Meta itself reports its insights with a ~24-48h lag (Meta-side limitation, not Admaxxer's), so today's spend isn't fully attributable until the day-after-tomorrow's sync. The Reconciliation Panel shows a small 'last sync' timestamp on the Meta column so you know which data freshness window you're working with.
What's 'time decay' and why H=7?
Time-decay is an attribution model that weights each touch by how recently it happened, on an exponential curve. The formula is weight = pow(0.5, days_since_touch / H), where H is the half-life — the number of days at which a touch's credit drops to 50%. We use H=7 days because it's the industry-standard default and matches the 5-21 day DTC consideration window most stores see. A touch from yesterday gets pow(0.5, 1/7) ~= 0.91; a touch from 7 days ago gets exactly 0.5; from 14 days ago, 0.25; from 30 days ago, ~0.05. The key property: the credit decays smoothly with time instead of stair-stepping, so the model never has a sharp 'before/after' edge. v1.5 will expose H as a per-workspace knob for stores with longer (subscription, B2B) or shorter (impulse-buy) consideration windows.
Can I make Admaxxer's numbers match another attribution tool I'm migrating from?
Usually, yes — if you line up the model and the window. Many tools default to a 7-day-click window with last-click as the model. Admaxxer's default is also 7-day-click but with time-decay (H=7d), so the two will differ on multi-touch journeys by design. Set Admaxxer to last-click + a 7-day window and the numbers should converge (within a few percent — residual differences come from how each tool parses and normalizes UTMs). We default to time-decay rather than last-click because it's more accurate for DTC funnels, where the closing touch rarely deserves 100% of the credit. Whichever model you pick, the Reconciliation Panel exposes the gap between your pixel, the platform, and your store — an honest 3-way view you can audit row by row.