GA4 tells you someone reached your contact page. It does not tell you whether they pressed the button once they got there. That gap is where most small business analytics quietly stop being useful, because the thing you actually want to count is the click, not the pageview.

This is the setup, start to finish, in Google Tag Manager. It takes about twenty minutes the first time.

Updated September 2026.

Before you start

You need three things in place:

  1. A GA4 property, with its measurement ID handy. It looks like G-XXXXXXXXXX and lives in Admin, under Data Streams.
  2. Google Tag Manager installed on the site, with both snippets in place: one in the head, one immediately after the opening body tag.
  3. Your GA4 tag firing through GTM, not through a separate hardcoded gtag snippet. If you have both, you will double count everything and spend an afternoon wondering why.

Check whether you already have it

GA4's Enhanced Measurement already tracks outbound link clicks, file downloads, form submissions, scrolls and site search without any setup at all. Look in Admin, Data Streams, your stream, Enhanced Measurement.

If the thing you want to count is a link to another domain or a PDF download, you are already collecting it and you can stop reading. What Enhanced Measurement does not cover is buttons that stay on your own site: a submit button, a "get a quote" button that scrolls to a form, an accordion, a phone number that is styled as a button.

Those need the setup below.

Step 1: turn on the click variables

In GTM, go to Variables, then Configure under Built-In Variables, and enable everything under Clicks:

  • Click Element
  • Click Classes
  • Click ID
  • Click Target
  • Click URL
  • Click Text

They are off by default. Nothing below works until they are on. This is the step people skip.

Step 2: find out what your button actually is

Turn on Preview mode in GTM and load your site in the window it opens. Click the button you want to track.

In the debug panel, find the Click event in the left column and open the Variables tab. You are looking for something stable that identifies this button and only this button. In rough order of preference:

  • Click ID, if the button has one. Most reliable.
  • Click Classes, if there is a distinctive class name.
  • Click Text, if the words on the button are unique on the page.
  • Click URL, for links.

Write down whichever one you find. If nothing is distinctive, ask whoever maintains the site to add an ID to the button. That is a one line change and it makes everything downstream simpler.

Step 3: the gotcha nobody warns you about

Click the button a few more times in Preview and watch what happens.

Most buttons are not one element. They are a button containing a span containing the text. Depending on exactly where the pointer lands, GTM may report the outer button on one click and the inner span on the next, with different IDs and different Click Text each time. Your trigger then fires sometimes.

Two fixes:

  • Match on Click Classes contains rather than equals, since the class list usually includes the parent's class on both.
  • Or use a CSS selector condition: set Click Element, choose "matches CSS selector", and enter something like #quote-button, #quote-button . That trailing , #quote-button catches the children.

Test by clicking the middle of the text, the edge of the button, and the corner. All three should fire.

Step 4: build the trigger

Triggers, New, Trigger Configuration, Click - All Elements.

Not "Just Links". Links only fires on anchor tags, and half the buttons on a modern site are not anchor tags. All Elements catches everything, and your conditions narrow it down.

Choose "Some Clicks" and add the condition you worked out in step two. For example:

  • Click ID equals quote-button
  • or Click Classes contains btn-quote
  • or Click Element matches CSS selector #quote-button, #quote-button *

Name it something you will recognize in six months. "Click - Quote Button" beats "Trigger 4".

Step 5: build the GA4 event tag

Tags, New, Tag Configuration, Google Analytics: GA4 Event.

  • Measurement ID: your G- ID, or the variable holding it if you set one up.
  • Event Name: lowercase with underscores, no spaces. quote_button_click. This name is permanent in your reports, so pick it deliberately.
  • Event Parameters: optional but worth adding. link_text set to {{Click Text}}, and page_location set to {{Page URL}}, tell you which button and which page when the same event fires from several places.

Attach the trigger from step four. Save.

Step 6: test before you publish

Back to Preview. Click the button. You should see:

  • The Click event in the left column.
  • Your tag listed under Tags Fired.
  • The correct event name and parameters in the tag's detail view.

Then check GA4 itself: Reports, Realtime, and look for your event name. It usually appears within seconds. If it fires in GTM but never reaches GA4, the measurement ID is wrong or your GA4 configuration tag is not firing on that page.

Only publish the container once both halves check out.

Step 7: make the parameters visible in reports

Custom event parameters do not appear in standard GA4 reports on their own. If you added link_text above and want to see it, go to GA4 Admin, Custom Definitions, and register it as a custom dimension with the same parameter name.

It takes up to 24 hours to populate, and it is not retroactive, so do this the same day you set the event up rather than a month later.

Mark it as a key event if it matters

For a button that represents real business value, such as a quote request or a phone tap, go to Admin, Events, and mark your event as a key event. That makes it available as a conversion in reports and in Google Ads.

Do not do this for every event. Three or four key events is a working analytics setup. Twenty is noise.

A working starter set

For most small business sites, four events cover almost everything worth knowing:

  1. phone_click on every tel: link.
  2. email_click on every mailto: link.
  3. form_submit on the contact form's submit button.
  4. cta_click on the main call to action, with link_text recording which one.

That is enough to answer the only question that matters: is the site producing contacts, and which page produced them.

If you want this set up correctly rather than approximately, Conversion Tracking Setup is exactly this work as a fixed piece.

Analytics