Offline Conversion Imports: Teaching Google and Meta What Money Looks Like
The 60-second version
The pixel sees the lead; the CRM sees the money ninety days later. What to send back, how matching works, and the mistakes that make imports harmful.
- What happened, in one line
- What to do about it this week
- What you can safely ignore
Your pixel fires the instant a lead form is submitted. Your CRM knows, ninety days later, which of those leads actually paid. Between those two moments sits the most expensive attribution gap in lead-gen, high-ticket e-commerce, and COD-heavy D2C: the ad platform optimised its bidding on the promise, and never learned about the outcome.
Offline conversion imports close that loop. You send the real outcome — qualified, closed-won, refunded — back into Google and Meta, matched to the original click. Bidding stops chasing form-fills and starts chasing revenue. This post covers what to send, how matching works, and the mistakes that make imports actively harmful.
The short version: teach the algorithm what money looks like
Closing the Loop With Offline Imports
Data JourneyOnline signal
A form submit, a COD order placed, a trial started. Fast, plentiful, and only weakly correlated with money.
Offline outcome
Sales qualifies 200, closes 60, refunds 4. Ninety days of reality the platform never observed.
Import back
Closed-won events matched to original clicks retrain Smart Bidding and Advantage+ toward buyers, not browsers.
An offline conversion is any conversion the platform could not observe itself: a closed-won deal, a COD order confirmed on delivery, an in-store purchase, a subscription renewal. Importing means uploading these outcomes with enough identity (click ID, hashed email/phone, timestamp) for the platform to join them to the click that started the journey.
The Golden Rule of imports: bid on the outcome closest to money that still has enough volume to optimise on. Platforms need roughly 30 conversions per 30 days per campaign to exit learning. Closed-won with 12 events a month will thrash; qualified-with-value (200 events, revenue-weighted) usually beats both extremes.
What to send: the event hierarchy
Not every CRM stage deserves an import. Send too little and bidding learns nothing; send everything and it learns noise.
| CRM stage | Send it? | Why |
|---|---|---|
| Raw lead / form submit | Already have it (pixel) | Useful as a micro-conversion for volume, never as the primary goal |
| Marketing-qualified (fit + intent verified) | Yes — primary goal for most | First stage correlated with money that still has volume |
| Sales-qualified / opportunity created | Yes, with value | Fewer events, higher signal; attach expected deal value |
| Closed-won / delivered-and-paid | Yes — the money event | Ground truth; also send value corrections when deals expand |
| Refunded / churned-in-30-days | Yes — as a retraction | Subtracts the revenue so bidding stops finding refund-prone buyers |
| Disqualified / junk / duplicate | No — never | Training the algorithm on your spam filter's rejects teaches it to find more of them |
Bidding on form-fills vs bidding on closed-won
How matching works: the three keys, in order of strength
- Click ID (
gclid,fbclid,wbraid) — the strongest key. If you stored the click ID on the lead or order row, matching is near-deterministic. This alone justifies the click-ID plumbing from the companion post. - Hashed contact identity (email, phone) — SHA-256 hashed on your side before upload; the platform matches against hashed logged-in users. Match rates of 50–70% are typical with clean data, far lower with role-based or typo-ridden emails.
- Event timestamp + value — the weakest signal, used to disambiguate. Keep clocks honest: the conversion timestamp should be the outcome moment (deal closed, order delivered), not the upload moment, or window attribution misfires.
Never upload plaintext PII. Hash emails and phone numbers with SHA-256 before they leave your systems, normalise first (lowercase, strip spaces and country-code inconsistencies) — a hash of +91 98XXX XXXXX and 9198XXXXXXX are different strings and will silently fail to match. Most failed imports are normalisation bugs, not platform bugs.
Timing rules that quietly break imports
- Upload fast, not eventually. Same-day or next-day uploads let the conversion land inside the campaign's attribution window. A closed-won uploaded 90 days late may fall outside the window entirely and train nothing.
- Respect the platform's lookback. As a rule of thumb, Google accepts conversions up to ~90 days after the click for import goals and Meta considerably less for some objectives — verify current limits in the platform docs before designing a 120-day enterprise cycle around imports.
- Send value corrections, not just events. When a deal expands, upload an adjustment with the same transaction ID. When an order is refunded, upload the retraction. Bidding trained on gross revenue systematically overbids on refund-prone segments.
The production SQL pattern: a CRM export ready to upload
Show query
Standing Up Offline Imports, In Order
Process FlowStore click IDs on leads and orders first
Without stored gclid/fbclid you are matching on email alone, and match rates roughly halve. Plumbing before uploads.
Pick one money-adjacent primary goal
Qualified-with-value for most teams. Verify 30+ events per month per campaign before switching bidding to it.
Normalise, hash, and upload daily
Lowercase, E.164 phones, SHA-256, outcome timestamps. Automate the export; manual CSVs die within a quarter.
Add refunds and value adjustments
Retractions keep bidding honest. Review match rates monthly — a falling match rate is a data bug, not a platform change.
Frequently Asked Questions
Will importing offline conversions double-count against my pixel?
Only if you let the same event exist in both systems under different identities. Use consistent transaction IDs and, where the platform supports it, matching event IDs so the import merges with rather than duplicates the online signal. Reconcile weekly: imported revenue in the platform vs closed revenue in the CRM should track within the match-rate gap.
Our sales cycle is 6 months. Can imports still work?
Partially. Import the earliest money-correlated milestone (qualification) as the bidding goal, keep closed-won as an observed secondary goal for reporting, and shorten the feedback loop with value-weighting. A 6-month-delayed signal cannot steer this month's auctions no matter how pure it is.
Does this apply to COD e-commerce, not just B2B leads?
Directly. A COD order placed is a lead; a COD order delivered and paid is the outcome. Importing delivered-paid (and retracting RTO) is the single highest-ROI measurement project for COD-heavy stores — see RTO for why order-time revenue overstates reality by the RTO rate.
Summary & Next Steps
The pixel measures interest; the CRM measures money; imports are the bridge. Store the click, pick one money-adjacent goal with enough volume, hash and normalise rigorously, upload daily, and retract refunds.
- Use click IDs as the primary match key wherever you can store them.
- Use channel CAC on imported revenue to judge channels honestly.
- Use ROAS targets derived from breakeven, not from pixel fantasy.
Breakeven ROAS Calculator
Enter your gross margin to find the minimum ROAS at which a campaign stops losing money — and the target ROAS at a chosen profit goal.
Chinmay Raibagkar
About author →Founder of DataLens AI. He helps non-technical teams read their ad and database numbers with confidence — which number to trust, what to do next, and what to ignore.