Most businesses I talk to have conversion tracking installed. Far fewer have conversion tracking they trust. Google Ads says one number, GA4 says another, and nobody is sure which ads actually bring leads.
Here’s how I set tracking up so the numbers agree, how I prove that every event fires, and the mistakes I find most often in existing setups.
Start with what counts as a conversion
Before any code, write down the actions that matter to the business. For most service businesses that’s a short list:
- A contact or quote form submitted.
- A phone number tapped on a phone.
- A booking made.
- For stores, a purchase with its value.
Everything else is extra. For each action I note how it’s detected, the event name and where it’s sent. Where Google has a recommended event name, I use it: generate_lead for forms and purchase for orders. A clear list keeps reports clean and makes testing possible.
Put everything in Google Tag Manager
Google Tag Manager becomes the one place where tracking lives. GA4, Google Ads conversions, the Meta Pixel and Microsoft Clarity all load from one container. If the site already has tracking codes pasted in different places, I move them into Tag Manager and remove the old copies, so nothing is counted twice.
To find old copies, search the page source for gtag(, G-, AW- and fbq(, then check the theme’s header settings, the page builder’s custom code area and plugins such as Site Kit.
Google Ads also needs to remember which ad click brought the visitor. A Google tag that loads on every page handles that, or a Conversion Linker tag on all pages.
Track the real success, not the click
A click on a submit button isn’t a lead. The form might fail validation. The reliable signals are:
- A thank-you page that only appears after a successful submission, or
- The form’s own success event, which Elementor Pro forms and most form plugins provide.
For a thank-you page, I use a Page View trigger on that exact path and keep the page out of menus and search results. For success events, a small listener pushes a dataLayer event for a Custom Event trigger. Elementor Pro fires submit_success after a good submission. Contact Form 7 has wpcf7mailsent; skip wpcf7submit, which also fires when validation fails.
For calls, track taps on tel: links with a Just Links click trigger where Click URL starts with tel: (enable the built-in Click URL variable first). That measures a tap, not a conversation. Google Ads call conversions with a forwarding number, or a call-tracking tool, tell you which calls connected. For stores, send the purchase with value, currency and transaction ID, so a refreshed confirmation page isn’t counted twice.
Send each event to the right places
Create the key events in GA4, link Google Ads, and create Google Ads conversion actions tied to those same events. Do the same for the Meta Pixel if you run Meta ads. Use one consistent name per action everywhere, so reports line up.
- GA4: Admin > Data display > Events, then mark the event as a key event, or add it ahead of time under Key events > New key event.
- Linking: in GA4, Admin > Product links > Google Ads links.
- Google Ads: Goals > Conversions > Summary, then create a conversion action from the Google Ads tag or import the GA4 key event. Imports can take up to 24 hours to show data.
- Counting: set leads to One and purchases to Every, as Google recommends, so three form sends after one ad click count as one lead.
Pick one primary source per action. If the Google Ads tag and an imported GA4 key event both count the same form as primary, every lead counts twice. Make the other one secondary: still reported, but not used for bidding.
Test it end to end
This is the step most setups skip. I test each action the way a customer would:
- Open Tag Manager’s Preview mode, which connects Tag Assistant to the site.
- Submit the real form, tap the real phone link, place a test order. Repeat on an actual phone, since mobile menus and sticky call buttons often use different links.
- Confirm the tag fires once, with the right values. In Tag Assistant, check Tags Fired for that event and the variables it sent.
- Confirm the event arrives in GA4 DebugView (Admin > Data display > DebugView) and that the Google Ads conversion tag fired with it.
- Publish the container with a clear version name, and tell whoever reads the inbox which leads were tests.
When I set up tracking for an HVAC contractor’s website, this is how I proved each event fired: page view, contact and lead.
Respect consent
If you serve visitors in places with privacy rules, add a consent banner and Google Consent Mode, so tags only use data the visitor allowed. It keeps you compliant and keeps the numbers honest.
Consent Mode uses four main signals: ad_storage, analytics_storage, ad_user_data and ad_personalization. In basic mode, Google tags wait for the visitor’s answer. In advanced mode they load with consent denied and send measurements without cookies, so Google can model part of the gap (Google’s overview explains both). In Tag Manager, switch on Admin > Container Settings > Enable consent overview, and the Tags screen shows every tag’s consent settings in one list. Test with the banner declined and accepted.
What usually goes wrong
- Extra form events in GA4. Enhanced measurement sends its own
form_submit, which watches the browser’s submit rather than the plugin’s success message. Switch off Form interactions in Admin > Data collection and modification > Data streams > your web stream > Enhanced measurement. - The test lead doesn’t show in Google Ads. Google Ads only counts conversions that follow an ad click, so a test from a direct visit shows in GA4 but not in Ads. That’s normal.
- GA4 and Google Ads never match exactly. Ads credits a conversion to the date of the click, GA4 to the date of the event, and each has its own attribution. Aim for close and explainable.
- Nothing in DebugView. It only shows debug traffic, so test from Preview mode, and check the measurement ID and your own consent choice.
- It worked last month. A redesign, a new form plugin or a changed thank-you URL quietly breaks triggers. Re-test after every site change, including speed work that defers scripts.
My conversion tracking checklist
- A written list of actions, event names and destinations.
- One Tag Manager container, old hard-coded tags removed.
- A Google tag or Conversion Linker on every page.
- Forms tracked on success, phone taps on tel: links.
- Purchases sent with value, currency and transaction ID.
- Key events marked, Google Ads linked, one primary action per goal, leads counted as One.
- Every action tested in Preview mode, DebugView and Google Ads.
- Consent tested both ways, and everything re-tested after site changes.
Questions I get about conversion tracking
Do I need Google Tag Manager, or is a plugin enough?
A plugin is fine for GA4 on a simple site. Once you add Google Ads, the Meta Pixel and custom form events, Tag Manager is easier to keep clean, and every change is a version you can roll back. Just don’t load the same tag both ways.
Will consent mode lower my numbers?
You’ll see fewer observed conversions when visitors decline, which is the point. Advanced mode lets Google model part of the gap, and the numbers that remain are ones you’re allowed to use.
How soon can I trust the data?
Once every test passes, compare a week or two of real leads against your inbox or CRM. If the counts line up, the setup is doing its job.
Before you spend more on ads, get numbers you can rely on. See my conversion tracking service or send me your site for a free review.


