Feature image on how to set up Google Analytics 4 to capture seo conversion events
Technical SEO7 min read

How to Set Up GA4 Goals and Track SEO Conversions

Oladoyin Falana
Oladoyin Falana

May 15, 2026

Reviewed bySemola Digital Content Team

Why Conversion Tracking is Not Optional

Without conversion tracking, you are flying blind. You may know your organic sessions are growing. You do not know whether those sessions are generating leads, enquiries, or sales. You do not know which pages are converting and which are attracting the wrong audience. You cannot calculate ROI. You cannot justify the investment to a finance team. You cannot make data-driven decisions about which content to scale and which to abandon.

The cost of this gap is compounding. An SEO engagement without conversion tracking is three to six months of work that generates conclusions like ‘traffic went up’ rather than ‘organic generated 43 leads at a cost per lead of ₦7,900.’ The second statement is defensible. The first is a decoration.

GA4 gives you everything you need to produce the second statement. It takes approximately three hours to configure correctly and produces measurement data that cannot be retroactively recovered if you delay. Configure it before traffic exists, not after.

Step 1: Confirm Your GA4 Property is Correctly Set Up

Before configuring conversion events, confirm the foundation is clean. A misconfigured GA4 property produces data that looks accurate but misleads every decision made from it.

Verify the tracking code is firing

Google tag firing on cta

The most reliable way to test your setup is by using Google's official Tag Assistant.

  • Go to tagassistant.google.com.
  • Enter your website URL and click Connect.
  • This will open your site in a new debug window.
  • Keep that window open and navigate to GA4 → Admin → DebugView to watch your page views and custom events appear live.

If nothing appears in the DebugView timeline as you click through your site, your tracking code is not properly installed.

Verify your Measurement ID is correct

// Your Measurement ID format: G-XXXXXXXXXX
// Find it: GA4 → Admin → Data Streams → your stream → Measurement ID

// Check it matches what is on your site:
// In DevTools → Sources → search for 'G-' to find the ID in your code
// Or in Network tab: filter by 'collect', click the request,
// look for 'tid=G-XXXXXXXXXX' in the query string
text

Confirm data is not being sampled or filtered incorrectly

Go to GA4 → Admin → Data Settings → Data Filters. If you see an active filter excluding internal traffic, confirm the IP address listed matches your office IP. An incorrectly configured internal traffic filter will suppress a significant portion of your real data if your IP range is too broad.

Step 2: Identify Every Conversion Point on Your Site

Before creating conversion events, list every action on your site that represents a genuine business outcome. Be specific. Generic tracking produces generic reports.

Conversion TypeTrigger EventPriorityWhat It Proves
Contact form submitForm submission completeP1 — CriticalA visitor became a lead. The single most important event for most service businesses.
Phone number clickClick on tel: linkP1 — CriticalHigh-intent action. Mobile users who call are frequently ready to buy.
Email link clickClick on mailto: linkP1 — CriticalSecond-most common enquiry method for professional services.
Booking widget completeCalendar confirmation pageP1 — CriticalThe most committed action possible before a contract is signed.
Resource/PDF downloadFile download eventP2 — HighLead magnet engagement. Indicator of serious research intent.
Live chat initiatedChat widget open eventP2 — HighHigh-intent signal, especially during business hours.
Pricing page visitPage view of /pricing/P3 — MediumCommercial intent indicator. Not a conversion but a strong signal.
Video play (key videos)Video start eventP3 — MediumContent engagement depth. Useful for long-consideration cycles.

Step 3: Create Conversion Events

GA4 tracks events automatically (page_view, scroll, click, etc.). For business-specific conversions, you either create custom events in GA4 or push them from your site via the dataLayer. The method depends on your site’s technical setup.

Method A: Mark an existing event as a conversion (no code required)

If GA4 is already detecting the action you want to track as a conversion — for example, a thank-you page view after a form submission — you can mark it directly without touching your code.

// Path: GA4 → Admin → Events
// Look for an event that fires on your confirmation/thank-you page
// Common candidates:
//   page_view with page_location containing '/thank-you'
//   page_view with page_location containing '/contact/success'

