# Attribution Desk > A marketing attribution workbench for founders, growth and demand-gen leads and marketing analysts: paste what each source claims per channel (each ad platform's own conversion count, web analytics, the CRM or store, a self-reported "How did you hear about us?" survey, spend) and optionally your converting touch paths, and find which source to trust for the count, how far the platforms over-claim against it, what first-touch, last-touch and four other models say, and where direct, branded search and dark social hide the real driver; then get an attribution readout with the allocation call, and the incrementality test that settles the channel two sources fight over. App: https://attribution-desk.skillsafe.ai/ API tutorial: https://attribution-desk.skillsafe.ai/api.html ## Input - What each source says: a table with one row per channel and a column per source, as CSV, tab-separated text copied from a spreadsheet, or a Markdown table, plus any notes (business, sales cycle, attribution windows, what you report today, a stated total such as "Closed-won deals in HubSpot: 64"). Columns are recognised by name: spend or cost; ad platforms (Google Ads, Meta, LinkedIn, TikTok, Bing, "platform"); analytics (GA4, Google Analytics, PostHog, Mixpanel, Amplitude); the source of truth (CRM, HubSpot, Salesforce, Shopify, store, orders, backend, closed-won); the survey (survey, self-reported, how did you hear). GA4's "Key events" reads as analytics and Meta's "Results" as a platform count. A "Total" row is read as a stated total, never as a channel ("All other" is a channel). Rows that repeat a channel are added together, and the scan says so. - Converting touch paths (optional): one journey per line, touches joined by ">", "(day N)" per touch when known, and "| x12" (12 such journeys) or "| $1,200" (the value). - Optional: the business type (B2B sales-assisted, ecommerce / DTC, or self-serve plus sales) and the decision the numbers inform. ## The free scan - The source of truth for the count: a stated total, else the CRM or store column's total. Never a platform. - The over-claim: the platforms' summed claims against the source of truth, as a ratio and an excess (never to be summed), and analytics against the source of truth. - Every channel under every source: count, share of that source's column, cost per conversion under each source, platform claim divided by the truth count, and the survey share minus the truth share in points. - The direct plus branded-search share of analytics and of the source of truth; channels only buyers name (dark social). - Six models over the journeys: first-touch, last-touch, last non-direct, linear, time-decay (7-day half-life on the days given, else halving per step back) and position-based (40% first, 40% last, 20% across the middle), with each channel's credit and share and its first-minus-last swing. - Flags AT-01 to AT-17: platforms claiming 1.2x or more of the real count, no source of truth, direct plus branded at 40% or more, no self-reported data, survey-only channels, survey shares 10 points above tracking, a platform claiming 2x or more of what the source of truth credits, paid search not split into branded and non-branded, one single-touch model on a long cycle, data-driven attribution under about 300 conversions, checkout or sign-in referrers, view-through windows, notes that add platform numbers together, AI assistants, MMM below six figures of spend, retargeting, fewer than 30 journeys. - The contested channel: the biggest platform-versus-truth disagreement weighted by spend, else the biggest first-versus-last swing, else the biggest survey-versus-tracking gap. - Exports: the scan as Markdown, every channel as CSV, every model's credit as CSV. ## After the first result (free, in the browser) - Save this scan, then compare a later scan with it: the source of truth, the platforms' claim, the over-claim ratio, spend and cost per truth conversion then and now, and each channel's truth share (points of change), cost per truth conversion (percent change) and platform-versus-truth ratio, with channels that are new or gone. Exported as CSV. - Read your result: once the incrementality test has run, enter the exposed and control conversions (counted by the source of truth), optional group sizes, spend and the platform's own claim. The page computes the conversions the channel caused, the lift and its 95% interval (conversions treated as counts), the incremental cost per conversion and the platform's claim per caused conversion, and names the reading - lift when the whole interval is above zero, no lift when it stays under the smallest lift worth paying for (5% unless set), inconclusive otherwise - next to the test design's own meaning and action for that reading. - Copy the call: the readout's recommendation, confidence, moves and the channel to settle next, as a short paste. ## The paid lanes Both run on gpt-terra with a 10% publisher markup; /estimate is free and shows the credits reserved before a run. - readout: the decision; the source of truth and its count; the platforms' total and over-claim ratio and what it is made of; every channel read underrated, overrated, fair or unclear with its confidence; first-touch against last-touch for the channels that swing 10 points or more, and the primary model for the business (position-based for B2B, last non-direct for short-cycle ecommerce, never last-touch for B2B, never data-driven below about 300 conversions); the blind spots (direct, branded search, dark social, AI assistants, cross-device, offline, view-through, redirects); the measurement that fits (basics, multi-touch plus tests, or a media mix model plus tests); the contested channel, its claimants and the test design that settles it; the allocation call with its confidence and 2 to 5 moves; what is missing. - test: the channel and the claim under test; the design (holdout audience for retargeting and email, on/off for branded search and low-volume B2B, ghost ads or PSA for prospecting, geo holdout for what cannot be split per user) and why; exposed and control groups (time periods for on/off); the duration; the outcome counted by the source of truth; the baseline in the page's numbers; 3 to 7 setup steps; contamination guards; how to read lift, no lift and an inconclusive result; incremental CPA as the decision rule. - Handoff: a readout hands its source of truth, contested channel, method, recommendation and blind spots to the test lane in one click. ## How replies are checked The page re-checks every reply against its own scan: the source-of-truth count equal to the page's and never the platforms' sum or a platform; the over-claim copied and not called consistent; every channel the page read, in order; direct and branded search never underrated; survey-only channels never high confidence; first and last shares equal to the page's models; no last-touch primary for B2B, no data-driven below about 300 conversions; the blind spots the numbers require; no media mix model below its scale; a contested channel from the table; no high confidence without a source of truth or with no survey; in a test, the outcome counted by the source of truth, three readings with their caveats and incremental CPA; every quote word for word; no figure, window or duration the input or the page's arithmetic does not contain; no blended lane. ## Sources - Derived from the agent skill @coreyhaines31/attribution by Corey Haines (github.com/coreyhaines31/marketingskills, MIT): https://skillsafe.ai/skill/@coreyhaines31/attribution - its interpretation pillar (attribution is directional; every model is an opinion; the six models and how each lies; first-touch and last-touch side by side; MTA, MMM and incrementality and how to read a test; self-reported attribution; reconciling conflicting sources against one source of truth; direct, branded search, dark social and AI traffic as blind spots), its B2B and ecommerce playbooks, and the first-party pillar's referrer hygiene. - Attribution is directional, not truth: the readout gives a defensible, consistent read with confidence levels, not a reconciliation to the decimal.