What it does
Ad platforms grade their own homework. A platform will claim dozens of conversions on a month of spend while the CRM shows three closed deals from that channel, and both numbers are technically true: they measure different things, on different windows, with different incentives.
This agent maintains the reconciliation continuously. It syncs CRM contacts that carry a paid source, matches their campaign trail against your actual campaigns, and accumulates the links at company level: touches, first touch, last touch. On top of that store it computes the table that settles arguments: per campaign, what was spent, what the platform claimed, what the CRM shows as deals and closed-won revenue.
The honesty guards are the product. When link coverage is too thin to support a claim, the surface says "awaiting data" instead of inventing attribution. And the model states its own limits on its face: first-touch, matched on campaign trails, so nobody mistakes the table for more than it is.
Before and after
Before
Every platform dashboard claims credit for the same deals
Attribution debates run on screenshots and conviction
Budget moves toward whichever platform overclaims best
Nobody can say what a channel actually closed
With the agent
One table: spend, platform claims, CRM deals, closed-won, per campaign
Claims and reality reconciled continuously, not once a quarter
Thin data renders as "awaiting data", never as a made-up number
The model's limits are printed on the report itself
How it works
The reconciliation method is public in our open-source skill; the agent runs the always-on version. Six gates.
- 1
Sync contacts that carry a paid source
CRM contacts whose first source is a paid channel are pulled on a schedule, along with the campaign value their tracking captured.
- 2
Match the campaign trail, without fuzzy guessing
The captured campaign value is matched against your real campaign catalog by identifier and name. Contacts that cannot be matched stay unattributed rather than being forced into the nearest bucket.
- 3
Accumulate links at company level
Matches become durable attribution links keyed on company and campaign, with first touch, last touch and touch counts. B2B deals close at company level, so the ledger lives there too.
- 4
Compute claimed versus closed
Per campaign: spend, what the platform claimed, how many CRM deals and how much closed-won revenue the link ledger actually supports.
- 5
Refuse to overclaim
When the ledger has no coverage for a campaign or period, the report says "awaiting data". A blank cell is honest; a fabricated one poisons every future report.
- 6
State the model's limits
First-touch attribution, matched on campaign trails. The report says so where the reader can see it, because a number without its method is a rumor.
The recipe
The open-source method inside this agent:
git clone https://github.com/PierreNicolasMarquez/pierce-skills.git
cp -r pierce-skills/skills/reconcile-attribution ~/.claude/skills/The reconciliation method is published as a free Claude Code skill: run it on your own exports whenever you want the table once. Then in Claude Code: "run the reconcile-attribution skill on my Meta and LinkedIn exports". The managed agent is the always-on version with the CRM sync underneath.
Tools in this agent
HubSpot
The CRM side of the truth: contacts, sources, deals, closed-won. Any CRM with stage history fits.
Meta Ads
One of the platforms whose claims get checked against the CRM.
Slack
Where the reconciled numbers reach the team as part of the weekly report.
Some tool links are referral links. They never change what the tool costs you.
Built and run in production by Pierre Nicolas. This page describes a workflow that actually runs, not a concept. Last reviewed 2026-07-11.
The detection and reporting methods behind these agents are published as open-source skills and on GitHub.
Goes deeper
Related agents
Meta anomaly watch
A daily watch on your Meta account against a trailing 14-day baseline. Nothing on quiet days; one proposed action when something is genuinely wrong.
See how it runs →RevenueInbound lead enrichment
Turns a bare email into an enriched, ICP-scored lead card in Slack: person, company, tier, and the signals behind each claim.
See how it runs →