Offline conversions and enhanced conversions explained
How Google Ads and Meta accept sales and leads that happen off your website, how hashed email matching works, and the rules that make uploads fail.
On this page
An offline conversion is a result that happens away from the web page where the ad click landed: a signed contract in a CRM, a phone order, a sale in a store, a subscription that renews. The ad platform never sees it unless you tell it. Uploading these results is how a business teaches ad bidding what a customer looks like, instead of what a form fill looks like.
This guide explains the two ways platforms match an offline result to an ad, how Google and Meta take them today, and what makes an upload fail.
Two ways to match a result to an ad
By click id. The ad click carries an identifier, such as Google's gclid or Meta's fbclid. You save it when the visitor lands, keep it with the lead or order, and send it back with the result. The platform knows exactly which click it was. See click ids explained.
By hashed contact details. You send the customer's email or phone, normalized and hashed with SHA-256. The platform hashes the details of its own signed-in users the same way and looks for a match. No click id needed, but only people signed in to that platform can match.
Most setups send both when they have them. The click id is precise; the hashed email catches people whose click id was lost, such as a lead who clicked on a phone and bought on a laptop.
Either way, the platform credits the result with its own model and window, which is why its count can differ from yours. See attribution models explained.
Normalize before you hash
A hash of Ann@Example.com and a hash of ann@example.com share nothing. Every platform asks for normalized values before hashing:
| Value | Normalize to | Notes |
|---|---|---|
| Trimmed, lowercase | Google also asks to drop dots before the @ for gmail.com and googlemail.com (Google) | |
| Phone | Country code and digits | Google wants E.164 with a plus (+14155550123); Meta wants digits only, with the country code (Meta) |
Never hash a value twice, and never hash a click id.
Google Ads
Google has three related tools.
Offline conversion import with the click id. You store the gclid with each lead and upload it later with the conversion name, time and value. It needs auto-tagging, a hidden form field or similar to keep the gclid, and the exact value, since it is case sensitive (Google).
Enhanced conversions for web. When a visitor converts on your site, the Google tag also sends hashed first-party data such as the email they typed. Google matches it to Google accounts that were signed in when they engaged with your ads (Google). This improves online conversions; nothing is uploaded later.
Enhanced conversions for leads. The site sends hashed lead details when the form is sent. When the lead converts, you upload the same hashed details, plus the gclid if you have it. Google calls it an upgraded version of offline conversion import (Google).
Two dates and limits to know:
- The conversion window. An upload is credited only if the click falls inside the action's window, 30 days by default and up to 90 (Google).
- The Data Manager API. From June 15, 2026, Google blocks offline conversion and enhanced conversions for leads uploads in the Google Ads API, except for developer tokens that already sent requests between January and June 2026. New integrations use the Data Manager API (Google).
Meta
Meta takes offline results through the same Conversions API as website events. Its older, separate Offline Conversions API is now a legacy interface (Meta).
- In-store and offline sales go with
action_sourceset tophysical_store. Meta asks for those within 62 days of the sale (Meta). - Other server events, such as a phone order sent as it happens, follow the general rule:
event_timeno more than 7 days in the past, or Meta rejects the whole request (Meta). - CRM lead stages for leads from Meta's own lead forms go through the Conversions API for CRM. It is built for Instant Forms and works best with the Meta lead id stored in your CRM (Meta). Leads from your website do not use it.
The matching keys are the same as for website events: hashed email and phone, fbc built from the fbclid, and your own customer id. The Meta Conversions API guide covers them field by field.
A worked example
Example numbers, made up for illustration. A kitchen fitter gets 60 leads a month from Google Ads and signs 8 jobs.
- Each form saves the
gclidand the email with the lead in the CRM. - When a job is signed, the CRM's export holds 8 rows:
gclid, hashed email, conversion nameSigned job, the signing time, and the job value. - 6 rows carry a
gclid; 2 leads came back from a bookmark weeks later and only have the email. - Google matches all 6 click ids. Of the 2 email-only rows, it matches the ones whose owners were signed in to Google when they clicked, and only if the clicks fall inside the window.
Without the upload, Google sees 60 equal form fills. With it, Google sees which 8 searches turned into signed jobs.
Why uploads fail
- The click is older than the window. Set the window to fit your sales cycle before uploading.
- The click id was changed. Lowercased, trimmed or cut off by a database column.
- Wrong time zone or format. Google wants the conversion time with its time zone; a missing zone shifts the time.
- Hashed without normalizing. One capital letter breaks a match.
- Customer data terms not accepted. Google needs these accepted in the account before hashed data can be used.
- Consent. Where the law requires consent for ad measurement, uploading a person who declined is still ad measurement.
What Sporetag sends today
What works today, on paid plans: leads and sales go from Sporetag's server to the Meta Conversions API, and to TikTok, Pinterest, Snapchat and Reddit, with click ids and hashed email and phone normalized the way each platform asks. In 90-day tracking, click ids are kept for 90 days, so a sale days after the click still names it.
What is built and not yet live: the Google Ads upload (when shipped). It sends offline click conversions, enhanced conversions for leads, and deals won in HubSpot or GoHighLevel as a secondary "Sporetag closed deal" action. It waits on Google's approval of Sporetag's API access. Microsoft Ads and LinkedIn uploads are in the same state (when shipped). Won CRM deals are never sent to Meta, because they are not website purchases.
Common questions
What is an offline conversion?
A result that happens away from the page where the ad click landed, such as a signed contract, a phone order or a store sale, sent back to the ad platform later so it can credit the ad.
What is the difference between enhanced conversions and offline conversion import?
Enhanced conversions for web add hashed customer details to conversions that happen on your site. Offline conversion import sends results that happen later, matched by click id. Enhanced conversions for leads combines them: hashed details when the lead is made, and again when it converts.
Is uploading hashed emails allowed under GDPR?
Hashing does not make the data anonymous. You need a lawful basis, usually consent in the EU and UK for ad measurement, and your privacy notice must name the sharing.
How long do I have to upload an offline conversion?
For Google, the click must fall inside the conversion action's window, up to 90 days. For Meta, offline store sales should be sent within 62 days, and other server events within 7 days of the event.
Sources
- Google Ads Help: About enhanced conversions, About enhanced conversions for leads, Set up offline conversions using GCLID, About conversion windows. Checked October 2026.
- Meta for Developers: Sending offline events using the Conversions API, Server event parameters, Customer information parameters, Conversions API for CRM integration. Checked October 2026.
Spotted something wrong or out of date? Email hello@sporetag.com and we will fix it.