Cases/ Healthcare/ Independent practice

The schedule was full. The month still came up short

Production to collections, every step is a named measure

Six operatories, two doctors, three hygienists. One screen now shows where the money goes between work performed and money deposited, which chair hours sit empty every week, and which accepted treatment never made it onto the schedule.

PMS exports (ledger, procedures, adjustments, payments, schedule) through Power Query into Power Pivot. Net collection rate, adjustment rate by plan, production per chair hour and pending treatment are all measures over one date table.

Production vs collections Chair utilization Unscheduled treatment Open Dental / Dentrix export Power Query · Power Pivot
Industry Independent general dental practice · 2 doctors, 3 hygienists, 6 operatories · Mixed PPO and fee for service, no DSO affiliation
Driver's seat What the owner opens on the first of the month, which numbers moved, what the team does differently. The engineering side is behind the toggle in the top right corner.
Under the hood Architecture, the collection bridge, key DAX measures. To see it through the owner's eyes, use the toggle in the top right corner.
Production to cash itemized ▲ was two unrelated numbers
Pending treatment a call list ▲ was invisible
Monthly reporting one click ▼ was 2 days of exports
First dashboard 3 weeks from kickoff

01How it worked before us

The practice was healthy. Good team, loyal patients, twenty years in the same building. The owner's problem was not the business, it was the instruments: she was flying on numbers she did not trust.

Before our work:

An independent two doctor practice on a standard PMS with a clearinghouse and an outside accountant. Nothing was missing from the software; the problem was that every number lived in its own report with its own date logic. Specifically:

Strategic backdrop. Private equity backed groups keep consolidating practices, and they arrive with exactly this reporting as standard equipment. An independent practice that can see its own numbers competes on very different footing.

02What we built

No software change. The practice kept its PMS, its clearinghouse and its accountant. We used the exports the software already produces and built a model that refreshes on one click.

PMS exportledger, procedures
Claimspayments, adjustments
Scheduleappointments, providers
Modelone monthly picture

The bridge from production to cash

This is the first thing the owner asked for and the thing that changed the most. Every step between work performed at full fee and money in the account is a named line with a number attached.

Production to collections · where the money goes synthetic data · structure mirrors the production model
Contractual adjustments are the difference between your fee schedule and what each plan allows
Period

Two lines usually surprise people. Contractual adjustments are almost always larger than the team assumes, and once they are broken out by plan the conversation about which contracts to renegotiate becomes concrete instead of theoretical. Insurance still in aging is money already earned and sitting somewhere; when it is a visible number rather than a stack of claims, somebody owns it.

Why the write-off line matters so much. A practice can run a 96% collection rate and still leave serious money behind, because the number it measures itself against was already reduced by adjustments nobody examined.

Chairs are the constraint, so measure the chairs

A dental practice sells chair time. The model reports utilization the way a factory would: share of available chair time actually booked, by day and hour.

Operatory utilization by day and hour share of available chair time booked
Synthetic data · six operatories, standard opening hours
85% and above 60 to 85% below 60% soft spots are where recall calls should point

The pattern is typical and it is actionable in a way a monthly average never is. Friday afternoons and the first hour of Monday are structurally soft; midweek mornings are full. Knowing that turns a recall call from "when can you come in" into "we have Thursday at 8 or Friday at 3", and the soft slots fill first.

Paired with utilization is production per chair hour, the number that lets you compare a hygiene column to a doctor column honestly, and one provider to another without arguing about who works harder.

Treatment that was accepted and never scheduled

This is usually the largest recoverable number in the practice and it is invisible by default. The model cross references diagnosed procedures against completed and scheduled ones, and produces a working list.

Unscheduled treatment and overdue recall patients and providers are masked
Synthetic data · priority rises when unused annual benefit is about to reset
Patient Diagnosed treatment Days pending Value Benefit left Priority

The benefit column is what makes this list work in practice. A patient with $900 of unused annual benefit and a crown pending in November is a genuinely useful phone call, for them and for the practice. In January the same call is a much harder conversation, so the list sorts itself accordingly.

The quiet finding. Rebook rate on the provider tab is usually the surprise. A provider whose patients leave without the next appointment on the books generates rework for the front desk every single day, and the effect compounds across a year of hygiene columns.

What it made possible

Architecture

Data sources
Store
Excel model
PMS · proceduresdiagnosed, scheduled, completed, per provider and operatory
PMS · ledgercharges, payments, adjustments with posting dates
Clearinghouse · claimssubmitted, paid, denied, aging buckets
PMS · scheduleappointments by operatory and time slot
Google Sheets (inputs)fee schedule · plan participation · operatory hours · recall intervals
Staged CSV exports scheduled PMS reports
dropped to one folder
Google Sheets straight
into Power Query
Power Query normalize dates, provider and plan keys
Power Pivot one date table · procedure, ledger, claim, schedule facts

