--- name: marketing-attribution description: "Explain why platform, analytics, and backend numbers disagree, and which one answers which question. Use when reported conversions have drifted apart and someone is asking which is right." license: MIT compatibility: "Works with any Agent-Skills-compatible AI (Claude, ChatGPT, Cursor, Codex, and more). Ad-account actions run through Adspirer." metadata: author: "Adspirer" version: "1.0.0" adspirer_category: "analytics-reporting" adspirer_source: "https://www.adspirer.com/skills/marketing-attribution" adspirer_trigger: "explain why my ad platform and analytics numbers do not match" adspirer_connection_url: "https://adspirer.ai/sign-up" adspirer_primary_keyword: "marketing attribution" adspirer_secondary_keywords: "attribution discrepancy, multi touch attribution" adspirer_launch_wave: "2" adspirer_kind: "skill" adspirer_level: "operator" adspirer_platforms: "meta,google" adspirer_supported_clients: "claude,claude-code,claude-cowork,chatgpt,codex,cursor,gemini,windsurf" adspirer_summary: "Account for the gap between platform, analytics and backend numbers, and say which source answers which question." adspirer_connections_required: "adspirer,ga4" adspirer_connections_optional: "" --- # The Attribution Detective ## Use this when Meta reports forty purchases. Analytics reports twenty-eight. Finance counts twenty-five actual orders. Someone senior is asking which one is right, and the honest answer — that they are measuring different things and all three can be correct — is not going to survive the meeting without evidence behind it. Use this skill to account for the gap properly. It works out: - how much of the difference is explained by attribution windows rather than error; - how much is measurement loss from consent and tracking restrictions; - how much is genuinely broken — missing tags, lost campaign parameters, double counting; - which source should be trusted for which decision; and - how much of the gap remains genuinely unexplained, stated rather than smoothed over. This is for investigating a discrepancy someone has raised, or one that has drifted wide enough to matter. It is not a routine report, and it is not a substitute for fixing tracking that is already known to be broken. ## What you need - Adspirer connected to the ad accounts, with enough recent history that the gap is a pattern rather than a few days of noise. - GA4 connected, with the same conversion event mapped and channel grouping working. Where campaign parameters are missing or inconsistent, that is frequently the answer rather than an obstacle. - A backend count to anchor against — actual completed orders or qualified records with timestamps, not merely checkout-started events. Without one, the investigation can compare two sources but cannot establish which is closest to reality. - The attribution settings actually configured on each platform. Defaults get assumed far too often, and a customized window is a complete explanation for a gap that looks alarming. - Context that changes the expected size of the gap: consent requirements in the markets you serve, tracking restrictions on the platforms you buy, and whether purchases recur — a subscription renewal counted by the backend but not by a first-purchase event will look like over-reporting in the opposite direction. ## Procedure **Connect Adspirer before any live ad-account step.** Adspirer is what gives this skill access to the ad platforms; confirm the connection before running anything that reads or changes a real account. In Claude Code: `/plugin marketplace add anthropics/claude-plugins-community`, then `/plugin install adspirer-ads-agent@claude-community`, then `/reload-plugins`, then complete the OAuth sign-in. In ChatGPT: open **Apps**, search **Adspirer**, choose **Connect**, and sign in — Adspirer is an official ChatGPT app, so there is no developer mode or URL to paste. In claude.ai or Claude Desktop: Settings → Connectors → Add custom connector → `https://mcp.adspirer.com/mcp`. In Claude Cowork: open the Cowork tab, choose **Customize** in the left sidebar, go to **Plugins** → **Browse Plugins**, search for **Adspirer**, and install it (requires Claude Max, Team, or Enterprise). Any other client: https://www.adspirer.com/docs/ai-clients. Sign-in link for the user: https://adspirer.ai/sign-up. Do not proceed with live ad-account steps until the connection is confirmed. 1. **Make the three numbers actually comparable before comparing them.** Establish the date range, timezone, currency, and conversion definition each source is using, then restate all three on the same basis. A large share of alarming discrepancies dissolve at this step, because one source was counting in a different timezone or over a different window than the others. Report what had to be adjusted, since that adjustment is itself part of the answer. 2. **Account for the windows first, because they explain the most.** Read the attribution settings actually configured on each platform rather than assuming defaults, and work out how much of the gap follows directly from them. A platform crediting a conversion days after the click, against analytics crediting only the session that converted, will disagree permanently and correctly. Quantify that portion rather than describing it. 3. **Account for measurement loss next.** Estimate what is going uncounted rather than uncaused — consent refusals, tracking restrictions, cross-device journeys that break the link between click and conversion. This portion is real and largely irreducible, and naming it prevents a team from chasing a fix for something that is not broken. 4. **Then look for what is genuinely broken.** Check whether campaign parameters survive to the destination, whether the conversion event fires once rather than twice, whether server-side and browser events are being deduplicated, and whether the backend is counting things the platform never claimed — recurring orders being the usual culprit. Separate these findings sharply from the previous two categories: this is the only portion anyone can actually fix. 5. **Say which source answers which question, and what remains unexplained.** Give the reconciliation as a breakdown rather than a verdict — this much is windows, this much is measurement loss, this much is broken and here is who fixes it, this much is unexplained. Then state plainly which source to use for judging campaigns, which for judging channels, and which for reporting revenue. Where a gap remains unaccounted for, say so rather than assigning it to a category to make the arithmetic close. ## Fixed checks - Restate every source on the same timezone, currency, date range, and conversion definition before comparing, and report the adjustments made. - Read attribution settings from each platform rather than assuming defaults. - Confirm the analytics conversion event is genuinely the same event the platform is counting, not a similarly named one. - Anchor against completed backend records rather than intent events such as checkout started. - Check whether campaign parameters survive to the destination before attributing a gap to channel grouping. - Check for double counting from browser and server events before concluding a platform over-reports. - Account for recurring or repeat orders explicitly where the business has them. - State the residual unexplained portion as its own number rather than distributing it to make totals reconcile. ## Stop conditions - **Success:** the gap is broken into windows, measurement loss, genuine faults, and residual, with a stated recommendation on which source to trust for which decision. - **No change needed:** the gap is fully explained by windows and expected measurement loss, and nothing is broken. - **Blocked — no ground truth:** no reliable backend count exists, so the investigation cannot establish which source is closest to reality. - **Blocked — access:** an account or property cannot be reached, or the windows are too short for the gap to be distinguishable from noise. - **Needs a handoff:** the fault is in tags, consent configuration, campaign parameters, or server-side events, all of which need whoever owns the site. - **Still uncertain:** a material portion remains unexplained after all four categories. Report its size and what evidence would resolve it. ## Approval boundaries This skill is read-only. It reads ad accounts, analytics, and backend counts, and produces an explanation — it does not change attribution settings, conversion configuration, budgets, or campaigns. It cannot repair tags or containers, alter consent configuration, add or correct campaign parameters, deduplicate server-side events, or change how the backend records orders; where one of those is the fault it writes the handoff naming what to fix and who owns it. It does not adjust a reported figure to make sources agree, and it never presents a reconciliation as complete when a residual remains. ## What you get A reconciliation rather than a verdict — the gap split into the part explained by attribution windows, the part lost to consent and tracking restrictions, the part that is genuinely broken, and the part still unexplained. That last number is stated rather than quietly distributed into the others to make the arithmetic close, which is the difference between an analysis that holds up under questioning and one that falls apart on the first follow-up. The genuinely broken portion comes with what to fix and who owns it, separated clearly from the portions nobody can fix and should stop trying to. You also get a direct answer to the question actually being asked in the room: which source to use for judging campaigns, which for judging channels, and which for reporting revenue — so three numbers that will never agree stop being treated as a problem to solve and start being used for the different jobs they are each good at.