rcm billing.docx

RCM & Billing Decision Guide

Companion to the Billing docs.

Section 1: Use Case & Participants

1.1 What is your reimbursement model?

Why: Claims-based reads every lane; self-pay skips the Charge → Claim → Payer lane; value-based leans on Foundations and the Value-Based lane (3.11).

1.2 How much of the revenue cycle runs in Medplum vs. delegated?

In one line: a clearinghouse moves your claims; an RCM platform runs your revenue cycle. Either way Medplum owns the front half (coverage, charge capture, claim assembly); the paths diverge on the back half.

Revenue-cycle stage Clearinghouse RCM partner Documents only External PM
Coverage & charge capture (3.1–3.5) You build You build You build You build
Eligibility (3.3) You build Partner platform Manual External
Claim assembly (3.6) You build You build You build External
Scrubbing / validation You build Partner owns Light External
Submission (3.6) You build (837P) Partner submit op PDF / patient files External
Responses & ERA posting (3.7) You build (webhook + poller) Partner owns; Tasks sync back Manual External
Denials & resubmission (3.8) You build Partner owns; Tasks sync back Manual External
AR & reporting (3.10) You build Partner owns Manual External

How to choose:

Clearinghouse RCM partner
You get Full control; billing data stays as FHIR in Medplum A payer-rules engine and in-house billers; far less to build
Trade-off You build and maintain the entire back office Recurring fees; less control; AR and reporting live on the partner’s platform
Choose if You have RCM expertise and want a fully owned cycle You want to outsource the cycle

Paths can mix. The choice sets which Section 3 lanes you build (3.5–3.10) vs. read only for the boundary.

1.3 Who does the billing work, and is the patient part of it?

Why: drives charge-capture design (3.5), who works denials and AR (3.8, 3.10), and whether patient-facing billing is in scope (3.9).

1.4 Where does coding happen, and how automated is it?

Why: drives the coding and review model in charge capture (3.5) and where scrubbing exceptions surface (3.6).

1.5 New build or replacing/extending, and what else must billing touch?

Why: surfaces integration boundaries and the source-of-truth split behind 1.2, 3.6, and 3.7. Core-to-product builds tend to own the cycle (a clearinghouse); additive builds tend to delegate (an RCM partner or external PM).

Section 2: Feature Scoping

Go through each row together. For each cell under Yes / No / Nice-to-have / Not sure, mark the customer’s answer. The § column points to the deep-dive subsection that covers each feature.

# Feature § Yes No Nice-to-have Not sure
1 Coverage & payer modeling 3.1
2 Patient financial account / running balance 3.2
3 Real-time eligibility & benefits (270/271) 3.3
4 Prior authorization (pre-service) 3.4
5 Patient cost / Good-Faith Estimates 3.4
6 Charge capture (encounter-linked) & pricing / fee schedules 3.5
7 Coding (CPT/ICD-10, modifiers) with review queue 3.5, 3.6
8 Assemble, validate & submit claims 3.6
9 CMS-1500 PDFs / superbills (manual / patient submission) 3.6
10 Ingest payer responses & post remittance (277CA / 835) 3.7
11 Denials, corrected claims & appeals 3.8
12 Patient statements, invoices & online payment 3.9
13 Claim / AR status, aging & reporting 3.10
14 Value-based contracts (panel, quality measures, capitation) 3.11

Section 3: Feature Deep Dives

Cover each feature flagged Yes or Nice-to-have in Section 2. The goal is to land on a clear recommended approach by the end of each section.

Section 3 is grouped into four lanes:

Lane Subsections When to read
Foundations 3.1 – 3.2 Always
Pre-service / Patient Access 3.3 – 3.4 When you verify coverage or authorize before service
Charge → Claim → Payer 3.5 – 3.8 When you bill insurance
Patient & Operations 3.9 – 3.10 Always
Value-Based 3.11 When you have capitated or risk-based contracts

Foundations

3.1 Coverage & Insurance Model

How you represent a patient’s insurance (the coverage stack, the subscriber, payers, cost-sharing) is the foundation every claim and eligibility check builds on. See Representing Patient Insurance Coverage; coverage capture at intake is in the Intake guide (3.5).

Questions:

Situation Approach
Subscriber is the patient One Coverage; subscriber = Patient; relationship = self; payor → Organization.
Primary + secondary One Coverage per plan; Coverage.order sets billing sequence. Second submits after the primary remittance posts (3.7).
Subscriber ≠ patient Coverage + RelatedPerson for the subscriber. The relationship inverts: Coverage.relationship is the patient’s relationship to the subscriber, the RelatedPerson’s is the reverse (coverage child → related person parent). Getting this backwards is a common billing bug.
Member ID & plan details Coverage.subscriberId for member ID; Coverage.class for group, plan name, RxBIN/RxPCN.
Cost-sharing Coverage.costToBeneficiary; feeds estimates (3.4) and patient responsibility (3.9).
Payer directory Medplum ships a built-in Payer Directory of Organizations, or curate your own. The payer identifier system differs by backend; see 3.6.
Card images Store as DocumentReference/Binary linked to the Coverage.

