What to include in a monthly SEO report
A monthly SEO report should answer four questions in this order: did search traffic go up or down, why, what did we do, and what will we do next. Here are the KPIs the template tracks and where each one comes from.
| KPI | Where to find it in Search Console | Better when |
|---|---|---|
| Clicks | Performance > Search results, Total clicks box | Higher |
| Impressions | Performance > Search results, Total impressions box | Higher |
| CTR | Formula: clicks divided by impressions | Higher |
| Average position | Performance > Search results, Average position box | Lower (1 is the top) |
| Indexed pages | Indexing > Pages, Indexed count | Higher, if the pages are ones you want found |
| Leads from organic (optional) | Your analytics or CRM | Higher |
| Branded vs non-branded clicks | Queries tab, split with the Branded? column | Non-branded higher |
| Queries on page 2 (positions 11 to 20) | Queries tab, counted by formula | Watch it: these are your closest wins |
Google defines CTR as clicks divided by impressions, and average position as the topmost position of your link, averaged across queries (Google: what are impressions, position and clicks).
A year-over-year caveat for 2026 reports. Google says a logging error over-counted impressions in Search Console from May 13, 2025 to April 27, 2026. Clicks were not affected, and Google is not correcting the old data (Google: data anomalies in Search Console). So until May 2027, lead with clicks when you compare a month to the same month last year, and add a note when impressions, CTR or position look worse year over year.
Leave out numbers the client cannot act on. Backlink counts and "domain scores" from third-party tools change for reasons no one controls. If you report them, put them below the Search Console numbers, not above.
How to fill in the template from Search Console
This takes about 30 minutes the first time and 15 after that.
- Open Search Console, pick the property, and go to Performance > Search results.
- Click the date filter, open the Compare tab, choose Custom, and set last full month against the month before (for example 2026-09-01 to 2026-09-30 against 2026-08-01 to 2026-08-31). Google's docs explain that comparing adds a Difference column to the table (Google: advanced filtering and comparison).
- Turn on all four boxes above the chart: Total clicks, Total impressions, Average CTR and Average position. Type the totals into the Summary sheet.
- Click Export (top right) and choose Google Sheets, Excel or CSV. One export holds every tab, including Pages and Queries (Google: export data from a report).
- Paste the Pages tab into "Clicks & impressions by page" and the Queries tab into "Queries", as values only. Mark branded queries Yes.
- Change the comparison to the same month last year and type those totals into the Same month last year column.
- Go to Indexing > Pages and type the Indexed count into Summary.
- Read Wins & losses, write one reason per big move, then fill in Work done, Next month plan and Notes for client.
Wait until about the 3rd of the month before you export. Search Console dates use Pacific Time, and the newest days can still be preliminary (Google: Performance report dimensions).
SEO report example (from the template)
This is the Summary sheet filled in with example data for a made-up store, northwind-outdoors.com, for September 2026:
| KPI | This month | Last month | Same month last year | MoM change | YoY change |
|---|---|---|---|---|---|
| Clicks | 4,150 | 3,700 | 3,180 | +12.2% | +30.5% |
| Impressions | 212,400 | 198,900 | 171,300 | +6.8% | +24.0% |
| CTR | 1.95% | 1.86% | 1.86% | +0.09 pts | +0.10 pts |
| Average position | 18.4 | 19.6 | 22.1 | -1.2 (better) | -3.7 (better) |
| Indexed pages | 412 | 405 | 366 | +1.7% | +12.6% |
| Leads from organic | 38 | 31 | 22 | +22.6% | +72.7% |
And the first lines of Notes for client, written by the formulas from those numbers:
Visits from Google: 4,150 this month, up 12% from last month and up 31% from the same month last year. Average spot in Google moved from 19.6 to 18.4. Lower is better, so this is an improvement. Biggest gain: https://northwind-outdoors.com/tents/ (+250 clicks). Biggest drop: https://northwind-outdoors.com/guides/how-to-choose-a-sleeping-bag/ (-80 clicks).
You then add the "why" in your own words. For example: "The tents page moved from position 12 to just under 10 after we added a comparison table. That put it on page 1 and clicks rose 41%."
Month-over-month vs year-over-year: which to lead with
Lead with month-over-month for momentum and year-over-year for truth. Many sites have seasons. A camping store will always dip after summer, so a September drop against August can be normal. If the same month last year was lower, the business is still growing.
Search Console keeps 16 months of data, which is enough for one year-over-year comparison (Google: debugging search traffic drops). Save each month's report so you never lose the history.
How to explain the numbers to a client
- Say "visits from Google" instead of "organic clicks".
- Use one number per sentence.
- Explain once that a lower position number is better.
- Name the page ("the tents page"), not the URL path.
- If a drop is seasonal, show the same month last year next to it.
- End with what you need from them, with a date.
Limits to know before you send the report
| Limit | What it means for your report | What to do |
|---|---|---|
| 1,000 rows per export | Big sites lose their long tail in the Pages and Queries tabs (Google) | Use the Search Console connector in Looker Studio, the Search Console API, or bulk export to BigQuery |
| Hidden private queries | Totals are higher than the sum of your query rows (Google) | Use the typed totals on Summary, not row sums |
| 16 months of history | Year-over-year works only within that window | Save every monthly report |
| ~ and - values | They export as zeros (Google) | Treat a zero as "not enough data", not as a fall |
Who this template is for
- Agencies sending a monthly report to each client. Duplicate the file per client per month.
- In-house SEO and marketing teams reporting up to a manager or founder.
- Freelancers who want a clear report without paying for a reporting tool.
It is not a technical audit. For a list of site problems, use our SEO audit report template instead.
Sources
All checked October 2026.
- Export formats and the 1,000-row limit: https://support.google.com/webmasters/answer/12919797
- Clicks, impressions, position and CTR definitions: https://support.google.com/webmasters/answer/7042828
- Performance report tabs, private queries, Pacific Time: https://support.google.com/webmasters/answer/17011259
- Comparing date ranges: https://support.google.com/webmasters/answer/17011165
- 16 months of data: https://developers.google.com/search/docs/monitor-debug/debugging-search-traffic-drops
- Page indexing report: https://support.google.com/webmasters/answer/7440203
- Looker Studio connector: https://cloud.google.com/looker/docs/studio/connect-to-search-console
- Search Console API export: https://support.google.com/webmasters/answer/12919192
- Bulk data export to BigQuery: https://support.google.com/webmasters/answer/12918484
How to use this with an AI assistant
If you use ChatGPT, Claude, Cursor or another assistant that supports MCP, connect SEOmatic (https://seomatic.ai/mcp) and paste the prompt below. It reads your real Search Console data and fills the same report.
The same prompt, with each step explained, comes with the template.
Connect SEOmatic: https://seomatic.ai/mcp
Copy and paste this prompt
Replace mysite.com with your site.
Use SEOmatic to build my monthly SEO report for mysite.com, laid out like the SEOmatic SEO report template.
1. Run connect_seomatic so I can sign in and connect Google Search Console.
2. Summary: use gsc_performance with action trend for the last 60 days. Add up clicks and impressions for the last 30 days and for the 30 days before, and work out CTR as clicks divided by impressions for each. If no tool gives me average position for both periods, say so and tell me to copy it from Search Console. Remember that for position a lower number is better.
3. Pages: use gsc_performance with action top_pages for the last 30 days. Show clicks, impressions, CTR and position for the top 20 pages.
4. Queries: use gsc_performance with action top_queries for the same period. Then use gsc_insights with action brand_split, with my brand terms "mybrand", and show branded vs non-branded clicks.
5. Wins and losses: use gsc_performance with action compare_periods (dimension page, then dimension query) to compare the last 30 days with the 30 days before. From the results, list the top 5 page and query gains and the top 5 drops by click change. For each, suggest one plain reason I can check.
6. Trend: from the daily trend (run it for 90 days if needed), tell me if any drop looks sudden or seasonal.
7. Work done: use task_manage with action list and show what SEOmatic changed this period, with dates and status.
8. Next month plan: use gsc_insights with action ctr_outliers and strategy_insights with action strategy. Pick 3 tasks, each with the number that justifies it (for example "11,200 impressions at position 6.4 but CTR 0.5%").
9. Draft those 3 tasks for my approval with task_manage action create, then show them with show_approval_cards. Do not publish anything.
10. Notes for client: write 5 short sentences in plain words: the month in one sentence, what went up and why, what went down and why, what we did, and what we will do next. Say "visits from Google" instead of "organic clicks".
Two numbers these tools do not give: year-over-year totals and the indexed page count. Tell me where to copy them in Search Console (Performance > Search results compared with the same month last year, and Indexing > Pages).Tools this prompt uses
| MCP tool and action | What it does |
|---|---|
| connect_seomatic | Shows the sign-in prompt. After it, the tools below are available |
| gsc_performance, action compare_periods | Current period against the preceding period of the same length. Biggest winners and losers by click change, by page or by query |
| gsc_performance, action top_pages | Top pages by clicks, with impressions, CTR and position |
| gsc_performance, action top_queries | Queries from Search Console |
| gsc_performance, action trend | Daily clicks and impressions (used for the Summary totals) |
| gsc_insights, action brand_split | Brand vs non-brand clicks for the brand terms you give |
| gsc_insights, action ctr_outliers | Pages with CTR far below what their position would suggest (brand excluded) |
| strategy_insights, action strategy | SEOmatic's current strategy read for the site |
| task_manage, action list | Tasks SEOmatic has proposed or run, with status |
| task_manage, action create | Stages tasks as proposals. It never publishes |
| show_approval_cards | Shows Approve and Dismiss cards in the chat |
What this prompt cannot do
- Year-over-year: compare_periods only compares with the period right before. Export the same month last year from Search Console by hand.
- Indexed pages: no tool reads the Page indexing report count. Copy it from Indexing > Pages.
- Calendar months: the tools take a number of days. For an exact calendar month, use the template with a Search Console export.
- Leads and sales: these live in your analytics or CRM, not in Search Console.
Template and how-to: https://seomatic.ai/?utm_source=asset&utm_campaign=monthly-seo-report-template
Go deeper
Sources (11)
- support.google.com/webmasters/answer/12919797
- support.google.com/webmasters/answer/7042828
- support.google.com/webmasters/answer/17011259
- support.google.com/webmasters/answer/17011165
- support.google.com/webmasters/answer/7576553
- developers.google.com/search/docs/monitor-debug/debugging-search-traffic-drops
- support.google.com/webmasters/answer/7440203
- developers.google.com/search/blog/2022/10/performance-data-deep-dive
- cloud.google.com/looker/docs/studio/connect-to-search-console
- support.google.com/webmasters/answer/12919192
- support.google.com/webmasters/answer/12918484


