Skip to main content

RCM & Billing Decision Guide

Companion to the Billing docs.

Section 1: Use Case & Participants

1.1 What is your reimbursement model?

  • Insurance / claims-based – you bill payers and reconcile their responses
  • Patient self-pay / cash – patients pay you directly; no payer claim
  • Value-based / capitation – per-member-per-month or risk-based
  • Some combination

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?

  • Clearinghouse-direct – Medplum runs the cycle; the clearinghouse is transport. You own scrubbing, denials, and remittance posting. The most complete documented path.
  • RCM-automation partner – you send encounter and charge data and delegate the back end; scrubbing, payer routing, denials, resubmission, patient collections, and reporting run on the partner's platform. The integration surface is claim submission; the partner's billing tasks sync back into Medplum as Tasks.
  • Documents only (no electronic claims) – you don't run claims through a clearinghouse or RCM partner. Generate a CMS-1500 PDF for the occasional paper/portal payer, or hand patients a superbill to self-submit for out-of-network reimbursement. Common for cash-pay and OON practices (see 1.1); also a per-payer fallback you can layer onto any engine above.
  • External Practice Management (PM) / billing system – Medplum is the clinical source of truth; charges or claims hand off to an existing PM/billing system that owns the rest.

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 stageClearinghouseRCM partnerDocuments onlyExternal PM
Coverage & charge capture (3.1–3.5)You buildYou buildYou buildYou build
Eligibility (3.3)You buildPartner platformManualExternal
Claim assembly (3.6)You buildYou buildYou buildExternal
Scrubbing / validationYou buildPartner ownsLightExternal
Submission (3.6)You build (837P)Partner submit opPDF / patient filesExternal
Responses & ERA posting (3.7)You build (webhook + poller)Partner owns; Tasks sync backManualExternal
Denials & resubmission (3.8)You buildPartner owns; Tasks sync backManualExternal
AR & reporting (3.10)You buildPartner ownsManualExternal

How to choose:

