Skip to main content

COB and dual-eligibility on member detail

Outcome

You can preview the COB waterfall and Medicare MSP classification for a member from the UI without writing data, and explain to a customer how the secondary chain would resolve before submitting a real claim.

Prerequisites

  • eligibility.read scope (the same scope that gates /coverage/priority).
  • Member with multiple coverage policies on file.

What's available

The Member detail page surfaces two read-only views backed by RM-11's COB engine:

ViewEndpointWhat it shows
Coverage policies (enriched)GET /api/v1/cob/members/:memberId/policies?asOfDate=YYYY-MM-DDCoverage rows joined to rcm_master.payer. Meta envelope carries isDualEligible, hasMedicare, hasMedicaid, Medicare entitlement reason.
Simulate waterfallPOST /api/v1/cob/simulate-waterfallCalls findSecondaryCoverages (MSP-aware). Optional deniedCarcCodes runs checkMedicaidLastResort per Medicaid secondary.

Both routes are gated by eligibility.read.

What "dual-eligible" means

A member is flagged dual-eligible when they carry at least one MEDICARE policy and at least one MEDICAID_FFS or MEDICAID_MCO policy, both active on the requested asOfDate.

The badge appears in the member detail summary bar and is decorated with the Medicare entitlement reason (AGE / ESRD / DISABILITY / BLACK_LUNG) when one is recorded on the Medicare row.

Validate MSP behaviour from the UI

  1. Open a dual-eligible member.

  2. Coverage tab → Simulate Waterfall.

  3. Pick Medicare as primary, set service dates inside the EGHP's effective range, leave CARCs empty. Click Run simulation.

    Expect: when the EGHP qualifies (e.g. employer ≥ 20 for working-aged, or ESRD inside the 30-month coordination window), the EGHP surfaces in the preview before any Medicaid entry.

  4. Add CARC 96 to Primary CARC codes and re-run.

    Expect: the Medicaid row's "Last resort" pill flips to a red blocked indicator with reason medicaid-last-resort: CARC 96 (federal) sourced from rcm_reference.medicaid_non_covered_carc.

Validation

CheckExpected
isDualEligible flag on policies responsetrue for members with both MEDICARE + MEDICAID coverage
EGHP surfaces ahead of Medicaid when MSP rules say soYes
Medicaid blocked indicator on CARC 96Reason includes medicaid-last-resort
Lapsed coverage on asOfDateHidden from response

Gotchas

  • Preview only. The drawer never writes to billing.claim or billing.claim_relationship. The real waterfall runs in processSecondaryClaimWaterfall after a primary 835 posts. Treat the preview as a what-if explorer — its output is not idempotency-keyed and is not audited.
  • asOfDate matters. The policies endpoint filters coverage_policy by effective_from <= asOfDate <= coalesce(effective_to, ∞). A coverage that lapsed yesterday won't appear today, even though is_active = true.
  • Primary not on member. If you pick a primary payer the member doesn't carry, the simulator returns primary: null and a note explaining why. Intentional — findSecondaryCoverages short-circuits on a missing primary.

Schema reference

ColumnNotes
coverage_policy.priority_order1 = primary, 2 = secondary, etc.
coverage_policy.is_activeHard gate; deactivated rows are hidden by the UI.
coverage_policy.coverage_statusFree-form; surfaced as the "Status" cell.
coverage_policy.medicare_entitlement_reasonDrives the dual-eligible chip's (reason) suffix.
rcm_master.payer.name / payer_type / stateJoined via payerName / payerType / payerState.
rcm_reference.medicaid_non_covered_carcFederal seed includes 26 / 27 / 96 / 204 / 256.

Cross-references

Next

4.1 — Publish rule changes