3.2 Account & Financial Ledger

Decide whether you track a patient financial account that rolls charges, claims, and payments into a balance (the backbone for AR in 3.10 and patient billing in 3.9), or let each charge stand alone.

Note: the rows below are one FHIR approach to a financial ledger; validate against your reporting and reconciliation requirements.

Questions:

Situation Approach
Running balance Account as the ledger anchor; ChargeItem, Claim, PaymentReconciliation, and Invoice reference it.
Account scope Account.subject → Patient, or tie to Encounter for visit-level; apply one scope consistently.
Payer vs. patient Payer side via claim/remittance (3.7), patient side via Invoice (3.9), both rolling to the same Account.
No ledger Skip Account for pure pass-through submission where another system owns the balance, but you lose in-Medplum AR (3.10).

Pre-service / Patient Access

3.3 Eligibility & Benefits

Decide whether you verify coverage before service, what you ask the payer, and when the check runs. See Insurance Eligibility Checks.

Note: Eligibility is provided by the clearinghouse integration. An RCM partner may offer its own eligibility on its platform, outside that integration.

Questions:

Situation Approach
Verify coverage / benefits CoverageEligibilityRequest (purpose: benefits); invoke the clearinghouse eligibility operation to run the X12 270/271 and return a CoverageEligibilityResponse.
Scope limit The current integration returns general benefits only, not arbitrary service-specific benefit queries.
In-network check Read network participation from the response (in-network indicator Y/N/U/W); run at provider selection or as a pre-schedule gate.
Cost-sharing Copay, coinsurance, remaining deductible, and out-of-pocket land in CoverageEligibilityResponse.insurance.item; the input to patient estimates (3.4).
When it runs A Bot issues the request on the triggering event; persist the response for the visit and billing.
Exception On failure or ambiguity, create a Task for registration rather than proceeding silently.

3.4 Prior Authorization & Estimates

Decide whether services need payer authorization before they happen, how you track that to a decision, and whether you produce patient cost estimates up front.

Note: the eligibility- and Claim-based rows below are one FHIR approach to prior auth; validate against your payer requirements. The standards-based CMS-0057-F path (CDS Hooks / CRD) is in alpha. Prior auth in a referral context is in the Referrals guide (3.7).

Questions:

Situation Approach
Is auth required? CoverageEligibilityRequest with purpose: auth-requirements; the response indicates whether authorization is required.
Submit a prior auth Claim with use: preauthorization (distinct from a claim for completed services); ClaimResponse carries the decision. A Bot converts FHIR ↔ X12 for transmission.
Standards-based (CMS-0057-F) Electronic prior auth via CDS Hooks / Coverage Requirements Discovery (CRD); alpha.
Gate scheduling Hold in an auth-pending Task.businessStatus until the ClaimResponse approves, then release.

Good-Faith Estimates (No Surprises Act). One FHIR approach: build the estimate from pricing rules (ChargeItemDefinition/$apply, 3.5) and the patient’s cost-sharing (Coverage.costToBeneficiary, 3.1), delivered as a DocumentReference; validate against your compliance requirements. Mainly for self-pay and out-of-network patients.

Charge → Claim → Payer

Insurance-claims-specific. Self-pay builds skip to Patient & Operations; pricing (3.5) still applies to self-pay rates and estimates.

3.5 Charge Capture, Coding & Pricing

Decide what gets billed, where the codes come from, and how each line is priced. Coding is the largest source of denials, so treat it as first-class, not a byproduct of charge entry.

Questions:

Situation Approach
What gets billed One ChargeItem per billable line; ChargeItem.code carries CPT/HCPCS. Link context → Encounter and reference the Account (3.2) at creation, or reconciling into claims and AR later gets painful.
Pricing ChargeItemDefinition holds the rules; $apply calculates the price.
Payer-specific rates Multiple ChargeItemDefinitions keyed to payer/contract; apply the one matching the coverage.
Coding source Auto-derive via a Bot, or set by a coder; route low-confidence items to a review Task.
Diagnoses Capture ICD-10 diagnoses to attach to the claim (Claim.diagnosis, with item-level pointers) in 3.6.

3.6 Claim Assembly & Submission

Decide how you build a valid claim from charges and coverage, and how it leaves your system. The 1.2 engine decision plays out here.

⚠ One-way door: Choosing a submission backend is hard to reverse. Each maps the Claim to a different format (837P, the partner’s API, a CMS-1500 PDF) with a different response pipeline (3.7), and payer identifier systems differ. Keep one Claim as the source of truth so the backend stays swappable.

Questions:

