Full-Loop Attribution: How We Trace a Click All the Way to a Closed Sale
Almost every reporting problem I get called into comes down to the same thing: the ad platform and the business are measuring two different events. Google says you got 214 conversions last month. The owner says he closed nine jobs. Both are right, and neither number is useful on its own.
Full-loop attribution is the work of connecting those two numbers. Not a dashboard — a data path. Here's how we build it.
Step 1: Every entry point gets an identity
Before anything else, we make sure a person can be recognized no matter how they show up.
- Forms carry hidden fields for GCLID/WBRAID,
utm_source,utm_medium,utm_campaign,utm_content, landing page, and first-touch referrer. Those fields are written by a small script on page load and persisted so they survive multi-page browsing. - Calls get dynamic number insertion, so the number a visitor sees is tied to the session that produced it. A call from a paid click and a call from an organic visit hit different tracking numbers.
- Chat and SMS inherit the same session parameters through the widget's custom-data payload.
If the identity doesn't get captured at the entry point, nothing downstream can fix it. This step is where most attribution projects quietly fail.
Step 2: The CRM becomes the source of truth, not the ad platform
Every lead lands in the CRM with its click ID attached, and from that moment the CRM owns the record. Stages are defined so they mean something operationally, not just visually:
- New — the raw inbound.
- Contacted — a human actually reached them.
- Qualified — they're in the service area, in budget, and have a real need.
- Appointment set / Job booked — a commitment exists on a calendar.
- Won with a revenue value attached, or Lost with a reason code.
That "lost reason" field does more work than people expect. When 40% of a campaign's losses are "out of service area," that's not a sales problem — that's a geo-targeting problem, and it's fixable in an afternoon.
Step 3: Offline conversion imports send the truth back
This is the part that turns reporting into performance. Once a deal hits Qualified, Booked, or Won, we push that event back to Google Ads and Meta against the original click ID, with the actual revenue value.
The effect compounds:
- Smart Bidding stops optimizing for form fills and starts optimizing for booked revenue.
- Campaigns that produced high lead volume and zero closes get starved automatically.
- Keywords and audiences that produce fewer, larger deals get funded.
We typically run a value model — Qualified gets a fractional value based on historical close rate, Won gets the real number — so the algorithm gets a signal early instead of waiting on a 60-day sales cycle.
Step 4: AI watches the loop so a human doesn't have to
The loop breaks constantly, and quietly. A developer ships a new landing page and drops the hidden fields. A sales rep starts marking everything "Won" with no value. A tracking number gets replaced in a template.
We run automated checks against the whole chain daily:
- Percentage of new leads arriving with a click ID attached. A sudden drop means tracking broke.
- Ratio of platform-reported conversions to CRM records. Drift means duplicate or missing events.
- Offline import success rate and rejection reasons.
- Stage-to-stage velocity, so a pipeline stalling at Contacted surfaces the same week rather than at the quarterly review.
Anomalies get flagged to a strategist with the context attached. AI does the watching. A human does the deciding and the fixing.
Step 5: Reporting reads backwards from revenue
The report a client sees starts with money and works back toward media:
Revenue closed → deals won → appointments set → qualified leads → raw leads → spend, sliced by campaign, then channel, then keyword or creative.
That ordering matters. When the first number on the page is revenue, conversations stop being about CPC and start being about which campaigns to fund next month.
What it actually changes
Once the loop is closed, three things happen fast:
- Budget moves. Nearly every account we close the loop on has at least one campaign that looks great on cost-per-lead and produces almost no closed revenue. It gets cut in week one.
- Bidding gets smarter. Feeding real revenue back into the platforms outperforms every manual bid adjustment we'd otherwise make.
- Arguments end. There's one number both marketing and sales agree on, and it's the same number the bank sees.
The honest caveats
Attribution is directional, not forensic. Multi-touch journeys, iOS privacy limits, and offline word-of-mouth all blur the picture. What full-loop attribution gives you isn't perfect truth — it's a consistent, revenue-anchored measurement you can steer with. That's a much better position than a dashboard full of conversions nobody can tie to a dollar.
If you want to know whether your loop is actually closed, the fastest test is this: pull last month's won deals and see how many can name the campaign that produced them. If you can't, we should talk.