// Once found:
// Click the toggle in the 'Mark as conversion' column
// The event becomes a conversion within 24 hours

// Verify: Go to Conversions report
// Submit your own form → wait 24 hours → check it appears
text

Method B: Create a custom event from an existing event

If no existing event matches your conversion point, create a custom event in GA4 without touching your site code. This works for page-view-based conversions.

// Path: GA4 → Admin → Events → Create Event

// Example: Track any visit to a URL containing '/thank-you/'
// Custom event name: contact_form_submit

// Matching conditions:
// Event name: equals: page_view
// page_location: contains: /thank-you/

// Click 'Create', then mark the new event as a conversion
// GA4 Admin → Events → find 'contact_form_submit' → toggle on

// Important: this method only works if the thank-you page
// has a distinct URL. If the form submits via AJAX with no
// URL change, use Method C instead.
text

For AJAX form submissions, ensure you only fire the event after a successful server response, not just when the button is clicked. Otherwise, you will track failed validation attempts as leads.

// Push event ONLY on successful form submission (Example using Fetch API)
document.getElementById('contact-form').addEventListener('submit', function(e) {
  e.preventDefault(); 
  
  // Assume fetch handles your form processing
  fetch('/submit-endpoint', { method: 'POST', body: new FormData(this) })
    .then(response => {
      if (response.ok) {
        // ONLY push to dataLayer on success
        window.dataLayer = window.dataLayer || [];
        window.dataLayer.push({
          'event': 'contact_form_submit',
          'form_type': 'contact',
          'page_location': window.location.href
        });
      }
    });
});

// Track phone number clicks:
document.querySelectorAll('a[href^="tel:"]').forEach(function(el) {
  el.addEventListener('click', function() {
    window.dataLayer = window.dataLayer || [];
    window.dataLayer.push({
      'event': 'phone_click',
      'phone_number': this.getAttribute('href')
    });
  });
});

// Track email link clicks:
document.querySelectorAll('a[href^="mailto:"]').forEach(function(el) {
  el.addEventListener('click', function() {
    window.dataLayer = window.dataLayer || [];
    window.dataLayer.push({
      'event': 'email_click',
      'email_address': this.getAttribute('href').replace('mailto:', '')
    });
  });
});
javascript

Configuring the dataLayer events in Google Tag Manager

If you are using Google Tag Manager (recommended), create a trigger for each dataLayer event and a GA4 event tag that fires on it.

// Google Tag Manager configuration:

// 1. Create a Trigger:
//    Trigger Type: Custom Event
//    Event Name: contact_form_submit
//    (match exactly, not regex)

// 2. Create a Tag:
//    Tag Type: Google Analytics GA4 Event
//    Configuration Tag: your GA4 config tag
//    Event Name: contact_form_submit
//    Triggering: the trigger you just created

// 3. Repeat for: phone_click, email_click, pdf_download

// 4. Preview mode → submit your form → confirm event fires
// 5. Publish the container
// Then in GA4: Admin → Events → mark each as conversion
text

Step 4: Isolate Organic Search Traffic

A conversion event tells you that a lead happened. Channel grouping tells you that an organic search visitor generated that lead. Without channel isolation, you cannot connect SEO to business outcomes. GA4 does this automatically via its default channel grouping, but it needs verification.

Verify organic is classified correctly

To ensure your SEO efforts are being tracked, you must first confirm that Google Analytics is properly classifying your organic traffic.

1. Check Default Groupings
  • Navigate to GA4 → Reports → Acquisition → Traffic Acquisition.
  • Set the primary dimension to Session default channel group.
  • Look for Organic Search as a distinct row.

If 'Organic Search' is missing or lumped together with other channels, navigate to GA4 → Admin → Data Settings → Channel Groups and confirm that the standard 'Organic Search' rule is active (where Session medium exactly matches 'organic').

2. Separating Branded vs. Non-Branded Organic Traffic

Separating your traffic is critical: branded organic traffic generally represents returning or already-aware users, while non-branded organic traffic represents a brand-new audience discovering you through your SEO content.

