Multi-site GA4 dashboard with one-click client reports

See every Google Analytics property your login can reach in one table, catch broken tracking instantly, and let an agent write each client's monthly report.

App
Google AnalyticsGoogle DocsGoogle SheetsMarketingOperationsAI ReportsContent Generation
PromptCreate

Build me an app that replaces the monthly GA4 reporting sprint I run across several websites. I manage multiple Google Analytics properties, some for my own sites and some for clients, and today reporting means exporting from each property one at a time into fragmented spreadsheets. I want one board that shows the whole portfolio and can write each client's monthly report for me.

The app opens on a portfolio table with one row per GA4 property my login can reach. Discover the properties automatically with the Google Analytics List Account Summaries operation and use the numeric property IDs it returns, so I never type or paste a property ID anywhere. Show the account name alongside the property name, since one login often spans several client accounts. Cache the discovered list so the board loads fast, and give me a refresh action that rediscovers properties when I add or lose access to a client.

For each property, pull last 30 days versus the prior 30 days with Run Report (GA4), for total users, sessions, engagement rate and key events. Run Report accepts two date ranges in a single request and labels each returned row with which range it came from, so fetch both windows in one call per property rather than two. Each row shows the current-period value, the prior-period value and the percent change for each metric. Sort so the biggest decliners are at the top, because the drops are what I need to act on, and let me flip the sort to biggest gainers or alphabetical when I am just looking something up.

Properties that come back with zero rows get pinned above everything else in a distinct check tracking state, styled as a warning rather than as a row of zeros. Silent tracking breakage is the single thing I most need to catch, and a property that has genuinely stopped reporting looks identical to a slow month unless you call it out. Handle the failure cases separately too: if a property returns a permission error or the request fails, mark that row as unavailable with the reason instead of folding it into the check tracking group, so I can tell a lost login from a broken tag.

Clicking a row opens a drill-down panel for that property covering the same selected window. The panel shows channel mix by session default channel group, top landing pages by landing page plus query string, and the device category split, each with sessions and engagement rate and each compared against the prior period the same way the main table is. All three come from Run Report (GA4) scoped to that one property. Let me switch the window for the whole board between last 30 days versus prior 30 and last calendar month versus the month before, and have the drill-down follow whatever the board is set to.

The board is backed by a Google Sheets tracker that I point it at once in settings. Read that sheet with the Sheets values operations, using Batch Get Values so a single call covers the tracker rows and the target column. Every property row on the board shows when its last report went out and links straight to the Google Doc for it, resolved by matching the property ID in the tracker. The sheet also holds a per client monthly traffic target, and the board compares the current window's users against that target, showing progress and whether the property is pacing ahead or behind. Let me edit a target inline on the board and write it back with Update Values, and if the tracker sheet is empty on first use, lay down the header row with Update Values so the columns are right from the start: property ID, property name, month, users, sessions, engagement rate, key events, percent change versus prior period, monthly users target, report date and document link.

Every row also has a Write this month's report button that kicks off a background agent scoped to that single property. The agent runs the period comparison with Run Report (GA4), then the channel report and the landing page report for the same property and window, and reads the tracker with the Sheets values operations so it knows that client's monthly target and what last month's report said. It then writes a client-ready narrative: what moved, why it likely moved based on which channels and landing pages drove the change, how the property is tracking against its target, and what to do next. It should read like something I can send to a client with light editing, not a table dump, and it should name specific channels and pages rather than generic statements about traffic being up or down.

The agent creates the report with Create Document in Google Docs, titled with the client or property name and the month, and then fills it in with Batch Update Document. Give the document real structure: a headline summary at the top, then the numbers for the period, then the channel and landing page analysis, then recommendations. Remember that Docs indexes shift as content is inserted, so build the batch carefully and apply heading and emphasis styling in the same batch rather than in a long chain of one-off edits.

Once the document is written, the agent appends a row to the tracker with Append Values in Google Sheets carrying the property ID and name, the month, the headline numbers, the percent change and the document link. The board picks that row up on its next read, so the property's row immediately shows a fresh report date and a working link. While a report is generating, show that state on the row so I can fire off several at once and watch them land, and surface a clear error on the row if a run fails so I can retry it.

