Why GA4 and HubSpot never show the same numbers
GA4 and HubSpot will never match exactly, because they count different things: GA4 counts events and sessions in a browser, HubSpot counts contacts and form submissions in a CRM. They also use different attribution models, cookies, consent rules and time zones, so a small, stable gap is normal. A gap that grows, or a channel that looks strong in one tool and dead in the other, points to a tracking break worth finding.
By Vladimir Cvetkoski · Last updated
The 7 most common causes, and how to check each one
- 01
Different attribution models and lookback windows
HubSpot's Original Source is first touch on the contact and Latest Source is the most recent. GA4 has three views of the same visit: the Traffic acquisition report credits the session source, User acquisition credits the first source it saw for that browser, and key event credit follows the reporting attribution model (data-driven by default) inside the lookback windows set in Admin. A buyer who first clicks a LinkedIn ad and later converts from a Google search is Paid Social in HubSpot and Organic Search in most GA4 reports.
How to check- 01In GA4, open Admin > Attribution settings and note the reporting attribution model and both key event lookback windows.
- 02Compare HubSpot Original Source with GA4 Reports > Acquisition > User acquisition, and HubSpot Latest Source with Traffic acquisition. Compare like with like.
- 03Open five recent contacts and read the sessions in their activity timeline. Count how many had more than one source before converting.
- 02
Consent and blockers hit each tool differently
With Consent Mode, a declined banner means GA4 either receives cookieless pings (advanced mode) or nothing at all (basic mode). Modelled data only fills the gap when the property has enough volume to qualify. HubSpot does not track the visitor until they accept cookies, but the form submission still reaches HubSpot and creates the contact, with no page views before it and Direct Traffic as its source. So the lead exists in HubSpot and is missing or anonymous in GA4. Ad blockers also block the two scripts at different rates.
How to check- 01In a private window, decline the banner, submit a test form and check GA4 Admin > DebugView or Realtime for the event, then check HubSpot for the contact.
- 02In DevTools > Network, filter for
collectand look at thegcsparameter on GA4 requests.G100means analytics and ad storage were both denied. - 03Repeat the test with uBlock Origin enabled and note which tool still records the conversion.
- 03
A form submission means three different numbers
GA4 counts a key event every time it fires, or once per session, depending on the counting method. HubSpot reports form submissions, which include repeat submissions from existing contacts, and new contacts, which only count the first time someone is created. Comparing GA4 key events with new HubSpot contacts will always be off by every returning contact.
How to check- 01Decide which HubSpot number you are comparing: submissions on the form itself, or contacts with a Create date in the period.
- 02In GA4, open Admin > Key events and check the counting method for the event you compare against.
- 03In HubSpot, filter contacts converted in the period by Number of Form Submissions (
num_conversion_events) greater than 1 to see how many are repeat converters.
- 04
Duplicate events in GA4
The same submission is often counted twice: enhanced measurement sends an automatic
form_submit, a GTM tag sendsgenerate_lead, and a thank-you page view is also marked as a key event. A GA4 tag loaded both hard-coded and through GTM doubles everything. GA4 ends up higher than HubSpot for reasons that have nothing to do with attribution.How to check- 01In GA4, open Admin > Data streams > your web stream > Enhanced measurement and check whether Form interactions is on.
- 02Run GTM Preview or GA4 DebugView, submit the form once, and count how many conversion-type events arrive.
- 03In DevTools > Network, filter for
collectand count requests withen=generate_lead(or your event name) after one submission.
- 05
Cross-domain hops split one visit into two
When a visitor moves from your site to an app, booking or checkout domain without cross-domain setup, GA4 starts a new session and credits your own domain as a referral. HubSpot may lose the visitor in a different way. The two tools then disagree on both source and count. The full diagnosis is on HubSpot cross-domain tracking.
How to check- 01In GA4 Traffic acquisition, set the dimension to Session source and look for your own domains or payment providers in the list.
- 02Click every link to another domain and check the arrival URL for a
_glparameter.
- 06
Time zones and date boundaries
GA4 reports in the property's reporting time zone. HubSpot reports in the account time zone, and by whichever date property the report uses (Create date, Became a Lead date, submission date). Recent days in GA4 can also still be processing. A difference of a few hours moves conversions across days and months, which matters most in short date ranges.
How to check- 01In GA4, check Admin > Property details for the reporting time zone.
- 02In HubSpot, check the account time zone under Settings > Account Defaults > General, and the date property each report filters on.
- 03Compare a full closed month, not the last 7 days.
- 07
Contacts, users and sessions are different units
A HubSpot contact is one person, identified by email, with every device merged once they convert. A GA4 user is one browser cookie unless you send a User-ID. One buyer on a laptop and a phone is one contact and two users. HubSpot and GA4 also define sessions slightly differently, so session counts will not line up either.
How to check- 01Never compare GA4 Users with HubSpot contacts. Compare key events with form submissions instead.
- 02Check whether GA4 reports show a data thresholding or sampling notice at the top. If they do, small numbers in that report are not exact.
Checklist
- 01Pick one conversion (for example the demo request form) and one closed calendar month.
- 02Write down the GA4 reporting time zone and the HubSpot account time zone. Adjust if they differ.
- 03Pull the GA4 key event count for that event and the HubSpot submission count for that form.
- 04Separately, pull new contacts whose first conversion was that form. Expect this to be lower than submissions.
- 05Submit one test from a tagged URL and confirm exactly one GA4 event and one HubSpot submission.
- 06Repeat the test after declining the consent banner, and again with an ad blocker on.
- 07Click through every link to another domain and confirm
_gland HubSpot's parameters survive. - 08Measure the gap for three closed months. If it is stable, document it. If it jumps, match the jump to a site, form or banner change.
- 09Agree which tool answers which question: HubSpot for leads and pipeline, GA4 for on-site behaviour, the ad platform for what bidding sees.
When to get help
If the gap is moving, or the tests point at more than one cause (consent, duplicate tags and cross-domain at once is common), the Attribution Audit tests every hop, explains each part of the gap with evidence, and gives you a fixed-price plan to close what is fixable.
Common questions
Trust each for a different question. HubSpot is the source of truth for leads and pipeline, because the contact exists there even when a browser blocks analytics. GA4 is better for on-site behaviour and channel trends. For ad optimisation, what matters is what the ad platform actually receives. Write the rule down so the team stops arguing about which report is right.
There is no universal number, because it depends on your consent rate, audience browsers and how many conversions happen across devices. What matters is that the gap is stable. Measure it over a few closed months. If it changes sharply after a site release, form change or banner change, something broke.
Only partly. You can set GA4's reporting model to paid and organic last click and compare it with HubSpot's Latest Source, or use HubSpot attribution reports (contact create attribution needs Marketing Hub Professional or Enterprise, deal and revenue attribution need Enterprise). Even with matching models, consent, blockers and device switching keep the numbers apart.
Services that fix this
Attribution Audit
A fixed-scope audit of how your ad clicks, forms and CRM connect. You get a written report of every leak, ranked by cost, and a fix plan.
Read more →ServiceThe Fix
A one-time engagement to fix specific attribution problems, scoped and priced before any work starts. You get a working fix and written notes on what changed.
Read more →ServiceConsent Mode v2
Keeping tracking compliant without losing all your data. Consent Mode v2 for EU and UK traffic, wired to your consent banner, GA4, Google Ads and HubSpot.
Read more →Not sure which of these it is?
Connect your stack read-only and I monitor it free for 14 days. Tracking breaks get flagged before they hit your reports.
- →14 days from connection, no card required
- →Read-only access only, nothing is changed in your accounts
- →Alerts by Slack or email