Billing & RCM

One claim model. Stedi everywhere. AR aging that actually works.

Carelytics produces CMS-1500 (837P) and UB-04 (837I) from a single Claim model. Stedi clearinghouse handles submission, ERA reconciliation, and payer enrollment. Per-payer rate overrides and 4 unit rounding modes mean the same service bills correctly to Medicaid PCA, commercial, and private pay without code changes.

app.carelytics.com/billing/queue
Billing Queue

Structured hold queue with reason categories

Each held claim shows its hold reason — missing_dx, missing_auth, missing_evv, missing_provider, missing_hipps. Click in to fix the upstream issue, claim auto-releases.

↳ Capture: /billing/queue with several claims across hold reasons

Stedi clearinghouse

Modern clearinghouse. Modern API. Real-time status.

Stedi is a modern healthcare clearinghouse built on a JSON API. We picked it because the legacy clearinghouses ship 1990s SFTP workflows and per-claim fees. With Stedi we get JSON submission, raw X12 fallback, and real-time payer-level status.

837P / 837I JSON

Both professional (CMS-1500) and institutional (UB-04) claim formats. One enrollment, one credentials store.

Raw X12 fallback

For payers that need exact X12, we can ship raw 837 files. JSON is the default; X12 is the escape hatch.

Real-time status

Submitted → accepted → rejected → paid status flows back from Stedi without manual SFTP polling.

Payer enrollment dashboard

Submit enrollments per transaction type (837P, 837I, 835, 270, 276), poll status, surface rejected/in-progress/enrolled.

835 ERA parsing

ERA files parse into batch postings with CARC adjustment library and exception queue.

270/276 eligibility

Real-time eligibility (270) and claim status (276) checks via the same Stedi pipe.

Real-time eligibility

One-click 270/271 on every patient. Included on every plan.

Click "Verify eligibility" on the patient's Payer & Eligibility tab. Carelytics builds the X12 270 from Client + Payer + Tenant data, sends it through Stedi, parses the 271 into status / coverage dates / copay / deductible / out-of-pocket, and persists an EligibilityCheck row for the audit trail.

  • Medicaid, commercial, most Medicare Advantage — works through standard Stedi 270/271 (no separate enrollment)
  • Original Medicare (FFS) — uses the CMS HETS endpoint (requires HETS attestation, also in-platform)
  • Coverage dates, copay, deductible, OOP parsed and surfaced inline
  • Every check stored — historical record per patient, queryable
app.carelytics.com/clients/<pk>/?tab=payer
Eligibility

Patient Payer & Eligibility tab with one-click Verify button

Card showing payer + member ID with a "Verify eligibility" button. After click: status badge, coverage from/to, copay, deductible YTD, OOP YTD, last-checked timestamp.

↳ Capture: client detail → Payer & Eligibility tab post-verification

Self-healing claim pipeline

Most billing systems lose claims when a webhook drops. Ours doesn't.

Webhook dropped during a deploy? Stedi rejected an enrollment that already existed? A 277CA never came back? Carelytics's claim pipeline assumes all of these will happen and recovers automatically — no support ticket, no manual reconciliation spreadsheet.

Idempotent retries

"Provider already exists" / "enrollment already exists" Stedi responses are caught and treated as success — Carelytics fetches the existing record and continues. Submitting the same claim twice never creates a duplicate.

Daily polling backstop

Every claim status is reconciled against Stedi nightly — 277CA acknowledgments and 835 ERAs that didn't fire a webhook are picked up automatically. Claims never silently stuck.

Pre-flight format validation

NPI digit count, EIN format, phone shape, address completeness — checked before the 837 leaves Carelytics. Fail-fast at submission instead of getting an obscure rejection back from Stedi six hours later.

Per-payer rate overrides

Same service. Different rates per payer. Zero code changes.

Medicaid PCA bills at one rate, the same HCPCS to a commercial payer bills at another, private pay is a third. Carelytics handles this through ServiceHCPCSMapping — set the rate per (service line × HCPCS × payer) tuple and the billing pipeline picks the right one.

  • 4 rounding modes per payer: nearest, ceil, floor, CMS 8-minute
  • 6 unit types: 15-minute, 30-minute, hour, visit, day, episode
  • CMS 8-minute rule for Medicare PT/OT/SLP — verified against the Pub 100-04 Ch.5 §20.2 examples
  • Authorization-line override beats rate-mapping override (which beats HCPCS default)
app.carelytics.com/settings/billing/payer-mappings
Settings

ServiceHCPCSMapping with rate + rounding mode + unit type per payer

Filter rows by service line, HCPCS, payer. Each row: rate, rounding mode dropdown, unit type dropdown. Effective dates supported for rate changes.

↳ Capture: payer-mapping table with rates set for one HCPCS across 3 payers

Reconciliation

835 → batch posting → exception queue → adjustment.

835 ERA parsing

Inbound ERAs parse into batch postings. Each ERA line links back to the originating claim. Mismatches surface in the exception queue immediately.

CARC adjustment library

Full CARC code library with reason categories. Adjustments routed by reason — denial vs underpayment vs contractual write-off.

Exception queue with ownership

Discrepancies route to a queue with an assignee, due date, and resolution path (rebill / appeal / write-off).

Write-off workflow

Two-person rule on write-offs above a tenant-configurable threshold. Reason category required. Audit-logged with full diff.

AR aging

Buckets you can actually act on.

0–30, 31–60, 61–90, 90+. Per payer. Per service line. Per branch. Click any bucket to see the underlying claims, sorted by amount. Click any claim to see the hold reason, the ERA history, the visit it came from, and the patient's authorization status.

  • 4 standard aging buckets, sliceable by payer / service line / branch
  • Drill from bucket → claim list → claim detail in one or two clicks
  • "Why isn't this paid?" answered without leaving the page (ERA history + payer status inline)
  • Aging snapshots logged daily so trend lines are real, not approximated
app.carelytics.com/billing/ar-aging
AR aging

AR aging with payer + service line slicing

Top: 4 bucket totals. Middle: stacked bar by payer. Bottom: drill-into table with claim id, payer, age, amount, hold reason.

↳ Capture: AR aging dashboard at full viewport