Attribution disagreements are an argument about the model, not the data
Marketing and finance rarely disagree about the events. They disagree about the credit rule, and a rule is something somebody chooses and owns.
The marketing deck said the spring campaign was the strongest thing the team had run all year. The finance deck, presented forty minutes later in the same meeting, said it had roughly covered its own media cost and no more. Both decks were built on the same warehouse. Both had been refreshed that morning.
The reflex in the room was to blame the plumbing. Someone asked whether the ad platform connector had failed overnight. Someone else offered to re-run the query. An analyst pulled the raw conversion table for the period and read out the row count, and the two sides agreed it was correct. The dispute survived the check completely intact, because nobody had disagreed about the rows in the first place.
What they disagreed about was a rule. Not a rule anybody had written down or argued for, just two different rules that had settled quietly into two different tools while everybody was busy. Once you can see that, the meeting stops being a data quality incident and becomes what it always was, which is a decision that has never been made.
What the warehouse actually knows
A click log is a list of things that happened. A timestamp, a session identifier, a channel string, sometimes a campaign name if the tagging discipline held. It records that a person saw a paid social ad on the Tuesday, searched for the brand on the Thursday, and bought on the Friday. Every one of those facts is real and none of them is in dispute.
What the log cannot contain, ever, at any volume, is the counterfactual. It does not know what the person would have done if the Tuesday ad had not run. That information was never collected because it never existed. Attribution is the step where you decide what to do about that absence, and every attribution model is a convention for splitting credit between touches that all genuinely occurred. Conventions are chosen. They are not sitting in the data waiting to be found by a better query.
Attribution is not a measurement. It is a rule for splitting credit, and rules are chosen rather than discovered.
The pattern, stated plainly
The decisions hiding inside one number
When two teams report different campaign performance, the gap is almost always the compound effect of five separate choices, each made independently and none of them written on the dashboard where the number appears.
- The credit rule First touch, last touch, last non-direct, linear, position based, time decay, or something fitted from the data. Each answers a different question and none of them is the true one.
- The lookback window Seven days, thirty, ninety. A long window flatters upper-funnel activity and a short one flatters the last thing before checkout. The window is usually inherited from a tool default.
- The eligible touch set Do organic search, direct, and email count as touches, or only paid media? Excluding the free channels quietly moves all their credit onto the paid ones.
- The identity rule How touches get stitched into one journey. Cookie, device, hashed email, logged-in account. Loosen the stitching and journeys get longer, which shifts credit backwards in time.
- The conversion definition Order placed, order shipped, or revenue net of returns and cancellations. Marketing usually measures the first and finance the last, which is most of the gap in retail on its own.
The bars matter because the same journey, with no change to a single row of data, hands the closing channel anything between all of the credit and none of it. Marketing tools tend to default to a last non-direct click inside their own platform, with each platform counting the conversion as its own. Finance counts the order once, in the ledger, net of returns. Both positions are internally consistent. That is exactly why the argument never resolves by looking harder at the data.
Write the rule down where it can be read
The fix is unglamorous and mostly clerical. Attribution logic belongs in the transformation layer where it can be reviewed in a pull request, not in a dashboard filter that one person edited in a hurry before a board meeting. Once it is defined in dbt and exposed through a semantic layer, marketing and finance can build whatever views they like on top and still be reading the same rule. This is the same reason we push governance down onto the query itself in Antvia rather than trusting each reporting surface to behave.
- 01Publish more than one modelShow first touch and last touch side by side, permanently. Two numbers with the rule named next to each are more honest than one number with the rule hidden.
- 02Fix the window and justify itPick a lookback that reflects your actual purchase cycle and write the reasoning down. If nobody can defend ninety days, it is not ninety days, it is a default nobody changed.
- 03Define the conversion onceAgree whether the denominator is gross orders or net revenue before anyone builds a chart on it. In categories with heavy returns this single choice outweighs the credit rule.
- 04Report the unattributed remainderSome revenue will match no journey at all. Show it as its own line instead of quietly distributing it, because its size tells you how much to trust everything else.
- 05Give it an owner and a review dateOne named person signs off on the convention and revisits it when the channel mix changes. An unowned definition drifts back into two definitions within a quarter.
The questions attribution cannot answer at all
Worth being blunt about this, because it is the part that gets skipped. No credit rule can tell you whether a channel is incremental. The clearest case is paid brand search. Somebody who has already decided to buy types your company name into a search engine, clicks the paid result sitting above the organic one, and converts. Every last touch model will credit that click generously, and the campaign will look excellent, and switching it off might cost you almost nothing because the organic listing was right there.
Attribution cannot separate those two worlds because both produce identical logs. The only way to find out is to withhold the spend deliberately and compare: a geographic holdout, a switchback test, a staged rollout across regions. That is a different discipline with a different cost, and it is slower and less satisfying than a dashboard. But when the question is genuinely whether to keep spending, the honest answer is that your model is describing correlation with a house style, and you need an experiment.
When the whole exercise is the wrong answer
There is a version of this work that is pure theatre. A business with one paid channel, a two day consideration cycle and a single checkout does not need a semantic layer full of competing credit rules. It needs somebody to say out loud that last touch is the convention, write it on the wall, and go back to work. Building the full apparatus there produces a lot of visible activity and changes no decision anybody makes, which is a fairly reliable definition of waste.
The apparatus earns its keep when spend is split across enough channels that the rule materially changes where the next pound goes, when the sales cycle is long enough that first and last touch land in different quarters, or when marketing and finance are reporting to the same board and cannot both be right. In those cases the argument does not disappear when you write the rule down. It moves, which is the point. It stops being a fight about whether the data is broken and becomes a conversation about which convention serves the decision in front of you, held by people who know they are choosing.