Agency reporting board that builds each client's Slides deck
See every client's month, numbers and report status on one board, then generate their branded Google Slides deck in a single click.
Build me a monthly reporting studio for my agency, where I can see every client's numbers and report status on one screen and generate the actual Google Slides deck from it. My client roster lives in a config sheet in Google Sheets, so read it with Get Values instead of hardcoding clients. The config tab has one row per client with the client name, their GA4 property id, the file id of their branded template deck in Google Slides, the spreadsheet id of their chart sheet, and the Google Drive folder id where finished decks should go. A second tracking tab in the same spreadsheet is keyed by client and month, with columns for report status (not started, draft, sent), the deck link, and when it was generated.
The main view is a month by month board with a month selector at the top, defaulting to the last complete month, and one card per client below it. Each card shows headline performance pulled live for the selected month with Google Analytics Run Report (GA4): sessions, total users and conversions for that month against the prior period, each with the percent change, plus a compact channel breakdown by default channel group. It also shows a status chip reading not started, draft or sent from the tracking tab, and a link to last month's deck. Fetch each card's metrics independently so the board fills in progressively rather than blocking on the slowest property, and visually flag any client whose headline metrics moved more than the configured threshold, so I can eyeball who had a rough month and needs a careful narrative before I generate anything.
Every card has a Generate report deck button that kicks off a background agent for that client and the selected month. The agent should: pull the month's figures and the channel breakdown from Google Analytics Run Report (GA4) for both the selected month and the prior period; push those figures into the client's chart sheet with Google Sheets Update Values, writing into the exact range the client's existing charts read from; copy the branded template with Google Drive Copy File into the client's reporting folder, named for the client and the reporting month; swap the metric and client placeholders with Google Slides ReplaceAllText, covering the client name, the month label, each headline metric and its change, and the top channel; replace the placeholder chart shapes with the live visuals using Google Slides ReplaceAllShapesWithSheetsChart, pointing at the chart sheet id and chart id from the config row and linking the chart so it stays connected to the sheet; write the commentary slide with Google Slides InsertText; then record the deck link, set the status to draft and stamp the generated time back into the tracking tab with Google Sheets Update Values so the board reflects it.
The commentary matters more than the rest. It should be plain language a client can read, explaining what actually moved and why, and it must explicitly call out month over month swings past a threshold I can set, defaulting to 15 percent, rather than narrating every metric. Use the channel breakdown to attribute the movement where it is honest to do so, for example organic search falling while paid held flat. If nothing crossed the threshold, say the month was steady and note the one or two things worth watching, rather than padding the slide.
Clicking a client opens a detail view with the full metric detail for the selected month, current versus prior with the channel table expanded, and the generated deck's slide thumbnails so I can review before sending without leaving the app. Get the slide object ids with Google Slides Get Slides, then render each one with Google Slides Get Page Thumbnail in slide order, clickable through to the deck itself. The detail view also has a control to flip the status from draft to sent, which writes back to the tracking tab with Google Sheets Update Values and updates the chip on the board.
A few behaviours to bake in. The month selector drives everything, so I can back-fill a period I never reported on or regenerate one after a data correction, and regenerating overwrites the tracked deck link for that client and month. The swing threshold is an editable setting that persists, defaulting to 15 percent. Generation runs in the background so I can keep working, with the card showing a generating state and refreshing itself when the agent finishes, and surfacing a clear error on the card if a step fails. Note in the app's setup guidance that ReplaceAllShapesWithSheetsChart requires the chart to already exist in the linked chart sheet and the template to contain matching placeholder text shapes, so the config sheet must carry the chart sheet id and the template has to be prepared that way first. When a deck already exists and I am only refreshing figures, Google Slides RefreshSheetsChart can update the embedded charts in place instead of copying a new template.
What does this prompt do?
- A month by month board with one card per client, showing this month's sessions, users and conversions against the previous period, a status chip for not started, draft or sent, and a link to last month's deck
- One button per client builds the finished report: your branded template is copied, the numbers and client name drop into place, the charts refresh from that client's chart sheet, and a commentary slide explains in plain language what actually moved
- The commentary only talks about real movement, calling out swings past a threshold you set instead of narrating every metric one by one
- Click into any client to flip through the new deck's slide thumbnails and review it before you send, without leaving the app
- A month selector lets you back-fill an earlier period or regenerate a report you already produced
What do I need to use this?
- A Google account with access to your clients' Google Analytics properties
- A config sheet in Google Sheets listing each client with their analytics property, template deck and chart sheet
- A branded report template in Google Slides containing placeholder text for the client name and metrics, plus placeholder shapes where the charts belong
- A chart sheet per client with the charts already built in it, since the deck embeds the live chart rather than drawing a new one
- A Google Drive folder where the finished decks should land
How can I customize it?
- Change the swing threshold that decides which metrics the commentary calls out, set to 15 percent out of the box
- Add or drop clients by editing rows in the config sheet, with no changes to the app itself
- Choose which headline metrics the board shows and which placeholders in your template they fill
- Point each client at a different template if some accounts have their own branding
FAQs
Does it use our own deck design, or a generic one?
Can I regenerate a report for an earlier month?
Will the commentary just restate every number on the slide?
Do the charts in the deck stay accurate?
Does the app email the deck to the client?
How does it know which clients to show?
Related templates
Generate on-brand ad variants in every format, approve the winners, and keep a ready library you can swap in the day an ad starts to fatigue.
Stage a batch of filings overnight, then approve each completed form from a screenshot before anything is ever submitted.
Search, filter and sort your whole signed contract repository, then have an assistant read any contract and write a plain English brief back onto the row.
Review every conversation Fin closed as resolved, judge which ones actually stuck, and see what the gap is worth against your bill.
Open one screen each Monday to see which upcoming posts still have no image, generate three on-brand options, and file the one you pick.
Work every return, damage and warranty claim in one queue, with the order, the delivery date and a policy-backed recommendation already on screen.
Stop rebuilding the same client deck every month.
Set up your template and config sheet once, then produce every client's monthly report from a single board.