Skip to main content
The Practice
Billing operationsAugust 25, 2026

How to Read an EOB Before You Post the Payment

A line-by-line guide to reading an EOB or ERA in a therapy practice: group codes, adjustment reasons, patient responsibility, and the reconciliation step that catches underpayments.

Callie Editorial 12 min read
The revenue-cycle issue
Reconcile

Action required

Denial recovery queue

01 · Classify

Eligibility, coding, documentation

02 · Correct

Fix the root record

03 · Respond

Resubmit or appeal on time

Reason → owner → deadline → evidence → outcome

At a glance

What you’ll leave with

  • Every remittance line tells one story: billed, allowed, adjusted, patient share, paid. If those five numbers do not reconcile, stop before posting.
  • Group codes assign the liability: CO belongs to the practice, PR belongs to the patient. Posting them interchangeably corrupts both your revenue and your patient statements.
  • Compare the allowed amount to your contracted rate on every posting pass. An underpayment arrives looking like a normal payment, and no denial report will ever surface it.

Most therapy practices read an explanation of benefits the way most people read a receipt: glance at the total, file it, move on. That habit is affordable right up until it is not. A denial at least announces itself — it shows up on a report and demands a response. An underpayment does not. It arrives inside a remittance that says “paid,” gets posted in thirty seconds, and disappears into the ledger. The only moment anyone can catch it is the moment of posting, and only if the person posting knows what each field on the remittance is actually asserting.

The document

What an EOB actually is, and how an ERA differs

An explanation of benefits (EOB) is the payer’s statement of how it adjudicated a claim: what was billed, what the plan allowed, what it subtracted and why, what the patient owes, and what it paid. The electronic version is the electronic remittance advice (ERA). Under HIPAA, payers send ERAs in a standard format — the X12 835 transaction — and they must explain every adjustment using standardized code sets rather than their own proprietary codes. That standardization is the reason this article can exist: the same reading skill works across payers, because the grammar of the document is regulated even though the amounts are contractual.

Two code sets do the explaining. Claim adjustment reason codes (CARCs) say why an amount was not paid, and remittance advice remark codes (RARCs) add supplementary detail. Both lists are maintained by the X12 standards body and updated three times a year, which is why a code you have never seen before is a lookup, not a mystery. Each CARC also arrives attached to a group code that assigns the liability for the unpaid amount — and that pairing, more than anything else on the page, is what payment posting has to get right.

The grammar

Five numbers that must reconcile on every service line

Strip away the formatting differences between payers and every remittance line makes the same five assertions. The billed amount is what you submitted. The allowed amount is what the payer says the service is worth under this patient’s plan — for an in-network claim, this is the number your contract governs. The adjustments are the difference between billed and allowed, each one tagged with a group code and a reason code. The patient responsibility is the share of the allowed amount assigned to deductible, coinsurance, or copay. And the paid amount is what is left: allowed, minus patient responsibility, minus any other adjustments.

That arithmetic is the whole discipline of payment posting. Billed minus adjustments must equal allowed. Allowed minus patient responsibility must equal paid, absent another coded adjustment. When the numbers on a line do not close, the line is telling you something — a bundled service, a secondary-payer interaction, a fee-schedule change — and posting it anyway just moves the confusion into your ledger where it is far more expensive to find.

Who owes what

Group codes assign the liability — read them before the dollar amounts

Every adjustment arrives as a pair: a group code that says who absorbs the amount, and a reason code that says why. Medicare limits its contractors to four group codes, and commercial payers use the same set, so this table covers nearly everything a therapy practice will see.

The four group codes on a remittance

