Daily reporting is 90% ritual, 10% signal. For the team at LiveKeeping we built a Google Apps Script pipeline that unifies Kibana, MongoDB, and GA4 into one auto-populated report — 88 mapped rows, delivered at 11 AM with zero manual steps. The automation wasn't the win; the agreed shape of the report was.
Every analytics team has a morning ritual: open 3 tabs, re-copy ranges, fight a formula, paste into Slack. For a growing B2B SaaS that ritual is a hidden cost — invisible in product metrics, present every single day.
The pipeline
- Sources: Kibana (logs), MongoDB (product), Google Analytics (web events)
- A Google Apps Script backend runs on a schedule, pulls each source via APIs, and maps every row into one canonical schema
- Outputs: an auto-populated Sheet at 11 AM (before the morning sync)
What made it stick (and what snuck out)
- The schema came first. We agreed on the 88 rows as a decision document before any script; the script just rendered the decision.
- Vendor lock-in was the risk. Pipelines die when one API changes; each source sat behind a tiny adapter so a Kibana change = one file, not a rewrite.
- 0 manual steps. If a human must touch a pipeline daily, it will be touched differently by three humans.
The result
- 3 sources unified, 88 rows mapped
- 11 AM auto-populate, 0 manual steps
- Team on-call removed; spreadsheet became the single truth for stand-up
What I'd do differently
- Audit the output contract. I'd print the Sheet schema on a wall so users stopped asking "which tab is that again?"
- Version the pipeline. Apps Script projects drift; add a version marker the moment it becomes the team's firehose.
Deep dive here: the daily report automation case study. If you live in metrics-heavy B2B, my compliance gap diagnostic is home data hunting — the same habit of watching the numbers actually flow.