Many guides recommend creating a Custom Channel Group in GA4 to separate these by filtering the session_campaign dimension. Do not do this. Because standard organic search does not use UTM parameters, the campaign dimension will show as (not set) or (organic), and your custom rules will fail to capture the data.

Instead, you must rely entirely on your linked Google Search Console integration to segment this traffic:

  • Navigate to Reports → Search Console → Queries.
  • Apply a filter to the Organic google search query dimension.
  • Set the filter to contains [your brand name] for branded tracking, or does not contain [your brand name] for non-branded tracking.

Linking GSC to GA4 enables the Queries report: which exact search terms generated sessions and which of those sessions converted. This is the most commercially useful report in the entire measurement stack.

  1. Go to GA4 → Admin → Product Links → Search Console Links → Add.
  2. Select the matching GSC property and confirm.
  3. Access linked data after 24–48 hours.

Important: GA4 hides these reports by default. You must first go to Reports → Library (at the bottom of the left menu), find the 'Search Console' collection, and click Publish.

Once published, navigate to Reports → Search Console → Queries. Here, you can add your specific Key Event as a secondary metric to see exactly which search queries are generating leads.

Step 5: Build the Organic Conversion Report

The default GA4 reports are designed for general use. For SEO measurement, build a custom Exploration that shows exactly what you need: organic sessions, engagement, and conversions side by side.

Create the Organic SEO Conversion Exploration

// GA4 → Explore → Blank Exploration
// Name it: 'Organic SEO — Conversion Report'

// DIMENSIONS (drag to Rows):
//   Landing page + query string
//   Session default channel group

// METRICS (drag to Values):
//   Sessions
//   Engaged sessions
//   Engagement rate
//   Average engagement time per session
//   Conversions (select your specific event name)
//   Session conversion rate

// FILTERS:
//   Session default channel group exactly matches 'Organic Search'
//   (or your custom 'Organic Non-Branded' group)

// DATE RANGE: Set to last 28 days, compare to previous 28 days

// SORT: Session conversion rate — Descending
// This surfaces your highest-converting organic landing pages at the top

// Save and share with edit access to your client/team
text

Reading the report: three things to look for

High sessions, low conversion rate: The page is attracting the wrong audience. The keyword driving traffic does not match the commercial intent of your service page. Either the content needs to be rewritten for a different intent, or the page needs a clearer call-to-action aligned to what the searcher expects.

High conversion rate, low sessions: This page is commercially excellent but under-trafficked. Expand the content, build internal links to it from related cluster articles, and consider building additional cluster articles targeting related queries to grow sessions while preserving the conversion rate.

Zero conversions despite significant traffic: A content piece is generating informational traffic from people who are researching but not ready to buy. This is not a failure — it is top-of-funnel traffic. Ensure these pages have a clear next step: an internal link to a service page, a lead magnet download, or a newsletter signup that keeps the visitor in the pipeline.

Step 6: Calculate Cost Per Organic Lead

This is the metric that converts an SEO report into a business case. It is calculated from GA4 data and your financial records. Run it monthly.

// Cost Per Organic Lead Formula:
// CPL = Monthly SEO Investment / Organic Conversions (that month)

// Example:
// Monthly investment: ₦380,000 (agency + content + tools)
// Organic goal completions from GA4: 43
// Cost per organic lead = 380,000 / 43 = ₦8,837

// Compare to your paid search CPL for the same queries:
// If Google Ads CPC = ₦800 and conversion rate = 3%
// Paid CPL = ₦800 / 0.03 = ₦26,667 per lead

// Organic CPL at month 7: ₦8,837
// Paid CPL equivalent: ₦26,667
// Organic is 67% cheaper per lead

// This number is what you present to a finance team or board.
// Not rankings. Not traffic. Cost per lead vs paid alternatives.

// Track it monthly. It should decline as traffic scales:
// Month 1:  ₦63,000 CPL (few conversions, full investment)
// Month 6:  ₦18,000 CPL (conversions growing)
// Month 12: ₦7,500 CPL (volume scaling, investment flat)
text

Step 7: Set Up the Monthly Verification Routine

Conversion tracking degrades silently. A developer updates a form plugin, a URL changes after a site migration, a new privacy banner blocks the tracking script. Build a monthly check into your workflow so you catch failures before they erase a month of data.

