reporting

The self-running weekly report

One threshold, four parts, and a report that sends itself

By Samer Azar, Fractional CFO · 2026-07-09 · 6 min read

Key Takeaway: Starting this Monday, an email will land in my inbox at 8am that reads my numbers, works out what changed, and tells me where I'm needed. The first one arrived this week as a test. I built it out of ordinary parts: one query per source, one history table, one threshold, and a rule that everything ends in a move. Here is the anatomy, the three mistakes I already made, and how to build your own.

Dear reader,

I used to check my numbers the way most founders do.

When something felt wrong.

The problem is timing. By the time something feels wrong, it went wrong weeks ago.

So last week I built the thing I keep telling everyone else to build.

This week, an email landed in my inbox that no human sent.

It had read every number I track. It knew what changed since last week. It flagged the two places that need me, then closed with this week's moves, in order.

Here is the real one, numbers blurred on purpose:

The weekly report email: four sections with deltas and flagged moves. Numbers blurred.

Every Monday at 8am from now on. Four parts: what happened, what changed, what needs a human, what to do next.

Which best describes you?

One click. It tells me who I'm writing for and makes these issues sharper.

Login or Subscribe to participate in polls.

Quick one while you're here: one click tells me who I'm writing for, and it makes these issues sharper.

Part 1: the sources

The reason nobody watches their numbers weekly is boring.

They live in five different systems. Pulling them together loses to whatever is on fire that morning.

So the first component does the chore:

I never log into anything.

Now the first mistake, because I made it within days.

My analytics counter was reporting our own internal test transactions as real events. I only caught it because two sources disagreed about the same number.

The fix became a rule. Rank your sources before the first report:

And pull live at run time, never from a saved export. An export was true the day someone downloaded it, and nobody remembers when that was.

See what I'm building →

Part 2: the history table

Every Monday from now on, the snapshot gets written into a table in a database. One row per week.

Why a table and not a file:

Mistake number two happened right here.

My first test send almost wrote itself into that table as week one. Test data, sitting as the baseline every future week would be measured against. I caught it in the logs and added one guard: test runs never write history.

The table is still empty today. The first real row lands Monday.

And when the report ran with nothing to compare against, it printed a dash where the deltas go. I'd rather see "no data yet" than a number that isn't real.

One more honesty feature: the footer prints how old each source's data is. Stale sources show up at a glance.

Part 3: the $1,000 rule

Twenty highlighted numbers is the same as zero, because you stop reading either way.

So the system gets one threshold. The rule I ran for years as a CFO, now written into code:

Any unexpected variance above $1,000 gets a written explanation of its cause. Below that, nothing.

Your threshold might be $500 or $10,000. The written-explanation part is the part that matters.

Here is why I'm strict about this one. Mistake number three, and it's the one that started this whole build.

A few weeks ago, a report of mine showed four new leads. I was pleased with them.

They did not exist. A tracking bug invented them.

That incident is why this machine treats its own output with suspicion:

Part 4: it ends in a move

The last section of the email is a short list. This week, do these, in this order.

Status flags, a needs-you line, then a numbered list of moves. Recreated with sample data.

The moves section, recreated with sample data so it's readable. Flags first, then the list. A quiet week says so.

That list is the entire reason the report gets read. If a report doesn't tell you what to do, you stop opening it within a month, like every dashboard you have ever been given.

And it watches few numbers. Distill a business to five or ten, watch them weekly, and it gets easier to run. I've seen it at every company I've worked with.

Build it this weekend

Nothing here is exotic. If you can write a script, or sit next to someone who can:

  1. List your sources. Every place a number you care about lives.

  2. Write one script per source, pulling through the API into a single snapshot.

  3. Create one table for history. Run date, source, metric, value. Four columns.

  4. Set one threshold. Anything that moved more than your number gets a line of explanation.

  5. Wire an email template to a scheduled job. Monday, 8am.

The tools are commodities. The four-part structure is the hard part.

I pointed the first one at my own numbers. You debug on yourself before you touch anyone else's numbers.

Now read it again, wearing your founder hat

Your sources are Shopify, the accounting tool, the bank feed, and a supplier-terms email from last year.

Your history table is the gap between money going out and money coming back, week by week.

Your threshold is a customer paying slower than usual, or stock sitting longer than it should.

And your move is the one action this week that frees the most cash.

It's the same architecture pointed at different numbers.

Watching a founder's cash that way, every week, is what I'm building next. It's called Cash Actions, built in the open for founders who run on Shopify, and it opens with a founding group of twenty.

The deposit is refundable if I don't deliver, so the risk stays mine.

This is what Cash Actions will watch for you →

The cash version watches a few of the seven levers that drive a business's cash. I broke all seven down in one long read here, if you want the full map.

Boring until the Monday it isn't

Last week I wrote about the boring reps of teaching an AI to work, and how the payoff arrives all at once. This week it did.

Steal these today, no code required: