Analistable

SEO report template for GA4 and Search Console

By the Analistable team · Updated · 3 min read

A free workbook with one sheet for a Search Console pages export, one for a GA4 landing page report and a Report sheet that joins them on URL path. Per page it shows clicks, impressions, CTR, position, sessions, engagement rate and key events, and flags low-CTR pages and pages with traffic but few conversions.

Part of our guide: How to join spreadsheets on a common column

What the template does

Search Console tells you how a page performs in Google; GA4 tells you what visitors did once they arrived. Neither shows both. This template lines the two exports up per page, the manual version of combining Google Analytics and Search Console data. The join itself is a standard lookup, covered in the joining spreadsheets guide.

Sheet-by-sheet guide

Sheets in seo-report-template-ga4-search-console.xlsx
SheetColumnsYou fill in?
InstructionsStep, What to doNo
Search ConsolePage, Clicks, Impressions, Position, PathFirst four columns
GA4Landing page, Sessions, Engaged sessions, Key eventsYes
ReportPage, Clicks, Impressions, CTR, Position, Sessions, Engagement rate, Key events, FlagNo — fully calculated

How to fill it in

  • In Search Console, open Performance → Search results → Pages, set the date range and export. Paste Page, Clicks, Impressions and Position.
  • In GA4, open Reports → Engagement → Landing page for the same dates, and export Landing page, Sessions, Engaged sessions and Key events. Use the Organic Search session default channel group filter if you only want search traffic.
  • The Path column strips the domain from the Search Console URL so it matches GA4's landing page format.
  • Extend the Report rows if you have more than seven pages.

Query strings are a common mismatch: GA4 may show /pricing?ref=nav while Search Console shows /pricing. Remove parameters in GA4 before pasting.

How the formulas work

The Path helper finds the first slash after 'https://' and keeps the rest:

=IFERROR(MID(A2,FIND("/",A2,9),300),A2)

GA4 sessions are summed by path, so duplicate landing page rows still add up:

=SUMIFS(GA4!$B$2:$B$500,GA4!$A$2:$A$500,A2)

The flag checks CTR first, then conversions per session:

=IF(AND(C2>=5000,D2<0.03),"Low CTR",IF(AND(F2>=500,IFERROR(H2/F2,0)<0.01),"Traffic, few conversions","OK"))

Worked example

Report sheet with the sample exports
PageClicksImpr.CTRPos.SessionsEng. rateKey eventsFlag
/820140005.86%3.1260065.0%52OK
/pricing41052007.88%4.298073.5%41OK
/blog/merge-excel-files1250380003.29%6.8140065.0%9Traffic, few conversions
/blog/vlookup-guide960410002.34%8.9105053.3%6Low CTR
/features15039003.85%7.540075.0%9OK
/blog/csv-tips8596000.89%14.211045.5%0Low CTR
/contact406006.67%226088.5%31OK

Two blog posts earn plenty of impressions but few clicks, so their titles are the first thing to test. The merge guide gets traffic but rarely leads to a key event, which points at the page's call to action rather than its ranking. For trends over time, find pages losing clicks by comparing two periods.

Limits and when to move on

Sessions in GA4 and clicks in Search Console are counted differently, so they will never match exactly. The template also covers one site and one date range. For monthly reporting across several sites, connect GA4 and Search Console to Analistable instead: the reports are fetched server-side, loaded into your browser, and you can ask questions such as 'pages with over 5,000 impressions and CTR below 2%' without exporting.

Frequently asked questions

Why are some pages missing GA4 sessions?
The paths don't match exactly — check trailing slashes, query strings and upper case. Or the page had no sessions in the GA4 date range.
Should I use the Organic Search channel only?
For an SEO report, yes: filter the GA4 landing page report to the Organic Search channel so sessions relate to Search Console clicks.
Can I change the flag thresholds?
Yes. Edit 5000 (impressions), 0.03 (CTR), 500 (sessions) and 0.01 (key events per session) in the Flag formula.

Related guides