Learn Google Analytics Conversion tracking

GA4 · No Tag Manager

Count every lead in GA4 from your thank-you page

If your form sends people to a thank-you URL, you already have everything you need. Two conditions in the GA4 admin turn that page view into a key event, and you can see which channel brought each lead.

5 admin steps 0 lines of code ~6 min read

GA4 is built on events, not sessions and goals like the old Universal Analytics. It collects a lot of them for you: page views, scrolls, outbound clicks. What it can't guess is which action pays your bills.

A thank-you page view is a form submit in disguise. Tell GA4 to watch for it.

The method below works for any form that redirects to its own page: a contact form, a demo request, a guide download. You build it in the GA4 interface. No Tag Manager, no developer.

The flow

5 steps from submit to report

Only step four is something you build. The rest already happens on your site.

How GA4 conversion tracking works

Follow a visitor from submitting a form to seeing a key event in your reports.

Select any step to expand its explanation.

Setup

Build it in the GA4 admin

You need Editor access to the property. The menu names below match the current GA4 interface.

  1. 1

    Create the custom event

    Admin → Data display → Events → Create event

    Pick your web data stream, then click Create. Name it generate_lead. That is one of Google's recommended event names for a lead, so reports and Google Ads understand it without extra mapping.

    Custom event name
    generate_lead
  2. 2

    Add the matching conditions

    Same screen, under "Matching conditions"

    Two conditions, and both must be true. The first narrows it to page views. The second narrows it to the thank-you page. Without the second, every page view on your site becomes a lead.

    event_name
    equals page_view
    page_location
    contains thank-you
  3. 3

    Keep the source parameters

    Same screen, "Copy parameters from the source event"

    Leave this ticked. It carries over the page, source and campaign details from the page_view, which is what lets you break leads down by channel later. If a lead is worth a known amount, add value and currency under "Modify parameters".

    Copy parameters from the source event
    ✓ on
  4. 4

    Mark it as a key event

    Admin → Data display → Key events → New key event

    Type generate_lead, spelled exactly as before, and save. You can do this before the event has ever fired. Once it has fired, you can also flip the star next to it in the Events list instead.

    New event name
    generate_lead
  5. 5

    Check it in reports

    Reports → Acquisition → Traffic acquisition

    Submit your own form, then watch Realtime for generate_lead. Standard reports take up to a day to fill in. Switch the key events column to generate_lead and the table shows leads by session source / medium and campaign.

Test your rule before you save it

Paste your real thank-you URL and see whether the event would fire.

Open GA4 Event Builder →

Why the URL rule says "contains"

page_location is the full address, not just the path. A trailing slash, a www. or a UTM tag changes it. Here's how the same thank-you page looks to each rule when the value is https://example.com/thank-you for equals and thank-you for contains.

page_location contains equals
https://example.com/thank-you ✓ fires ✓ fires
https://example.com/thank-you/ ✓ fires ✗ missed
https://example.com/thank-you?utm_source=email ✓ fires ✗ missed
https://www.example.com/thank-you ✓ fires ✗ missed
https://example.com/contact ✗ no ✗ missed

Pick a value specific enough that nothing else on your site contains it. thank-you also matches a blog post called /blog/thank-you-email-templates. If you have one, use /thank-you/ or a less common slug like /lead-confirmed.

When this isn't enough

The thank-you trick needs a page only converters see. Without one, reach for Tag Manager.

Form redirects to its own thank-you URL

→ GA4 create event (this guide)

No code, no Tag Manager. Five minutes in the GA4 admin.

Form shows "Thanks!" without changing the URL

→ GTM trigger or dataLayer push

There is no page_view to hang a rule on. You need something to fire on the submit itself.

Thank-you page is reachable without submitting

→ Fix the page first, then GA4

If it is in your sitemap or linked from a menu, Google and curious visitors inflate your lead count.

You need the lead's plan, value or form ID

→ GTM or gtag with parameters

A URL match tells you a lead happened, not what kind. Send the details as event parameters.

What to look at once it's counting

Open Reports → Acquisition → Traffic acquisition and set the key events column to generate_lead. Each row is now a channel with its own lead count and session key event rate.

Switch the primary dimension to Session source / medium or Session campaign to see which newsletter, post or ad actually filled your pipeline. This is where tagged links pay off. A link without UTM tags shows up as (direct) / (none) and tells you nothing.

If you run Google Ads, import generate_lead into your Ads account as a conversion so bidding can optimise for leads instead of clicks.

Common questions

FAQ: GA4 conversion tracking

Are GA4 conversions and key events the same thing?
Yes. Google renamed conversions to key events in GA4 in 2024. "Conversion" now mostly refers to the Google Ads side. If a video or older guide says "mark as conversion", look for "mark as key event" in the current interface.
Do I need Google Tag Manager to track form submissions in GA4?
Not if the form sends people to a unique thank-you URL. A custom event built in the GA4 admin is enough. You need GTM or code when the form confirms in place without a new URL, or when you want extra details like the form name sent with the event.
Why does my custom event not show up in GA4?
Custom events only start counting after you create them, and they never apply to old data. Check Realtime after submitting your own form. If nothing appears, open the thank-you page and compare its real address with your page_location condition. A typo or wrong case is the usual cause.
Should page_location use contains or equals?
Contains, in almost every case. page_location holds the full address, including https://, the domain, any trailing slash and any UTM tags. An equals rule has to match all of that exactly, so it misses visits a contains rule catches.
Will refreshing the thank-you page count two leads?
By default every matching page view counts. You can change a key event's counting method to "once per session" in Admin → Key events, which stops refreshes and back-button visits from inflating the number.
Should I give the lead a monetary value?
Only if you have a real number, like average deal size times your close rate. A made-up value makes revenue reports look precise when they are not. For a free guide download, leave it blank.

Keep going

More Google Analytics breakdowns, built the same way.