Situation Approach
Build the claim Claim referencing the Coverage (Claim.insurance), charges (Claim.item), and ICD-10 diagnoses (Claim.diagnosis) with item-level pointers.
Billing provider Set on Claim.provider, but backends read it differently (billing provider vs. rendering provider with the billing Organization via PractitionerRole); confirm per integration.
Electronic (you own the cycle) The clearinghouse submit operation sends an 837P and writes a correlation id back to the Claim.
RCM partner The partner’s submit operation returns a ClaimResponse; the partner owns scrubbing, denials, resubmission, and remittance on its platform, and billing tasks sync back into Medplum as Tasks (3.8).
Manual / paper / portal Claim/$export generates a CMS-1500 PDF (Binary; experimental); log the outbound document.
Patient-submitted (out-of-network) Generate a superbill for the patient to file.
Validation Validate before submit; surface a Task and don’t transmit invalid claims. (In the current integration, a submission failure marks the Claim status = error.)
Multiple channels One Claim is the source of truth; run separate send paths per payer without diverging content.

3.7 Payer Responses & Remittance Posting

Decide how you ingest what the payer sends back (the 277CA acknowledgment, accepted or rejected pre-adjudication, and the 835 ERA remittance, what was paid, adjusted, or denied line by line) and how payments post. These share one pipeline, so design them together.

Note: applies to the clearinghouse path, and the row specifics reflect the current integration. With an RCM partner, the partner owns response handling and posting; what flows back is its billing Tasks.

Questions:

Situation Approach
Ingestion A webhook bot (primary) plus an optional poller (catch-up). Make it idempotent on the payer’s inbound transaction id (not the webhook delivery id); webhooks redeliver, and without dedup you double-post payments.
Acknowledgment (277CA) Persist as a ClaimResponse; surface front-end rejections to denials (3.8).
Remittance (835 ERA) Create a PaymentReconciliation and ClaimResponse; the ERA PDF is stored as a DocumentReference. Post payments/adjustments against the Account (3.2).
Matching Match on the patient-control-number (PCN) assigned at submission from the Claim id (835), or the correlation id (277).
Claim status Status lives on ClaimResponse; query ClaimResponse?request=Claim/{id} (3.10).
Review Auto-post clean remittances; route mismatches to a Task.

3.8 Denials, Rejections & Resubmission

Decide how you work claims the payer rejects or denies: correcting and resubmitting, or appealing.

Note: The rows below are one FHIR approach to denial handling; validate against your workflow. On the clearinghouse path you build this in Medplum; with an RCM partner, denials are worked on the partner platform and surface back as synced Tasks.

Questions:

Situation Approach
Surface denials Denial detail lives on the ClaimResponse (3.7); create a Task work queue for the biller.
Corrected claim Resubmit a corrected Claim linked to the original (Claim.related), via the same backend (3.6).
Appeals Track as a Task with deadlines; attach supporting docs as DocumentReference.
Find work Search over open denial Tasks (3.10).
Partner-owned The RCM partner works denials/resubmission on its platform; surfaced tasks sync into Medplum as Tasks.

Patient & Operations

3.9 Patient Responsibility & Self-Pay

Decide how you bill patients for their share (copays, coinsurance, deductibles, full self-pay) and how they pay.

Questions:

Situation Approach
Patient balance Invoice for patient-owed amounts rolling to the Account (3.2); responsibility from remittance (3.7) or self-pay pricing (3.5).
Online payment Integrate a payment processor; a sample integration shows keeping invoices and payments in sync.
Self-pay / cash Price via ChargeItemDefinition/$apply (3.5); invoice the patient directly, no payer claim.
Out-of-network Provide a superbill (3.6) for the patient to submit for reimbursement.

3.10 Accounts Receivable, Aging & Lifecycle Status

Decide how you track where every claim and balance sits, and how staff find work that’s stuck or overdue.

Note: The rows below are one FHIR approach to AR tracking; validate against your reporting needs. Most relevant on the clearinghouse path; an RCM partner owns AR and reporting.

Questions:

Situation Approach
Lifecycle states Track progress with Task.businessStatus; move Task.status on clear transitions. Keep the state set small and single-sourced.
External signals Bots/subscriptions advance status when responses arrive (3.7): accepted, paid, denied.
Aging & AR Search over Claim.created, Task.lastModified, and Account balances; bucket by age.
Overdue work Scheduled Bots or subscriptions flag items past an SLA into work queues.

Value-Based

3.11 Value-Based & Capitation

Value-based care isn’t a claims pipeline; it splits into measurement (quality, gaps in care) and money (capitation, risk, settlement). Read only for capitated or risk-based contracts.

Note: Quality measurement uses documented operations; the financial rows are one FHIR approach to validate against your contracts. Quality/HEDIS reporting overlaps clinical analytics; see Analytics.

Questions:

Situation Approach
Attribution / panel Group as the member roster; ingest the payer roster via a Bot; CareTeam for accountable teams.
Quality measurement & gaps in care Measure + MeasureReport via Measure/$evaluate-measure; eCQM and HEDIS via Analytics.
Risk adjustment (HCC / RAF) Capture Condition coding from encounters and submit as encounter data; ties to coding (3.5).
Encounter data Even when capitated, reuse claim assembly (3.6) to send 837/encounter data for measurement and risk.
Payments (PMPM, settlement) Model received capitation and shared-savings settlement as PaymentReconciliation against the Account (3.2).