Skip to content

Report tracking SEO workflow

A monthly client SEO report stitched from GSC keyword + page rankings, GA4 organic traffic, and internal + external article tracking – auto-built in a Google Doc.

What this does

Once a month the workflow pulls the data your client SEO report needs – top keywords from Google Search Console, top landing pages, organic traffic from Google Analytics, internal article performance, external mentions / backlinks tracked in a sheet – and assembles it into a Google Doc you can hand to the client.

About 10 minutes from "run workflow" to "report ready to share". Down from 6-12 hours of manual exporting, formatting, and table-building per client per month.

The problem this solves

Client SEO reports are the single biggest time sink in an agency or fractional SEO operation. You know what goes in them – top keywords, top pages, traffic, the new content you published, the backlinks you earned. The data lives in 4-5 different tools. The report has to look like the same report you sent last month, just with new numbers.

The work breaks down into hours that nobody enjoys:

  • Open GSC. Set the date range to last month. Export keyword performance to CSV. Format the numbers (commas vs dots, position rounding). Paste into the report doc.
  • Repeat for page-level performance.
  • Open GA4. Same dance for organic traffic.
  • Open the article-tracking sheet. Manually look up which articles were published last month. Copy the URLs. Manually check their performance.
  • Open the backlinks tracker. Copy the new links. Paste into the report.
  • Format everything to match the template the client expects.

That's 6-12 hours per client per month if you're slow, 3-5 hours if you're fast. For an agency with 8 retainers, that's a full week burned every month on copy-paste work.

This workflow does every step except final review. You hit "run", the workflow pulls all 5 sections, formats everything into the layout your template expects, drops it into a Google Doc named with the month + client. You open the doc, skim for anything weird, share with the client. The first time it works, an entire week comes back.

What you put in

A one-time setup per client:

  • Google Doc template that has the layout your clients expect (sections, table styles, headings). The workflow writes into copies of this template.
  • GSC property (service account access)
  • GA4 property (same service account)
  • Google Sheet for tracking internal articles (URL, title, publish date, target keyword) and another for external articles / backlinks
  • Date ranges – default is "previous calendar month", but configurable per run

Per-month inputs: none. The workflow runs from the previous-month default. You can override if you need a different window.

What you get out

Each run produces:

  • Google Doc in your Drive, named <Client> – SEO Report – <Month> <Year>, that contains:
    • Keyword performance section – top 20-50 keywords by clicks, with position + click + impression + CTR data, formatted as a table
    • Page performance section – top 20-50 landing pages, same shape
    • Organic traffic section – month-over-month organic sessions, click-through rates, impressions trend
    • Internal articles section – every article published in the report window, with its month-to-date performance numbers
    • External articles section – every backlink / external mention earned in the window, with the linking page's authority data
  • The doc is plain Google Docs, editable, ready to share with the client OR convert to a PDF / brand-template PowerPoint

