A lead gen site has one job: turn visitors into enquiries. But the gap between "we got 40 leads this month" and "we know exactly which traffic, pages, and CTAs produced those 40 leads" is where most teams get stuck. Standard GA4 page view data tells you where people went. It doesn't tell you what they did — or how close they came to converting before they didn't.

GTM closes that gap. The three tracking types covered here — form submissions, CTA clicks, and scroll depth — are the foundation of any lead gen measurement setup. Combined, they give you enough data to make meaningful decisions about copy, layout, and where to focus conversion optimisation effort.

This guide assumes GTM is already installed and your GA4 configuration tag is live. If it isn't, start with the GTM setup guide first.


What these three signals actually tell you

Before building anything, it's worth being precise about what each tracking type tells you — and what it doesn't.

Signal 01

Form Submissions

The definitive lead event. Tells you which page the enquiry came from, which form was used, and — if your site passes it — the source that drove the session. This is your primary conversion metric.

Signal 02

CTA Clicks

Clicks on buttons and links that lead toward a conversion — "Get a quote", "Book a call", "Contact us". These capture intent even when users don't complete the form. High click rate, low completion rate points to a form problem, not a traffic problem.

Signal 03

Scroll Depth

How far down a page visitors read before leaving. A page with a 20% scroll depth average isn't converting because nobody reaches the offer. Scroll depth diagnoses content and layout problems that conversion rate data alone can't surface.

Combined

The Full Picture

Together: a visitor scrolled to 75%, clicked the CTA, started the form, and left. That's a very different problem from a visitor who bounced at 10% scroll. Each signal alone is partial — together they tell the conversion story.


Form submission tracking

Form tracking is the most important event on a lead gen site and the one most likely to be misconfigured. GTM offers two approaches — which one you use depends on how your forms are built.

Approach 1: Thank-you page trigger (most reliable)

If your form redirects to a dedicated thank-you page after submission (e.g. /thank-you or /contact/confirmation), use a Page View trigger scoped to that URL. This is the most reliable method because it doesn't depend on GTM intercepting a JavaScript form event — the page view itself is the confirmation.

  1. 1
    Create a Page View trigger for the thank-you URL In GTM, go to Triggers → New → Page View. Set it to fire on Some Page Views with the condition: Page URL contains /thank-you. If your URL is more specific, use matches RegEx with a pattern like \/contact\/confirmation\/?$ to avoid false matches.
  2. 2
    Create a GA4 Event tag Go to Tags → New → Google Analytics: GA4 Event. Select your GA4 configuration tag, set the Event Name to generate_lead (GA4's recommended name for lead events — it maps cleanly to GA4's conversion reports). Assign the thank-you page trigger.
  3. 3
    Add event parameters for context At minimum, pass page_referrer (using the built-in GTM variable) so you know which page the visitor came from before the thank-you page. If your forms have IDs or names, pass those too — it's much harder to add later once data is flowing.
  4. 4
    Mark as a conversion in GA4 In GA4, go to Admin → Events, find generate_lead, and toggle Mark as conversion. This makes it appear in your Conversions reports and enables conversion-based audience building.

Approach 2: Data layer push from your form handler

If your forms use AJAX — submitting without a page redirect — the thank-you page method won't work. The reliable alternative is to push a dataLayer event directly from your form's success callback. This requires a small code change, but it's the correct long-term approach for any modern single-page or AJAX form setup.

JavaScript — Data layer push on AJAX form success

// Inside your form submission success handler
formElement.addEventListener('submit', function(e) {
  e.preventDefault();

  // Your existing form submission logic here...
  submitFormData(formData).then(function() {

    // Push to dataLayer on successful submission
    window.dataLayer.push({
      event: 'generate_lead',
      form_id:   formElement.getAttribute('id'),
      form_name: formElement.getAttribute('data-form-name'),
      page_path: window.location.pathname
    });

  });
});

In GTM, create a Custom Event trigger with the event name generate_lead, then a GA4 Event tag using Data Layer Variables to pull form_id, form_name, and page_path as event parameters.

Avoid GTM's native Form Submission trigger for AJAX forms. GTM's built-in Form Submission trigger listens for the native HTML submit event. Forms that use fetch or XMLHttpRequest to submit data don't fire this event in the same way — the trigger fires before the server responds, meaning you may record submissions that actually failed. The data layer approach fires only after a confirmed success response.


CTA click tracking

CTA clicks sit between scroll depth and form submissions in the conversion funnel. They tell you how many visitors showed enough intent to engage with your offer — even if they didn't complete it. On a well-structured lead gen site, CTA click rate divided by form completion rate points directly to where conversion is breaking down.

Setting up click triggers correctly

Before creating any click triggers, enable GTM's built-in click variables. Go to Variables → Configure → Click Variables and enable: Click Element, Click Classes, Click ID, Click Text, and Click URL. Without these, GTM has no values to evaluate click conditions against.

GTM Trigger — CTA button clicks by CSS selector

// Trigger type: All Elements
// Fire on: Some Clicks
// Condition (use whichever matches your markup):

// Option A — by CSS class:
Click Element  matches CSS selector  .cta-primary, .btn-contact, .hero-cta

// Option B — by data attribute (more reliable than class names):
Click Element  matches CSS selector  [data-track="cta"]

// Option C — by link URL for anchor tags:
Click URL  contains  /contact

Data attributes are the most maintainable approach. Adding data-track="cta" to any element you want to track means your GTM trigger never needs to change when designers rename CSS classes or restructure the markup. Ask your developer to add the attribute once — GTM handles everything else from that point.

Passing useful click parameters to GA4

A CTA click event is much more useful when it carries context about what was clicked and where. Build your GA4 Event tag with these parameters:

