The hardest attribution problems are the ones where the sale never touches a browser. The click happens online, and then the money shows up weeks later on a phone call your ad platform will never hear about.
If your revenue closes in a CRM or over the phone, days or weeks after someone first raises their hand, you have a version of this problem whether you have named it or not. The platform bidding for your traffic can only see as far as the form.
It watches someone fill one out, files that away as a win, and goes looking for more people who behave the same way. Everything after the form, the qualifying call, the underwriting, the signature, the deposit, is invisible to it.
So it optimizes toward the event it can see, and quietly ignores whether any of those forms ever turned into money.
At Leverage Companies I led growth for Leverage Homes, a property wholesaling business whose funnel lived on the phone. Leads came in through Meta ads, dropped into Salesforce, and then a human worked them: a call, a review, an offer, and a close that could land two months after the original click.
The ad account was doing its job by its own lights. It was filling the top of the funnel with people who submit forms. The catch was that the people who submit forms are a different crowd from the people who fund a deal, and nobody had ever told the platform about the gap.
Ad platforms optimize whatever you report back. A phone-sales business reports back nothing by default, so the auction optimizes for form-fillers.
The loop that never closed
Follow the chain of events end to end. Somebody clicks an ad, lands on a page, and submits a form. That form-fill is the last thing the platform ever hears.
Then the real work begins, entirely offline: a rep calls, the deal moves through a few stages in the CRM, and eventually it funds or it dies. None of that travels back up the wire.
The auction is optimizing against the first tenth of the journey and flying blind through the nine tenths where the value is actually decided.
So the platform did exactly what you would expect. It found more people who submit a form and stop there.
Cost per lead held steady and looked healthy on the dashboard. The leads themselves were getting weaker, because the optimization kept reaching for the cheapest form-filler it could find rather than the person most likely to close.
From the inside it was tempting to blame the audience, or the creative, or the sales team. All of them were fine. The thing that was broken sat between the CRM and the ad account, in a feedback path that did not exist.
Send the outcome back
The fix turns almost boring once you see it. If the platform optimizes on the events you report, then report a better event.
When a deal advances in the CRM, send that stage change back to the ad platform as an offline conversion: a signal that says this specific lead, the one that started with that click, just did something that matters.
Every major platform has a channel built for exactly this, meant for conversions that happen away from the site, on a phone or in a back office. Meta's documentation names the Conversions API as its recommended route for offline events, and lists targeting alongside measurement and attribution as what those events feed.
Feed the auction the stage after the form and lead quality fixes itself. The auction always hits exactly what you report, so change what you report before you touch the targeting.
That reframing is the whole point. For months the instinct had been to fiddle with targeting and bidding, as though the auction were aiming at the wrong people.
It was aiming at exactly the people it had been trained to find.
Values turn a signal into a lesson
A bare conversion event teaches the auction only that a lead moved forward. Attaching a value teaches it how much the movement was worth, and that is what genuinely reshapes who it goes after. Optmyzr co-founder Frederick Vallaeys frames value-based bidding as how Google learns which potential customers are most valuable to you.
We reported the stage changes that meant something, an application entering review, a deal reaching the closing table, a deal funding, and we put a value on each one. The early stages carried a conservative estimate keyed to the type of deal, and the close carried the real figure.
From there the auction stopped chasing raw volume and started leaning toward the leads that resembled the ones carrying value.
Stage values also solve a timing problem. If you only ever report the final funded deal, the auction learns slowly, because the signal arrives two months after the click and only for the small fraction that closed.
Reporting the intermediate stages gives it earlier, more frequent evidence about which leads are heading somewhere, so it can correct course long before the cash actually lands.
The hard part is matching the outcome to the click
Sending an outcome back is easy. Making sure the platform can tie that outcome to the original click, weeks later, is the part that takes design.
By the time a deal funds, the browser session that started it is long dead. You need an identifier that survived the entire journey, from the anonymous click to the row in the CRM, so the platform can line the two up.
In practice you keep a ranked list of identifiers and always send the strongest one you managed to hold on to.
At the top sits the platform's own click identifier, captured the instant someone arrives from an ad and written onto the record then and there. Google's instruction for offline conversion imports is to save that click ID alongside whatever lead information you collect from the person who clicked. When it is present it is close to exact.
Below it sits a first-party identifier you mint yourself, which earns its keep on the leads where the click stamp never made it, and it fails to make it more often than people assume, dropped by in-app browsers, redirects, and copied links.
At the bottom sits hashed contact information, email or phone, which lets the platform match on the person once every stronger key has fallen away. You send whichever you have, best first, and let the platform work down the list.
One ID from click to close
The first-party identifier deserves a moment, because it is the piece that makes the loop reliable rather than lucky. The mechanism is small.
The first time anyone lands on the site, the browser mints a stable ID and stores it. That ID gets injected into every form, so when the lead reaches the CRM it arrives already stamped.
From then on the record carries an identifier you control, one that does not hinge on a platform cookie surviving or an email staying consistent from one system to the next. When the deal funds months later, that same ID is still sitting on the record, ready to be handed back to the auction.
What keeps this from turning into a mess is precedence. A person can arrive in more than one order. They might be an anonymous visitor who fills a form, or a known contact already in the CRM who clicks an email and turns up on the site.
If two systems each try to assign an identity, you get collisions and duplicates.
An anonymous visitor gets the browser-minted ID, which becomes their CRM identifier the moment they convert. A contact who already lives in the CRM brings that identifier with them onto the site. Either path leaves exactly one ID per person, and it never changes hands.
Decide early which system owns a person's identifier. First touch owns it, everything else references it, and the loop closes itself.
This also disarms the case that trips most teams: the buyer who fills a form on one page and checks out somewhere else under a different email. Anchor identity to a durable ID rather than the email of the moment and that person stays one person.
The deeper version of this, resolving a single human across a CRM, a billing system, and a heap of marketing tools that all disagree, is its own build, which I wrote up in the customer data platform I built for about thirty dollars a month.
For the ad feedback loop you do not need all of that machinery. You need one identifier that lives from the first click to the funded deal.
What it changed
Once outcomes were flowing back with values attached, the auction finally had something real to steer toward, and the make-up of the leads began to shift. The platform started favoring the sources and audiences that produced deals that actually funded, because those were the ones now lighting up as valuable.
The media spend did not change. The scoreboard changed, and the spend followed it.
One event, fired at the right moment, moved a number that a quarter of targeting tweaks had failed to move.
Build your own version
None of this is specific to wholesaling or to a two-month sales cycle. If any meaningful part of your revenue closes after the click, offline and later, the same loop is missing. The steps:
- Capture the platform's click ID the moment a visitor arrives from an ad, and write it onto the lead record as soon as the form is submitted.
- Mint a first-party ID in the browser on first touch, inject it into every form, and carry it into the CRM so every lead lands already identified.
- Pick the CRM stages that genuinely mean something and send each one back to the platform as an offline conversion.
- Attach a value to those events, estimated at the early stages and actual at the close, so the auction optimizes toward money instead of motion.
- Decide which system owns a person's identifier and make every other system reference it, so one ID survives the whole journey.
This is the same problem I pulled apart in how marketing attribution breaks, seen from the other end. That piece is about the signal you lose on the way in, before a click even becomes a lead. This one is about the signal you never send back on the way out.
And once the outcomes are flowing, they feed the economics I steer by in the LTGP:CAC operating system, because an auction that knows which leads fund is an auction you can finally point at gross profit instead of raw lead volume.
If your revenue closes offline while your ad platforms optimize on form-fills, this is the kind of loop I build. Let's talk.