ClearinghouseRCM partner
You getFull control; billing data stays as FHIR in MedplumA payer-rules engine and in-house billers; far less to build
Trade-offYou build and maintain the entire back officeRecurring fees; less control; AR and reporting live on the partner's platform
Choose ifYou have RCM expertise and want a fully owned cycleYou 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?

  • Charge capture: clinicians at point of care, or back-office entry?
  • Coding and claim work: dedicated coders/billers, or automated with exception review?
  • Accounts receivable (AR) follow-up: who works denials, aging, and patient balances?
  • Patient: do patients see estimates, statements, or pay online?

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?

  • Auto-derived from clinical data (visit type, orders, procedures)?
  • Coder-reviewed before the claim is built?
  • Fully manual?

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?

  • If replacing: what billing/PM system, and what gaps drove the change?
  • If new: is billing core to the product (you're building an RCM/billing product) or additive (a clinical app that also needs to bill)?
  • What other systems must billing read from or write to (clinical/EHR source, PM, clearinghouse, accounting/GL, payment processor, payer portals)?

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§YesNoNice-to-haveNot sure
1Coverage & payer modeling3.1
2Patient financial account / running balance3.2
3Real-time eligibility & benefits (270/271)3.3
4Prior authorization (pre-service)3.4
5Patient cost / Good-Faith Estimates3.4
6Charge capture (encounter-linked) & pricing / fee schedules3.5
7Coding (CPT/ICD-10, modifiers) with review queue3.5, 3.6
8Assemble, validate & submit claims3.6
9CMS-1500 PDFs / superbills (manual / patient submission)3.6
10Ingest payer responses & post remittance (277CA / 835)3.7
11Denials, corrected claims & appeals3.8
12Patient statements, invoices & online payment3.9
13Claim / AR status, aging & reporting3.10
14Value-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:

LaneSubsectionsWhen to read
Foundations3.1 – 3.2Always
Pre-service / Patient Access3.3 – 3.4When you verify coverage or authorize before service
Charge → Claim → Payer3.5 – 3.8When you bill insurance
Patient & Operations3.9 – 3.10Always
Value-Based3.11When 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:

  • Do patients commonly have more than one coverage, and must you bill them in order?
  • Is the subscriber sometimes someone other than the patient?
  • Is your payer list curated in Medplum, synced, or created on demand?
  • What cost-sharing (copay, coinsurance, deductible) do you need for estimates and patient billing?
SituationApproach
Subscriber is the patientOne Coverage; subscriber = Patient; relationship = self; payorOrganization.
Primary + secondaryOne Coverage per plan; Coverage.order sets billing sequence. Secondary submits after the primary remittance posts (3.7).
Subscriber ≠ patientCoverage + 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 detailsCoverage.subscriberId for member ID; Coverage.class for group, plan name, RxBIN/RxPCN.
Cost-sharingCoverage.costToBeneficiary; feeds estimates (3.4) and patient responsibility (3.9).
Payer directoryMedplum ships a built-in Payer Directory of Organizations, or curate your own. The payer identifier system differs by backend; see 3.6.
Card imagesStore 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:

  • Do you need a single balance rolling up charges, payer payments, adjustments, and patient payments?
  • Is the account scoped per patient, per visit, or per episode?
  • Do you track payer and patient responsibility separately on the same account?
  • Must the account reconcile against an external accounting/GL system?
SituationApproach
Running balanceAccount as the ledger anchor; ChargeItem, Claim, PaymentReconciliation, and Invoice reference it.
Account scopeAccount.subjectPatient, or tie to Encounter for visit-level; apply one scope consistently.
Payer vs. patientPayer side via claim/remittance (3.7), patient side via Invoice (3.9), both rolling to the same Account.
No ledgerSkip 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:

  • What must you confirm: active coverage, covered service, in-network status, or benefit/cost detail?
  • When does the check run: scheduling, check-in, or batch pre-visit?
  • Do you re-check on a cadence for ongoing patients?
  • Who works failed or ambiguous checks?
SituationApproach
Verify coverage / benefitsCoverageEligibilityRequest (purpose: benefits); invoke the clearinghouse eligibility operation to run the X12 270/271 and return a CoverageEligibilityResponse.
Scope limitThe current integration returns general benefits only, not arbitrary service-specific benefit queries.
In-network checkRead network participation from the response (in-network indicator Y/N/U/W); run at provider selection or as a pre-schedule gate.
Cost-sharingCopay, coinsurance, remaining deductible, and out-of-pocket land in CoverageEligibilityResponse.insurance.item; the input to patient estimates (3.4).
When it runsA Bot issues the request on the triggering event; persist the response for the visit and billing.
ExceptionOn 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:

  • Do any services require prior authorization before scheduling or delivery?
  • How do you check whether auth is required, and track a submitted auth to approval/denial?
  • Must scheduling be gated until authorization clears?
  • Do you owe patients a cost estimate before service (e.g. a Good-Faith Estimate)?
SituationApproach
Is auth required?CoverageEligibilityRequest with purpose: auth-requirements; the response indicates whether authorization is required.
Submit a prior authClaim 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. The emerging payer-interop path as the rule phases in.
Gate schedulingHold 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:

  • What generates a charge: a completed encounter, an order/procedure, a fulfilled service?
  • Where do codes come from (CPT/HCPCS, ICD-10, modifiers): auto-derived, coder-reviewed, or manual (1.4)?
  • Is pricing a single fee schedule, or does it vary by payer contract?
  • Who reviews coding before a claim is built, and how do exceptions surface?
SituationApproach
What gets billedOne ChargeItem per billable line; ChargeItem.code carries CPT/HCPCS. Link contextEncounter and reference the Account (3.2) at creation, or reconciling into claims and AR later gets painful.
PricingChargeItemDefinition holds the rules; $apply calculates the price.
Payer-specific ratesMultiple ChargeItemDefinitions keyed to payer/contract; apply the one matching the coverage.
Coding sourceAuto-derive via a Bot, or set by a coder; route low-confidence items to a review Task.
DiagnosesCapture 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:

  • Are you billing as an organization or an individual provider?
  • Which submission path(s), and does it vary by payer (electronic for most, paper/portal for some)?
  • What validation must pass before submission, and where do failures surface?
  • Do you submit secondary claims after the primary pays (coordination of benefits)?
SituationApproach
Build the claimClaim referencing the Coverage (Claim.insurance), charges (Claim.item), and ICD-10 diagnoses (Claim.diagnosis) with item-level pointers.
Billing providerSet 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 partnerThe 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 / portalClaim/$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.
ValidationValidate before submit; surface a Task and don't transmit invalid claims. (In the current integration, a submission failure marks the Claim status = error.)
Multiple channelsOne 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:

  • How do responses arrive: webhook push, polling, or partner API?
  • How do you match a response to the originating claim?
  • How do payer payments and adjustments post to the account?
  • What share posts automatically vs. needs review?
SituationApproach
IngestionA 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).
MatchingMatch on the patient-control-number (PCN) assigned at submission from the Claim id (835), or the correlation id (277).
Claim statusStatus lives on ClaimResponse; query ClaimResponse?request=Claim/{id} (3.10).
ReviewAuto-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:

  • Do you work front-end rejections (277CA) differently from adjudicated denials (835)?
  • When you fix and resend, is it a corrected claim or a fresh submission?
  • Do you track appeals (deadlines, supporting documentation, outcome)?
  • How do staff find claims that need work?
