Measurement

Measuring SEO in revenue, not sessions

How to connect query clusters to URLs, URLs to conversions and conversions to revenue in GA4, and build an SEO report a finance team will accept.

Published July 31, 2026 8 min read

Two colleagues celebrating a quarterly organic revenue milestone at a desk

Most SEO reports lead with sessions because sessions are easy to produce and almost always go up. They are also the metric least connected to whether the work was worth paying for.

A report that survives contact with a finance team answers one question: what did organic search contribute, and what did it cost to get it? Here is how to build that.

Separate brand from non-brand first

This is non-negotiable and it is where most reporting fails.

Branded organic traffic — people searching your company name — is largely produced by everything except SEO: paid media, PR, word of mouth, existing customers. Counting it as an SEO result attributes other teams’ work to your channel, and it is the single most common way agency reporting flatters itself.

In Search Console, split queries containing your brand terms (and common misspellings) from everything else. Report the two separately, always. Non-brand organic is the line SEO is actually responsible for.

A programme where non-brand is flat and total organic is up has not worked, whatever the headline chart says.

Map queries to clusters, clusters to URLs

Individual keyword rankings are noisy and mostly meaningless — position fluctuates by device, location and personalisation, and a single term rarely maps to a business outcome.

Clusters are stable and interpretable. Group your query set by intent and subject into clusters, then assign each cluster to the URL or small set of URLs that should own it. This is the same keyword-to-URL map that prevents cannibalization, reused as a reporting structure.

Now every URL belongs to a cluster, and every cluster has a commercial meaning: “comparison pages”, “category: outerwear”, “pricing intent”. That is a language a non-SEO can follow.

Configure GA4 so the question is answerable

GA4’s defaults will not answer this. Three things need to exist:

Conversion events that mean something. Not page_view on a thank-you page — a distinct event per meaningful action, with a value parameter where there is one. For ecommerce, the standard purchase event with actual revenue. For lead generation, a lead event with an assigned value.

An assigned value for non-transactional conversions. If a demo request is worth average deal value × close rate, put that number in. A conversion without a value cannot be summed into anything, and the whole exercise stalls here more often than anywhere else.

A URL-to-cluster dimension. A custom dimension, or a lookup table applied in your reporting layer, mapping every URL to its cluster. Without this you can report by page but not by theme, and by-page reporting on a large site is unreadable.

Join the two data sources

Search Console knows queries and positions but not conversions. GA4 knows conversions but not queries. Neither alone answers the question.

The join is by URL — the landing page is the common key. At small scale a spreadsheet works. Past a few thousand URLs, pull both via API into BigQuery and join there, which also solves Search Console’s 1,000-row export limit and its 16-month retention.

The output is one table: cluster, impressions, clicks, average position, sessions, conversions, revenue. That single table is the report.

Use both attribution views, and say which is which

Last-click attribution undercounts SEO systematically, because organic search frequently starts a journey that converts later through direct or paid.

Report both:

  • Last-click revenue — the conservative number. Use it as the floor.
  • Assisted revenue — where organic appeared anywhere in the path. Use it as the ceiling.

The honest answer is between them. Quoting only the assisted figure overstates the case; quoting only last-click understates it, particularly for B2B with long consideration cycles. Presenting both, labelled, is what makes the report credible rather than promotional.

Set the baseline before work starts

This is the discipline that makes everything else meaningful, and it has to happen in month one.

Record, before anything changes:

  • Non-brand organic sessions, conversions and revenue by cluster
  • Average position per cluster
  • Indexed URL count and index coverage breakdown
  • Core Web Vitals status per template
  • Referring domains and link profile snapshot

Then build a forecast from it: realistic position improvement per cluster, expected click-through at that position, your actual conversion rate, your actual order value. That model is the thing you measure against for the next twelve months.

A forecast agreed in advance turns every subsequent report into a comparison rather than a claim. It also means an agency can be wrong in a way you can see, which is the point.

Account for what you cannot control

Three things will move the numbers regardless of the work:

Seasonality. Compare year-over-year, not month-over-month, wherever you have the history.

Algorithm updates. Google ships several broad core updates a year. Annotate them on every chart so a drop in week three of an update is not misread as a failed deployment.

SERP layout changes. AI summaries, expanded ad blocks and feature additions all reduce clicks at a constant position. Impressions holding while clicks fall is usually this rather than a ranking loss, and the distinction matters.

What the monthly report should contain

  1. Non-brand organic revenue, last-click and assisted, against forecast
  2. Revenue by cluster, with the movers named
  3. What shipped — the actual work, not activity counts
  4. What moved and what did not, with a stated reason for each
  5. What is next, and what changed in the plan
  6. Sessions and positions, as context, at the bottom

Written by the person who did the work. An automated PDF export cannot tell you why something did not move, and that is the sentence the report exists for.


This is the measurement setup we build in month one of every engagement, and the forecast it produces is what the retainer gets judged against. See how engagements run, or send your domain for a free audit that includes a baseline snapshot.

Forecasts are models, not promises — our disclaimer sets out what that means.

Next step

See it on your own URLs

Everything in this guide is part of the audit we run at the start of every engagement. Send your domain and you get the findings, prioritized by effort against revenue impact, inside five business days.

Get my free technical SEO audit

Five business day turnaround. No call required to receive it.