Was this helpful?

Quickstart: track calls, forms, and email clicks with GA4 and Tag Manager

For business ownersFor agencies and marketers
On this page

This page shows how to measure the three actions that turn a website visit into a lead for most local businesses: a successful form submission, a tap on the phone number, and a click on the email address. You will install Google Tag Manager, send each action to Google Analytics 4 (GA4) as an event, mark the lead events as key events, and prove each one works. It is the base layer I install before any other tracking work, and it takes about an afternoon.

Before you begin

  • Admin access to the business's Google Analytics and Tag Manager accounts, or permission to create both under the business's ownership with you added as a user, so the history stays with the business.
  • A way to add code to the <head> and the top of the <body> on every page: the theme or template files, or the site builder's custom code setting.
  • A list of every form on the site and what success looks like on each one: a thank-you page, a message that replaces the form, or something else.
  • Phone numbers and email addresses written as real tel: and mailto: links. A number typed as plain text or baked into an image cannot be measured.
  • A phone to test on. The tap that matters happens on mobile.

Set up GA4 and Tag Manager

  1. Confirm or create the GA4 property

    Check what already exists before you create anything. View the site's source and look for IDs that start with G- (a GA4 measurement ID) or GTM- (a Tag Manager container), then find which account and property each one belongs to. If the business owns a working property, use it. If not, create one with the business's own time zone and currency. Then change event data retention from the default of two months to 14 months, the longest option on a standard property.

  2. Create a web data stream

    In the property's data streams, add a Web stream for the site's main domain and copy its measurement ID. Enhanced measurement, part of the stream settings, collects page views, scrolls, outbound clicks, and a few other events without extra tags. If its form interactions option is on, turn it off: it counts the browser's submit event, which has the same weakness as the generic form trigger described below.

  3. Create the Tag Manager container

    Create a Tag Manager account for the business and a Web container named after the domain. Use one container per site. Write the container ID, the measurement ID, and the property name in a document the business keeps. An ID map that lives only in Google's screens is how sites end up sending data to the wrong property.

  4. Install both snippets on every page

    Tag Manager gives you two snippets. The script goes as high in the <head> as possible; I put it on the line right after <meta charset> so it loads before any other script. The <noscript> snippet goes immediately after the opening <body> tag.

    <head>
      <meta charset="utf-8">
      <script>(Tag Manager script snippet, with the real GTM ID)</script>
      ...the rest of the head
    </head>
    <body>
      <noscript>(Tag Manager noscript snippet, same ID)</noscript>
      ...the page

    Use the real container ID, never a placeholder. A page carrying GTM-XXXXXXX tracks nothing and looks like it does. If the site already has a hard-coded Google tag with the same measurement ID, remove it once Tag Manager is live, or every page view gets counted twice.

  5. Add the Google tag

    In the container, create a tag of type Google tag, enter the measurement ID as the tag ID, and fire it on the Initialization - All Pages trigger. That loads GA4 on every page and sends the page view. Store the measurement ID once in a Constant variable and reference it in every tag, so changing the ID later means editing one value instead of hunting through tags.

  6. Enable the built-in click variables

    In Variables, configure the built-in variables and turn on the click variables, including Click URL, which the phone and email triggers need.

Track the lead actions

Successful form submissions

Tag Manager has a generic Form Submission trigger, and I do not use it for lead tracking. It listens for the browser's submit event. Many forms send their data in the background and never fire a normal submit, so the trigger stays silent. When it does fire, it cannot tell a submission the server accepted from one that failed validation, was caught by a spam filter, or never reached an inbox. The lead count comes out wrong in both directions, and people make budget decisions with that count.

Fire the lead event on evidence that the submission worked. These are the options, best first:

A dataLayer event
The form's own code pushes an event after the server confirms the submission. This is the most reliable signal and the one I prefer. Many form plugins already announce success in JavaScript (Contact Form 7 fires a DOM event named wpcf7mailsent, for example), and a few lines of script can pass that on to the dataLayer.
A thank-you page
The form redirects to a page that can only be reached by submitting. Trigger on a page view of that path. Keep it out of navigation and search results, because every visit counts as a lead.
A success message
The form swaps in a confirmation message without changing the address. Use an Element Visibility trigger on the message's CSS selector, set to fire once per page.
// Run this only after the server confirms the submission
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
  event: 'lead_form_success',
  form_name: 'estimate_request'
});
  1. Create the trigger

    For a dataLayer push, create a Custom Event trigger with the event name lead_form_success. For a thank-you page or a success message, use the trigger type described above.

  2. Create the event tag

    Create a tag of type Google Analytics: GA4 Event, reference the measurement ID variable, set the event name to generate_lead, and attach the trigger. If the site has more than one form, send form_name as an event parameter through a Data Layer Variable, so you can tell an estimate request from a general question, and register it as a custom dimension in GA4 to see it in reports.

