What you'll learn in this article
- How I handle the google ads ga4 campaign click tracking setup so the link actually carries data
- What I import from GA4 as key events and what I deliberately keep as native Google Ads conversions
- Why double counting is the error I see most, and the one setting that prevents it
- The clean primary/secondary structure I standardize on every account
The mistake I inherit most often isn't a broken tag. It's an account where GA4 and Google Ads are both counting the same purchase, the "Conversions" column is inflated by roughly double, and Smart Bidding has been chasing a number that was never real. Nobody set out to do that. It happens because linking GA4 to Google Ads is a single toggle, and everything that decides whether your numbers are trustworthy happens after that toggle, in choices most people never make on purpose. I've opened accounts where the reported figure was twice the truth for months, and the person running it had no idea, because nothing on the screen looked wrong.
So this is not a click-the-buttons walkthrough. My angle is the setup I actually run: how I link the two properties, what I pull in from GA4, what I keep native inside Google Ads, and how I structure the whole thing so nothing gets counted twice. If you want the mechanics of the tag itself, I cover that in the pillar on how conversion tracking works in Google Ads. Here I'm assuming you already understand what a conversion goal is, and we're deciding where each one should live, because that placement is the difference between clean numbers and a slow, invisible corruption of everything the algorithm optimizes on.
The reason this matters beyond tidiness: the whole point of connecting the two platforms is to measure the effectiveness of your spend against real outcomes, not clicks. If the conversion count is wrong, every downstream decision, budget, bids, which campaigns you scale, is wrong too, and confidently so. A doubled number feels like success right up until you realize you've been paying for the same sale twice in the ledger the machine reads.
How I link the two properties
The link is the plumbing. Before any google ads ga4 campaign click tracking setup can work, two things have to be true: the GA4 property and the ads account are linked, and auto-tagging is on. Auto-tagging is what appends the GCLID to your ad clicks, and that identifier is the entire reason GA4 can attribute a session back to a specific campaign. Turn it off and the whole chain silently degrades to "google / organic" attribution guesswork, which looks like data but tells you nothing about which ad did the work.
I do the linking from the Google Ads side under Admin, then confirm it from the GA4 side so I know both directions agree. Access trips people up here: you need at least a Marketer role in GA4 and admin access on the Google Ads account, or the import options simply won't appear and you'll assume the feature is missing. When someone tells me "I don't see the import screen," the cause is almost always permissions, not a bug. I also check that I'm in the right ga4 account before I touch anything, because linking the wrong property to a client's ads is a mistake that's quiet until the numbers make no sense a week later.
The GCLID is fragile, protect it
The link can look perfect and still leak. If your site alters or drops the GCLID, on a redirect, a consent wrapper, or a URL rewrite, GA4 can't tie the session to the click and the conversion never makes it back. I've traced "the import stopped working" complaints to exactly this more than once. This is the same discipline I apply to the tracking template: the parameter that carries the identity has to survive the whole trip, or nothing downstream is accurate. The identifier is what links user interactions on the site back to the ad that paid for them, and once it's gone there's no reconstructing the connection after the fact.
Verify the link before you build on it
I never assume a fresh link is carrying data. On a live page I run google tag assistant to confirm the Google tag actually loads and the GCLID is present in the request, and I watch that the right tag fires on the pages that matter, not just the homepage. On a wordpress site this is where things quietly break, because a plugin or a cache layer can strip or defer the tag so it never records the click. Confirming the tag on the real template, with the real consent banner in play, saves me from building a whole measurement structure on a foundation that isn't there.
What I import from GA4 and what I keep native
This is the decision that defines the account. Google Ads conversion tracking analytics gives you two overlapping sources: native conversions fired by the Google Ads tag, and GA4 conversions imported from key events. You're allowed to run both at once, and that flexibility is exactly what causes the mess. My rule is that a single conversion goal should have one source of truth, never two. Everything in the sections below is really just working out, action by action, which of the two owns it.
What I import from GA4
I pull in things GA4 sees better than a raw tag: cross-device and cross-session behavior, engaged actions defined once in GA4, and events where I want a single definition shared across analytics and ads. To import an event it has to be marked as a key event in GA4 first, that's the gate, and event names must match exactly if you're ever reconciling them later. The conversion data lands in Google Ads up to 24 hours after it happens, so I don't panic when a same-day import looks empty; that lag is expected, not a failure.
The upside of importing is that GA4 already models the messy reality of real journeys, someone clicks on mobile, converts on desktop days later, and the raw tag would miss the connection. GA4's session and identity stitching captures more of that, which is why importing tends to reflect the true path better than a single-page tag. When I care about the full-funnel picture, the events I've built inside analytics are the ones I want feeding the account, so they carry that richer context with them.
What I keep native in Google Ads
For the bottom-of-funnel action I bid on, especially anything where I want view-through conversions, I keep it native. You don't get view-through conversions on imported GA4 conversions, because that measurement needs the Google Ads tag directly. Native also fires faster and filters invalid clicks on the Google Ads side. So the honest split is: GA4 for the richer, cross-channel picture; native for the fast, biddable signal that feeds automation cleanly. Those native signals are also what I lean on when I set up conversion tracking through Google Tag Manager for a specific high-value action.
There's a speed argument too. Native conversions surface in Google Ads faster than the imported ones, and when I'm tracking conversions on a campaign that's still in its learning phase, that latency difference is the gap between reacting today and reacting three days late. For the core purchase or lead I'm optimizing toward, I want the freshest, cleanest version of that signal, and that's the native tag, sitting as close to the action as possible with nothing in between to delay or distort it.
Why double counting is the error I see most
Here's the trap in one sentence: import a GA4 purchase key event and leave the native purchase tag on the same page as a primary conversion, and Google Ads counts the sale twice. Both fire, both get marked biddable, and your "Conversions" column doubles for that action. Smart Bidding then optimizes toward a phantom, spending more to hit a target that's built on air. It's the single most common thing I fix, and it's almost never done deliberately, it's the result of two well-meaning setups layered on top of each other by different people at different times.
The fix is the action optimization setting, primary versus secondary. Primary conversions are the ones Smart Bidding actually bids on and that populate the "Conversions" column. Secondary conversions still report, in "All conversions," but they don't drive bidding and they don't double the number you optimize against. Google helps a little here: conversions created through the GA4 interface are set to secondary by default, precisely to stop the same event counting twice for bidding. But defaults drift, and someone always flips one to primary "to see it in the main column."
Read the columns before you trust them
Even a clean setup shows gaps between GA4 and Google Ads, and that's normal, not a bug. Google Ads dates a conversion to the click; GA4 dates it to when the action happened. Google Ads filters invalid clicks; GA4 doesn't. Cookie windows differ. The place people go wrong is comparing the Google Ads "Conversions" column against GA4 totals and declaring the setup broken, when they're two different questions. For the authoritative rules on how imported events behave and why the numbers diverge, I keep Google's own reference open: create conversions from Google Analytics events in Google Ads.
When I'm chasing a real discrepancy rather than an expected one, I don't stop at the ads interface. I pull the matching reports in google analytics and line the two views up event by event, because the difference between "GA4 says 100, Ads says 60" and "GA4 says 100, Ads says 200" points at completely different problems. The first is usually attribution windows and invalid-click filtering doing their job; the second is duplication I need to hunt down. Reading both sides together is the only way to tell a healthy gap from a broken one.
What double counting does to the numbers you report
The damage isn't only in bidding. When a client asks for detailed reports, an inflated conversion count flows straight into the summary they see, and now the whole story of the account is off. The conversion rate looks artificially strong, cost-per-conversion looks better than it is, and you end up defending performance that's partly fiction. Worse, if you scale spend on the back of those inflated conversion rates, you're doubling down on a signal that was never real, and the correction, when the numbers finally get fixed, looks like a performance drop that you then have to explain.
The clean setup I standardize on
Every account I take over gets the same structure, because it removes the guesswork. First, one source per action: if the purchase comes from GA4, the native purchase tag is either removed or demoted, never both primary. Second, exactly one primary conversion per real business outcome, that's the number Smart Bidding sees, and everything else, micro-conversions, secondary events, the imported duplicates, sits in secondary as context. Setting up conversion tracking this way, with a deliberate hierarchy instead of an accidental pile of overlapping actions, is what makes the account legible to both me and the algorithm.
Third, I audit the source column. In the conversions summary you can see which action came from GA4 and which is native, and whether each is primary or secondary. I read that grid before I trust a single bidding decision. Fourth, I wait. After changing what's biddable, there's a learning period while the algorithm recalibrates, so I don't judge performance for a conversion cycle or two. The signals I've cleaned up here are the exact inputs my Smart Bidding strategy reads, and a doubled or phantom conversion doesn't just distort a report, it teaches the automation the wrong lesson and it keeps paying for it.
The order I do it in, on a live account
Concretely, on a takeover I inventory every existing conversion goal first, then map each one to its source, then decide the single primary before I change anything biddable. Only after the hierarchy is settled do I let the account run and start reading results. Rushing that order, flipping a conversion to primary because it looks good in the column, is exactly how the duplication I spend so much time removing gets introduced in the first place. Slow, boring, one source per outcome: that's the whole method.
The checks I re-run every quarter
A clean structure decays if nobody watches it. Every few months I go back and confirm nothing has quietly re-duplicated, because platforms push recommendations that flip a secondary event to biddable with one click, and a well-meaning teammate accepting a suggestion can undo the whole hierarchy overnight. So I treat the audit as recurring, not one-and-done. I re-open the summary, re-read the primary and secondary split, and make sure the single biddable outcome is still the one I intended and still the only one carrying weight.
I also re-test the technical layer, not just the account settings. Sites change: a template gets redeployed, a consent tool updates, a caching rule shifts, and any of those can silently break the identifier or delay the tag without a single alert firing. The pattern I've learned to trust is that measurement problems almost never announce themselves. There's no error message, no red banner, just a slow drift where the reported outcomes stop matching what the business actually experienced. By the time someone notices the mismatch, weeks of optimization have already been steered by numbers that were subtly wrong.
That's the real lesson from every account I've untangled: the platforms make it easy to connect things and easy to over-connect them, and the gap between those two is where most of the pain lives. Verification is unglamorous and it's the whole game. A structure you've personally checked, where you know exactly which signal drives spend and exactly where it comes from, is worth more than any clever configuration you can't fully see. Simplicity you can verify beats sophistication you can't.
The through-line of the whole google ads ga4 campaign click tracking setup is boring on purpose: link it properly, decide one source per action, keep a single primary, and verify in the source column before you believe the numbers. Do that and GA4 and Google Ads stop fighting each other and start telling you the same, true story, one you can actually build google ads campaigns on without wondering whether the foundation is real.