Nobody teaches this part in grad school. You learn assessment and how to sit with pain. Then you open your first EOB and it reads like a parking ticket written in code. This guide walks the page top to bottom, in plain words, so reading an explanation of benefits stops eating your afternoon. If you run a private practice in New York, New Jersey, or Connecticut, these pages land every week. Ten minutes of decode skill pays for itself fast. We'll also cover the quiet trap in remark codes: the codes on the page you actually read are not always the standard ones.
What is an EOB, and why is it not a bill?
An EOB is a statement the insurer sends after it processes a claim. It shows what you billed, what the plan allowed, what it paid, and what the client owes. It looks simple until you count the boxes. Cigna's behavioral health EOB reference sheet labels 17 separate fields in the claim payment detail section alone (Cigna Behavioral Health, June 2013 revision). Seventeen fields, for one therapy session.
The same Cigna sheet prints a banner across the page: "THIS IS NOT A BILL." Hold onto that line. Your client gets an EOB too. When they call you upset about "a bill from the insurance," this is usually what they're holding. Nobody owes anything because of the EOB itself. Any real bill comes later, from you, based on what the EOB says the client owes.
A simple script helps for that call: "That paper is a report, not a bill. If you owe anything, the bill will come from me, and we'll walk through it together." The confusion is the system's fault, not the client's. Say so.
One naming note. Strictly speaking, the member gets the EOB and the provider gets a remittance advice, sometimes called a PRA. Most of us call both "the EOB," and payer reps often do too. Same fields, same math, same headaches.
The five fields to read, in order
Every payer lays out the page differently. The bones are the same. Read these five, in this order:
1. Billed amount (charges). Your full fee for the session. This is your number. Everything after it is the insurer's math. 2. Allowed amount. The most the plan will pay for that covered service. The federal glossary also calls it the "eligible expense," "payment allowance," or "negotiated rate" (HealthCare.gov Glossary, accessed July 2026). If you charge $100 and the allowed amount is $70, the plan runs all its math on the $70. 3. Contractual adjustment. The gap between your fee and the allowed amount. Cigna's sheet calls it the "agreement adjustment" and says the participant is not liable for it (Cigna, 2013). In network, you agreed to write this off when you signed the contract. It's the quiet line where commercial insurers pay therapists so little, one claim at a time. 4. Patient responsibility. Deductible, copay, and coinsurance, added up. For an in-network claim, this is the only money you may collect from the client. 5. Remark codes. Short codes "assigned to explain adjusted and noncovered amounts," in Cigna's words. When a claim pays strange, the answer is supposed to live here. Often it only half does.
Here's the whole page as one worked example. Say your fee is $100 and the allowed amount is $70. The contractual adjustment is $30, and it's gone. If the client's copay is $25, the plan pays $45. Your real total for that session is $70: $45 from the plan, $25 from the client. Never the $100 you billed.
Now check the math on every EOB. Billed amount should equal allowed amount plus contractual adjustment. Allowed amount should equal the plan's payment plus patient responsibility. If either sum is off, something on the claim is wrong, and the remark code is where you start digging. And if this arithmetic is part of why you keep eyeing the exit door, the honest numbers live in Cash-Pay vs Insurance: The Real Income Ceiling.
What do the group codes PR, CO, PI, and OA mean?
Some good news: there are only four. Every adjustment line on the remittance carries a group code, and the federal operating rule confirms that only four exist (CAQH CORE 360 rule, June 2012):
- PR, Patient Responsibility. You may bill the client for this amount.
- CO, Contractual Obligations. You may not. This is your write-off.
- PI, Payor Initiated Reductions. The payer cut the payment for its own reasons, and it is not saying the client owes it.
- OA, Other Adjustments. The junk drawer for everything else.
For your books, PR versus CO is the whole question. PR means the money is still collectible. CO means it is gone.
Each group code pairs with a claim adjustment reason code, or CARC. CARCs "describe why a claim or service line was paid differently than it was billed," and the list is kept by a standards body called X12 (X12, status reviewed July 1, 2026). These lists are alive, not carved in stone. They can update up to three times a year (CAQH CORE, 2012). A code you memorized in the spring can shift meaning by fall.
Why don't the remark codes match across payers?
This is the part that makes therapists feel dumb, and it shouldn't. The standard codes are only required on the electronic remittance, called the 835 or ERA. That's the machine file your billing software reads. The paper or portal EOB you read with your own eyes sits outside that rule.
UnitedHealthcare says so in its own EDI documentation, word for word: "The ERA/835 uses claim adjustment reason codes mandated by HIPAA. The EOB/PRA displays UnitedHealthcare proprietary denial/adjustment codes used in claim adjudication" (UnitedHealthcare Provider, accessed July 2026). Proprietary means the payer's own private codes. Adjudication just means how the claim got processed. So the code on the page in your hand may not exist in the standard list at all.
And this was never one payer's quirk. The federal CORE 360 rule was written under the ACA because health plans used "internal proprietary codes" and their own plan-specific mappings, which left providers decoding hundreds of shifting code combinations (CAQH CORE, June 2012). One honest caveat on names: UnitedHealthcare is the major payer we can verify in public, because its own pages say it. Other large payers keep their code lists behind login-only provider portals, so there is no public page to cite. The federal rule is the tell that the habit ran industry-wide. That's why the rule had to exist.
The practical move is simple. When a portal or paper code makes no sense, pull the 835 for that claim, or ask the payer rep for the standard CARC that matches their internal code. Write the pairing down somewhere you'll find it again. The standard code has a published definition you can point to in an appeal. Their private one means whatever the rep says it means today.
What should you do when the EOB says no?
First, know the odds you're up against. Insurers selling plans on HealthCare.gov denied 19% of in-network claims in 2024. Out of roughly 85 million denied in-network claims, consumers appealed at least 262,982. That's an appeal rate under 1% (KFF, March 2026). The system is built on the bet that a denial is the end of the story.
A denial is not a clinical judgment on your work. It's the output of a claims process, so treat it like one: a document to check, not a verdict to absorb.
The payer-level numbers spread wide. Among the highest-volume marketplace insurers in 2023, UnitedHealth denied 33% of in-network claims, and Elevance, which runs Anthem plans, denied 23% (Healthcare Dive, reporting KFF data, January 2025). UnitedHealth disputes the 33% figure. It says the rate is closer to 2% when counting only correctly submitted claims for eligible members. Both numbers are on the record. Your own stack of EOBs will tell you which one your practice is living.
When a denial lands, work it in this order:
1. Find the group code and the reason code, on the 835 if you can, not just the portal note. 2. Make the payer name the specific reason in standard-code terms. "Does not meet criteria" is not a reason. 3. Build the paper trail. Mental Health Parity Denials: What to Document to Win lists exactly what to save. 4. Appeal. Fewer than 1% of denials get appealed (KFF, March 2026). The math changes when someone actually pushes back.
One more flag. If the denial arrives wrapped in a "clinical review" phone call, slow down and read Optum "Clinical Review" Call: Do Therapists Have to Engage? before you pick up.
The decode is unpaid work, so keep it small
None of this time is billable. Every EOB you decode is minutes taken from notes, from rest, or from the clinical work you trained for. You can't opt out of the paperwork, but you can stop treating the confusion as a personal failing. The page was genuinely built confusing. A federal rule had to be written just to make the codes line up, and it still only covers the electronic file.
That's the spirit VibeCheck was built in: clinician-built, by a therapist who opens the same envelopes, aimed at giving you back time and attention for the clinical side of your week. If that sounds like your kind of tool, take a look, or book a call. No hard sell. Therapists get enough of those from payers.
FAQ
Is an EOB a bill?
No. Cigna's reference sheet prints "THIS IS NOT A BILL" across the page (Cigna, 2013). An EOB reports how the insurer processed one claim. Any real bill comes from the provider, based on the patient responsibility line.
What does "allowed amount" mean on an EOB?
It's the most a plan will pay for a covered service, also called the "eligible expense" or "negotiated rate" (HealthCare.gov Glossary). The federal example: you charge $100, the allowed amount is $70, and out of network the client can owe the $30 gap.
Can a therapist bill the client for the contractual adjustment?
Not in network. Cigna's EOB sheet says the participant is not liable for amounts above the contracted fee maximum (Cigna, 2013). Out of network is different: the federal glossary's example shows the provider may bill the remaining balance.
Why isn't my EOB's remark code in the standard CARC list?
Because the standard-code rule, CORE 360, covers only the electronic 835 file, not the paper or portal version (CAQH CORE, June 2012). UnitedHealthcare states its EOB/PRA shows proprietary codes (UnitedHealthcare Provider, accessed July 2026). Pull the 835, or ask for the matching standard code.