A FinOps Workbook That Tells Finance What It Is Missing
A monthly finance pack fails the moment someone asks which of its numbers are final. ZopNight’s Cost Reports can now build an Excel workbook from your billing data, and its first sheet answers that question before anyone asks it.
Export on Cost Reports → Summary is now a menu. The Standard report (CSV) stays exactly as it was. The Advanced report (Excel workbook) opens a page where you design the file, preview it, and have a download link emailed to you.
A gap-first workbook is a report that opens by stating what its figures are missing. It also refuses to build when it cannot vouch for the data underneath. The rest of this piece shows where each part of that rule lives.
Ready-Made Sheets Start the Pack and a Template Finishes It
You begin from ready-made sheets: cost by service, account, team, region, pricing model or tag, a monthly overview, reserved instance, VM and service views, and charge-level dumps for compute, network, databases and storage. A team sheet is where a showback or chargeback conversation starts. Then you make the pack yours. Rename sheets, reorder them, add columns, group charges into your own buckets, and filter by any field or tag.
Under the hood, the pack is a template. A template holds 1 to 12 sheets, each sheet holds 1 to 4 tables, and each table is a dump, a pivot or a monthly layout. A dump can carry up to 60 columns, drawn from fields such as team, a tag key, one of your own buckets or the month.
You can save the setup to a file and open it again next month. Decoding is strict: an unknown field is rejected with a 400 that names it. A typo in a saved setup therefore fails at once, rather than producing a sheet that quietly lacks a column.
A Preview Catches the Problem Before the Email Does
Export is slow work that happens off screen, so the place to catch a mistake is before it starts. The preview validates your template against your real data. It returns sample rows, totals, caveats and a provenance record of whether billing data exists and which cost source the figures use.
You choose 1 to 24 months. Each month is converted into your organization’s currency at that month’s exchange rate, so a pack that spans a rate change never restates an old month at today’s rate.
Previews are capped at 2 per pod, with a 429 beyond that, and a preview that runs past 2 minutes returns a 422. Those caps keep a heavy template from tying up a pod that other people share.
Refusing Is Safer Than Guessing
Every row below is a decision to say no instead of shipping a plausible file.
| Situation | What happens |
|---|---|
| Request body over 64 KB | Refused with a 413 |
| Unknown field in the template | Refused with a 400 naming the field |
| Modeled rack-rate cost source | Refused with a 409 |
| Tag or team coverage read fails | Refused with a 503 |
| Build fails, returns empty or crashes | An export.failed notification is posted |
| Caller lacks org-wide report:view | Refused before the body is read |
The coverage row is the clearest case. If the workbook carried on after a failed tag read, every team column would show zero, and finance would read zero as unallocated spend rather than as missing data. A 503 forces the question to be asked instead.
The modeled rack-rate source is not billing data, so the workbook declines it. And a build that fails or comes back empty posts an export.failed notification, so a missing email is not the only sign that something went wrong.
The First Sheet Names the Gaps
The file opens on an About this report sheet. It says what the figures are and what they are missing, for example months not yet invoiced or tags still being prepared. The caveats the preview showed travel with the file.
That matters because a workbook is forwarded, pasted into a board deck and reopened months later, long after the preview screen is gone. A caveat that lives only in the app is a caveat the next reader never sees.
This works when the reader opens the first tab. It cannot stop someone copying one sheet’s totals onto a slide. What it does is put the gap one click from the first tab, instead of leaving it as something only the exporter knew.
A Two-Year Pack Is Written Row by Row
A 24 month pack is built to be written as it is read. Data streams from the deduplicated line items with one keyset-paged query for each table and each month, and tags and teams are joined in. The writer streams into a temporary file with a streamed zip, so memory follows the size of a page and not the size of the report.
Two bounds still apply. One sheet is capped at 3 GiB, and Excel’s own cap of 1,048,576 rows per sheet is the ceiling for a dump. The emailed link is valid for one hour, so the file does not sit at a permanent address.
This ships without a migration, a new table, a cron job or an environment variable, and the CSV export is untouched. The MCP server gains preview_cost_workbook and export_cost_workbook, so an assistant follows the same preview-then-export path a person does.
