One console for every SEO client's search performance

Every client site on one grid with the biggest drops first, plus a one-click monthly recap written up and posted to that client's channel.

App
Google Search ConsoleGoogle DocsSlackMarketingOperationsResearch & MonitoringAI Reports
PromptCreate

Build me a portfolio console for the Search Console properties I manage. I run SEO for a book of client sites, and today the only way to see how they are doing is to log into Google Search Console and switch properties one client at a time, which means I usually find out about a drop when the client emails me about it. I want one screen that shows every property at once, and a way to hand each client a written monthly recap without rebuilding it by hand.

The landing view is a grid of property cards, one card per verified site. Enumerate the properties with List Sites in Google Search Console and build a card for each one. Each card shows the last 28 days of clicks, impressions, CTR and average position, each with its change against the previous 28 days, a sparkline of daily clicks across the window, and a sitemap health chip. Pull the metrics and the daily series with Search Analytics Query, and build the chip from List Sitemaps plus Get Sitemap: pages submitted against pages indexed, plus the error and warning counts. Sort the grid so the biggest clicks drops float to the top, because triage is the reason I am opening this. Put a floor on that sort so a property with almost no impressions cannot top the chart on a percentage swing, and let me re-sort by clicks, impressions or position when I want to browse instead of triage.

Use the site identifier exactly as List Sites returns it, everywhere, and never reconstruct it. Whole-domain properties come back in the sc-domain form and URL prefix properties come back as a full address with protocol and trailing slash, and a near miss does not raise an error, it silently returns empty data, which on this grid would look exactly like a client losing all of their traffic overnight. Treat the returned value as an opaque key: store it as-is, pass it through verbatim, and only URL encode it at the moment it goes into a request path.

Clicking a card opens that client's detail view. It shows top queries and top pages for the window, biggest movers (the queries and pages that gained or lost the most clicks versus the prior window), and country and device splits. Each of those is a Search Analytics Query with different dimensions. Go deeper than the Search Console screen does: the product caps exports at 1,000 rows, while the API returns up to 25,000 rows per call and pages with startRow, so let me page through a long query list rather than a truncated one. Show position and CTR alongside clicks in the query and page tables, because a term that gained impressions but lost position is a different story from one that simply fell out.

Search analytics data lags two to three days and the most recent day or two is incomplete, so end both windows a few days back and derive the current and the prior window from the same date logic. Comparing a partial window against a complete one invents drops that are not real, which is the exact mistake this app exists to prevent. Sitemap counts for submitted, indexed, errors and warnings sometimes come back as strings, so cast them before comparing. A property with no sitemap submitted should show a neutral chip saying so rather than an error, and a property I cannot query because of permissions or quota should mark itself unavailable on its own card while the rest of the grid still loads. Fetch the properties in parallel and cache the grid, since a book of twenty clients means a lot of calls on every open.

Every card has a Write monthly recap button that kicks off a background agent for that one property. The agent pulls that property's last full month and the month before it from Search Console, headline metrics plus top queries, top pages and biggest movers, then writes a recap in plain English aimed at a client rather than an analyst: what moved, the likely reason based on what the query and page data actually shows, and what to do about it next month. It creates the report with Create Document in Google Docs and formats it with Batch Update Document, giving it a heading, the headline numbers and then the written sections, and posts the link into that client's Slack channel with Send a Message alongside a one line summary of the headline movement. The recap must name real numbers, real queries and real pages instead of talking in generalities.

The mapping of which Slack channel belongs to which client has to be editable inside the app, not hardcoded. Give me a settings view where each property row has a channel picker populated with List Channels in Slack, plus a friendly client name so the grid reads as client names rather than raw site addresses, and persist both in the app so they survive between sessions. If a property has no channel mapped yet, the recap button should still write the document and then tell me to map a channel, rather than failing silently or posting into the wrong place.