You review the doc, add 2-3 sentences of commentary at the top (the part the workflow can't write), and send to the client. The whole review-and-send loop is 15-30 minutes per client per month.

How long per report

Workflow time: 8-12 minutes per client. Most of it is sequential Google Sheets writes (Sheets API is slow when you're writing 100+ rows).

Your time: 15-30 minutes to review the doc, write the commentary, and send.

End-to-end per client per month: about 45 minutes of human time. Down from 3-12 hours. For an agency with 8 retainers, that's 24-95 hours saved per month.

When this is a good fit

  • You run monthly SEO reports for clients. The workflow is built for that cadence – weekly is overkill, quarterly is too long to remember tuning details.
  • You have a stable report template that clients are happy with. Without one, customizing the workflow to N different templates is wasted setup work.
  • You have at least 3 retainers. Below that, the manual version is faster than the setup.
  • You're willing to write the commentary yourself. The workflow does the data. It doesn't write "here's what we did this month and what we recommend next month" – that's the part you (or your strategist) needs to write.

When this isn't a good fit

  • You don't run monthly reports. The whole shape of the workflow assumes monthly.
  • You report on paid media or other non-organic channels in the same document. The workflow is GSC + GA4 only. Paid media reporting is a different add-on (GSheets pulls from Google Ads / LinkedIn Ads APIs – we can wire it as a separate phase).
  • You use a custom non-Google-Docs reporting tool (Looker Studio, Whatagraph, AgencyAnalytics). This workflow writes to Google Docs. The data-pull phases are reusable in those tools, but the doc-writing phases aren't.
  • You want the workflow to generate the commentary with AI. We've tried this. AI-generated SEO commentary reads like AI-generated SEO commentary, and clients notice. Keep the data automated, keep the commentary human.

What's actually under the hood

The workflow runs on n8n. 30+ nodes organized into 5 parallel report sections:

  1. Trigger – manual or scheduled monthly
  2. Keyword Ranking section – GSC API for the previous month's top queries, format dots-to-commas for European number formatting, write to a table in the doc
  3. Page Ranking section – GSC API for the previous month's top pages, same format/write pattern
  4. Organic Reach section – GA4 API for sessions, click-through rates, impressions, written to a separate doc section
  5. Internal Articles section – read the article-tracking sheet, filter to articles published in the report window, look up each one's clicks/impressions/position from GSC, format and write
  6. External Articles section – read the backlinks sheet, filter to links earned in the window, fetch each linking page (HTTP request), extract the link's destination + text + rel attribute, format and write

The reason this is 30+ nodes is the formatting work. Each report section has its own data shape (keyword tables look different from page tables look different from external-link tables). Each one needs:

  • Number formatting (rounding positions, formatting CTRs as percentages, formatting impressions with comma separators)
  • Table assembly (header row, data rows, alignment hints for Google Docs)
  • Section header writing (so the doc reads like a report, not a data dump)

Most of the time spent during setup is matching the formatting to your existing report template so the output is indistinguishable from what you used to send by hand.

What you own at handover

  • The full n8n workflow file
  • The Google Doc template the workflow writes into (one per client, OR a master template with placeholders the workflow fills)
  • The Google Sheet templates for internal articles + external articles / backlinks
  • A setup doc covering service account creation, GSC permission grant, GA4 permission grant, Doc template setup
  • A runbook for the common errors – mainly "Doc template has been edited and the workflow can't find its anchor section anymore"
  • A Loom showing one full run end-to-end
  • Optional add-on: PDF export + automated client email delivery (the report goes to the client without you opening the Doc)
  • Optional add-on: a Looker Studio dashboard fed by the same Sheets, for clients who'd rather have a live dashboard than a monthly Doc

Why I can help

The mechanics – GSC API + GA4 API + Google Docs API + Sheets API + a templating layer – are well-known. The work that earns its keep is the formatting tuning:

  • Matching the client's existing template down to the table styles, the rounding conventions, the column ordering. Clients notice when their monthly report suddenly looks slightly different. The workflow has to produce something visually identical to what you were sending by hand.
  • Number formatting – European vs US conventions (dots vs commas), rounding rules (positions to 1 decimal, CTRs to 2), what to show when GSC returns null (blank vs "—" vs "0"). Wrong choices here look unprofessional.
  • The internal vs external article split – tracking who's writing what, what got published, what links got earned. This logic is the part that varies most across agencies, and the workflow's flexibility is in how the tracking sheets are structured.

I built this after running 6 monthly retainers by hand for two years and finally getting tired of the same copy-paste work. The current version is the third rewrite – the first two were too rigid to handle real client variation, this version handles variation cleanly through the Doc-template + tracking-sheet approach.

What it costs to run

Per run: free. GSC, GA4, Google Docs, Google Sheets APIs are all free at the volumes a small-to-mid agency runs. n8n hosting: about $5-15/month depending on workflow volume.

Build cost: 1-2 weeks of my time. Most of it is matching the formatting to your existing report template. If you have multiple templates (e.g. enterprise client gets a different layout from a startup client), each template is +2-3 days of work.

How to start

Book a call. Bring one filled-in monthly report you've sent recently. We'll match the workflow's output to that template's layout during setup. First report goes out within 14 days.

Want this built for your team?

Book a call and walk through what we'd adapt for your stack.