Attribution · Sprites diagnoses this

HubSpot vs Meta Ads: why the leads don't add up

Meta counts every lead form submit and every pixel lead it can attribute, including after a view or an engagement. HubSpot keeps one contact per person and files them under the first source it saw, and lead form contacts only arrive if the sync is set up. Unsynced lead forms and first-touch source explain most of the gap.

$1 today. Cancel anytime before day 7.

What Sprites checks

  • ✓Meta leads210 in 30 days
  • ?HubSpot Paid Social contacts124 in 30 days
  • !Lead form sync1 of 3 forms connected
  • ?Duplicate contacts17 leads already in CRM
Illustration of a typical broken account. Your own readout comes from your account.

Why it happens

Lead forms not synced

  1. Lead forms not synced

    Meta instant form leads only reach HubSpot when that form is connected in HubSpot. A new form launched without the connection collects leads HubSpot never sees.

  2. Existing contacts

    A lead who is already in HubSpot keeps their original source. Meta counts a new lead; HubSpot adds activity to an old contact.

  3. View and engage credit

    For website leads Meta credits people who saw or engaged with an ad in the last day. HubSpot has no record of that view and files them by the visit it tracked.

  4. Missing UTMs on website ads

    Website traffic from Meta without URL parameters lands as Social Media or Direct Traffic in HubSpot, not Paid Social. See UTM parameters stripped.

How to line them up, step by step

  1. Connect every lead form

    In HubSpot go to Marketing, Ads, open the Meta account and check Lead syncing lists every active lead form as connected.

  2. Count new vs existing contacts

    Build a HubSpot contacts report for the same 30 days on Create date, broken down by Original Source, and a second one on Recent conversion to catch existing contacts.

  3. Compare click-only

    In Ads Manager use Compare attribution settings and add 7-day click. Compare that with HubSpot Paid Social contacts.

  4. Tag website ads

    Set URL parameters on every Meta ad that sends traffic to your site, with a paid utm_medium so HubSpot files it as Paid Social.

Steps checked against HubSpot Knowledge Base: Sync leads from Facebook lead ads; HubSpot Knowledge Base: Understand the original source and latest source properties; Meta Business Help Center: About attribution settings.

Sprites diagnoses this

Sprites diagnoses it

Sprites lines up your HubSpot contacts and Meta leads and shows where they split.

What Sprites does

  • Reads HubSpot contacts, deals and lifecycle stages by source for any date window, read-only.
  • Pulls Meta leads and cost per lead per campaign on the same basis as Ads Manager.
  • Follows Meta leads into the pipeline, to MQL, SQL and closed deals, so campaigns are judged on revenue.

What it doesn't do

  • It does not connect lead forms or write anything to HubSpot.
  • It does not send HubSpot stages back to Meta.

Questions

Why are my Facebook leads not showing up in HubSpot?

The lead form is not synced, or the person was already a contact and HubSpot added the submission to their record instead of creating a new one.

Why does HubSpot file Meta leads as Social Media instead of Paid Social?

The visit had no paid UTM. HubSpot read the facebook.com referrer and filed it as organic social.

Which number should I trust for Meta?

HubSpot for pipeline and revenue. Meta for optimizing inside Meta. Judge campaigns on cost per SQL, not cost per lead.

Do Meta lead form leads have a gclid or UTMs?

No. Instant form leads never visit your site, so HubSpot sources them from the sync, not from tracking parameters.

See where it breaks

Connect your accounts. Sprites reads them side by side and shows you exactly where the numbers split.