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.
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?
Why do the numbers stop a few days short of today?
Does the recap get sent to the client automatically?
What if a client has not submitted a sitemap?
Can I see more search terms than Search Console lets me export?
Will this work for both kinds of Search Console property?
Related templates
Search creators for free, shortlist the best with your team, and spend an audit credit only when you decide someone is worth a closer look.
One screen showing invited, completed, and shortlisted counts for every open role, plus the stalled invites that have quietly gone nowhere.
Open one board each morning to see which of your facilities, suppliers and shipping lanes are sitting near trouble in the news right now.
Pick creators from your saved list and see their best and worst Instagram posts side by side, so your brief is built on what actually lands.
One screen where your hiring team watches every unscored candidate, reads the transcript alongside each answer, and scores and shortlists on the spot.
Pick a client and a date range to see organic trends, paid campaigns and every post ranked best to worst, then generate the client report.
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.