> ## Documentation Index
> Fetch the complete documentation index at: https://docs.encoreos.io/llms.txt
> Use this file to discover all available pages before exploring further.

# ERA Reconciliation

> Underpayment work queue comparing ERA payments against contracted rates with bulk appeal and review actions.

The ERA Reconciliation page (`/pm/era-reconciliation`) is the underpayment work queue where billing staff compare electronic remittance advice payments against contracted rates and take action on variances.

## Overview

The ERA Reconciliation page reads paginated records from `pm_era_reconciliation_results` (25 rows per page, server-side), scoped to the current organization and excluding soft-deleted records. A filter bar is visible by default and supports filtering by payer, reconciliation status, date of service range, CPT code, and variance amount range. The data table columns are: Select (checkbox), Claim ID (clickable link to detail sheet), CPT, Payer, Variance (color-coded by severity), DOS, Status, and Actions.

Variance amounts are color-coded: `destructive` for high-severity variances, `warning` for moderate, and unstyled for low. A detail sheet (`ReconciliationDetailSheet`) opens from the Claim ID link. An appeal confirmation dialog (`AppealConfirmationDialog`) supports both single and bulk appeal creation with an optional note.

Users with `pm.era_recon.manage` can bulk-mark rows as `reviewed` or `accepted`. Users with `pm.era_recon.appeal` can initiate appeals on `underpaid` rows.

## Who it's for

Requires permission: `PM_PERMISSIONS.ERA_RECON_VIEW` (`pm.era_recon.view`).

Bulk status management requires `PM_PERMISSIONS.ERA_RECON_MANAGE`. Creating appeals requires `PM_PERMISSIONS.ERA_RECON_APPEAL`.

## Before you start

* Ensure you have the `pm.era_recon.view` permission.
* Reconciliation results are populated upstream by the ERA processing pipeline; no manual creation is available on this page.

## Steps

<Steps>
  <Step title="Open ERA Reconciliation">
    Navigate to `/pm/era-reconciliation`. The filter bar is visible by default and the first page of results loads automatically.
  </Step>

  <Step title="Apply filters">
    Use the `ReconciliationFilterBar` to filter by payer (populated from the active payer list), status, date of service range, CPT code, or variance amount range. Changing any filter resets the page to 0.
  </Step>

  <Step title="Review a reconciliation record">
    Click the linked Claim ID in a table row to open the `ReconciliationDetailSheet` on the right with full record details.
  </Step>

  <Step title="Appeal an underpaid result (single)">
    In the Actions column, click the appeal icon (gavel) on a row with status `underpaid` (requires `pm.era_recon.appeal`). Enter an optional note in the `AppealConfirmationDialog` and confirm.
  </Step>

  <Step title="Bulk appeal selected results">
    Check one or more rows using the row checkboxes. The bulk actions toolbar appears. Click **Appeal Selected** (requires `pm.era_recon.appeal`), add an optional note, and confirm to create appeals for all selected rows.
  </Step>

  <Step title="Bulk mark as reviewed or accepted">
    With rows selected, click **Mark Reviewed** or **Mark Accepted** (requires `pm.era_recon.manage`) to bulk-update the `reconciliation_status` for all selected records.
  </Step>

  <Step title="Paginate results">
    Use **Previous** / **Next** buttons at the bottom of the table. The footer displays the current page, total pages, and total record count.
  </Step>
</Steps>

## Key concepts

**Reconciliation statuses:** `pending`, `matched`, `underpaid`, `overpaid`, `no_contract`, `reviewed`, `appealed`, `accepted`.

**Variance:** The difference between the contracted expected payment and the actual <Tooltip tip="Electronic Remittance Advice — the 835 transaction that explains what was paid on a claim">ERA</Tooltip> payment. High variance severity is shown in a destructive color; moderate in a warning color.

**CPT code filter:** Uses a case-insensitive partial match (`ilike`) on the `cpt_code` field.

<AccordionGroup>
  <Accordion title="Empty state">
    When no records match the current filters: "No underpayments detected — All ERA payments match contracted rates."
  </Accordion>

  <Accordion title="Error state">
    If the data query fails: "Unable to load reconciliation data. Please try again."
  </Accordion>
</AccordionGroup>

## Related

<Columns cols={2}>
  <Card title="Practice Management" icon="briefcase" href="/pm/overview">
    Overview of the Practice Management core.
  </Card>

  <Card title="Governance & parity" icon="scale-balanced" href="/governance/index">
    Documentation coverage and governance.
  </Card>
</Columns>

<Note>
  This page documents shipped product behavior. It is not medical, legal, or
  billing advice. Verify against your organization's policies and applicable
  regulations before using it for clinical, compliance, or billing decisions.
  Protected health information (PHI) shown in the product is governed by your
  tenant's access controls and is never exposed in this documentation.
</Note>

<Accordion title="Documentation sources">
  * src/routes/pm.tsx
  * src/cores/pm/pages/EraReconciliationPage.tsx
  * src/cores/pm/hooks/useReconciliationResults.ts
  * src/cores/pm/hooks/usePayerList.ts
</Accordion>
