
"Why does Google Ads say 42 conversions but GA4 only shows 27?"
That's the question we get more than almost any other when we onboard a new paid ads client at Vixi. It usually comes in one of two flavors: either the client is worried Google Ads is lying to them, or they're worried GA4 is broken. In our experience running 50+ campaigns for businesses across Dallas-Fort Worth and nationally, the answer is almost always neither.
These tools weren't built to agree. They were built to measure different things. The moment you understand that—and adjust your setup accordingly—the number confusion goes away and you start making better decisions with your budget.
Here's exactly where the breakdown happens, why it's by design, and the specific fixes we implement for every Vixi client on day one.
They're Measuring Different Things (By Design)
The most important thing to understand before troubleshooting any discrepancy: Google Ads and GA4 have fundamentally different jobs.
Google Ads is an ad attribution platform. Its entire purpose is to connect your ad spend to outcomes. It tracks clicks, impressions, and conversions that can be traced back to an ad interaction. It will credit itself with a conversion as long as that conversion happened within the configured attribution window after a click or view.
GA4 is a behavior analytics platform. It tracks what users do on your site or app across sessions, channels, and devices. It assigns credit to the channel responsible for a conversion based on the session—not the ad click.
The downstream effect of this difference is significant. Consider a real scenario we see constantly in DFW service businesses:
- User clicks your Google search ad on Tuesday
- Bounces without converting
- Returns on Friday via a direct bookmark and submits a contact form
Google Ads: Conversion attributed to the Tuesday click (it happened within the 30-day window).
GA4: Conversion attributed to "direct" (the Friday session is what triggered the event).
That's one conversion, two platforms, two different stories. Neither is wrong. They're just answering different questions.
The problem comes when business owners compare these numbers directly and try to make budget decisions based on the "gap."
Attribution Models: The Hidden Setting That Changes Everything
Here's the setting most people never look at: attribution model configuration.
Google Ads defaulted to data-driven attribution in 2021. This model uses machine learning to distribute conversion credit across all touchpoints in the path—not just the last click. If a user saw a display ad, then clicked a search ad, then converted, data-driven attribution might give 30% credit to the display ad and 70% to the search ad.
GA4 uses last non-direct click as its default attribution model for acquisition reports (though you can change this under Admin → Attribution Settings). Under this model, the Google Ads click gets 100% credit if it was the last non-direct touch before conversion.
When these don't match, the reported numbers diverge—sometimes significantly.
Here's what that looks like in practice across 100 hypothetical conversions:
| Attribution Model | Google Ads Reported | GA4 Reported | |---|---|---| | Both on Last Click | 85 | 85 | | Google Ads: Data-Driven, GA4: Last Click | 78 | 85 | | Both on Data-Driven | 78 | 71 |
The fix is straightforward: align both platforms to the same attribution model. At Vixi, we align GA4's attribution model with Google Ads (both on data-driven) and document it in the client's measurement plan so everyone on the team knows which number to reference for which decision.
To change GA4: Admin → Attribution Settings → Reporting attribution model → Data-Driven.
Conversion Windows: When "30 Days" Isn't the Same 30 Days
Another major source of discrepancy that almost nobody catches until they're already confused: conversion windows behave differently across platforms.
In Google Ads, the default conversion window is 30 days for click-through conversions and 1 day for view-through conversions. This means a click from May 1st can generate a conversion that shows up in your May report even if the user didn't convert until May 30th.
GA4 doesn't have a "conversion window" in the same sense. It records events as they happen in the session. There's no look-back mechanism tying today's event to a click from three weeks ago.
This creates a specific mismatch when you're comparing month-over-month performance. Your Google Ads "May conversions" include conversions from April clicks that converted in May. Your GA4 "May conversions" only include events that happened in May sessions.
We've seen this cause a 12-18% over-count in Google Ads relative to GA4 for clients running evergreen search campaigns with long sales cycles—especially B2B clients in professional services where someone might research for weeks before calling.
The fix: When running comparative reports, pull Google Ads data using Conversion Date (not Click Date) as the date dimension. In the Google Ads reporting interface: Segment → Time → Conversion Date. This aligns the timing to match what GA4 records.
UTM Tagging Failures: How Incomplete Tags Break GA4 Attribution
Every "(not set)" you see in GA4's Source/Medium report represents a conversion that can't be attributed—often an ad click that's flying blind.
This happens more than you'd think. Common culprits we find when we audit new client accounts in Dallas:
1. Auto-tagging conflicts with manual UTM parameters
If you're using Google's auto-tagging (gclid) AND manually adding UTM parameters to your ad URLs, they can conflict. GA4 prefers gclid when both are present—but if you've manually tagged with utm_source=google and the gclid gets stripped by a redirect, GA4 falls back to the manual tag and may miscategorize the session.
2. Redirect chains stripping gclid
If your ad destination URL redirects through an intermediate URL before reaching the landing page, the gclid parameter is often dropped during the redirect. GA4 never sees it. Traffic shows up as direct.
This is extremely common when clients use:
- Bitly or other URL shorteners in ads
- Marketing automation landing page platforms with their own redirects
- WordPress with certain redirect plugins
3. Inconsistent campaign naming across ad accounts
When UTM parameters include special characters (&, +, spaces) in campaign names, GA4 can misparse the parameter string and assign traffic to the wrong campaign—or drop attribution entirely.
The UTM structure we enforce for all Vixi clients:
utm_source=google
utm_medium=cpc
utm_campaign=brand-search-dallas
utm_content=responsive-search-ad-v2
utm_term={keyword}
Rules: lowercase only, hyphens not underscores in campaign names, no special characters, consistent naming taxonomy across all ad types.
To audit your UTM coverage: In GA4, go to Reports → Acquisition → Traffic Acquisition. Filter by Session Source/Medium. Any rows showing "(not set)" represent untagged or broken traffic. Sort by conversions descending to triage by impact.
At Vixi, we require zero "(not set)" in source/medium before we call any campaign reporting reliable.
Cross-Device Attribution: The 20% Gap Nobody Talks About
Here's a number that surprises clients: in our experience running campaigns for Dallas-area service businesses, roughly 15-25% of conversions that GA4 attributes to "direct" traffic are actually users who clicked a Google ad on mobile and converted on desktop.
This happens because GA4's cross-device stitching requires either a User ID (users must be logged in to your site) or Google Signals (requires consent banner and signed-in Google users). Most small business websites have neither configured properly.
Google Ads handles cross-device attribution natively through signed-in Google accounts—it knows if the same Google account clicked your ad on mobile and later converted on desktop. GA4 doesn't have this visibility unless you've set it up.
The practical result: Google Ads counts the conversion. GA4 misses the attribution and assigns it to direct.
Three fixes, in order of impact:
-
Enable Enhanced Conversions in Google Ads (highest impact): This hashes first-party data (email, phone) at conversion time and matches it to signed-in Google accounts. Go to Google Ads → Tools → Conversions → select conversion action → Enhanced Conversions → enable.
-
Enable Google Signals in GA4: Admin → Data Settings → Data Collection → Google Signals Data Collection → Enable. Requires a consent banner in place if you have EU traffic.
-
Implement User ID tracking: If users log in to your site (accounts, portals, gated content), pass a consistent hashed User ID to GA4 via the config command. This is the most accurate cross-device solution for e-commerce and SaaS—overkill for most local service businesses.
The Triple Mismatch: When CRM Enters the Picture
So you've got Google Ads saying 42 conversions, GA4 saying 27, and your CRM showing 31 closed deals. Which one is right?
All three. They're just counting different things.
Here's how we define each metric for clients:
| Platform | What It's Counting | |---|---| | Google Ads | Ad-attributed events within the conversion window (includes micro-conversions, test fills, duplicate submissions) | | GA4 | Session events that triggered a conversion action (de-duplicated by session, includes cross-channel) | | CRM | Human-qualified leads that a sales person acted on |
These numbers will never perfectly align. And they shouldn't have to. The mistake is trying to make them match instead of understanding what each one tells you.
What does matter: making sure the CRM data gets back into Google Ads so the algorithm optimizes for real outcomes, not just form submissions.
Offline conversion import is the most underused tool in paid search. Here's how it works: when a lead closes in your CRM, you export the original gclid (stored at form submission), the conversion name, the time, and optionally the deal value. You import this back into Google Ads. The algorithm now knows which clicks generated real customers—not just form fills—and adjusts bidding accordingly.
The CSV format:
Google Click ID,Conversion Name,Conversion Time,Conversion Value,Currency Code
Cj0KCAjw_abc123xyz,Qualified Lead - Closed Won,2026-05-10 14:30:00+00:00,2500,USD
Cj0KCAjw_def456uvw,Qualified Lead - Closed Won,2026-05-11 09:15:00+00:00,1800,USD
To capture gclid at form submission, you need a hidden field in your form that's populated by JavaScript reading the gclid URL parameter on landing page load. Most CRMs (HubSpot, GoHighLevel, Salesforce) support this natively.
We've seen clients cut their cost per actual customer by 30-40% after implementing offline conversion import—because Google stops optimizing for people who fill out forms and ghost you, and starts optimizing for people who actually buy.
The Vixi Day-One Measurement Checklist
When we take on a new paid ads client—whether they're a law firm in Plano, a roofing company in McKinney, or a SaaS company running national campaigns—we run through this checklist before we touch a single bid or ad creative:
Account Linking
- [ ] Google Ads account linked to GA4 property (Admin → Google Ads Links)
- [ ] Google Ads conversion actions imported into GA4 as key events
- [ ] Bidding set against Google Ads conversion actions (not GA4 goals)
Attribution Alignment
- [ ] Both Google Ads and GA4 set to data-driven attribution
- [ ] Attribution window documented in measurement plan (we default to 30-day click / 1-day view)
- [ ] Comparison reports use Conversion Date, not Click Date
UTM Hygiene
- [ ] All ad URLs include correct utm_source, utm_medium, utm_campaign
- [ ] Auto-tagging enabled (Account Settings → Auto-tagging)
- [ ] No redirects stripping gclid — verified with a test click
- [ ] GA4 Traffic Acquisition report shows zero "(not set)" in source/medium
Cross-Device & Enhanced Data
- [ ] Enhanced Conversions enabled for all primary conversion actions
- [ ] Google Signals enabled with consent banner in place
- [ ] User ID tracking enabled if site has authenticated users
CRM Integration
- [ ] Hidden gclid field on all lead gen forms
- [ ] CRM configured to capture and store gclid at submission
- [ ] Offline conversion import process documented (weekly or triggered at deal close)
Reporting
- [ ] Looker Studio dashboard showing Google Ads, GA4, and CRM side-by-side
- [ ] Single "source of truth" metric agreed upon for each decision type
- [ ] Team educated on why numbers differ and which platform to reference for what
The last point matters as much as the technical setup. If your marketing team is pulling Google Ads data to report ROAS to the CEO, while your ops team is using CRM data to track lead quality, you're going to have arguments that data can't resolve. Define upfront which number answers which question—and document it.
The Number That Actually Matters
After all of this—attribution models, conversion windows, UTM tags, cross-device matching—here's what we've learned from 50+ campaigns in the DFW market and beyond:
The number that matters most isn't the one in Google Ads or GA4. It's the revenue per customer that can be traced back to a specific campaign, ad group, or keyword. Everything else is directional.
When you close the loop between your CRM and Google Ads via offline conversion import, and you're consistent about what you're measuring and why, the platform-to-platform gap stops mattering. You know which campaigns generate customers. You know which keywords generate deals. You optimize accordingly.
The businesses that win in paid search aren't the ones with the most sophisticated attribution setup—they're the ones with enough clarity to act on what the data is telling them.
If you're staring at mismatched numbers across your paid ads stack and aren't sure which one to trust—or you suspect your current setup is leaving optimization opportunities on the table—we're happy to take a look.
At Vixi, we audit the measurement setup before we touch any campaign spend. It's the most consistently undervalued part of paid advertising, and it's where we find the most leverage for new clients.
Book a free audit call — we'll walk through your Google Ads account, GA4 setup, and CRM integration and tell you exactly what's causing your attribution gap.