Two practical notes. List Account Summaries lives on the Google Analytics admin host while the reporting operations live on the data host, and the same read-only Analytics access covers both. Google Analytics is read-only in this app, so every write goes to Google Docs or Google Sheets and nothing is ever written back into Analytics. Fan the per-property report calls out with sensible concurrency and back off on rate limit responses, because a portfolio of a dozen or more properties can otherwise hit the Analytics quota on a single board load.

What does this prompt do?

  • Opens on a portfolio table with one row per Google Analytics property your login can reach, found automatically so you never type a property ID
  • Compares the last 30 days against the 30 before them for users, sessions, engagement rate and key events, with percent change and the biggest decliners sorted to the top
  • Pins any property reporting zero traffic to the very top in a check tracking state, so silent tracking breakage is the first thing you see
  • Opens a drill-down for any property with its channel mix, top landing pages and device split for the selected window
  • Gives every row a Write this month's report button that sends a background agent to draft a client-ready Google Doc and log it, with the link and send date shown back on the board

What do I need to use this?

  • A Google account with access to the Google Analytics properties you report on
  • Google Docs and Google Sheets available on that same Google login
  • A Google Sheet to act as the report tracker, blank is fine because the board sets up the columns on first use
  • Optional: a monthly traffic target per client, kept in a column on that tracker sheet

How can I customize it?

  • Change the comparison window, for example last 30 days versus the prior 30, or last calendar month versus the month before
  • Choose which metrics lead the table and how big a drop has to be before a row gets flagged
  • Adjust the tone and section order of the written report, or point the board at a different tracker sheet

FAQs

Do I need Analytics 360 to see all my sites in one place?
No. Combining properties inside Google Analytics itself requires a paid 360 feature, and it can increase your billable event count. This board sidesteps that by querying each property separately and stacking the results into one table, so a standard free Google Analytics account works fine.
Will this work for an agency with several client accounts?
Yes. The board lists every property your Google login can reach, no matter which account or organization it sits under, so one login covers the whole client roster without tab switching.
Does it change anything in my Google Analytics data?
No. The board only reads from Google Analytics. Everything it writes lands in a new Google Doc and in your tracker spreadsheet, never back into Analytics.
How does it know when tracking is broken?
If a property returns no data at all for the reporting window, the board pins it to the top in a check tracking state instead of quietly showing zeros in the middle of a long list, because a site that stopped reporting is usually a tag problem rather than a traffic problem.
Can I edit the report before sending it to a client?
Yes. Each report is written into a normal Google Doc that you can edit, comment on, rename and share like any other document.
How long does a report take to write?
The agent runs in the background, so you can keep browsing other properties while it works. When it finishes, the row updates with the report date and a link straight to the finished document.

Related templates

Prospecting desk that builds account lists from the live web

Stop buying stale lists. Reps run a saved search, work the results like an inbox, and only the accounts they approve ever reach your CRM.

Hyperbrowser
HubSpot
Google Sheets
App
Influencer campaign roster board with AI creator briefs

Drag creators through Sourced to Wrapped on a board grouped by campaign, with audience stats on every card and a one-click brief for each creator.

HypeAuditor
Google Sheets
Notion
App
Morning repricing console for Shopify with margin-safe rules

Pick a repricing rule, send an assistant out to check competitor pages, then approve the new prices that clear your margin floor.

Hyperbrowser
Shopify
Google Sheets
App
Pre-flight bounce check before you launch a cold email sequence

See the projected bounce rate for any outbound send before it goes out, and keep the launch button locked until the list is clean enough to be safe.

Hunter
Google Sheets
App
Per-device electricity cost explorer for your smart home

Pick any date range and see what each device in your home actually cost to run, not just how many kilowatt-hours it used.

Home Assistant
Google Sheets
App
Build a PR media list from real worldwide news coverage

Search three months of global coverage on your topic, rank the outlets actually writing about it, and draft a tailored pitch for each one.

GDELT
Google Sheets
Gmail
App

Stop rebuilding the same traffic report for every client.

Open one board, see every property at a glance, and let an agent write the monthly narrative for you.