Meta Ads reporting
Connecting Meta Ads to your CRM: the path from click to deal
The plumbing that makes the ad show up inside the CRM: what has to travel with the lead, where it gets lost, and how to test before trusting the report.
Also available in: Português · Español
Between the click on an ad and the deal in your CRM sit four or five systems, and the origin data has to cross all of them without falling through. When it falls through — and it often does — the lead arrives, the rep follows up, the sale happens, and nobody can say where it came from.
This article walks the whole path, points at the exact places data gets lost, and shows how to test. It is the plumbing that real cost per sale assumes: without it, that calculation has no denominator.
What has to travel with the lead
Origin is a handful of fields born in the ad that have to arrive intact in the CRM record:
| Field | What it holds | Why it matters |
|---|---|---|
utm_source | the platform | separates paid from organic |
utm_medium | the media type | separates paid social from search |
utm_campaign | the campaign | the level where budget is decided |
utm_content | the creative | the level where the piece is swapped |
utm_term | the ad set | where the audience lives |
Almost everyone has the first three. The fourth is what most operations are missing — and it is exactly what lets you answer which piece sold, not just which campaign spent.
The caution from the guide to UTM parameters for ads applies: when you use macros, the name in the platform is the UTM. Messy naming becomes a messy report, with no retroactive fix.
The path, step by step
1. From the ad to the URL
Use macros, not hand-built links. Meta's URL parameters field accepts {{campaign.name}}, {{adset.name}} and {{ad.name}}, filled in at delivery.
Hand-built links are the number one cause of leads with no origin: someone duplicates an ad, swaps the creative and forgets to update utm_content. A macro never forgets.
2. From the URL to the page
More data disappears here than anywhere else, for three reasons:
- Redirects that drop the query string. Shorteners, link-in-bio tools, a domain that redirects to
www— any of them can swallow the parameters. - A page that ignores what it received. The site loads, shows its content, and discards the query string without storing anything.
- A form inside an iframe. The sneakiest: the page receives the parameters, the form lives in an iframe on another domain, and the iframe cannot see the parent page's URL. It has to be passed through explicitly.
3. From the page to the form
Origin fields have to exist on the form, even hidden, and be populated by script on load. If the form has five visible fields and no hidden ones, origin does not travel.
4. From the form to the CRM
Hidden fields need a destination in the CRM. If there is no field for utm_content, the data arrives and is silently dropped — the integration works, the lead comes in, and the field simply does not exist on the other side.
The native lead form case
Meta's instant forms convert better because they never take the person out of the app. They track worse, because there is no URL to carry parameters.
Three ways around it:
Hidden fields in the form itself. Meta supports fields populated by parameter in native forms. The cleanest path when it is available.
An integration that carries the ad identifiers. Meta's lead API returns ad_id, adset_id and campaign_id alongside the lead. Not UTMs, but a more precise identification of origin — as long as the CRM stores them.
One form per campaign. Crude and effective for small operations: each campaign uses its own form, and the form's name identifies the origin.
How to test before trusting
The test takes five minutes and prevents a month of wrong reporting:
- Open the ad on a phone, as a real user would — not through the ad manager preview, which does not carry parameters.
- Submit the form with a name you will recognize later.
- Open the record in the CRM and check field by field: source, medium, campaign, content, term.
- Repeat for every distinct path your operation has — landing page, native form, link in bio.
If a field arrives empty, the problem is in the step before it. An empty utm_content with a filled utm_campaign almost always means a hand-built link missing the creative macro.
Measure coverage, not just the test
The test proves one path works. Coverage proves the whole operation works.
coverage = paid leads with recorded origin ÷ total paid leads
Run it weekly, against real traffic. Below 70%, any conclusion about creatives is a half-truth. And the denominator is paid traffic only: a referral has no UTM and is not a tracking failure — counting it sinks coverage forever and jams the indicator.
The four mistakes that show up most
Overwriting origin on the last touch. Someone arrives from the ad, disappears for a week, comes back typing your address, and the system records "direct". Keep the first visit and never replace it — that is the one that did the work.
An origin field the rep can edit. If it is editable, someone will type "referral" on half the deals. Keep it automatic and locked.
Deals recreated, losing origin. In CRMs where a new opportunity means a new deal, origin stays on the first and vanishes from the rest. Stamp it on the contact, not only the deal.
Trusting the report before checking coverage. The most expensive of the four: setting budgets at 40% coverage while believing you are looking at reality.
Where to start
If you are building from scratch, in this order:
- Standardize campaign names before anything else. The name becomes the UTM; a bad name has no retroactive fix.
- Put the macro at account level, not ad by ad. Once, and it applies to everything created afterwards.
- Create the fields in the CRM before sending data there.
- Run the end-to-end test described above.
- Only then build reporting on top.
Invert the order and you get a beautiful dashboard over data that does not exist. For what to do once the plumbing works, see revenue by creative; and if the CRM numbers do not match the ad manager, the piece on when the CRM and the ad manager disagree covers the legitimate reasons for the gap.
Frequently asked questions
Do I need a native Meta-to-CRM integration?
No. What has to travel is the origin alongside the lead, and that happens through URL parameters or the lead form. A ready-made integration saves work but is not a requirement.
Native lead form or my own landing page — which tracks better?
Your own page tracks better, because you control the parameters and what gets stored. The native form converts better but needs an integration to pass origin through, otherwise leads arrive blank.
How do I know the connection works?
Submit a test lead through the live ad and open the record in your CRM. If the origin fields are empty it is broken — and no report built on top of it is worth anything.
Can I fix old leads that arrived with no origin?
Usually not, and guessing is worse than admitting it. Treat the fix as a milestone: from the day tracking started working the number is trustworthy, before it is not.