Home About Experience Projects Case studies Resources Articles Briefs Playbook Tools FAQ How we start Security Get in touch

Case study 11

Reports nobody has to assemble

Confidential engagement, described by its shape. Every image and file on this page is rebuilt with invented data.

All case studies · 11 of 15

Case study 11

Reports nobody has to assemble

WhereA small professional-services team running a few dozen client accounts; details changed
RoleRemote operations and project management; built and runs the scheduled reports
ScaleEvery live client on one page weekly; one digest per person; an hours ledger for every client
StackSpreadsheets, scripts, a shared task tracker, email

Leadership used to wait for someone to build the week. Now a client health page arrives every Friday on fixed written rules, each person gets their own digest and priorities email, reminders stop only when the work is closed, and client hours land in a ledger that checks itself.

Every weekly view was assembled by hand. Client status came from reading boards one by one. Client hours were reconciled from monthly exports reshaped in spreadsheets. Nobody's week lived in one place, so people opened the tracker to find out what was theirs.

I replaced assembly with four scheduled jobs.

The client health page. A script pulls every client board, measures overdue tasks, open blockers and days since the last client touch, and applies fixed rating rules written down and approved by leadership. A small override sheet can force a rating, but only with a one-line driver. Each row shows client, rating as color plus word, the rule that fired, next step, owner and an ask for leadership. Every reference is linked: tasks, files, meeting notes, emails. Red sorts first. A preview mode sends to me only; the live page goes out on Friday afternoon.

A digest and priorities email per person. Sunday evening covers the week ahead, Friday afternoon the week in review. Sections are overdue, due this week, waiting on others and recently completed, with a link on each section to a tracker view the script refreshes every run. People with nothing due get nothing.

The reminder engine. Each morning, open tasks carrying a reminder tag and due today or earlier email their owner, one line per task with a link. Closing the task is the only off switch. There is no snooze.

The client hours ledger. A weekly pull groups hours by client into a block per client: purchased hours, flat-fee work that is tracked but never deducted, hours used, balance. New clients get a block automatically. A check row reconciles hours pulled against hours in the blocks and must read zero. Before a balance on a client's hours task changes, the old figure is logged as a comment. It ran beside the manual method for the first weeks until the two agreed.

Weekly Client Health page (demo): red and amber sort first

ClientRatingDriver
DolomiteRedApprover unresponsive 12 days; two deliverables blocked
IronbarkRedClient approver blocking 9 days; two deliverables past due
BasaltAmberTwo invoices unpaid past 30 days
GarnetAmberThree out-of-scope requests this week
KaolinAmberNew point of contact
AlderGreenOn schedule; cadence holding
Red if: blocked or overdue >5 business days, hours exhausted mid-cycle, invoice >60 days, or >10 business days unresponsive

Client Hours Ledger, OVERVIEW tab (hourly blocks)

ClientBoughtUsedLeft
Alder12047.5072.50
Basalt8019.7560.25
Dolomite10047.0053.00
Fernworth4016.2523.75
Juniper & Co5030.7519.25
Total (8)615223.50391.50
Check (= 0)0
Used =SUMIF(DETAIL!$B$2:$B$121,A6,DETAIL!$E$2:$E$121)   Balance =C6-D6   Check =SUMPRODUCT(C6:C13-D6:D13-E6:E13)
Weekly Client Health page with one row per client: rating badge, driver, next step, owner and partner ask
The Friday page: rating, driver, next step, owner, ask
Weekly priorities email for one person showing overdue, due this week and waiting counts
One digest per person, week ahead or week in review
Client Hours Ledger overview tab with purchased, used and balance hours per client and a check row reading zero
Hours ledger overview; the check row must read zero

Click any image to see it full size. Every file here is rebuilt with invented data.

The results, in bands. The weekly client health page became a scheduled send, and my part shrank to review. Monthly reshaping of hours became an automated weekly pull. Each person's week now arrives in their inbox. Time saved was not formally measured.

What went wrong
  1. A test or live switch kept flipping whenever code was pasted in. I moved it into a stored setting outside the code, so a paste cannot change who receives a send.
  2. My confirmation replies cluttered leadership's inboxes. I stopped sending them. Nothing urgent goes in a scheduled report; urgent asks go separately with a clear subject line.
  3. I did not measure time before and after. The claim stays at "assembly replaced by review" until I can show the numbers.