Send real sales back to Google and Meta
Both platforms optimise towards whatever you tell them counts as a win, and most lead accounts tell them a form was filled in. Five steps to tell them which forms became sales, a checklist you can lift, and what the groundwork turned up on a real account.
On a lead account, Google Ads conversion tracking counts a filled-in form as a win unless you tell it which leads became sales. Google and Meta only learn from what you send them. Capture the click ID and contact details with every lead, and write down what counts as a sale, what it's worth and when it happened. Send each sale back at least daily, to Google with the click ID and hashed contact details, to Meta with the lead ID. Then check the match rates and wait out the lag before you trust a number. Done badly, it teaches bidding the wrong lesson with total confidence.
Required inputs.
- Click IDs and lead IDs stored in the CRM
- Each lead's email and phone
- A written definition of a sale
- Sale values and dates, with time zones
Operator sequence.
Capture
Store the click ID, lead ID, email and phone with every lead as it arrives.
Define
Write the rule for which CRM status is a sale, with its value and date.
Upload
Send sales to Google daily, with the click ID and hashed contact details.
Feed Meta
Send every lead stage to Meta's Conversions API, keyed on the lead ID.
Check
Read the diagnostics and reconcile the counts, then wait out the lag before judging.
The account in this guide: the same Australian education provider as in my Google Ads audit guide and my Meta lead ads guide. I do this work inside someone else's business. Leads arrive by web form, phone and Meta's instant forms, and the sale is an enrolment that can land days or months later. I can't name it, but the numbers are real. The value-carrying upload wasn't live on this account when I wrote this. What follows is the groundwork.
01 Capture the click ID and contact details with every lead
With auto-tagging on, Google adds a click ID to every ad click, the GCLID. Some iOS traffic carries a GBRAID or WBRAID instead. Capture whichever one is in the landing page address, hold it in a first-party cookie so it survives the visitor clicking around, and write it into a hidden field on every form. Your CRM stores it in its own field, and nothing overwrites it later.
Capture email and phone on every form too. When the click ID is missing, Google can still match the sale on those, hashed, as long as the Google tag captured the same email or phone when the form was submitted. That's most of what enhanced conversions for leads adds.
For Meta instant forms, store Meta's lead ID, a 15 to 17 digit number, in its own CRM field. For Meta visitors who enquire on your own landing page, keep the _fbc cookie, which holds Meta's click ID.
Then open ten recent leads and look at the field. On this account, the field the click IDs landed in also held Google Analytics client IDs, which are two long numbers joined by a full stop. They look like IDs, but Google can't match them to anything, so they had to be filtered out.
Phone sales are the hole in all of this. A call has no click ID unless you use Google's call tracking, which puts a forwarding number on your ads. Then you can import the calls that became sales, matched on caller number and call start time.
02 Decide what counts as a sale, its value and its date
Before anything is uploaded, write down three rules: which CRM statuses count as a sale, which date it takes, and what it's worth.
The sale. On this account the CRM had an "enrolment accepted" tick box that looked like the obvious answer. It missed about one enrolment in three. Counting by status, and accepting a sale if any of its won, payment or acceptance dates fell in the period, caught the ones the tick box missed. For an upload, pick one date per sale and stick to it. I'd use the won date, with the payment date as the fallback.
The value. Send the actual revenue of each sale. If you upload earlier stages too, value each one at the average sale value multiplied by the share of that stage that goes on to buy. A booked call that becomes a sale one time in four is worth a quarter of a sale. That keeps bidding pointed at the sale before it has enough sales to learn from.
The date. Google needs the conversion time with a time zone offset, in the form 2026-10-29 14:05:00+11:00, and it has to fall after the click. Check the offset at the source. On this account the CRM's spreadsheet export and its API gave the same moments in different time zones, an hour apart. That's enough to put a sale before its own click. In a file import, a time zone name such as Australia/Sydney avoids daylight saving mistakes.
For refunds and cancellations, Google lets you retract an uploaded conversion or restate its value, found by the transaction ID you uploaded it with (for GCLID and GBRAID sales, not WBRAID).
Conversion value rules adjust a conversion's value by location, device or audience as Smart Bidding sets a bid. Smart Bidding already uses those signals, so only add a rule when your sales show a difference it can't see, such as leads from one state buying at half the rate. They matter most while you're bidding on a stage before the sale.
03 Upload offline conversions to Google Ads
Create an import conversion action for the sale, and one for each stage you plan to send. Set its click-through window to cover your real time from click to sale, up to the 90-day maximum; Google rejects a sale whose click falls outside it. Wait four to six hours before the first upload.
Start the sale action as secondary. Secondary actions report in the All conversions column but don't steer bidding, so you can watch the numbers settle first. FM-01 covers when to make it primary, which is once campaigns have enough sales to learn from and after at least four weeks in parallel.
Then turn on enhanced conversions for leads. Accept the customer data terms in the conversion settings, because Google won't process data sent before you do, and set the Google tag (or Tag Manager) to capture the email and phone from your lead form when it's submitted. Google matches your upload against that. Each sale goes up with the click ID where you have it, plus up to five hashed identifiers:
- The click ID, whenever you have it. Google still recommends including it.
- The email: trimmed and lowercase, with dots and anything after a plus sign removed from Gmail addresses, then hashed with SHA-256.
- The phone, in international format (+61 and the number without its leading zero), then hashed the same way.
Build new uploads on Google Ads Data Manager, which connects to Google Sheets, file transfer, HubSpot, Salesforce and common databases, or on the Data Manager API. Since 15 June 2026 Google has blocked new integrations from the old Google Ads API upload method.
Give every sale a transaction ID, such as the CRM record ID. Google uses it to drop duplicates, and it's how you retract or restate that sale later.
Upload daily, overlapping each upload by a day as Google's file import guidance suggests. Google rejects a repeat with the same click ID, conversion action and conversion time, which only protects you if the conversion time is the sale time. Stamp it with the upload time and every re-send becomes a new sale.
04 Send CRM stages to Meta's Conversions API
My Meta lead ads guide covers the strategy: whether your account fits (Meta's own forms, at least 200 leads a month, a stage reached by 1% to 40% of leads within 28 days), which stage to optimise for, and the higher intent form. This is the plumbing underneath.
Every event sent to Meta's Conversions API for CRM needs:
event_name: your CRM stage, named as your CRM names itevent_time: when the lead reached that stage, in Unix secondsaction_source: alwayssystem_generatedlead_id: Meta's lead ID, inside the user dataevent_source:crm, andlead_event_source: the name of your CRM, both inside the custom data
Send every stage as it changes, starting with the lead stage. Then mind the clock, because an event can be at most seven days old when it reaches Meta, and one stale event gets the whole batch rejected. A weekly upload lives on that edge. Daily is Meta's minimum, and the safe choice.
Meta checks lead coverage, the share of your Meta leads with matching events, and wants at least 60%. The lead ID is what gets you there. In FM-02's analysis on this account it made 92% of the matches between Meta leads and the CRM, so store it on every lead from day one.
Leads from your own landing page work differently. Send the submission through the Conversions API as well as the Pixel, with the same event name and event ID on both, so Meta counts it once (it merges pairs that arrive within 48 hours). Include hashed email and phone (for Meta, the phone is digits only: 61 and the number with no plus sign and no leading zero, so it hashes differently from Google's) and the unhashed _fbc and _fbp cookies, then watch the Event Match Quality score in Events Manager.
05 Check it's working, then wait out the lag
Check three things, in this order.
The diagnostics. In Google Ads, offline data diagnostics show successful, pending and failed uploads with a status and alerts. Pending uploads should clear within 24 hours. The enhanced conversions diagnostics add coverage and match rate. In Meta's Events Manager, the CRM integration has Overview and Diagnostics tabs and a lead coverage report.
The reconciliation. Compare sales in the CRM, sales uploaded and conversions the platform recorded, for the same dates. Every gap needs a reason. On this account, one month Google counted about a fifth more enrolments than the CRM export showed. The gap was entirely older leads that paid that month, outside the export's window. Google was right and the export was short.
The match rate. Write down the share of sales that reached the platform with a usable click ID or contact match. My working floor is about 70% before bidding relies on it. Below that, fix the feed before the bids.
When match rates are low, work through the causes in order: the click ID never captured (no hidden field, a redirect that strips it, a form on another domain); captured but wrong (analytics IDs, truncated, overwritten); phone sales; clicks older than the window; contact details not formatted before hashing; and leads keyed in by staff with no email.
Then the lag. Google reports an uploaded sale against the date of the original click, not the upload, so last week's numbers keep rising for weeks. On this account half the sales closed within about a week of the enquiry and the rest trailed out over months. The Days to conversion segment shows your own curve. Until a period is older than most of it, it can describe but not decide, so never judge a bid change on a week whose sales haven't landed.
Where AI fits
AI handles this plumbing well, from the hashing scripts to flagging the week coverage drops. On this account AI wrote the scripts that hash the CRM export on my own machine before it goes anywhere, and the reconciliation of the CRM against Google's count. It never saw a raw email or phone number. It can't decide what counts as a sale, though. A tick box that misses one enrolment in three looks perfectly sensible from the outside.
The checklist.
30 points, in the order I check them. Anything you can't tick is a finding.
Capture
- Auto-tagging is on in Google Ads
- Every form has a hidden field for the GCLID, GBRAID or WBRAID
- The click ID survives page changes and is stored in its own CRM field
- The field holds real click IDs, not analytics client IDs
- Meta's lead ID is stored in its own field for every instant form lead
- Every form captures email and phone
Definition and value
- A written rule says which statuses count as a sale and which date it takes
- Each sale carries its real value, or a stage value based on how often that stage buys
- Conversion times include a time zone offset and fall after the click
- Refunds and cancellations are retracted or restated
- Value rules are used only where sales data shows a difference bidding can't see
Google setup
- Customer data terms are accepted and enhanced conversions for leads is on
- The Google tag captures email and phone on every lead form submission
- Email and phone are formatted and SHA-256 hashed, with the click ID included where you have it
- The conversion window covers your click-to-sale time, up to 90 days
- The sale action ran as secondary for at least four weeks before becoming primary
- New uploads are built on Data Manager, not the old Google Ads API route
- Each uploaded sale carries a transaction ID
- Sales are uploaded to Google daily, each upload overlapping the last by a day
- Each conversion time is the sale time, never the upload time
- Phone sales are tracked with call tracking and imported
Meta setup
- Every stage is sent as it changes, starting with the lead stage
- Events are sent at least daily and are never more than 7 days old
- Each event carries the lead ID, system_generated, crm and the CRM's name
- Website leads send Pixel and Conversions API events with the same event ID
Checks
- Google's offline data diagnostics show no unexplained failures
- Meta's lead coverage is at least 60%
- Uploaded sales reconcile to the CRM for the same dates, every gap explained
- The match rate is written down and at least 70% before bidding relies on it
- Recent weeks are judged only once the usual click-to-sale lag has passed
Guardrails.
- New sale actions start as secondary
- Hash contact details before they leave your systems
- One written definition of a sale
- No bidding on a feed below 70% match
Common questions.
What is a GCLID?
The Google Click ID, a unique code Google adds to every ad click when auto-tagging is on. Store it with the lead, and when the lead becomes a sale you can send the sale back against the click that started it.
What's the difference between offline conversion import and enhanced conversions for leads?
Offline conversion import matches a sale to its click by the click ID alone. Enhanced conversions for leads adds the lead's hashed email and phone, which Google matches against what its tag captured when the form was submitted, so it can still match sales without a click ID. It's the upgraded version, and you keep sending the click ID with it.
How often should I upload offline conversions?
Daily, to both. Meta asks for at least daily and rejects events more than seven days old, and fresher sales give Smart Bidding more to work with.
Why doesn't my Google Ads conversion tracking match my CRM?
Usually sales without a click ID (most often phone sales), clicks older than the conversion window, different time zones or sale definitions, or the lag, because Google reports a sale against the click date. Reconcile the same dates in each system and give every gap a reason.
Do I need Meta's Conversions API if I use instant forms?
If you want Meta to find buyers rather than form fillers, yes. Only your CRM knows which leads bought. The Conversions API for CRM sends those stages back against the lead ID so Meta can optimise towards them.
A running feedback loop on both platforms, and a one-page record of it: the sale definition, each conversion action and its status, the upload schedule, match rates and coverage, and the date each period becomes safe to judge.
Prefer to hand it over? I check this as part of a fixed-price paid media audit: $1,500 plus GST for one platform and its tracking, $750 for each extra platform.