A weekly finance report for a subscription business we built and run
The business charges its customers through Stripe. Here is how the weekly report is built, how every number is checked and what we learned.
The starting point.
Weekly, monthly and quarterly plans, each with a free trial, all charged through Stripe.
Paid, still on a trial, cancelled, or declined by the card for one of several reasons.
Subscriptions, invoices and charges all live in Stripe, so the weekly report starts there.
Customer names and emails stay private, out of the program itself.
The report can look at every payment and change none of them.
The report downloads every subscription, invoice and charge, to the last one, and saves them exactly as they came. The tool that writes to Stripe is blocked for it.
Download this week's data and watch every page come in.
It keeps asking for the next page until there is none, so nothing is left out.
It can read payments. It can't refund, charge or edit anything.
- Subscriptionswaiting0 pages
- Invoiceswaiting0 pages
- Chargeswaiting0 pages
Nothing saved yet
Every subscription gets one clear status.
A tested program goes through every customer, leaves out internal and test accounts, joins tries made within an hour into one, and gives each subscription one of 6 statuses, using the card's real decline reason.
Sort this week's customers and see where each one lands.
Several tries within an hour count as one, and test accounts are left out of every total.
The sheet must match the payments to the cent, or it isn't sent.
Two independent sources are compared: the sheet's total and the sum of paid charges in Stripe. If they differ by more than one cent, the program stops with an error and no sheet goes out.
Both sources agree, so the sheet goes out.
Example figures. The check runs every time the sheet is built.
The AI writes the words, never the numbers.
The program saves its results in one small file. The AI reads only that file and fills in a fixed template, so every number in the summary comes from the calculation.
The project in numbers.
Source: the project's code, read on 21 October 2026.
What we learned.
Reading payments was all the report needed, so writing was switched off from the start.
The AI is good with words. Sums belong to a program with tests.
Comparing the sheet with Stripe catches a mistake before anyone reads the report.
A declined card has a specific reason, and the follow-up depends on which one it is.