// Monthly conversion tracking verification (first Monday of month):

// 1. Submit your own contact form → check DebugView immediately
//    GA4 → Admin → DebugView
//    The 'contact_form_submit' event should appear within 60 seconds

// 2. Click your phone number link on mobile → check DebugView
//    The 'phone_click' event should appear

// 3. Check last month's conversion volume in GA4:
//    Reports → Conversions
//    If conversions dropped sharply vs prior month with no
//    corresponding traffic drop: tracking failure, not lead drop

// 4. Check GSC for crawl errors on key landing pages:
//    GSC → Indexing → Pages → Errors
//    A page removed from the index stops generating organic sessions
//    which shows up as a conversion drop in GA4

// 5. Run a test conversion in Incognito mode (clears cookies)
//    This simulates a new user and confirms the full tracking path

// Monthly check takes 20 minutes. Saves weeks of lost data.
text

Quick Reference: The Complete Setup Checklist

TaskPath in GA4 / GTMStatus
Verify GA4 tracking code is firing on all pagesDevTools → Network → filter 'collect' OR DebugView☐ Done
Confirm Measurement ID matches on site and in GA4GA4 → Admin → Data Streams → Measurement ID☐ Done
Create 'contact_form_submit' conversion eventGA4 → Admin → Events → Create Event OR GTM → New Tag☐ Done
Create 'phone_click' conversion eventGTM dataLayer push → GA4 mark as conversion☐ Done
Create 'email_click' conversion eventGTM dataLayer push → GA4 mark as conversion☐ Done
Mark all P1 events as conversions in GA4GA4 → Admin → Events → toggle Mark as Conversion☐ Done
Verify conversions fire via DebugViewGA4 → Admin → DebugView → submit test form☐ Done
Confirm Organic Search channel grouping is correctGA4 → Admin → Data Settings → Channel Groups☐ Done
Create branded vs non-branded organic splitGA4 → Admin → Data Settings → Channel Groups → Create Custom☐ Done
Link Google Search Console to GA4GA4 → Admin → Product Links → Search Console Links☐ Done
Build Organic SEO Conversion ExplorationGA4 → Explore → Blank → set dimensions/metrics/filter☐ Done
Record Month 1 baseline: sessions, conversions, CPLGA4 Reports → document in content strategy tracker☐ Done
Schedule monthly verification routineFirst Monday of each month — 20-minute check☐ Done

Configure it Today. The Data Cannot Be Recovered Retroactively

Every day your site operates without conversion tracking is a day of organic lead data permanently lost. GA4 does not backfill. Whatever traffic your site received before conversion events were configured is unattributable to any business outcome.

The setup described in this guide takes two to three hours for a standard service business site. The GA4 DebugView verification takes twenty minutes. The monthly check takes twenty minutes. The cost of not doing any of this is measured in months of unmeasured leads and an SEO engagement that cannot demonstrate its own value.

Configure the events. Verify they fire. Link Search Console. Build the exploration. Record the baseline. Then measure every month against that baseline, and the conversation with your finance team or your board changes from ‘trust us, SEO is working’ to ‘here is the cost per lead this month versus what we were paying in paid search.’

That is the conversation worth having. And it starts with three hours of configuration.

Continue reading:

Need help setting this up? semoladigita@gmail.com

Semola Digital configures GA4 conversion tracking and GSC linkage as part of every SEO engagement. We also offer this as a standalone setup session for businesses that already have an SEO team but are not yet tracking conversions correctly.

Share this article

Oladoyin Falana
Oladoyin Falana

Founder, Technical Analyst

Oladoyin Falana is a certified digital growth strategist and full-stack web professional with over five years of hands-on experience at the intersection of SEO, web design & development. His journey into the digital world began as a content writer — a foundation that gave him a deep, instinctive understanding of how keywords, content and intent drive organic visibility. While honing his craft in content, he simultaneously taught himself the building blocks of the modern web: HTML, CSS, and React.js — a pursuit that would eventually evolve into full-stack Web Development and a Technical SEO Analyst.

Follow me on LinkedIn →

Related Insights