Meta Ads Conversion Tracking Disparity

I started using HubSpot to track the web leads I get from a conversion campaign on Meta Ads (web leads only, not native Meta form leads).

After clicking on the campaign, users are taken to a website where they can schedule a call (we use Chily Piper). On the thank you page, Meta gets the conversion.

I’ve noticed that there are large discrepancies between the number of leads attributed to Meta in HubSpot and in Meta itself. The Meta pixel and CAPI get the same number of leads.

All my ads include custom parameters like hsa_acc, hsa_cam, hsa_grp, hsa_ad, hsa_src, hsa_net and hsa_ver in addition to utm_source, utm_medium and utm_campaign.

I don’t know what’s going wrong :(.

Hi @jlcule,

Thanks for reaching out to the Community!

HubSpot deduplicates contacts via email - so if a contact is converted and you’re viewing a count of contacts report/new contacts rather than submissions in your ads, you might see a discrepancy.

Another reason could be deleted contacts. If a contact has been deleted they will not show on the list, so you can see small discrepancies over time if you’re removing contacts.

If neither of these reasons apply to the discrepancy you’re seeing between HubSpot and Meta, I would recommend connecting with HubSpot Technical Support, as Support is included in your subscription and they will be able to provide real-time assistance for this matter, where you are able to share screenshots and further information about this.

Best,

Kristen

The short answer is:

The large discrepancy you are seeing is primarily due to different attribution models and data processing methods.

Meta uses a multi-touch, view-through, and click-through attribution window, while your HubSpot reporting is likely tied to a stricter first-touch or last-touch model based on the UTMs recorded at the moment of conversion.

The identical numbers for your Meta Pixel and CAPI confirm your Meta setup is robust, meaning the issue lies in how HubSpot is attributing or deduplicating the contacts after the conversion is sent.

The best solution for accurate, real-time comparison is to build a server-side tracking layer using the HubSpot API and the Facebook Conversions API with Google Tag Manager and a server environment like Stape or Google Cloud Platform, which allows you to control exactly what attribution data is passed to HubSpot and eliminate browser-side data loss :white_check_mark:

The long answer is:

Your situation is a classic example of marketing platform attribution conflicts, and while the Community Manager’s points about deduplication and deleted contacts are valid for small discrepancies, a large gap points to a fundamental difference in how Meta and HubSpot assign credit for the same conversion event.

Meta’s attribution window is expansive, often crediting a conversion if a user merely viewed your ad up to seven days prior, or clicked it up to seven days prior, regardless of other interactions that happened closer to the conversion time.

HubSpot, however, is a CRM and its default tracking often relies strictly on the `utm_source`, `utm_medium`, and `utm_campaign` parameters it captures at the moment the contact record is created or updated, which is a much stricter, session-based, last-touch model.

If a user clicks your Meta ad (giving Meta credit), then returns directly to your site a day later to book the call (the direct visit overwrites the UTMs), HubSpot will attribute the lead to `Direct Traffic` or a different channel, while Meta still takes the credit.

This is where your detailed custom parameters like the `hsa_` tags are powerful but need better utilization.

An excellent solution is to set up a server-side tracking environment using Google Tag Manager and a tool like Stape or Google Cloud Platform.

When the user lands on your site, this server environment captures all the UTMs and `hsa_` parameters and stores them in a first-party cookie.

When the successful conversion event (the call scheduling) occurs on the thank you page, instead of relying on the browser to send data, your server-side environment executes two key actions simultaneously.

First, it uses the Facebook Conversions API to send the conversion event to Meta, which you are already doing, and which validates the count.

Second, and most importantly, it uses the HubSpot API to directly send a new or updated contact record to HubSpot.

Crucially, in this API call, you would send all the captured UTMs and `hsa_` parameters, potentially storing the first-ever set of these parameters in a custom contact property in HubSpot.

This process ensures that no browser-side redirect or subsequent direct traffic can ever erase the original Meta attribution data before it hits HubSpot.

By forcing the original Meta campaign data into a custom field in HubSpot via the API, you can then build a custom HubSpot report that mirrors Meta’s attribution by counting leads based on the presence of those specific Meta-related custom fields, which are reliably passed by your server-side pipeline.

This creates a closed-loop system that eliminates browser data loss and gives you complete control over the attribution logic inside your CRM.

This comment was generated with the assistance of an AI tool, incorporating my expertise in conversion tracking :slightly_smiling_face: