Skip to main content
GullySystem
A practical guide

How to set up a monthly management report that sends itself

Ganesh HSStrategy and Technology, GullySystem
Practical advice · 6 min read

In this guide 6 sections
The short answer

To automate a monthly management report, list the pages of the pack and name one agreed source for each figure. Build the queries, then schedule the run after close. Set recipients, choose email or WhatsApp delivery, and add a failure alert with a manual fallback.

Decide what the pack contains

Open last month’s pack and mark every page. Ask who reads it and which decision it feeds. A page that nobody acts on, even if it took the accountant two days of copying from the stock register, can go. Cut it without regret. Interview each reader for ten minutes and ask which single figure they look at first, since that answer usually decides the order of the pages.

A typical pack runs to six or eight pages. Think of profit and loss against budget with accruals, receivables ageing, sales by product and region, stock value, and one page of operating counts. Resist adding a page for every new request, and swap an old page out when a new one comes in so the pack stays readable on a phone.

Write the page list in order. Then freeze it. Changes need a named approver. It becomes the specification and stops the pack growing every month.

  • Profit and loss against budget and prior year
  • Cash position and receivables ageing
  • Sales by product, region and salesperson
  • Stock or work-in-progress value
  • Headcount, overtime and machine downtime counts

Fix one source for every figure

Revenue may sit in the accounting ledger, the billing module and a salesperson’s spreadsheet, and all three disagree on the total for the same month. Pick one: the ledger export, the billing table or the CRM. Write beside each figure its system, table and definition, for example net invoiced sales excluding returns, by invoice date. Record the filters too. Are intercompany sales removed, are credit notes netted, which exchange rate applies? Those small choices move totals more than any formula does.

This sheet settles arguments early. Keep it short. When the managing director asks why the pack differs from the sales report, the answer is already on paper, with a system, a table and a definition beside it.

Manual inputs need an owner as well. If the budget lives in an Excel file, name who uploads it and by which working day, and lock that file once the version is approved. A shared spreadsheet with a locked upload date, or a simple form that writes to a table, is far safer than an email attachment that someone pastes in.

Build, schedule and test the run

Write each figure as a saved SQL query or a model in your reporting tool, then lay the pages out as a PDF template or a dashboard export. Keep the layout identical every month. Readers find things fast. Labels never move. Tools such as Power BI, Metabase or a plain Python script with a PDF library can all produce the same pack, so choose the one your team can maintain.

Schedule the run for the working day after close. Not the first of the month. A job that fires before posting is finished will deliver half-true numbers on time. Add retries with a pause between them, because a source database that is busy at six in the morning is often free by seven.

Run it beside the manual pack for two months, compare every figure, and fix each difference by changing a definition or a query, never by editing the file.

  • Trigger tied to the close flag, not only the calendar
  • Run log with start time, end time and row counts
  • Totals tested against the closed trial balance
  • One PDF template reused every month
  • Test sends to your own address first

Set recipients and delivery

Keep recipient lists in a table rather than inside the job, so directors get the full pack and branch managers get only their own region. Adding or removing a person needs no code change. Simple. Store the recipient table with columns for name, address, WhatsApp number, region, pages allowed and an active flag, and review it each quarter.

Email with a PDF suits most boards. WhatsApp suits owners who read on the move, where a short message with headline figures and a login-protected link beats a forty-page attachment. Sending through your own authenticated mail server, with a proper sender domain, keeps the pack out of spam folders and gives you delivery receipts to check.

Open the message with one line. Name each file by month and year. Sales against budget and cash on hand will do. The reader gets the point before opening anything.

Plan for the run that fails

Sooner or later an API token expires or a database server is down at two in the morning, and nobody is awake to restart it. The job should stop, write the reason to a log and alert a named person, and it must never send a partial pack to the board. Alerts should say what failed, which step it failed in and when it last ran successfully, so the person on call can act without opening the logs.

Keep a manual fallback as a short checklist: fix the cause, rerun, or export the key pages by hand. Note who may approve a late send. Name one person. Practise the fallback once while nothing is wrong. A checklist nobody has tried is only a hope, and cron will not warn you about a silent timeout.

This month, produce the pack by the old route and the new one together, and list every gap between them.

Monthly pack build sheet

Each page of the pack gets its own row in this build sheet. Columns give the page name, reader, figure, source system, table, definition, owner, delivery channel and the day it is ready. A bottom block records the schedule, the failure contact and the manual fallback steps.

Open a blank worksheet to print

Questions owners ask

When should an automated monthly report run?

After the books are closed and checked, usually a day or two into the month. Tie the trigger to a close flag so the pack never goes out on unfinished data.

Can the report be sent on WhatsApp?

Yes. Send a short summary with a login-protected link to the full pack. Large files and sensitive detail are better kept behind that link than attached.

What if one source system is down at run time?

The job should stop, log the cause and alert a named person. A partial pack sent as if complete does more harm than a late one.

How do we stop people disputing the numbers?

Write the source and definition for each figure and share the sheet. A fixed definition per figure turns most disputes into a quick lookup.

Browse all guidesBack to top ↑
Next step

Have a specific situation to work through?

This article covers the general case. Tell us what you’re actually dealing with and we’ll respond directly.

Share Your Requirements