How to Set Up GA4 Goals and Track SEO Conversions
Table of Contents
Table of Contents
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

Open your website in Chrome. Open DevTools (F12), go to the Network tab, reload the page, and filter by ‘google-analytics’ or ‘gtag’. You should see a hit to collect.analtyics.google.com with your Measurement ID in the payload. If no hit appears, the tracking code is not installed.
// Alternative: use GA4 DebugView to verify hits in real time
// In Chrome DevTools Console, run:
document.cookie = '_ga_debug=1'
// Then in GA4: Admin → DebugView
// Reload your site and watch events appear live
// Every page load should show a 'page_view' event
// If nothing appears after 30 seconds: tracking code is not installedVerify 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 stringConfirm 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 Type | Trigger Event | Priority | What It Proves |
|---|---|---|---|
| Contact form submit | Form submission complete | P1 — Critical | A visitor became a lead. The single most important event for most service businesses. |
| Phone number click | Click on tel: link | P1 — Critical | High-intent action. Mobile users who call are frequently ready to buy. |
| Email link click | Click on mailto: link | P1 — Critical | Second-most common enquiry method for professional services. |
| Booking widget complete | Calendar confirmation page | P1 — Critical | The most committed action possible before a contract is signed. |
| Resource/PDF download | File download event | P2 — High | Lead magnet engagement. Indicator of serious research intent. |
| Live chat initiated | Chat widget open event | P2 — High | High-intent signal, especially during business hours. |
| Pricing page visit | Page view of /pricing/ | P3 — Medium | Commercial intent indicator. Not a conversion but a strong signal. |
| Video play (key videos) | Video start event | P3 — Medium | Content 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 appearsMethod 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.Method C: Push events via dataLayer (recommended for accuracy)
For AJAX form submissions, phone click tracking, or any interaction that does not produce a page URL change, push a custom event to the dataLayer. This is the most reliable method and works with Google Tag Manager.
// Push event from your contact form (JavaScript)
// Add to your form's success callback:
document.getElementById('contact-form').addEventListener('submit', function(e) {
// After successful submission:
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.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.push({
'event': 'email_click',
'email_address': this.getAttribute('href').replace('mailto:', '')
});
});
});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 conversionStep 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
// GA4 → Reports → Acquisition → Traffic Acquisition
// Primary dimension: Session default channel group
// You should see: Organic Search as a distinct row
// If 'Organic Search' is missing or grouped with other channels:
// GA4 → Admin → Data Settings → Channel Groups
// Confirm 'Organic Search' rule is:
// Session medium exactly matches 'organic'
// Recommended: create a custom channel group to separate
// branded and non-branded organic:
// GA4 → Admin → Data Settings → Channel Groups → Create Custom
// Rule 1: 'Organic (Non-Branded)'
// Session medium = 'organic'
// AND session campaign does NOT contain [your brand name]
// Rule 2: 'Organic (Branded)'
// Session medium = 'organic'
// AND session campaign CONTAINS [your brand name]
// This separation is critical: branded organic = returning/aware users
// Non-branded organic = new audience discovered through contentLink Google Search Console to GA4
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.
// Path: GA4 → Admin → Product Links → Search Console Links → Add
// Select the matching GSC property → Confirm
// Access linked data after 24–48 hours:
// GA4 → Reports → Acquisition → Search Console → Queries
// This report shows:
// Query | Clicks | Impressions | CTR | Sessions | Conversions
// Add 'Conversions' as a secondary metric:
// Click the column header area → Add metric → select your
// conversion event name
// Now you can answer: which search queries are generating leads?
// A query with 200 clicks but 0 conversions = intent mismatch
// A query with 40 clicks and 8 conversions = protect and grow thisStep 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
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)
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.
Quick Reference: The Complete Setup Checklist
| Task | Path in GA4 / GTM | Status |
|---|---|---|
| Verify GA4 tracking code is firing on all pages | DevTools → Network → filter 'collect' OR DebugView | ☐ Done |
| Confirm Measurement ID matches on site and in GA4 | GA4 → Admin → Data Streams → Measurement ID | ☐ Done |
| Create 'contact_form_submit' conversion event | GA4 → Admin → Events → Create Event OR GTM → New Tag | ☐ Done |
| Create 'phone_click' conversion event | GTM dataLayer push → GA4 mark as conversion | ☐ Done |
| Create 'email_click' conversion event | GTM dataLayer push → GA4 mark as conversion | ☐ Done |
| Mark all P1 events as conversions in GA4 | GA4 → Admin → Events → toggle Mark as Conversion | ☐ Done |
| Verify conversions fire via DebugView | GA4 → Admin → DebugView → submit test form | ☐ Done |
| Confirm Organic Search channel grouping is correct | GA4 → Admin → Data Settings → Channel Groups | ☐ Done |
| Create branded vs non-branded organic split | GA4 → Admin → Data Settings → Channel Groups → Create Custom | ☐ Done |
| Link Google Search Console to GA4 | GA4 → Admin → Product Links → Search Console Links | ☐ Done |
| Build Organic SEO Conversion Exploration | GA4 → Explore → Blank → set dimensions/metrics/filter | ☐ Done |
| Record Month 1 baseline: sessions, conversions, CPL | GA4 Reports → document in content strategy tracker | ☐ Done |
| Schedule monthly verification routine | First 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:
- How to Measure SEO ROI: The Metrics That Actually Matter — what to do with the conversion data once it’s flowing
- How We Report on SEO Progress: The Metrics We Use and Why — how Semola uses GA4 conversion data in monthly reports
- What Happens After You Launch a Website? The Post-Launch SEO Checklist — GA4 setup is step one of the post-launch workflow
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.

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 →