Store the finished document link on the card along with the month it covers and when it was generated, so anyone on the team can reopen the last recap straight from the grid without hunting through Drive. The button needs a clear pending state while the agent works, the rest of the app has to stay usable while a recap runs, and a failed run needs to say so on the card and let me retry from the same place. Keep the previous recap link visible until a new one replaces it.

What does this prompt do?

  • A card for every client site you have access to, showing the last 28 days of clicks, impressions, click-through rate and average position next to the previous 28 days, so you can see who moved without opening anything
  • Cards sort worst first, so the client whose traffic fell off a cliff is the first thing you see instead of something you hear about on a call
  • Each card carries a small traffic chart and a sitemap health tag showing pages submitted against pages indexed, with any errors or warnings called out
  • Open a client to see their top search terms, top pages, biggest gainers and losers, and where their traffic comes from by country and device
  • Hit Write monthly recap and a background agent compares this month to last month, writes a plain-English explanation of what changed and what to do next, saves it as a document, and posts the link in that client's channel

What do I need to use this?

  • A Google account that has been given access to your clients' sites in Search Console
  • Client sites already verified in Search Console, the app lists whatever your account can see
  • A Google account that can create documents, for the monthly recaps
  • A Slack workspace, ideally with a channel per client

How can I customize it?

  • Change the 28-day comparison window to a week or a full calendar month
  • Set which Slack channel each client's recap goes to, and give each site a friendly client name, from inside the app
  • Adjust how the grid sorts and set a minimum traffic level so very small sites do not top the list on a percentage swing
  • Reword the recap sections so they read in your agency's voice

FAQs

Do I need a separate login for every client?
No. You connect one Google account, and the app shows every client site that account has been given access to in Search Console. Adding a new client is a matter of being granted access, not setting anything up in the app.
Why do the numbers stop a few days short of today?
Google's search data lags two to three days behind, and the most recent day or two is usually incomplete. The app ends its window a few days back and uses the exact same window for both periods, so a comparison never shows a fake drop caused by half a day of missing data.
Does the recap get sent to the client automatically?
It writes a document and posts the link into whichever Slack channel you have mapped for that client. If you want a review step first, map an internal channel, read it there, and forward it yourself. Nothing is emailed to anyone.
What if a client has not submitted a sitemap?
Their card shows a neutral tag saying no sitemap has been submitted rather than an error. The same goes for a site you cannot pull data for, it flags itself on its own card while the rest of the grid loads normally.
Can I see more search terms than Search Console lets me export?
Yes. The client detail view pulls much deeper lists than the Search Console screen allows you to download, so you can scroll a long tail of queries instead of a truncated top slice.
Will this work for both kinds of Search Console property?
Yes. Whole-domain properties and single-address properties are labelled differently by Google, and the app uses whichever label Google returns for each site, so both kinds report correctly.

Related templates

Partner tier review board for quarterly promotion calls

Work every partner tier decision from one board, with the revenue and commission numbers, clear promotion thresholds, and AI review briefs.

Introw
HubSpot
Slack
App
Reconcile partner commissions between HubSpot and Introw

Open one board at month end to find every closed deal missing a commission, every commission with no deal behind it, and every amount that does not add up.

Introw
HubSpot
Slack
App
One control room for every Instantly sending mailbox

See warmup status, daily send volume, and bounce risk for every sending account in one grid, with the riskiest mailboxes floating to the top.

Instantly
Slack
App
Track which pages and brands win your buyers' questions

A board of the questions your buyers ask, showing where your pages land, which competitors show up instead, and what you lost since the last check.

Internet Search
General Input Database
Google Docs
+1
App
Partner payout approval queue with Xero bill handoff

Review Introw partner payouts line by line, approve them from one board, raise the matching bill in Xero, and post every approval to Slack.

Introw
Xero
Slack
App
Benchmark your Instagram account against rival brands

See follower growth, posting cadence, format mix and engagement rate for your brand and every competitor you track, side by side on one board.

Instagram
Google Sheets
Google Docs
App

Stop logging into Search Console one client at a time.

Put every property on one screen, catch the drops before your client does, and hand over a written recap without rebuilding it by hand.