Offline conversion tracking: send B2B sales to Meta and Google
An ad algorithm finds exactly the people you pay it to find. Here is how to send qualified calls, quotes and signed clients from your CRM back to Meta and Google, and prove it works.

This guide covers HubSpot and GoHighLevel step by step, then other CRMs, phone calls and WhatsApp, as both platforms stood in October 2026.
An ad algorithm finds exactly the people you pay it to find
Meta and Google optimise for whatever you tell them a conversion is. Tell them it is a form fill, and they find the person who downloads every checklist at 11 pm, the student, the job seeker. Each one counts as a lead, and each one is cheap.
Send back which leads became qualified calls, and the platform can look for more people like those instead. It will not screen out junk on its own; the form and the stage rule still do that.
Our own numbers show why lead counts alone settle nothing. On TheHexaTown's B2B lead generation on Meta, cost per lead was $12.30 in the launch month and $29.00 blended across five months, on 212 leads: 2.36 times more per lead. Those two figures can not tell us whether each lead became more valuable or less, and we will not pretend they do. Only a stage sent back from the CRM would show it.
When 99% of records sit at stage one, the stage field records only that a form arrived, and that is all the algorithm can learn.
A signed client links back to the ad through a click ID, a backup and a stage
Each event you send back carries three things.
- The click ID (a code added to the ad link so the platform knows the click later). Google's is the
gclid, orgbraidandwbraidon some iOS traffic, added by auto tagging (a Google Ads setting). On Meta instant forms it is the Lead ID (Meta's 15 to 17 digit number per submission, delivered by the lead webhook, Zapier or Make). On website forms Meta uses thefbclidfrom the URL, saved in a Meta cookie asfbc. - The backup. Email and phone, hashed (scrambled one way, so they match but can not be read), for when the click ID is missing.
- The stage. Its name, the time it happened and, for a sale, the value and currency.
A click ID, or a hashed email and phone that match, is a usable key. Without one, the platform never hears about the sale.
Take one invented lead. She clicks a Meta ad on a Tuesday, submits the instant form on Wednesday, and your CRM stores her Lead ID. On day 9 she holds a qualified call, and the CRM sends "Qualified call held", her Lead ID and the time. On day 41 she signs a $12,000 contract, and the CRM sends the close with its value. Meta matches each event to her lead, and so to the ad.
Meta's route for this is the Conversions API for CRM (Meta's way for a CRM to send lead stages). Google's is the Data Manager API (Google's newer upload route, which replaced the Google Ads API for offline imports). Neither costs anything to use; the exact fields for whoever builds it are in the developer box near the end.
| Term | What it means |
|---|---|
| Feed | The whole flow of stage events from your CRM to the platforms |
| Conversion leads goal | Meta's performance goal that optimises on a CRM stage you choose |
| Events Manager | Meta's screen for data sources and test events |
| Dataset | Meta's container that receives your events; the CRM gets its own |
| Diagnostics | Meta's tab listing event errors |
| Business Manager | Meta's account that owns ad accounts, pages and datasets |
| E.164 | The international phone format: plus, country code, number |
| Lifecycle stage | HubSpot's contact level funnel field, separate from deal stages |
| Qualified lead, Converted lead | Google's two goals for imported CRM stages |
| Target ROAS, Target CPA | Google bidding that aims at a return on ad spend or a cost per conversion |
| MCC | A Google Ads manager account that holds several client accounts |
| Webhook | An automatic message one app sends another when something happens |
| Zapier, Make, n8n | No code tools that connect apps; Make calls each flow a scenario |
Source: Contwre glossary, from the Meta, Google and HubSpot documentation cited in this post
Meta and Google both changed their upload routes in 2025 and 2026
If a guide tells you to upload GCLIDs through the Google Ads API, or to use Meta's Offline Conversions API, it is out of date.
Google's offline import page, read on 20 October 2026, says that from 15 June 2026 offline imports and enhanced conversions for leads (matching by hashed email or phone instead of the click ID) move to the Data Manager API and are blocked in the Google Ads API. An old script that still calls the Google Ads API may have failed silently since June. Moving it means sending the same pieces, the click ID, conversion time, conversion action, value and an order ID, to the new API. Zapier's Google action needs a GCLID, and we could not confirm whether it uses the new API.
Meta's developer pages now call its Offline Conversions API "Meta's legacy API", and they disagree on whether the CRM route covers website forms or only instant forms.
| When | Who | What changed |
|---|---|---|
| 23 May 2023 | Meta | Offline Conversions API to stop taking offline events; v16 is its last version |
| 21 May 2024 | Meta | Offline Conversions API set for discontinuation in May 2025 |
| 9 Dec 2025 | Data Manager API launches (trade press) | |
| Apr to Jun 2026 | Enhanced conversions for web and for leads merge into one setting | |
| 15 Jun 2026 | Offline imports blocked in the Google Ads API, moved to the Data Manager API | |
| Aug 2026 | Meta | Qualified leads goal needs a Conversions API integration on new campaigns (practitioner report) |
Rows marked trade press or practitioner report are secondary sources. The rest were read on the platforms' own pages on 20 Oct 2026.

