Attribution Architecture
Define the claim types once, apply them everywhere, and pick the window before you see the results.
When to use
- Marketing and sales report different numbers for the same quarter
- Channel budget decisions need a defensible basis
- Before a campaign, to set the measurement
- Board reporting is coming and the numbers need to survive questions
Inputs
- Reads:
workspace/data/object-model.md,workspace/reports/metrics-dictionary.csv - Needs from user: the current reporting setup, the source fields and how they get populated, and the two conflicting reports if they exist
Workflow
1. Define the three claim types, and only these three
Sourced. The first identifiable interaction that created the record, or the first for an account with no prior activity. One owner. No splitting, no percentages.
Influenced. Any meaningful interaction with any buying-committee member inside the opportunity window. Multiple owners allowed by design.
Accelerated. Stage velocity above the segment baseline where a specific program touched the account. The hardest to claim and the most credible when you can.
2. Enforce the four rules that keep it honest
Never sum sourced and influenced against the same target. Influenced revenue double counts by design, everyone knows it, and reporting a combined total destroys the credibility of every other number on the slide.
Pick the window before the campaign. A window chosen after seeing results is not a measurement, it is a selection. Write it into the campaign brief.
State the model on the slide, every time. "Marketing sourced 40% of pipeline" means nothing without the model. Two sentences of definition prevents the entire argument.
No credit without a plausible mechanism. A channel that correlates with revenue but has no path to influencing the buyer does not get credit. Correlation in attribution data is abundant and mostly meaningless.
3. Fix the source field, which is the actual problem
Most attribution problems are one field being overwritten.
[ ] Original source is write-once. Never updated after creation
[ ] Latest source is a separate field
[ ] Neither is overwritten by an enrichment refresh
[ ] Offline and event sources have a defined entry path
[ ] Self-reported source captured on the form, as a separate field
Self-reported attribution is worth more than most people expect. A single "how did you hear about us" field on the demo form outperforms multi-touch modeling for the channels that dark social and word of mouth hide, and it costs one form field.
4. Resolve a disagreement by finding the definition, not the bug
When two reports disagree, the cause is almost never a technical fault. Compare:
Object counted: opportunities? accounts? deals?
Date used: created? stage-change? closed?
Stage filter: which stages count?
Attribution model: sourced? influenced?
Window: how long?
Exclusions: renewals? expansion? partner deals?
The differing line is the whole answer. Write the resolution into the metrics dictionary rather than fixing one dashboard, or it recurs next quarter.
5. Set the coverage floor
Attribution coverage = opportunities with a resolvable source ÷ total opportunities
Below 90% and every channel argument is unwinnable, because the unattributed pile is large enough to contain whatever anybody wants to believe. Below 70% and there is no point modeling anything until intake is fixed.
6. Report it in a shape that survives questions
PIPELINE ATTRIBUTION: <period>
Model: <sourced | influenced>, <n>-day window, <exclusions>
Channel Opportunities Pipeline $ Win rate Note
<channel> n $n n%
...
Unattributed n $n <coverage %>
Reported separately, not summed with the above:
Influenced pipeline $n across n opportunities
Showing the unattributed row is what makes the rest believable.
Output
- Writes:
workspace/reports/attribution-model.md - Uses:
templates/attribution-model-template.md - Prints: the three definitions, the four rules, the source-field checklist result, coverage percentage, and the reporting shape
Rules & quality bar
- Three claim types, defined once, used everywhere
- Never sum sourced and influenced
- Window set before the campaign, written in the brief
- Model stated on every slide
- Original source is write-once and protected from enrichment refresh
- Capture self-reported source. One form field, disproportionate value
- Show the unattributed row
- Resolve disagreements in the dictionary, not in a dashboard
- Under 70% coverage means fix intake before modeling anything
Related skills
- Requires:
data-model-and-syncfor the field rules - Pairs with:
reporting-architecturefor the dictionary - See also:
docs/metrics.md,docs/field-notes.mdstory 5