Parameter name GTM variable What it tells you
cta_text {{Click Text}} The button label — "Get a quote", "Book a call". Tells you which CTA wording performs best.
cta_url {{Click URL}} Where the click was going — useful for tracking clicks to external booking tools or phone links.
page_path {{Page Path}} Which page the click happened on — lets you compare CTA performance across service pages, landing pages, and the homepage.
cta_location {{Click Element}} → custom JS variable Where on the page the CTA sits — hero, mid-page, footer. Requires a small lookup variable but reveals whether placement affects click rate.

Tracking phone number and email clicks

On lead gen sites, phone and email links are often the highest-intent actions on the page — and the ones most commonly missed by analytics setups. These are anchor tags with href values starting with tel: or mailto:, and they need their own dedicated triggers.

GTM Trigger — Phone and email link clicks

// Phone clicks — Trigger type: Just Links
Click URL  starts with  tel:

// Email clicks — Trigger type: Just Links
Click URL  starts with  mailto:

Create a separate GA4 Event tag for each — phone_click and email_click — and pass the {{Click URL}} as a parameter so you know which number or address was clicked. Mark both as conversions in GA4 if phone and email enquiries are valuable leads for your business.


Scroll depth tracking

Scroll depth is built directly into GTM as a native trigger type — no custom code required. It's one of the quickest high-value setups in the platform.

  1. 1
    Create a Scroll Depth trigger In GTM, go to Triggers → New → Scroll Depth. Select Vertical Scroll Depths and enter the thresholds you want to track — typically 25, 50, 75, 90. Set it to fire on All Pages or scope it to specific page types if you only want data on key service or landing pages.
  2. 2
    Enable the Scroll Depth built-in variables Go to Variables → Configure and enable Scroll Depth Threshold and Scroll Depth Units. These tell GTM the scroll percentage value at the moment the trigger fires — you'll use them as event parameters.
  3. 3
    Create a GA4 Event tag Name the event scroll (GA4 auto-collects this natively, but GTM gives you more control over thresholds and parameters). Pass {{Scroll Depth Threshold}} as the percent_scrolled parameter and {{Page Path}} so you can filter by page in GA4.
  4. 4
    Verify in Preview mode Open GTM Preview, navigate to a page, and scroll slowly to the bottom. The debug panel will show a Scroll Depth event firing at each threshold with the correct percentage value. If thresholds aren't firing, confirm the Scroll Depth variables are enabled and the trigger is assigned to the tag.

GA4 already auto-collects a 90% scroll event — but only at the 90% threshold, with no page-level filtering, and only when Enhanced Measurement is enabled. Setting up your own scroll trigger in GTM gives you the intermediate thresholds (25%, 50%, 75%) that actually tell you where drop-off happens, and lets you scope tracking to the pages where it matters.

Using scroll data in GA4

Once scroll events are flowing, build a Free Form Exploration in GA4 with Page Path as a row dimension, Percent Scrolled as a secondary dimension, and Event Count as the metric. This gives you a table showing, for each key page, how many users reached the 25%, 50%, 75%, and 90% scroll marks. Pages where event counts drop sharply between 25% and 50% are losing visitors before they reach the offer — the first place to look when a page isn't converting.


Structuring your GA4 events for reporting

The events you create in GTM only become useful reporting data if GA4 can surface them cleanly. A few structural decisions made now save significant rework later.

  • Use GA4's recommended event names where they fit. generate_lead for form completions, phone_call for phone clicks — GA4's standard reports are built around these names. Custom names work but require custom reports for every metric.
  • Register custom parameters as custom dimensions. Event parameters like form_name, cta_text, and page_path aren't visible in GA4 reports by default. Go to GA4 Admin → Custom Definitions → Custom Dimensions and register each parameter you want to filter or segment by. It takes two minutes per parameter and makes all the difference.
  • Keep event names lowercase with underscores. GA4 is case-sensitive. Generate_Lead and generate_lead are two separate events. Establish a convention from day one — lowercase, underscores — and apply it consistently across every tag in your container.
  • Don't mark scroll events as conversions. Scroll depth is an engagement signal, not a conversion. Marking it as a conversion inflates your conversion rate and makes the metric meaningless. Keep conversions limited to actions with real business value: form submissions, phone clicks, email clicks.

Document your event schema before you build. A simple spreadsheet with columns for Event Name, Parameters, Trigger, and Purpose takes 20 minutes to put together and prevents the most common problem we see in client containers: five different tags sending five differently-named versions of the same event. Write it down first, build second.


Putting it together: a lead gen reporting view

With form submissions, CTA clicks, and scroll depth all flowing into GA4, the reporting picture becomes considerably richer than page views alone. Here's how to read the signals together.

Start in GA4's Explorations → Funnel Exploration. Build a three-step funnel: Step 1 is a page view on your key service page, Step 2 is a cta_click event, Step 3 is generate_lead. The drop-off between Step 1 and Step 2 tells you whether the page is engaging visitors. The drop-off between Step 2 and Step 3 tells you whether the form is completing. These are two different problems requiring two different fixes.

Layer in scroll depth by building a Free Form Exploration filtered to the same service page with scroll threshold as a secondary dimension. If 60% of visitors reach 50% scroll but only 15% click the CTA — and the CTA is positioned at 60% down the page — the problem is placement, not the offer.

This kind of analysis is what turns a lead gen site from "we think the homepage is working" to "we know the homepage service section needs a CTA above the fold because 40% of visitors never reach the one we have." That specificity is what makes optimisation decisions defensible rather than guesswork.

Want this tracking set up on your lead gen site?

We build complete GTM and GA4 event tracking setups for lead generation sites — form submissions, CTA clicks, scroll depth, phone and email tracking — and connect them to GA4 dashboards your team can act on. Book a free 30-minute audit and we'll review what your current setup is missing.