Clean these CRM fields before you send a single event
Most of the work in CRM offline conversion tracking is cleaning fields, not writing code.
| Field | Store it as | What breaks it |
|---|---|---|
| Meta Lead ID | Text, 15 to 17 digits | Number formatting |
| gclid, gbraid, wbraid | Text, case kept | Lowercasing, iframes, redirects |
| fbclid, sent as fbc | Text, case kept | Any edit at all |
| Trimmed, lower case | Typos, shared inboxes | |
| Phone | One clean column with country code | Local formats, leading zeros |
| Stage name | Fixed pick list | Free text, renamed stages |
| Stage date and time | One field per stage | Overwritten on each change |
| Deal value and currency | Gross profit plus currency code | Revenue sent instead |
| Transaction or order ID | One per conversion | Reused IDs |
| Consent | Who, when, which form | Missing on older contacts |
Meta wants phone as digits with the country code and no plus sign. Google wants E.164 format, with the plus. Store one clean column and derive both.
Three rows do quiet damage. Phone is hashed two ways: Meta wants digits only with the country code and no leading zero, Google wants the plus. A Dubai mobile written locally as 050 123 4567 becomes 971501234567 for Meta and +971501234567 for Google; a US number becomes 16505551212 and +16505551212. Send one test lead before you trust the format.
Click IDs are case sensitive, and Meta says not to modify the fbclid at all, so one lowercase step in a sheet or a Zap breaks every match. And Meta's Lead ID page says HubSpot Lead Sync, Zoho CRM Social and Microsoft Dynamics 365 do not store the Lead ID, so capture it with a webhook, Zapier or Make. HighLevel's guide says 15 to 16 digits and Meta's says 15 to 17; text fits both.
Run four checks first:
- Pull last month's paid leads and count how many carry a click ID. There is no reliable published benchmark, so track the share weekly and treat any drop as a broken form.
- Open Meta's Lead Coverage report, under View Reports in the CRM dataset's Settings tab. Meta's verify page sets the bar: "Your Lead Coverage is at least 60%." We read it as the share of your Meta leads that come back with CRM events; we did not find Meta's formula. Below 60%, fix capture before you touch the goal.
- Count the share of opportunities that moved past stage one in the last 90 days.
- Take one known
fbclidfrom a test click and compare it, character by character, with what your CRM stored.
If the stage field is the mess, start with our CRM data cleanup guide.
Consent is a field in your CRM, not a banner on your site
What we checked: in the EEA (the European Economic Area), Google needs ad_user_data and ad_personalization granted, per contact, before user data is used for advertising. Meta's Business Tools Terms ask for "appropriate notice to and consent from your users" before you share event data, and the line we read is not limited to one region. So store consent on every contact as three facts: who consented, when, and through which form.
What we did not check: US state privacy laws, Canada's rules, or the UAE's federal data protection law. This is not legal advice, so take the question below to a lawyer in your market.
Keep optimising for the lead until your qualified stage reaches about 50 a week
If you spend under about $32,500 a month, this is the whole answer. Store the click ID on every lead, send every CRM stage to both platforms, stay on the lead goal on Meta, and judge any change on cost per qualified lead. On Google, upload the qualified stage as a secondary conversion (Google's label for observe only) until it passes the bidding floor below, then make it primary.
Our house rule on Meta is to optimise for the deepest event you can generate about 50 times a week. We use 50 because it matches Meta's learning phase (the settling period after a change): an ad set "generally needs about 50 optimisation events within seven days", per Meta's Help Center as ppc.land reported on 23 September 2026. We have not tested 30 against 50.
Weekly spend to feed 50 of a stage = 50 divided by the share of leads that reach it, times your cost per lead.
At $30 a lead, with 20% of leads reaching a qualified call, that is $7,500 a week, about $32,500 a month. Find your own row below.
| Monthly spend | At $15 a lead | At $30 a lead | At $60 a lead |
|---|---|---|---|
| $2,000 | 6 | 3 | 2 |
| $5,000 | 15 | 8 | 4 |
| $15,000 | 46 | 23 | 12 |
| $32,500 | 100 | 50 | 25 |
MODEL: 20% of leads reach a qualified call. Cells at or near 50 meet our rule. Meta's conversion leads goal opens at 200 leads a month: $3,000 of spend at $15 a lead, $6,000 at $30, $12,000 at $60.
Source: Contwre model; Meta for Developers, Conversions API for CRM integration, read 20 Oct 2026
Under 200 leads a month, Meta's conversion leads goal is closed, so make the form do the filtering. Practitioner Ben Heath showed in September 2026 an instant form with screening questions, conditional logic that closes the form for people who fail a budget question, and phone verification. It cuts lead volume on purpose.
From 200 leads a month, Meta allows the conversion leads goal. We treat that as permission, not a signal, and stay on the lead goal. To try it early, run it as one change and judge it after the learning period below, on cost per qualified lead.
When the qualified stage reaches about 50 a week, switch Meta to conversion leads on that stage: a Leads objective, Instant forms as the conversion location, and Conversion leads as the goal. It does not work on personal ad accounts.
- 200 leads a month before Meta's conversion leads goal opens
- 28 days for the optimised stage to happen after the lead
- 60% Lead Coverage Meta requires on CRM events
Source: Meta for Developers, Conversions API for CRM integration, read 20 Oct 2026
Meta's CRM integration page also wants daily uploads, at least two stages, and an optimised stage reached by 1% to 40% of leads within 28 days. Below 1%, pick an earlier stage. Meta's floor and our rule use different units: 200 leads a month is about 46 leads a week, which at 20% is about 9 qualified calls. On GoHighLevel, plan for 250 leads a month, the figure its guide uses.
Meta's CRM follow up page gives a 2 to 4 week learning phase and its FAQ says 1 to 2 months. Our planning assumption is the slower one: about two months before we judge the goal, with a Lead Coverage check at week four.
On Google, import the qualified stage under the Qualified lead goal and the sale under Converted lead. Google's own page puts Target ROAS on Search at 15 conversions in 30 days, not the 50 several blogs quote. Closed won is the hardest event to feed: at $30 a lead, 20% of leads reaching a call and 25% of calls closing, it reaches 50 a week only at about $130,000 a month.
Pick the stage that proves intent, whether your sale starts with a call, a quote or an appointment
For a software company the stage is a qualified call; for a wholesaler, a quote; for a clinic, an attended appointment. Whatever it is, define it before anyone talks to the lead, and make it checkable in the CRM. If a rep decides afterwards, the platform learns that rep's judgement, which changes week to week.
Our own strategy call gate checks company, team size, recent marketing spend, revenue and email domain before anyone speaks. A quote rule can be as plain: send a quote only when the buyer gives a delivery address and a date within 60 days.
- Write the definition down before the conversation, using fields the CRM can check.
- Fire the event when the stage happens and meets the rule: the call held, the quote sent, the patient seen. A booking is a lead with a calendar invite.
- Record the date and time of that stage in its own field.
- Never rename the stage. A renamed stage splits your history into two events.
Then check each stage's date against each platform's window. Google's page on upload windows gives 90 days for click IDs and 63 for hashed data, with uploads at least daily.
| Meta conversion leads | 28 days |
|---|---|
| Google, hashed | 63 days |
| Google, click ID | 90 days |
Meta wants the stage you optimise for inside 28 days of the lead.
Source: Meta for Developers, Conversions API for CRM; Google Ads Help 10029210; read 20 Oct 2026
| Sale type | Optimise Meta on | Also send to Google | Too late |
|---|---|---|---|
| Call led service | Qualified call held, day 9 | Closed won, day 41 | Close, for Meta |
| Wholesale, short quote | Quote sent, day 3 | Order placed, day 10 | Nothing |
| Wholesale, long build | Quote sent, day 7 | Order placed, day 40 | Order, for Meta |
| Clinic | Consult attended, day 5 | Paid, day 30 | Payment, for Meta |
| Property | Viewing held, day 12 | Offer made, day 60 | Sale at day 120, for both |
MODEL: the days are illustrative. Use the windows in the chart above for your own dates.
Source: Contwre model; Google Ads Help 10029210; Meta for Developers, read 20 Oct 2026
Send gross profit as the value, not revenue. A $12,000 first year contract with 25% of qualified calls closing is worth $3,000 in revenue per qualified call. At a 70% software margin that is $2,100; at a 25% margin after delivery costs, $750. Send your own margin, because revenue teaches the bidder to chase big deals with thin margins.
Website orders already reach Meta as purchase events through the pixel and Conversions API, so they skip the CRM route. Check Events Manager for purchase events from your site in the last seven days.
| CRM | To Meta | To Google | Google route checked? |
|---|---|---|---|
| HubSpot | Lifecycle stages, Conversion Leads campaigns only | Lifecycle stage or form, fixed values | Documented by HubSpot |
| GoHighLevel | Any pipeline stage, natively | Built in action for forms, orders, calls; own webhook for other stages | Built in action not verified after 15 Jun 2026 |
| Any other CRM | Any stage via Zapier, Make or a webhook | Your own Data Manager API build | Depends on the build |
Source: HubSpot Knowledge Base; HighLevel Help; Meta for Developers; read 20 Oct 2026
HubSpot sends lifecycle stages to Meta and Google, not deal stages
One open question decides whether HubSpot's native route works for instant form ads. Meta says HubSpot Lead Sync does not store the Lead ID, and HubSpot's page never mentions it. We have not tested it. The five minute check: send one test lead through Lead Sync and look on the contact for the 15 to 17 digit Lead ID. If it is missing, or you can not test yet, ask HubSpot in writing before you buy, and capture the ID with a webhook or Zapier.
HubSpot to Meta
- Install the Meta pixel; the ad account must sit in a Business Manager.
- In HubSpot, go to Marketing, then Ads, and create an ad conversion event for your Meta ad account.
- Choose the trigger: lifecycle stage change, form submission or page view. Deal stages are not offered.
- Send the Click ID, email and phone, and add your consent property.
- Create the event. There is no backfill, so earlier leads are not sent.
HubSpot's page, updated 9 September 2026, lets you create 5 of these events on Starter, 50 on Professional and 100 on Enterprise. It says Meta only takes this data from contacts who came through lead generation campaigns on the Conversion Leads goal, so campaigns on any other goal get nothing from it.
For deal stages, map them to a lifecycle stage such as SQL or Opportunity, or send them yourself: Meta's developer guide for Zapier stores the Lead ID from the Lead Ads trigger, then sends each stage change through the Facebook Conversions "Send Funnel Event" action. If you build your own route, delete the HubSpot event for the same stage so it is not sent twice.
HubSpot to Google
- Create a HubSpot ad conversion event for Google on a lifecycle stage or a form submission.
- HubSpot sends the GCLID, or email, phone and address for matching. Turn on enhanced conversions.
- Values are fixed: HubSpot says "Use the Deal amount" is no longer available. Set each stage's value to its gross profit.
- HubSpot's Google sync does not work with manager (MCC) accounts. Under an MCC you need your own Data Manager API build; we have not tested one under an MCC.
A fixed value has a cost. Value bidding can only learn the value you send, so with one number per stage a $3,000 deal and a $30,000 deal look the same. Two fixes: split the stage into value bands by expected deal size, or build a custom workflow that sends real amounts to the Data Manager API.
One HubSpot community thread reports that click IDs land reliably only when a HubSpot form is submitted on the landing page, so test capture on any other form tool. For the wider trade offs, see our GoHighLevel vs HubSpot comparison.
GoHighLevel sends pipeline stages to Meta natively, but Google needs your own webhook
GoHighLevel to Meta
- In Meta Events Manager, go to Connect Data Sources, choose CRM, and create a new dataset, not your web pixel.
- Workflow one stores the Meta Lead ID on the contact when the lead arrives; HighLevel's walkthrough says to make sure it is mapped.
- Workflow two: trigger Pipeline Stage Changed (fires when a deal moves stage), action Facebook Conversion API, Event Type Lead Event, the pipeline stage as the stage name, and LeadConnector (HighLevel's own CRM name) as the CRM.
- Connect through HighLevel's Ad Manager connection to Meta, or a token (a password style key) plus the Dataset ID.
- Turn on Allow Multiple (lets the same contact run the workflow again at each new stage).
HighLevel's walkthrough asks for at least 250 leads a month and at least 50 events in seven days before the dataset leaves its waiting status. Events can take up to a day to appear. HighLevel counts value only when the stage is named Purchase, so name your closing stage Purchase. The contact also needs real Facebook attribution; the workflow trigger does not create it.
GoHighLevel to Google
The built in Add to Google Ads action fires only on form submissions, order purchases, number pool calls, survey submissions and chat widget events, and HighLevel says it can not be tested. When we read its help page on 20 October 2026, it did not mention the Data Manager API, so we have not verified it after 15 June 2026. For a stage like "Quote sent", build this:
- Make sure the GCLID, GBRAID or WBRAID sits on the contact. CustomerLabs, which sells a fix, reported on 5 August 2026 that funnels, iframes (pages inside other pages) and redirects can drop it.
- Build a workflow on Pipeline Stage Changed with a webhook to Make or n8n.
- Send the stage time, the click ID, the stage name, the deal ID and whether the contact consented.
- Steps 4 and 5 need a developer, or someone fluent in API calls inside Make or n8n. Give them the developer box near the end; the job is one request to the Data Manager API.
- Ask for a dry run with
validateOnly(Google checks the request and records nothing). A clean response means the shape is right.
We have not priced this route, and we found no ready made n8n template. Get two builder quotes against these five steps. The scope to accept: every stage arrives once, with its click ID or hashed backup, failed uploads are logged by reason, and a passing dry run comes first.

Phone calls, WhatsApp and any other CRM need the same three fields
Pipedrive, Salesforce, Zoho or a spreadsheet can feed both platforms if they fire a webhook, or a Zapier or Make trigger, on each stage change. A spreadsheet works only if nobody edits the ID columns by hand.
Phone calls have no form, so no click ID, unless you use tracking numbers such as HighLevel's number pool, which its Google action accepts. For Meta, the CRM integration page says to send "click ID, phone number, or email" when the Lead ID is missing. Record every caller's number in E.164 and send it hashed.
WhatsApp, as of 20 October 2026, is unknown. We found no Meta documentation saying the conversion leads goal covers click to WhatsApp ads, and we have not confirmed whether Meta passes any ID besides the phone number. Run a one week test before you build for it:
- Have reps create a CRM contact for every WhatsApp chat, with the phone number in E.164, and move its stage like any other lead. Without that step the feed carries nothing.
- Send each stage through the standard Conversions API with
business_messaging(Meta's source label for chat events) as the source. - After a week, check Events Manager for errors and compare event counts with your CRM.
Each platform matches the sale to its own click, so one buyer can be counted by both. The feed improves targeting inside each platform; profit per campaign across both has to come from your CRM.
| Column | Where it comes from |
|---|---|
| Spend by campaign | Meta and Google |
| Leads | CRM, by source |
| Qualified stage count | CRM |
| Cost per qualified lead | Spend divided by qualified count |
| Gross profit closed | CRM |
| Platform count of the same stage | Meta and Google, for the gap check |
When the CRM and a platform disagree, report the CRM figure and show the gap beside it.
Source: Contwre reporting template
Test it with one lead, then check the feed every week
- Create one test lead with Meta's Lead Ads testing tool, record the Lead ID, and label the contact as a test.
- Move it through two stages on a dataset no live campaign uses, then point the integration at the live one. Meta documents no setting that keeps a test event out of optimisation; if you must use the live dataset, keep it to one labelled lead.
- In Events Manager, check the event arrived with the right stage name, then check Lead Coverage and Diagnostics.
- On Google, send the upload with
validateOnlyfirst, then for real, and read the diagnostics. - Give a new Google conversion action a few hours before the first upload. If a file shows "still processing", Google says to upload again after 12 hours, and it ties "Conversion date precedes click date" to time zones.
- After 14 days, count each stage in your CRM and in each platform, and chase any gap you can not explain. Nobody publishes a standard pass mark.
The quote is from Meta's Conversions API guide.
After launch, the feed breaks quietly when people stop updating stages; Growth Room's fifth case, below, shows the cost. Give it a named owner, usually whoever owns the CRM, and a ten minute weekly check:
- Stage counts in the CRM against each platform
- The share of new paid leads with a usable key
- Meta's Lead Coverage
- Google offline uploads accepted in the last seven days; zero means a blocked route
- Rejected uploads, by reason
Set one alert in the CRM or in Make: no stage changes for three working days. It fires before Lead Coverage drops.
| Asset | Client owns (our default) | Agency owns |
|---|---|---|
| Meta dataset | Client's Business Manager | Agency's Business Manager |
| Tokens | Issued under the client's login | Issued under the agency's login |
| Workflows | Client's CRM account | Agency's CRM or sub account |
| If the agency leaves | Client keeps everything | Client rebuilds the feed |
Either way, ad spend is paid by the client directly to Meta or Google. We never mark it up.
Source: Contwre build practice
Our client results are in our case studies.
Judge the switch on cost per qualified lead, and check every published gain yourself
When the algorithm starts looking for buyers, it bids for people who cost more to reach. In Growth Room's case 3 below, raw cost per lead rose 23%.
| A, per lead | $20 |
|---|---|
| A, per call | $250 |
| B, per lead | $45 |
| B, per call | $180 |
Run it on your own pair: B wins while its call rate beats B's cost per lead divided by A's cost per call, here $45 divided by $250, or 18%.
Source: Contwre model, illustrative numbers
| Figure | Source | Type | Could we check it? |
|---|---|---|---|
| 16% lower | Meta LATAM newsroom, Nov 2023 | Primary, no sample | Yes |
| 15% lower | HubSpot event listing, 2024 | Secondary | No, the page returned an error |
| 21% lower, instant forms | Make blog, 25 Jun 2026, citing a Meta test of 1,031 advertisers | Secondary | No Meta original found |
| 9.5% lower, website forms | Zapier guide, undated, quoting Meta | Secondary | No Meta original found |
Quality is whatever each advertiser defined, so the figures can not be compared. None is cost per closed deal.
Meta's Latin America newsroom is the only Meta publication here, citing "a recent study" with no sample. Make and Zapier cite Meta for the others. A cheaper quality lead on a campaign that attracts the wrong people is still a bad campaign, so fix the form and the offer first, then measure your own cost per qualified lead before and after.
Growth Room, a Paris agency, published B2B cases on 15 September 2026 from about ten months of optimising on qualified CRM events. It is the agency's own client work, with no control group and no spend figures, so we checked the arithmetic.
| Case | What it reported | Cost per qualified lead or opportunity | Does the arithmetic work? |
|---|---|---|---|
| 1 | 188 qualified of 300 leads, stated as 31% | Not usable | No: 188 of 300 is 63% |
| 2 | Leads down 58%, qualification 21% to 44%, qualified leads down 12% | Cost per qualified lead up 12% | Only if spend fell about 1.5% |
| 3 | Raw cost per lead up 23%, qualified leads 131 to 144 | Cost per qualified lead down 1% | Only if spend rose about 9% |
| 4 | Figures that do not reconcile; not reproduced here | Not usable | No |
| 5 | CRM link broke in Q3 2025, qualification 71% to 16% | Cost per opportunity 47 to 172 euros; 92 after repair, still 96% above 47 | Only if spend fell about 18% or leads rose about 21% |
The agency gave no spend, week counts or opportunity counts per period, so no row can be fully checked.
Source: Growth Room, B2B ads 2026 playbook, 15 Sep 2026; arithmetic checks by Contwre
Cases 1 and 4 fail, and the other three only work with spend changes nobody published. So we use Growth Room to decide what to measure, not as proof that the switch pays.
When some ad sets look worse after the switch, we would not cut them on cost per conversion alone. We believe some do discovery work (our phrase for reaching people who later convert through another ad set), but we have not proven it. Judge at campaign or account level and hold each change for 14 days. To test one ad set, pause it for 14 days and compare the campaign's total qualified leads with the 14 days before.
Questions people ask
What is offline conversion tracking?
It means sending what happens after the click, such as a qualified call, a quote or a signed deal, back to the ad platform, matched to the ad by a click ID or a hashed email and phone. The platform then learns which clicks produced money.
How do you set up Google Ads offline conversion tracking?
Turn on auto tagging, capture the GCLID in a hidden form field, and store it with the lead. Create an import conversion action and upload stages at least daily; since 15 June 2026, API uploads go through the Data Manager API.
How do you capture the click ID on your own website form?
Add hidden fields for the gclid and fbclid, fill them from the landing page URL, and save them to the CRM with the lead. Google's setup guide says to capture the parameter on every page and add a hidden field to each form.
What value should a subscription business send?
The gross profit you expect from that stage: first year contract value, times the share of that stage that closes, times your margin. Use the same formula for every deal, so the platform compares like with like.
Which event should you optimise for?
The lead, until your qualified stage reaches about 50 a week; that is our house rule. Send every CRM stage back in the meantime, so both platforms see the whole path.
Does HubSpot send closed won deals to Meta or Google natively?
No. Its Meta sync triggers on lifecycle stages, HubSpot forms or page views, not deal stages, and its Google sync sends fixed values only.
Will offline conversion tracking lower my cost per lead?
Often not: in one agency case, raw cost per lead rose 23%. Meta's only published figure is a 16% drop in cost per quality lead from a study with no sample, so measure your own cost per qualified lead before and after.
Open your CRM and count how many of last month's paid leads carry a click ID. If you can not find that number in ten minutes, Meta and Google can not find your buyers either.
Bring that number to a call with us, and we will start there.