Skip to content

Google Analytics 4: The Conversion Events That Actually Matter

Most GA4 installations track everything and surface nothing. Five events cover what SMBs actually need.

John Cravey with AIFounder5 min readUpdated Jul 6, 2026

GA4 replaced Universal Analytics in 2023. The migration was rough — the UI is busier, the data model is event-based instead of session-based, and the default dashboards bury what SMB owners actually want to know. Two years in, the pattern that works has settled. Five conversion events, three custom dimensions, two dashboards. Here’s the configuration we run across the FH client book.

Free estimate · 2 minutes

Measure what buyers do, not what dashboards say.

Build the estimate to see the measurement and lead system we would install for your business. About a minute, no opt-in.

The data model shift you have to internalize

Universal Analytics was session-based: a session contained pageviews, events, transactions, and time-on-site. GA4 is event-based: everything (pageview, click, form submit, scroll) is an event. Sessions are derived from event timing. Once you accept this, the reporting starts to make sense — you’re always asking ‘what events happened, on what page, for what user.’

The five conversion events for SMB sites

  1. `form_submission` — a lead form was successfully submitted. Fires on the thank-you page or in a server action callback.
  2. `phone_click` — someone clicked your phone number link. Fires on any `tel:` link click.
  3. `email_click` — someone clicked an email link. Fires on any `mailto:` link click.
  4. `chat_started` — someone opened your chat widget (if you have one).
  5. `booking_scheduled` — someone completed a booking flow (if applicable).

That’s it. Don’t add `scroll_depth`, `engaged_session`, `outbound_click`, or any of the dozen other defaults GA4 surfaces. Those are noise for SMB reporting. Track the events that produced the customer outcome you care about, ignore the rest.

Wiring events in a Next.js app

GA4 fires events via `gtag('event', name, params)` or by sending to the Measurement Protocol from your server. We use both: client-side gtag for interactions, server-side for form_submission (after validation succeeds in the server action).

// app/components/Analytics.tsx — client component
"use client";
import Script from "next/script";

export function Analytics() {
  const id = process.env.NEXT_PUBLIC_GA4_ID;
  if (!id) return null;
  return (
    <>
      <Script src={`https://www.googletagmanager.com/gtag/js?id=${id}`} strategy="afterInteractive" />
      <Script id="ga4-init" strategy="afterInteractive">{`
        window.dataLayer = window.dataLayer || [];
        function gtag(){dataLayer.push(arguments);}
        gtag('js', new Date());
        gtag('config', '${id}', { send_page_view: true });
      `}</Script>
    </>
  );
}

// Track a click
export function PhoneLink({ number }: { number: string }) {
  return (
    <a
      href={`tel:${number}`}
      onClick={() => (window as any).gtag?.("event", "phone_click", { number })}
    >
      {number}
    </a>
  );
}

Marking an event as a conversion

In GA4 → Admin → Events, find your event, toggle ‘Mark as key event.’ This is the GA4 term for what used to be called ‘conversion.’ Key events appear in conversion reports and the homepage scorecard. Mark the five events above; don’t mark anything else.

Server-side firing from a server action

Client-side gtag is unreliable — ad blockers, slow page loads, and JavaScript errors all lose events. Critical conversion events (form_submission especially) should fire server-side via the Measurement Protocol.

// app/contact/actions.ts
"use server";
import "server-only";

async function fireGA4Event(name: string, params: Record<string, unknown>, clientId: string) {
  await fetch(
    `https://www.google-analytics.com/mp/collect?measurement_id=${process.env.GA4_MEASUREMENT_ID}&api_secret=${process.env.GA4_API_SECRET}`,
    {
      method: "POST",
      body: JSON.stringify({
        client_id: clientId,
        events: [{ name, params }],
      }),
    }
  );
}

export async function submitLead(formData: FormData) {
  // … validate and insert …
  const clientId = formData.get("_ga_client_id") as string ?? "server";
  await fireGA4Event("form_submission", { form: "contact", lead_score: score }, clientId);
  return { ok: true };
}

Custom dimensions you should set up

  1. `page_type` (event-scoped): homepage, service, blog, location, contact. Lets you slice every event by page type without parsing URLs.
  2. `tenant_id` (user-scoped): your `site_id` if you share GA4 across tenants. Lets you filter every report to one tenant.
  3. `lead_score` (event-scoped): the score computed at form submission. Lets you weight conversions by quality.

The two reports we actually use

GA4’s default reports are mostly noise for SMB use cases. We replace them with two custom Explorations:

  • Acquisition by Source/Medium with conversion rate — which channels are bringing leads, weighted by the lead_score dimension.
  • Landing page performance — which entry pages convert, broken out by Source/Medium so we can see ‘paid landing page converts 4x organic landing page’ kinds of insights.

Joining GA4 with Search Console

GA4 → Admin → Search Console links → connect your GSC property. After 24 hours, you get a Search Console report inside GA4 that joins query data with conversion data. This is the closest thing to ‘which organic queries actually convert,’ and it’s the most valuable joined view in SMB analytics.

Google requires Consent Mode v2 for ads-data flow from European users. Even if your audience is mostly US, install it — it’s a one-time setup and it handles future regulatory shifts cleanly. The consent mode post walks the wiring.

Filtering internal traffic

