Guide 06 · Revenue cycle
Posted cash versus deposited cash
The bridge between the practice management system and the general ledger is where revenue becomes trustworthy or does not. It is also where systematic underpayment hides — inside the adjustment bucket, in amounts small enough that nobody queries them individually.
Two systems, two truths
The practice management system knows what was produced, what was adjusted and what was collected, by provider, by location and by payer. The general ledger knows what hit the bank. Neither is wrong, and they will never agree without an explicit bridge, because they are measuring different events at different moments.
In most groups that bridge does not exist as a document. Somebody posts a summary journal entry from a PMS report each month and the two systems drift apart quietly. By the time the drift is noticed, nobody can say which month it started or which of the two is right.
"Our revenue in the P&L doesn't match the production report, and it never has." That is not a software problem. It is a missing bridge, and until it exists no revenue conversation in the business is standing on anything.
The bridge
Build it as a waterfall from gross production down to cash, every month. Each line comes from a named report, and the bottom line has to agree to the deposits in the ledger.
− Contractual adjustments — the difference between your fee and the allowed amount
= Net production
− Non-contractual adjustments — courtesies, write-offs, bad debt
= Expected collections
± Change in accounts receivable
− Refunds and credit balances issued
= Collections posted
± Timing — batches not yet deposited, deposits not yet posted
= Cash deposited — must agree to the ledger
Two lines in that waterfall carry nearly all the diagnostic value, and they are the two most often combined into one: contractual and non-contractual adjustments. Contractual is the price you agreed to. Non-contractual is money you chose, or failed, to collect. Reported as a single "adjustments" figure they tell you nothing. Split, they tell you almost everything.
Splitting the adjustment bucket
| Adjustment type | What it means | Who owns it |
|---|---|---|
| Contractual — per fee schedule | Expected. The agreed difference between your fee and the allowed amount. | Contracting |
| Contractual — variance | Paid below the contracted allowed amount. Not expected. | Finance |
| Denial written off | A claim abandoned rather than appealed. | Billing |
| Timely filing | Claim submitted or resubmitted past the deadline. | Billing — process failure |
| Courtesy or discount | A deliberate commercial decision. | Clinical or ownership |
| Bad debt | Patient responsibility deemed uncollectible. | Finance |
The second row is the one that does not belong in the bucket at all. It is sitting there because the posting process has no category for "the payer paid less than the contract says," so it goes in with everything else that reduces AR — and becomes invisible.
Where underpayment hides
Here is the mechanism, and it is worth stating plainly because it is not obvious from inside a billing queue.
A claim is submitted. The payer remits an amount lower than the contracted allowed amount. The difference is a few dollars — well inside the range of normal contractual adjustment, and far too small to justify a phone call. The poster closes the claim and the difference posts as a contractual adjustment. From every seat in the organisation, that claim is paid.
Now repeat that across one procedure code, one payer, every location, every month, for a year. Individually immaterial; in aggregate, not. And because each instance was closed correctly according to the process as written, no report in the practice management system will flag it. The AR ageing is clean. The collection ratio looks normal. The money is simply gone.
It is not a failure of attention. A biller's job is to resolve claims, and the system tells them the claim is resolved. Detecting it requires comparing paid amounts against the contracted fee schedule across the whole population — a modelling job, not a billing job, and one that needs a copy of the contract.
Running the fee schedule test
Get the contracted fee schedules — in writing
Per payer, per plan, current and dated. This is the step that stalls engagements, because the schedules are often not where anyone thinks they are, and the version in use may be years old. Until you have them, the test cannot be run at all: there is nothing to compare against.
Extract paid detail at line level
Claim, date of service, procedure code, payer, plan, billed, allowed, paid, adjusted. Line level, not claim level — the variance lives in individual procedure codes and claim-level totals will average it away.
Join and compute the variance
Expected allowed, from the schedule, against actual allowed, from the remittance, for every line. The variance column is the entire output of the exercise.
Flag every line where variance > 0 — no materiality floor at this stage
Aggregate before you judge
This is the critical instruction, and the one that is easiest to get wrong. Do not filter out small variances before aggregating — small variances are the finding. Group by payer and procedure code and look at frequency alongside amount. A $4 variance appearing on the same code eleven hundred times is a systematic issue; a $400 variance appearing once is a data error.
Separate systematic from one-off
A consistent variance on one code and one payer means a fee schedule loaded wrong on one side or the other — usually fixable going forward with one conversation, and often recoverable backwards within the payer's reprocessing window. Scattered variances across many codes are more likely posting errors at your end. The two findings lead to completely different conversations.
Quantify, then go and have the conversation
Payer, code, date range, claim count, variance per claim, total. Specific and documented. Payers reprocess claims when presented with that; they do not reprocess claims in response to a general concern that reimbursement feels low.
Recovering past underpayment is a one-time benefit and is bounded by the payer's reprocessing window. Correcting the loaded fee schedule, and adding a variance check to the posting process, keeps the money every month afterwards. Prioritise the second even when the first is the number that gets attention.
One caution worth stating: a variance analysis finds differences, not fault. Some will be your data, some will be timing, some will be plan terms nobody documented. Investigate before concluding, and go into the payer conversation having already eliminated your own errors. Credibility in that conversation is the whole asset.
What to look at every month
- The full bridge, gross production through to cash deposited, agreeing to the ledger
- Adjustments split by type — contractual, variance, denial, courtesy, bad debt — never as one figure
- Adjustment percentage by payer and by location, trended; a location that moves is a question
- AR ageing by payer, with the over-ninety bucket named rather than summarised
- Credit balances and unapplied payments — both are liabilities, not revenue
- Collection ratio against net production, by location
- The variance test on a rotating sample of payers and codes, so the whole book is covered over a year
Where I spend my time. This is the work I care most about, because it is the one place in a practice's finances where a reconciliation finds money rather than just agreement. I will not put a client's numbers, or a former employer's, on a marketing page — but ask me on a call and I will walk you through the method in as much detail as you want.