Case study 06
17 quarterly reports in a row, each now done in under a day
Since 2022 I've produced recurring reports from two separate LMS (learning management system): Software that runs online courses and training: who can see what, who has enrolled and who has finished.Glossary run for a state education department, and rebuilt how they're made so each takes under a day.
The situation
The department had two programs on two different systems. A quarterly report covered an online learning program for out-of-school-hours care staff, on its own LMS. Monthly reports covered the department's training portal, which ran on a Drupal-based LMS. Each report had to match the look of the last one exactly, with accurate figures.
The monthly reports ran until the training portal moved to a new platform. Its last report covered December 2025, and the training delivery partner now handles reporting on the new system. The quarterly report continues.
When I started, the reports were built by hand in Excel. Each time, someone pasted in the raw data, made tables, applied filters and counted rows. That took two to three days and left room for small errors.
My role
I owned both reports end to end: downloading the raw data from each system, working out the figures, updating the charts and text, and delivering the report on schedule. I also handled the department's one-off data requests.
What I did
Replaced manual counting with prepared formulas
I rebuilt the Excel working files so the counting is done by formulas I'd already written and tested. Each period, I paste in the new export and the figures calculate. They feed the charts, and the charts feed the Word report. Turnaround dropped from two to three days to under a day, for both reports.
Kept the look identical
Each quarterly report starts as a copy of the last one. Only the data, the period labels and the appendix change. The department sees the same structure each time, which makes quarter-on-quarter comparison easy.
Added a reconciliation check
In 2026 I added a simple check to the quarterly report: the previous total plus the accounts added since then must equal the new total. I also cross-checked the figures three ways: in Python, in the spreadsheet formulas, and in an independent pass with an AI (artificial intelligence): Here, AI assistants such as Claude that help with drafting, scripts and checks.Glossary assistant. Then I checked them against the finished Word text and PDF.
That review found small errors that had carried over between versions: a chart with the wrong month labels, a caption number, a state abbreviation and a region count that didn't add up because one category was missing from a formula. All were fixed.
Answered one-off data requests
The department also asked, from time to time, for data the regular reports didn't cover. For each request I downloaded the raw data from the portal's LMS, processed it to answer the exact question, and shared the result with the department, usually through a restricted SharePoint link so it only reached the right people. One request, for training participation across 15 schools going back to 2018, came in one morning and went back the same day.
Wrote the method down
I documented how the quarterly report is built: what each figure means, which columns it comes from, and the order of steps. Anyone picking it up now has a written method, not just last quarter's file.
Results
- 17 consecutive quarterly reports, Q3 2022 to Q3 2026, none missed.
- Monthly reports from the Drupal-based training portal, from late 2022 until it was replaced (last report: December 2025).
- Turnaround cut from 2–3 days to under a day per report.
- One-off data requests answered from the raw data, including a 15-school request covering 2018 onwards, returned the same day.
- A reconciliation check and a written method for the quarterly report.
What I'd do differently
- Build the reconciliation check into the first report. I added it in 2026. If it had been there from the start, the small carried-over errors would have been caught the quarter they appeared.
- Document the method as I go. I wrote it down years in. A one-page method from the first quarter would have made every handover and check easier.
Tools and skills
- Data: Excel formulas, LMS report exports, Python for cross-checks, one-off data requests
- Reporting: Word reports with linked charts, PDF delivery, quarter-on-quarter consistency
- Quality: reconciliation checks, three-way cross-checking
- AI: an AI assistant (Claude) for the independent cross-check, with every figure confirmed by me
What it looked like (recreated)
- LMS export Raw data for the period
- Excel working file Prepared formula blocks
- Charts Fed by the formulas
- Word report Linked charts, same structure
- PDF Delivered on schedule
| Metric | What it counts | Value |
|---|---|---|
| Registered | Accounts created to the end of the period | 2,416 |
| Logged in | Accounts with at least one sign-in | 1,982 |
| Commenced | Accounts that opened at least one module | 1,537 |
| Completed | Accounts that finished every module | 1,104 |
| Period | Previous total | Accounts added since | Expected total | New total | Difference |
|---|---|---|---|---|---|
| Quarter A | 2,180 | 236 | 2,416 | 2,416 | 0, matches |
| Quarter B | 2,416 | 198 | 2,614 | 2,614 | 0, matches |
Client and program names, and some details, are left out. Any visuals are recreations with invented data.