GA4 → Admin → Data Streams → Configure tag settings → Define internal traffic. Add your office IP, your team’s VPN IPs, anyone whose traffic shouldn’t pollute the data. Then exclude internal in the Data Filters. Without this, every team member’s visits show up as legitimate user behavior — and you’ll wonder why your blog has 200 sessions on Wednesday afternoons.

What about pageviews?

GA4 fires `page_view` automatically. It’s useful for traffic-volume reporting. Don’t treat it as a conversion — pageviews are not value. We report pageviews only in trend context (‘blog traffic up 18% YoY’), never as a primary KPI.

GA4 vs Plausible vs Fathom

Privacy-focused analytics (Plausible, Fathom, Simple Analytics) are easier to use, easier to read, and don’t require consent banners. They lack GA4’s depth on attribution and audience analysis. For most SMB sites, Plausible is plenty — we recommend it to clients who don’t need ads-data flow and want a clean privacy posture. GA4 is the right tool when you’re running Google Ads (the integration is too valuable to give up) or need the BigQuery export.

BigQuery export

GA4 → Admin → BigQuery Links → connect. Every event flows into a BigQuery table. Free up to 1M events per day. Lets you SQL-query your analytics, join with other data, and answer questions GA4’s UI can’t. We use this on two retail clients with substantial volume.

How this lands across FH client work

Every FH client site has GA4 wired with these five events, the three custom dimensions, the two custom Explorations, and the GSC join. The reporting takes 10 minutes a week. The data answers ‘what channels produce leads that close’ — which is the only question SMB analytics needs to answer well. If your GA4 is wired with the defaults and you don’t know what to look at, book a consultation — the configuration is a one-day engagement that ships a reporting setup you’ll actually use.

Answers

Frequently asked questions

What is the data model shift I need to internalize?

Everything is an event, including a pageview. There are no sessions-first reports built around page hits the way there used to be, so measurement starts with deciding which actions matter and firing named events for them. Carrying the old mental model over is what makes the tool feel unusable.

Which conversion events matter for a small business site?

Five: a form submission, a phone-number click, a click on an email address, a booking or scheduling action, and a meaningful engagement such as a quote-tool completion. Those cover how a service business actually gets contacted, and pageviews cover none of them.

Why is tracking a phone click so important?

Because service businesses convert by phone far more than by form, so an analytics setup counting only form submissions systematically undercounts the channels that are working. A tracked tel: click is the cheapest correction available to most small-business measurement.

How should events be fired in a Next.js app?

On the real action, once, from the component that owns it, and server-side for anything that must not be lost to an ad blocker. The failure mode to avoid is firing on render, which produces conversions for people who merely saw the page.

What custom dimensions are worth setting up?

The ones you will segment by: traffic source detail, page type, service line, and any lead-quality flag your form captures. Set them up before you need them, because dimensions only populate from the moment they exist and cannot be backfilled.

Why does internal traffic need filtering?

Because your own team visits far more than any customer, and on a small site that traffic is a large share of the total. Unfiltered, it inflates engagement, distorts conversion rate, and makes every report about your own behaviour rather than your buyers'.

Do pageviews still matter?

As context rather than as the measure. They tell you what is being read; they say nothing about whether anything happened. A report built on pageviews will show a healthy site with no enquiries as a success, which is exactly the misreading conversion events exist to prevent.

Should I use a lighter analytics tool instead?

If your needs are simple traffic understanding and privacy is a priority, the lightweight options are genuinely good and much easier to read. The trade is the ad-platform integration and the depth of event modelling, which matter once you are running paid campaigns.

What does the BigQuery export give me?

The raw event data without sampling or interface limits, which is what you need for real analysis or for joining with your own business data. It is unnecessary for a small site and the right answer the moment someone asks a question the interface cannot answer.

Which reports are actually worth using?

Two: conversions by traffic source, and the path from landing page to conversion. Between them they answer which channels produce business and which pages do the work. The rest of the interface is mostly available for questions most sites never ask.

How do I know my events are configured correctly?

Test each one deliberately, then check the count against reality: form submissions against enquiries in your inbox, phone clicks against calls received. Analytics that has never been checked against a source of truth is a number generator rather than a measurement.

What is the most common setup mistake?

Marking too many things as conversions. When ten events are conversions, the conversion number means nothing and every channel looks successful. Keep it to the actions that genuinely represent business, and track the rest as ordinary events.

Question we did not answer? Ask us directly and we will answer it here.

John Cravey, Founder
Written by
John Cravey
Founder

Founder of Frontend Horizon. Writes most of the long-form work on the FH blog.

Newer post
App Router Patterns That Actually Scale in 2026
Older post
AI-Assisted Content: How to Use Claude for Drafts Without Sounding Like Every Other AI Site
Keep reading

More from the blog

Search Console·10 min

Turn Google Search Console Into an AI Opportunity Finder

You are already ranking on page two for things you never wrote about. An AI agent's job is to find them before you waste effort elsewhere.

Analytics·4 min

Joining GA4 with Search Console: The Reporting View That Tells You What Actually Works

Search Console shows what queries clicked. GA4 shows what queries converted. The join shows what actually matters.

SEO·5 min

Data for SEO: The Numbers That Should Drive Your Strategy and Where to Get Them Free

Most SEO arguments end the moment someone opens the right dataset. The right datasets are mostly free, and most sites have never joined them.