# Attribution Architecture

> Use when the user says "attribution", "what did marketing source", "our numbers don't match sales", "multi-touch", "first touch last touch", "campaign influence", "prove marketing ROI", "which channel is working". Defines sourced, influenced, and accelerated with enforceable rules, sets the model and window before the campaign, and kills the double-counting. Writes workspace/reports/attribution-model.md.

- Skill: `guerrilla2799/attribution-architecture` (Agent Skill)
- Install (CLI): `npx skillmds@latest add guerrilla2799/attribution-architecture`
- Raw SKILL.md: https://api.skillmd.com/api/skills/guerrilla2799/attribution-architecture/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- Author: guerrilla2799 (https://skillmd.com/u/guerrilla2799)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/guerrilla2799/attribution-architecture

---


# 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-sync` for the field rules
- Pairs with: `reporting-architecture` for the dictionary
- See also: `docs/metrics.md`, `docs/field-notes.md` story 5