CodeMeaningWho absorbs itPosting behavior
CO — Contractual ObligationAdjustment required by your contract or by lawThe practice writes it offPost as a contractual adjustment. Never bill the patient for a CO amount.
PR — Patient ResponsibilityDeductible, coinsurance, or copay under the planThe patientPost to the patient balance and let it drive the statement.
OA — Other AdjustmentNeither contractual nor patient, e.g. prior-payer impact on a secondary claimDepends on the reason codeRead the reason code before deciding; common on coordination-of-benefits claims.
CR — Correction/ReversalThe payer is reversing or correcting a prior decisionDepends on what is being reversedMatch it to the original claim and re-reconcile that claim from scratch.

The reason codes riding on those groups are standardized too. A handful account for most therapy remittance lines: CARC 1, 2, and 3 are the patient-responsibility trio — deductible, coinsurance, and copayment. CARC 45 is the contractual write-down: “charge exceeds fee schedule/maximum allowable or contracted/legislated fee arrangement.” CARC 97 means the payer considers the service bundled into another line it already paid. And CARC 23 flags the impact of a prior payer’s adjudication on a secondary claim. Anything unfamiliar goes to the X12 code list, not to guesswork.

The centerpiece

A remittance walked line by line, underpayment included

Worked example — fictional

One OT visit, two service lines, one hidden underpayment

Every name, rate, and dollar amount below is invented for illustration. A fictional outpatient OT clinic bills an in-network commercial payer for one visit: two units of therapeutic activities charged at $90 per unit, and one unit of self-care management training charged at $95. The clinic’s contracted rates for this plan — from its own fee schedule exhibit — are $62 per unit for the first code and $58 for the second.

The remittance as received

Line one: billed $180.00, allowed $124.00, adjustment CO-45 $56.00, patient responsibility PR-2 $24.80, paid $99.20. Line two: billed $95.00, allowed $50.00, adjustment CO-45 $45.00, patient responsibility PR-2 $10.00, paid $40.00. Total check to the practice: $139.20, patient owes $34.80. Nothing on the page says “denial.” Nothing is flagged. It looks like a routine paid claim.

Line one, reconciled

Billed $180 minus the $56 contractual adjustment equals the $124 allowed — and $124 matches the contracted rate of $62 × 2 units. The plan’s 20% coinsurance on $124 is $24.80, assigned to the patient as PR-2, and the payer paid the remaining $99.20. Every number closes against the contract. This line is done: post the payment, the write-off, and the patient share exactly as coded.

Line two — where the underpayment hides

Billed $95 minus CO-45 $45 equals the $50 allowed, and the internal arithmetic closes the same way line one did: 20% of $50 is the $10 patient share, and $40 was paid. But the contract says this code allows $58, not $50. The remittance is internally consistent and still wrong — the payer priced the code off the wrong fee schedule. Arithmetic checks catch transcription errors; only the comparison to your own contracted rate catches this.

What posting it blind would cost

Posting line two as received writes off $45 as “contractual,” understates the patient share by $1.60, and quietly accepts $8.00 less allowed than the contract requires — the practice’s share of that gap is $6.40 on this one line. The correct move is to post nothing as final, route the line to a variance queue, and query or appeal the pricing with the contract exhibit attached, using the payer’s stated process and deadline.

Why this failure mode compounds

A mispriced code is rarely mispriced once; it is usually mispriced on every claim for that code and plan until someone notices. That is what makes the posting-time contract check the highest-leverage thirty seconds in the revenue cycle: the first caught line is worth one correction, and the pattern it reveals is worth every future claim on that code.

The system

A posting pass that catches what the codes will not

