← Chris Bullard
Sample · Root-Cause Diagnostic Report

Why the studio's numbers didn't add up

Client
SweatSet, a boutique fitness studio
Period
First month open, August 2026
Data
Orders, members, check-ins from the booking system
Prepared by
Chris Bullard

These findings are real. At SweatSet they were found and fixed one at a time during the studio's first month, not in a single paid two-week engagement. They are written up here in the format a diagnostic report takes, so you can see what you would get.

01Summary

The studio's dashboard was answering three questions wrong: who is in a trial, how much sold today, and how many members there are. None of these were software bugs anyone would notice from the screen. Each one only showed up when the dashboard's numbers were checked against the raw records underneath.

RankFindingValueEffortStatus
F1Trial end dates wrong for 100 of 111 active trials; 31 paid customers never came in and appeared nowhereHighSmallFixed
F2Evening sales counted on the next dayMediumSmallFixed
F318 staff, vendor, and partner accounts counted as membersMediumSmallFixed

02Findings

Finding F1

Trials that ended before they started

High valueFixed
Question
Who is in their 14-day intro trial right now, when does each trial end, and who needs a follow-up?
Evidence
Comparing each intro purchase against that person's first check-in: 100 of 111 running trials had a different end date than the dashboard showed. Most intro buyers bought before opening day on August 15 and didn't come in until it opened.
Bought July 31, first class August 15.
Dashboard said trial ends: August 14
Actual trial ends: August 29
The same comparison turned up 31 people who had paid for the intro and never checked in at all. They had no end date, so no list included them.
Root cause
The trial clock started on the purchase date. The trial really begins at the first visit.
Fix
The trial clock now starts at first check-in everywhere: the dashboard, the studio's nightly 6 PM email, and the query both read from. The 31 got their own list, "Paid the intro, never checked in," sorted oldest purchase first, since the longer one sits unused, the more likely it becomes a lost customer.
Why it ranks first
These are the warmest leads the studio has. They already paid. The follow-up window is when a trial turns into a membership, and the old dates were telling staff that window had closed before it opened.
Finding F2

Tonight's sales landed on tomorrow

Medium valueFixed
Symptom
Daily sales on the dashboard were off from what the studio expected for the day.
Evidence
The booking system stores every timestamp in UTC, a universal clock four or five hours ahead of Eastern time. The dashboard grouped sales by day without converting to Eastern time, so anything sold in the evening counted toward the next day. Separately, the date picker in the browser asked for tomorrow's data once it was evening on the East Coast.
Root cause
Two places, the reports on the server and the date picker on the page, both treated UTC as local time.
Fix
Every date the dashboard groups or filters on is now converted to Eastern time, with daylight saving handled. The conversion is tested at all four moments a year when the clocks change. Date-only fields like expense dates were deliberately left alone, since there's no time of day to shift.
Finding F3

Members who weren't members

Medium valueFixed
Symptom
Member lists and signup counts were padded with names that weren't customers.
Evidence
18 accounts in the member data belonged to the studio's own front desk, the booking software vendor and related tools, a retail partner, and a test account. All of them were counted in member activity and signups.
Root cause
Nothing separated customer accounts from service and partner accounts.
Fix
Non-customer accounts are excluded from member lists and signup counts by email domain, so new staff or vendor accounts are filtered automatically.

03How each finding was checked

Your two weeks end with a report like this one, built on your data and ranked by what each fix is worth. $4,500 fixed.