Line-Level 835 Auditing: Finding the Underpayments That Balance Perfectly
Here is the uncomfortable part of payer underpayment: the remittance that shortchanged you is arithmetically correct. Every segment ties out. Your practice management system posts it without a warning, the claim closes, and the money you were contractually owed is gone — not denied, not pended, just quietly never paid.
That happens because the checks built into most posting workflows operate at the claim level, and underpayment lives at the service line. A claim-level check asks does this remittance balance against itself? The payer's adjudication engine guarantees the answer is yes. The question that finds money is different: does each line's allowed amount match the rate in our contract? Nothing in the 835 answers that. The file has no idea what your contract says.
This article walks one synthetic remittance through both checks, shows exactly where the claim-level view goes blind, and specifies the data you need to store to close the gap.
Where the 835 hides it: CLP versus SVC
An ANSI X12 835 nests two levels of adjudication detail. Loop 2100 carries the claim payment information segment, CLP — total charge, total paid, total patient responsibility, one row per claim. Loop 2110 carries a SVC segment per service line, each with its own CAS adjustment groups.
Two balancing rules govern the file:
- Line level:
SVC02(line charge) =SVC03(line paid) + the sum of that line'sCASamounts. - Claim level:
CLP03−CLP04= the sum of everyCASamount on the claim.
Both are structural. A payer's system will not release a file that violates them, and a clearinghouse will reject one that does. So "the 835 balances" tells you the payer did arithmetic, not that the payer paid your rate.
The allowed amount — the number your contract actually specifies — is not a first-class field you can trust to be present. It appears at the line as AMT*B6, and otherwise must be derived as the line charge minus the contractual (CO-group) adjustments [verify segment usage against your payer's 835 TR3 companion guide]. Either way, it is a line value. Sum it up to the claim and the variance disappears into the total.
There is also a lag problem stacked on top of the visibility problem: the file and the funds travel separately, so by the time anyone reads the remittance, the deposit has usually already been posted and the claim closed. That interval is worth compressing on its own terms — see real-time payment rails like FedNow and RTP [verify link target before publish; Article 3 not yet drafted] — but it is a different problem from the one below.
Worked example: three lines, one clean, two not
Established patient, commercial PPO, deductible satisfied, 20% coinsurance. All values are synthetic and contain no patient data.
Your contracted rates for this payer and plan:
| Line | Contracted allowed |
|---|---|
99214 | $142.00 |
20610 | $78.00 |
96372 | $28.00 |
The 835 that arrives:
BPR*I*166.64*C*ACH*CCP*01*011000015*DA*9876543*1234567890**01*021000021*DA*5555555*20260812~
TRN*1*0812441703*1234567890~
CLP*PCN-77310*1*570.00*166.64*41.66*12*ICN-2026-0812-4417*11~
SVC*HC:99214:25*265.00*113.60**1~
CAS*CO*45*123.00~
CAS*PR*2*28.40~
AMT*B6*142.00~
SVC*HC:20610:RT*210.00*53.04**1~
CAS*CO*45*143.70~
CAS*PR*2*13.26~
AMT*B6*66.30~
SVC*HC:96372*95.00*0.00**1~
CAS*CO*97*95.00~
AMT*B6*0.00~
LQ*HE*N19~Every line balances. SVC02 = SVC03 + CAS:
99214—265.00 = 113.60 + 123.00 (CO-45) + 28.40 (PR-2)✓20610—210.00 = 53.04 + 143.70 (CO-45) + 13.26 (PR-2)✓96372—95.00 = 0.00 + 95.00 (CO-97)✓
And the claim balances. CLP03 − CLP04 = 570.00 − 166.64 = 403.36, which is exactly the sum of all five CAS amounts (361.70 contractual + 41.66 patient). CLP05 = 41.66, the PR-group total and the only amount billable to this patient.
Now run the check the file cannot run on itself — derived allowed against contracted allowed:
| Line | Contracted | Allowed on the 835 | Variance |
|---|---|---|---|
99214 | 142.00 | 142.00 | — |
20610 | 78.00 | 66.30 | −11.70 |
96372 | 28.00 | 0.00 | −28.00 (contingent) |
Line one is clean. Line two was adjudicated against a rate that is not your rate — the classic signature of a stale fee schedule left in place after an amendment took effect. Note how the shortfall splits: at the correct 78.00 allowed, coinsurance is 15.60 and your payment is 62.40, against the 53.04 you received. Your cash shortfall is $9.36, not $11.70 — the remaining $2.34 is patient responsibility that was never assessed because the allowed amount was understated. You recover it by getting a corrected 835 that restates PR, not by billing the patient the difference.
Line three is a zero-allowed bundle under CO-97, with LQ*HE*N19 flagging the line as incidental to another procedure [verify current CARC and RARC code lists at X12/WPC]. That is a triage flag, not a provable underpayment. Whether the injection administration is separately payable depends on the NCCI edit pair in effect on the date of service and on what the documentation supports [verify current CMS NCCI edit files]. It goes to coding review, not into an appeal batch.
One claim: 9.36 provable, 28.00 to be adjudicated internally. Multiply the provable class across every claim that touched that stale rate for as long as it has been in place — that is the recoverable number, and it is knowable exactly rather than estimated.
What the CARC tells you, and what it can't
CO-45 reads charge exceeds fee schedule / maximum allowable or contracted arrangement [verify current description]. It appeared on the clean line and the underpaid line identically, because from the payer's side both are true statements: the charge did exceed what their system believed the allowable to be. The CARC describes the payer's action, never its correctness. No adjustment code in the file means "we underpaid you." Underpayment is only ever a comparison against data the payer does not have.
What the codes do give you is a routing signal. The adjustment group is the first branch: CO is contractual and unbillable to the patient, PR is patient responsibility, and OA and PI are neither and usually deserve a human. Then the reason code sorts the work — CO-45 against a matching contract row is a legitimate write-off, CO-45 against a mismatched row is a fee-drift appeal, and CO-97 or CO-59 is a bundling or multiple-procedure question that needs coding review before anything goes back to the payer.
Two line-level fields worth storing that most posting configurations discard: SVC06 holds the procedure code you submitted when the payer adjudicated a different one, which is the only reliable tell for a downcode; and SVC05 holds units paid, which will silently differ from units billed on drug and time-based codes.
Four ways to look, ranked by what they can see
| Deposit reconciliation | Claim-level posting | Line-level posting | Line level + contract matrix | |
|---|---|---|---|---|
| What it compares | BPR02 vs bank credit | CLP04 vs claim total | SVC03 vs that line's CAS | Derived allowed vs contracted rate |
| Fee-schedule drift | No | No | No | Yes |
| Zeroed or bundled line | No | Only if the total looks short | Yes, line is visible | Yes, with dollars at stake |
| Downcode / unit substitution | No | No | Only if you store SVC05/SVC06 | Yes |
| Data you must retain | Deposits | Claim totals | Every SVC, CAS, AMT, LQ | The above, plus versioned rates |
| Typical failure mode | Cash posted, nothing known | "It balances" → claim closed | Variance visible, nothing to compare it to | Stale contract rows cause false positives |
| Answers "how much are we owed?" | No | No | No | Yes, per line |
The fourth column is the only one that produces a dollar figure you can put in an appeal, and it is the only one that requires data from outside the 835. That contract matrix is the whole build, and it needs four dimensions to be correct: payer and specific plan or product, procedure code with modifiers, geographic locality where the contract is locality-adjusted, and an effective-date range so a claim is always evaluated against the rate in force on its date of service. Get the last one wrong and every claim spanning an amendment reports as a variance.
Two disciplines make the output trustworthy. Set a variance floor per line and per claim so the queue surfaces recoverable work rather than rounding noise. And route by class — provable rate variances batch into a systematic underpayment appeals workflow [verify link target before publish; Article 2 not yet drafted]; bundling and downcode flags go to coding review first. Mixing them produces appeal packets that get denied and train your staff to ignore the queue.
Published estimates of contractual-allowance leakage circulate widely and vary enormously by specialty and payer mix. Don't import one. The point of the method above is that you can compute your own exactly, per line, from files you already receive.
FAQ
Our claims all balance in the PMS. Doesn't that mean we're being paid correctly? No. Balancing means SVC02 = SVC03 + CAS on every line and CLP03 − CLP04 = total CAS on the claim — both of which the payer's adjudication engine enforces before the file is transmitted. Line two of the example above satisfies both rules and is still $11.70 under contract. A balanced 835 proves internal consistency and says nothing about contract compliance, because the file contains no representation of your contract.
When an appeal succeeds and the allowed amount goes up, can we bill the patient the difference? Not from the original remittance. In the example, correcting the allowed amount from 66.30 to 78.00 raises coinsurance from 13.26 to 15.60 — but until the payer issues a corrected 835, 13.26 is the adjudicated `PR` amount and the 11.70 sits in the CO group, which is your contractual write-off and not billable. Bill the patient only from the PR groups on the corrected remittance, and reconcile any statement already sent. Balance-billing restrictions are set by your payer contract and by state and federal law; confirm your specific obligations with counsel [verify].
What has to be in place before this produces anything usable? Two things, and the second is the real project. First, retain the full 2110 loop at posting — every SVC, CAS, AMT, and LQ, not a claim-level rollup; if your system already discards line detail, that is the blocker to fix first. Second, build the contract matrix. Start narrow: your top ten procedure codes against your top five payers by volume, with effective dates, covers most of the recoverable dollars in most practices and is a spreadsheet, not a platform. Expand once the first batch of variances comes back confirmed. Check your appeal and reconsideration windows before you start pulling history — they are contract-specific and can be short [verify your agreements].
Run it against your own remittance
The shteg.ai sandbox takes a de-identified 835 and returns the line-level audit described above: every SVC validated for balancing, claim-level tie-out against CLP03 − CLP04, derived allowed amount per line compared against the fee-schedule row you supply, CARC/RARC combinations sorted into appealable rate variance versus coding review, and the PR-group total isolated as the only patient-billable figure.
Bring one 835 from a payer whose fee schedule was amended in the last eighteen months. That is where the drift usually is, and the variance report will either be empty — which is worth knowing — or it will name the codes, the effective date, and the amount.
[Open the shteg.ai sandbox →](/sandbox) [verify link target before publish]
Educational content for physicians, practice administrators, and revenue-cycle staff. Not legal, billing, coding, or compliance advice. All segment values, claim identifiers, procedure codes, dollar figures, and contracted rates in this article are synthetic illustrations and contain no patient data. X12 835 implementation specifications, CARC and RARC code lists, and CMS NCCI edit files are revised on a published schedule — verify current versions with your clearinghouse and payer companion guides before making operational decisions. Coding determinations, appeal rights, timely-filing windows, and patient billing obligations are governed by your payer contracts and by applicable state and federal law; consult counsel for your jurisdiction.
Draft notes: ~1,690 words. H1 + 6 H2s (4 body + FAQ + CTA). Worked example carries the required SVC02 = SVC03 + CAS arithmetic on all three lines plus claim-level tie-out, deliberately constructed so both checks pass while two lines are variant — the thesis is that balancing and correctness are independent properties. Comparison table is detection-method-level, not vendor-level. Coinsurance split on line two (9.36 practice / 2.34 patient of an $11.70 variance) is the non-obvious detail that also carries the §5 balance-billing guardrail. CO-97 line is deliberately not framed as appealable — it routes to coding review, which keeps the piece from giving coding advice. Both brief-specified internal links placed with the exact anchor text (§4 mappings 1 and 2); both targets are undrafted, flagged blocking. Seven [verify] flags: TR3 AMT*B6 usage, CARC/RARC descriptions and current lists, CMS NCCI edits, balance-billing law, appeal windows, and two link targets. No statistics asserted — the brief's 3–7% leakage figure is explicitly declined in-body rather than repeated with a [verify], since an unsourced range in a YMYL-adjacent piece is a liability even when hedged. Blocking before publish: §5 requires a named physician or revenue-cycle reviewer (currently unassigned), and the two internal link targets don't exist yet.
Want me to save this to examples/seo-presence/workspace/drafts/underpayment-recovery-1-<id>.md to match the pipeline convention? The other drafts use a short base-36 timestamp slug (msr7hc54) — give me an ID in that format, or say the word and I'll generate one.
<!-- generated_by: claude-draft-1 -->