The example above is a reading skill. This is the workflow that applies it every time, so catching an underpayment does not depend on whoever happens to be posting that day. It assumes you post from the ERA rather than the paper EOB wherever possible — the electronic remittance carries the same adjudication in a machine-postable form, which is precisely what makes unreviewed auto-posting both efficient and dangerous.

  1. 01

    Reconcile the deposit to the remittance before touching claims

    The remittance total and the bank deposit (or check) must match. If they do not, stop — you may be looking at the wrong remittance, a split payment, or a payer offset recouping money from an earlier claim.

  2. 02

    Close the arithmetic on each line

    Billed minus adjustments equals allowed; allowed minus patient responsibility equals paid. A line that does not close gets investigated before it gets posted, not after.

  3. 03

    Compare every allowed amount to the contracted rate

    This is the underpayment check, and it requires your fee schedules to be somewhere the poster can see them — in the billing system or a maintained rate table, not in a filing cabinet. A remittance can be internally perfect and still underpay the contract.

  4. 04

    Honor the group codes when posting

    CO amounts become contractual write-offs; PR amounts become patient balances. Miscoding this either bills patients for money they do not owe or silently absorbs balances the plan assigned to them.

  5. 05

    Route exceptions instead of resolving them at the keyboard

    Underpaid lines, bundling you disagree with, unfamiliar codes, and unresolved arithmetic go to a variance queue with the remittance attached. Posting should be fast because judgment calls happen elsewhere — the same separation that makes a denial workflow effective.

  6. 06

    Log the pattern, not just the instance

    When a variance resolves, record the code, plan, and root cause. One mispriced code found in March and again in May is not two events; it is one systemic error with a date range — and a stronger appeal.

For Medicare Part B, the patient-responsibility math is published rather than contractual: after the annual deductible, the beneficiary owes 20% of the Medicare-approved amount for covered services, which is why PR-2 lines on Medicare remittances are so predictable. If a Medicare line’s units look wrong rather than its rate, the discrepancy is usually upstream in minute counting — the Medicare 8-minute rule governs how timed-code minutes become billable units. And when reading the remittance turns into disputing it, the claim-denial workflow covers classification, deadlines, and appeals; the billing features page shows how Callie handles claims and remittances.

A denial is the payer disagreeing with you out loud. An underpayment is the payer disagreeing with you quietly, and hoping you post it anyway.

Quick answers

Reading EOBs and posting payments: FAQ

What is the difference between an EOB and an ERA?

They carry the same adjudication decision. The EOB is the human-readable statement; the ERA is the electronic version in the standardized X12 835 format that HIPAA requires payers to support, which billing systems can post from automatically. Patients also receive their own EOB, which explains the same claim from their side.

If the EOB says “paid,” can the amount still be wrong?

Yes. A remittance can be internally consistent — every line’s arithmetic closes — and still allow less than your contract requires. The only check that catches this is comparing the allowed amount to your contracted fee schedule at posting time.

What does CO-45 mean on a therapy remittance?

The group code CO marks a contractual obligation the practice absorbs, and reason code 45 means the charge exceeded the fee schedule, maximum allowable, or contracted fee arrangement. It is the routine write-down between your charge and the contracted rate — routine in kind, but the amount is only correct if the resulting allowed matches your contract.

Can a practice bill the patient for a CO adjustment?

No. CO assigns that amount to the provider, and for contracted claims the write-off is part of the network agreement. Patient balances come from PR amounts — deductible, coinsurance, and copay — which the remittance identifies explicitly.

Where do the codes on an EOB come from?

HIPAA requires payers to explain adjustments using the standardized claim adjustment reason codes and remittance advice remark codes maintained by X12, rather than proprietary codes. The lists are updated three times a year and published online, so an unfamiliar code is always a lookup.

Is auto-posting ERAs safe for a small practice?

Auto-posting the arithmetic is safe and saves real time; auto-accepting the amounts is the risk. Keep the automation, and add a review that compares allowed amounts against contracted rates and routes variances to a person instead of posting them as final.

Primary sources

Bibliography / 5
  1. 01Health Care Payment and Remittance AdviceCenters for Medicare & Medicaid Services
  2. 02Medicare Claims Processing Manual, Chapter 22 — Remittance AdviceCenters for Medicare & Medicaid Services
  3. 03Claim Adjustment Reason CodesX12
  4. 04Remittance Advice Remark CodesX12
  5. 05Medicare CostsMedicare.gov

Written by Callie Editorial

Published August 25, 2026

Educational content, not legal, billing, or patient-specific clinical advice.