SituationApproach
Surface denialsDenial detail lives on the ClaimResponse (3.7); create a Task work queue for the biller.
Corrected claimResubmit a corrected Claim linked to the original (Claim.related), via the same backend (3.6).
AppealsTrack as a Task with deadlines; attach supporting docs as DocumentReference.
Find workSearch over open denial Tasks (3.10).
Partner-ownedThe 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:

  • What balances do you bill: post-adjudication responsibility, self-pay, or both?
  • Do you issue statements, and on what cadence?
  • Do you take online payment / card on file, through which processor?
  • For out-of-network patients, do you provide a superbill instead of billing the payer?
SituationApproach
Patient balanceInvoice for patient-owed amounts rolling to the Account (3.2); responsibility from remittance (3.7) or self-pay pricing (3.5).
Online paymentIntegrate a payment processor; a sample integration shows keeping invoices and payments in sync.
Self-pay / cashPrice via ChargeItemDefinition/$apply (3.5); invoice the patient directly, no payer claim.
Out-of-networkProvide 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:

  • What lifecycle states matter (e.g. draft → submitted → accepted → paid → denied → closed)?
  • How do you standardize states so queues, reports, and integrations agree?
  • Do you track aging (days since submission, days pending) and AR buckets?
  • How do staff find overdue or stuck claims and balances?
SituationApproach
Lifecycle statesTrack progress with Task.businessStatus; move Task.status on clear transitions. Keep the state set small and single-sourced.
External signalsBots/subscriptions advance status when responses arrive (3.7): accepted, paid, denied.
Aging & ARSearch over Claim.created, Task.lastModified, and Account balances; bucket by age.
Overdue workScheduled 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:

  • Which contracts are capitated or risk-based, and which members are attributed to you?
  • Which quality measures (eCQM, HEDIS, stars) are you accountable for?
  • Do you still submit claims or encounter data when capitated (for risk adjustment and measurement)?
  • How are capitation payments and any shared-savings settlement reconciled?
SituationApproach
Attribution / panelGroup as the member roster; ingest the payer roster via a Bot; CareTeam for accountable teams.
Quality measurement & gaps in careMeasure + 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 dataEven 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).

The billing and revenue-cycle partners Medplum integrates with first-party: