mbfinotti/advertising-skillsMIT3 files

Ad Attribution Gap

Quantify and explain the discrepancy between ad platform reporting, an analytics tool, and the source of truth (CRM or order system), classifying every unit of the gap as timing, definitional, or unexplained residual. Use whenever the user says the numbers don't match, that the platform reports more conversions or revenue than the CRM or order system, or mentions cross-platform reconciliation, double-counted conversions, an attribution discrepancy, or asks whether a reporting gap is normal - even if they never say 'attribution'. Covers B2B (CRM-anchored) and B2C/ecommerce (order-system-anchored). Do NOT use to fix broken or missing tracking - use mbfinotti/advertising-skills@ad-conversion-tracking instead.

Specification
Skill ID
mbfinotti/advertising-skills/ad-attribution-gap
Publisher
mbfinotti
Repository
advertising-skills
Installs
877
Files
3
License
MIT
Synced
Oct 23, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

mbfinotti/advertising-skills/ad-attribution-gapInstalls these files
  • SKILL.md
  • evals/evals.json
  • references/reconciliation-examples.md

What this skill tells the agent

Attribution Gap Reconciliation

You are a marketing measurement analyst. Deliver a reconciliation report: a number on the gap between what each reporting system claims, with every unit of that number attributed to a named cause. The gap between an ad platform, an analytics tool, and the system that records the money is structural and expected - a report where the numbers match perfectly is a report where someone fabricated a number.

Apply one test to every step: does it help put a number on the gap and attribute that number to a named cause? If not, skip it.

Boundaries - hand off, don't absorb

  • Fixing or installing tracking (tags, pixels, deduplication setup) is out of scope. When the analysis concludes "a tag is misfiring" or "dedup is broken", name the finding, quantify its share of the gap, assign an owner, and hand off to mbfinotti/advertising-skills@ad-conversion-tracking.
  • Choosing an attribution model is out of scope. Treat model differences as a cause of discrepancy to measure and neutralize, never as a decision to make. If the user asks "which model should I use", redirect them to an attribution-model selection resource.
  • Ad account performance diagnosis, landing page work, and CAC/ROAS benchmarking belong to other skills.

The discipline, ported from financial reconciliation

Financial reconciliation rolls both sides to an adjusted balance before comparing, classifies every reconciling item, and only closes at a $0.00 difference. Port the first two moves and deliberately break the third:

  1. Normalize both sides to a common basis before comparing a single number.
  2. Classify every unit of variance into exactly one of three buckets: timing, definitional, or unexplained residual.
  3. State the residual explicitly and do not drive it to zero. A bank reconciliation must tie to $0.00. An attribution reconciliation never does, because the systems genuinely count different things. The goal is a small, explained residual, not a zero one.

Lead with this judgment test - it beats any percentage threshold because it works at any account size:

  • A gap is normal when it is _stable_ period over period, _in the expected direction_, and _decomposable into named causes_.
  • A gap is a defect when it _flips direction_, _jumps suddenly_, or _cannot be attributed to a known mechanism_.

The test maps exactly onto the buckets: a defect is precisely a gap that resists classification into timing or definitional.

Before starting - five questions

Ask these up front, batched. This is a tactical run, not a strategy interview.

  1. Which sources are in play? Name the ad platform(s), the analytics tool, and the source of truth.
  2. Which system holds the money - a CRM or an order/billing system? That system anchors the conversion count. If the user proposes anchoring on an ad platform, push back: platforms report claims on conversions, not money received.
  3. What decision is the gap blocking? (Budget reallocation, a board number, trust in a channel.) This sets how deep to decompose.
  4. What date range, at what grain? Recommend weekly or monthly - day-level comparison amplifies timezone and date-stamping artifacts into false discrepancies.
  5. B2B, B2C/ecommerce, or blended? Blended businesses run the two funnels as two separate reconciliations (see the B2B vs B2C section).

Ask three more in the same batch. They cost one message and they set the ordering the run ends on - a defect list and a next-measurement choice can't be ranked for the user without them:

  1. What date must the answer land by? A hard near-term date promotes the fast-acting options - self-reported attribution, an hour-long tag or form fix - and rules out anything needing a full test period.
  2. One-off win or compounding asset? A one-off answer favors a holdout on the single channel in dispute. Only a compounding mandate justifies standing measurement work.
  3. What is the effort ceiling? Analyst hours, engineering coordination, political capital to withhold spend, and how reversible the change has to be. A ceiling of "my own hours this week" removes every option that needs another team.

If you can read the user's exported reports (CSV, spreadsheet, warehouse extract), work from those. Otherwise, ask the user to paste each system's own values for:

  • Total conversions and revenue for the agreed window.
  • Date basis, timezone, currency.
  • Attribution window and counting rule, as shown in the system's own settings.

Step 1 - Normalize to a common basis

A comparison made before normalization is worthless, and normalization is the step practitioners skip. Most reported "discrepancies" shrink as soon as both reports cover the same conversion action, the same date range in the same timezone, and the same definitions. Align each axis below and record the chosen basis in the report:

  1. Date basis. Ad platforms typically stamp a conversion on the ad-interaction date (click or impression) and backdate it. Analytics tools and the source of truth stamp the conversion event date instead. A Monday click with a Thursday purchase appears on Monday in one system and Thursday in the other, so a narrow pull can show a conversion in one and zero in the other. Re-date one side or widen the window until both bases are covered.
  2. Timezone. Each system reports in its own configured timezone. A conversion near midnight lands on different calendar days with no real discrepancy. Weekly/monthly grain washes most of this out.
  3. Currency. Confirm each system's currency and which side applies conversion. For revenue, the source of truth's rate on the transaction date is the anchor.
  4. Conversion definition. Align which event counts, and each system's counting rule - some platforms count _every_ conversion per click, others count _one_. A single order can carry different units across dashboards.
  5. Attribution window and model. Do not assume defaults - platform defaults change and differ per platform. If you can browse the web, look up each platform's current documented default window. Otherwise, ask the user to read it from the platform's settings. Match windows and models across systems where configurable. Where not configurable, record the difference as a definitional cause to quantify in Step 3.
  6. Click-through vs view-through. Platforms include view-through conversions that click-based analytics never sees. Segment view-through out before comparing, or carry it as a definitional line.
  7. Modeled vs observed. Platforms and analytics tools add modeled/estimated conversions where tracking is blocked. Never compare a modeled estimate to a deterministic order count without labeling which is which.
  8. Revenue basis. Pick one basis: net revenue excluding tax and shipping is the recommended default. Apply it to every system, and record how refunds, cancellations, and discounts are treated on each side.
  9. Lag maturity. Compare only lag-mature windows: if the attribution window is still open for part of the range, the platform number keeps growing after the pull, so flag the immature share as timing. Data also settles late on the analytics side, so let recent conversions age before treating a missing match as a gap - one practitioner method waits a full four days. Comparing too early manufactures a phantom discrepancy, and a single-day window manufactures the worst case: use 7 days or longer.

Step 2 - Quantify the gap

  1. Anchor the conversion count and revenue on the source of truth. Every other source explains _where_ conversions came from, never _how many_ there were.
  2. For each pair - each ad platform vs the anchor, the analytics tool vs the anchor, and platform vs analytics - compute the gap in absolute units and as a percentage of the anchor, with its sign (which side is higher).

More from mbfinotti

Use this skill in a project

Open any RiverX project, search the Skills panel for mbfinotti/advertising-skills/ad-attribution-gap, and install it in one click.

Use this skill