Phone taps

  1. Create the trigger

    Create a trigger of type Click - Just Links, set to fire on some link clicks where Click URL starts with tel:.

  2. Create the event tag

    Create a GA4 Event tag with the event name phone_click and attach the trigger. If the business lists several numbers, for separate locations or departments, add a parameter that names which one was tapped.

Email clicks

  1. Create the trigger

    Create another Click - Just Links trigger where Click URL starts with mailto:.

  2. Create the event tag

    Create a GA4 Event tag with the event name email_click. Leave the email address itself out of the parameters. Google's analytics policies do not allow personally identifiable information, email addresses included, and GA4 already records the page where the click happened.

Publish and mark key events

  1. Test in preview first

    Click Preview in Tag Manager and enter the site's address. Tag Assistant opens the site connected to your unpublished changes and lists the tags that fire on each action. Submit a form, submit it again with a required field left empty, and click the phone and email links. Each lead tag should fire exactly once, and generate_lead should not fire for the failed submission.

  2. Publish a named version

    Click Submit, give the version a name that says what changed, such as "Lead events: generate_lead, phone_click, email_click", and publish. Tag Manager keeps every version, so the previous one is your way back.

  3. Mark the lead events as key events

    In GA4, open the events list in the property's admin, under Data display. Mark generate_lead and phone_click as key events, and email_click too if email is a real lead channel for the business. You can mark an event once it has been collected, or create the key event ahead of time by entering its exact name. Key event status does not apply to data collected before you set it, so do this on day one.

Visits from the website link on a Google Business Profile arrive looking like ordinary organic search, which hides one of the strongest channels a local business has. Add UTM tags to the website address in the profile:

https://www.example.com/?utm_source=google&utm_medium=organic&utm_campaign=gbp

A source of google and a medium of organic keep these visits grouped with search in GA4's default channel reports, and the campaign value lets you pull profile visits out on their own. For a business with several locations, add utm_content with the location name on each profile. Keep the values lowercase and identical everywhere, because GA4 treats GBP and gbp as two different campaigns.

Verify it works

A tag firing in preview is not the finish line. The finish line is the event arriving in the property you meant to send it to.

  1. Check the page source

    View the source of the home page and of a page deep in the site. The container ID should appear twice on each, once in the script and once in the noscript frame, and it should match the ID you wrote down.

  2. Watch Realtime from your phone

    Open the site on your phone, outside preview mode, while watching the Realtime report in the intended GA4 property. Your visit should appear; if it does not, the site is sending data to another property, or nowhere. Then tap the phone link and look for phone_click. Hang up before the call connects, or warn the office first.

  3. Walk through every action in DebugView

    Start Tag Assistant preview again, then open DebugView in the GA4 admin. Preview mode sends your events there automatically. Submit a real test form (write TEST in the message so the business knows to ignore it), click the email link, and click the phone link. Each event should appear once.

  4. Check the reports after processing

    Standard GA4 reports can take 24 to 48 hours to fill in. Confirm the test events appear as key events, and note the date the setup went live so nobody compares a partial month with a full one.

For the full list of checks, including consent, server-side containers, and ad platforms, use the verification checklist.

Troubleshooting

Undo it

To stop tracking without touching the site, pause the tags and publish, or publish an earlier version from the container's version history. To remove Tag Manager completely, delete both snippets from every page.

What this gives you, and what it does not

You now have level 1 from how attribution works: a verified count of the leads the website produces and the channels they came from. It does not tell you which leads became paying customers, and it still runs entirely in the visitor's browser, where Safari's cookie limits and ad blockers erase part of the trail. The next layers carry the source into the CRM through hidden form fields, then move collection onto the business's own domain with server-side tagging.

What's next

Rather have me do this for you?

I set up tracking that ties every call and form to the marketing that earned it, inside accounts you own, and report it in plain language.

See how I do it

Last updated 2026-09-13 UTC. Written by Tucker Shively.