The one structural decision that makes everything else possible: a single date table, with every fact table joined to it by its own business date. Production hangs off procedure date, payments off deposit date, adjustments off posting date. Only then can the bridge be a single row of measures in one context.

Net collection rate, with the denominator in the open

The rate itself is trivial. The point is to compute and display the write-off separately, so the denominator is never quietly assumed:

-- Net collection rate: of what was collectible, how much we actually got
VAR GrossProduction = SUM( 'Procedures'[FeeAtFullSchedule] )
VAR ContractualAdj  = SUM( 'Adjustments'[ContractualWriteOff] )
VAR NetProduction   = GrossProduction - ContractualAdj
VAR Collected       = SUM( 'Payments'[Amount] )
RETURN
    DIVIDE( Collected, NetProduction )

Alongside it the adjustment rate against gross production, sliceable by plan. That single cut is what turns a payer conversation into a negotiation:

-- Adjustment rate against gross production (slice by plan)
DIVIDE(
    SUM( 'Adjustments'[ContractualWriteOff] ),
    SUM( 'Procedures'[FeeAtFullSchedule] )
)

Capacity as a denominator

Available chair time is not in any export, it is a parameter: operatories multiplied by open hours in the period, from the Google Sheets input. Utilization and production per chair hour both hang off it:

-- Available chair hours in the current context
VAR OpenHours  = SUMX( 'Calendar', RELATED( 'Hours'[OpenHoursOnDay] ) )
VAR Operatories = SELECTEDVALUE( 'Settings'[OperatoryCount] )
RETURN OpenHours * Operatories
-- Production per chair hour (works for a doctor or a hygiene column)
DIVIDE(
    [Gross production],
    SUMX( 'Appointments', 'Appointments'[ScheduledMinutes] ) / 60
)

Utilization uses booked minutes over available minutes in the same context, which is what lets the heatmap resolve to a single day and hour without a separate report.

Unscheduled treatment: a join, not a report

The recoverable list is the difference between two states of the same procedure table. Diagnosed, minus anything completed or currently on the schedule:

-- Value of treatment diagnosed and neither completed nor scheduled
CALCULATE(
    SUM( 'Procedures'[FeeAtFullSchedule] ),
    'Procedures'[Status] = "Diagnosed",
    ISBLANK( 'Procedures'[CompletedDate] ),
    ISBLANK( 'Procedures'[ScheduledDate] )
)

Priority is where the model earns its keep. Remaining annual benefit comes from plan maximums minus benefit already used in the current benefit year, and it decays to zero on the plan reset date:

-- Remaining annual benefit, current benefit year
VAR PlanMax  = SELECTEDVALUE( 'Plans'[AnnualMaximum] )
VAR UsedYTD  =
    CALCULATE(
        SUM( 'Payments'[InsurancePortion] ),
        DATESBETWEEN(
            'Calendar'[Date],
            [Benefit year start],
            MAX( 'Calendar'[Date] )
        )
    )
RETURN MAX( PlanMax - UsedYTD, 0 )

Sorting the list by remaining benefit and days pending, rather than by treatment value alone, is what makes the front desk trust it. The expensive implant with no benefit left is a slower conversation than the crown with $900 expiring in six weeks.

Recall as a set of buckets

Recall status is derived, not stored: last hygiene visit plus the interval from the input sheet, compared to today. Buckets, a reactivation rate per bucket taken from the practice's own history, and a recoverable number:

ComponentWhere it comes from
Months overduelast hygiene visit + recall interval vs today
Average hygiene valuecompleted hygiene procedures ÷ visits
Reactivation ratehistorical: share of patients in the bucket who returned
Recoverablepatients × value × reactivation rate
Deliberately not a forecast. The recoverable column is an order of magnitude, computed from the practice's own reactivation history. Presented as a target it would be wrong; presented as a call priority it is useful.

Refresh path

Scheduled PMS reports land in a folder, the claims file lands next to them, Power Query reads the folder rather than named files. One "Refresh all" and the whole month is current, including anything the office manager changed in the input sheet.

03Timeline and outcome

StageFrom start
Audit: PMS exports, fee schedules, plan participationWeek 1
Production to collections bridge, adjustments by planWeek 2
Chair utilization, production per chair hour, provider viewWeek 3
Unscheduled treatment and recall working listsWeeks 4-5

How much of the pending treatment and overdue recall converts depends on your team and your patient base. We size the opportunity during the audit, from your own exports, before any work starts.

Everything above comes out of software the practice already pays for. The clinical day does not change. The only difference is that on the first of the month the picture is already assembled.

A similar problem on your side?

Tell us and in 30 minutes we will figure out what is possible.

view mode