python Case study
Google Sheets Reporting Automation
Reports that require someone to run them are reports that stop being run. Putting the output where the team already looks, on a schedule, is what turns a report into something people actually use.
The business problem
The recurring reports were being rebuilt by hand: export, clean, paste, format, share. That is an hour a week that produces slightly different numbers each time, and when the person who does it is busy the report simply does not exist that week. The team then makes decisions on whatever they remember from last month.
What I delivered
- Scheduled extraction and normalisation feeding SEO, product and operations reports directly into Google Sheets.
- A consistent sheet structure, so formulas, filters and charts built on top of a report keep working when the next run lands.
- Normalisation as an explicit step before anything is written, since raw exports from different sources do not agree on formats.
- Read-only reporting flows kept entirely separate from anything that writes to the store.
- Credentials held in server-side environment configuration rather than in the workflow definitions.
Technical approach
- Sheets was chosen because it is where the team already works. A better dashboard nobody opens loses to a spreadsheet they already have bookmarked.
- Writing into a stable structure rather than replacing the sheet is what lets people build their own views on top without those breaking weekly.
- Reporting flows have no write access to commerce data. Separating read from write means a reporting bug can never become an inventory or price incident.
- Scheduling makes the report exist by default. The manual version existed only when somebody had time.
Result and evidence
The recurring reports arrive on their own, in the same shape each time, and the team reads current numbers instead of remembering old ones.
Commercial value
An hour a week recovered is the small part. The real gain is that decisions get made against data that is actually there.
Readable implementation brief
implementation_brief {
project: "Google Sheets Reporting Automation"
destination: "Google Sheets, where the team already works"
cadence: "scheduled; the report exists by default"
pipeline: "extract -> normalise -> write, as separate steps"
structure: "stable sheet shape so downstream views survive"
access: "read-only; reporting can never mutate commerce data"
secrets: "server-side environment config, not in workflows"
}What this project shows
Choosing the tool the team already uses over the technically better one is a judgement I would make again. Adoption is the constraint, not capability.
Keeping reporting strictly read-only is a boundary worth being rigid about. It costs nothing and it removes an entire category of incident.