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 
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 