Case study 01 · Measurement methodology

Recovering 320 hours a month of non-billable time

Non-billable time on client projects looked like it was rising. The measurement was broken. Building an instrument everyone could trust — then redesigning how billing ran — cut delivery-staff non-billable time 63%.

Role

Sole analyst

Org

PE-backed professional-services firm

Timeline

8 months, takeover to measured steady state

Instrument

ERP API → owned data layer → locked metric

−63%

Non-billable time

Logged by delivery staff on client projects — five measured months vs. the last fully-measured month before the billing takeover.

The headline is the least interesting part of this number. The first framing of the metric failed, and the failure is documented below. The version that survived is the one built to be checked: a definition locked before computing, windows committed in advance, and a tie-out against the source system that reproduced every figure to the decimal.

The business question

Leadership believed non-billable time on client projects was high, but nobody could say how high, where it sat, or whether the recently redesigned billing process was actually working. The stakes scale fast: delivery staff log on the order of eleven thousand client-project hours a month, so every percentage point of leakage is a hundred-plus hours of paid time that never reaches an invoice.

The ERP couldn’t answer the question honestly. Billable tags on time entries only became standard partway through the prior year; before that, nearly everything sat in a generic category and non-billable time was systematically under-recorded. Any naive before/after comparison would pit a period that couldn’t see the problem against one that could — and conclude, with full confidence, the wrong thing.

The instrument

The fix started below the reporting layer. Time entries, tasks, projects, and users flow from the ERP’s API into an owned local database, where the metric is defined once and locked: per entry, non-billable hours are logged duration minus billable duration. That is the same concept the ERP’s own reports use — but computed arithmetically from raw fields, it cannot be false-zeroed by a missing tag, which is exactly how the historical record went wrong.

Line chart: non-billable share of logged hours by month, January 2025 to May 2026, all client-project staff. The rate ramps from 1.5% to an 8.0% peak in July 2025 as billable tagging rolls out; August 2025, the first fully-measured month, reads 5.8%; after the September billing takeover it declines to 2.8% by May 2026.
FIG. 01 Non-billable share of logged hours by month — tagging rollout and billing takeover marked

The operational half is a monthly billing review that runs before invoices ship: mislogged time gets reclassified back to billable at the source, so the recovery lands on invoices rather than in a slide deck. Supporting it is a small open-source browser extension that restores a per-entry billable badge to the ERP’s timesheet — billable, non-billable, partial, or locked, visible at a glance without opening the entry, an indicator the ERP itself had removed.

Diagram: a tagged 6-hour entry splits into 4 billable and 2 non-billable hours via logged minus billable duration; an identical untagged entry from before the rollout reads as fully billable, recording the same real gap as zero hours.
FIG. 02 How an entry classifies: logged duration vs. billable duration
Grouped bar chart, tagged era: delivery-staff non-billable hours fall from 509 per month in the August 2025 baseline to 187 across January to May 2026, down 63 percent, while leadership's expected non-billable holds roughly flat at 190 to 203.
FIG. 03 Delivery staff vs. leadership — leakage fell while expected non-billable held flat

Method

The measurement plan was locked before anything was computed: metric definition, population filters, and comparison windows, committed in writing. On those pre-committed windows the claim failed — measured against early history, non-billable time appeared to have gone up. That number was never going to be published as a win, so the next step was to find out whether it was true.

It wasn’t — it was an artifact. The measured non-billable rate ramps in lockstep with the company-wide rollout of billable tagging: what looks like leakage exploding is the measurement turning on. That diagnosis sets the honest boundary for any comparison, and the framing that survives it is narrower and disclosed as adopted after the fact: the last fully-measured month before the billing takeover, against five fully-measured months after.

Two refinements make the number mean what it claims. The population narrows to delivery staff — the people the monthly billing review actually targets — while seven leadership roles whose non-billable time is structurally expected are tracked separately. And the obvious escape hatch is checked: leadership’s non-billable level held flat across the same span, so the drop is a real reduction, not cost-shifting from one population to the other. Delivery-staff non-billable fell from 4.6% of logged hours to 1.8% — about 320 hours a month — and the final month of the window came in at 0.8%, the cleanest on record.

Non-billable hour Per entry: logged duration minus billable duration, floored at zero — the ERP's own non-billable concept, computed from raw fields so a missing tag can't zero it out.
Baseline The last fully-measured month before the billing takeover — complete billable tagging, none of the redesigned process.
Delivery staff Client-facing staff below director level — the population the monthly billing review targets. Leadership's expected non-billable time is measured, reported, and excluded from the headline.
Recovered hour An hour that moved from a non-billable bucket to invoiced billable work — not an hour that vanished from the timesheet.

Measured outcome

−63%

Delivery-staff non-billable time — from 4.6% to 1.8% of logged hours across the measured span.

320 hrs/mo

Cut vs. the pre-takeover baseline — converted to invoiced work, not hidden from the timesheet.

0.8%

The cleanest month on record, logged in the final month of the measured window.

What the number bought: a defensible answer to "did taking over billing actually change anything" — and a mechanism rather than a one-time cleanup, because every monthly invoicing pass now converts mislogged time back to billable before invoices ship. Just as deliberate is what this data does not claim: no improvement against early history (the measurement-era boundary makes that comparison unreliable in both directions), no dollar figure (not yet computed against rates), and no pretense that the baseline is longer than one fully-measured month — a limit owned openly in the method notes.

Appendix — method notes

Data sources. Time entries, tasks, projects, and users pulled from the ERP's API into an owned local database. Every figure re-derives from raw pulls on demand, independent of the ERP's own reporting module.

Population & exclusions. Client projects for the primary operating entity only; internal-overhead projects and deleted entries excluded; company-domain staff only. Seven leadership roles with structurally expected non-billable time are tracked separately rather than dropped.

Verification. Ten stratified entries matched the live system exactly on every field; two full months re-derived from fresh API pulls with zero variance; the ERP's own work report reproduces the baseline month's total.

Known limits. Time logging is self-reported. The baseline is one fully-measured month — earlier months under-recorded non-billable time while tagging rolled out. Results are a snapshot of a live system; unbilled entries remain editable.

← All work

Questions about the method — hello@bryceos.com