Skip to main content

Manage denials and appeals

Outcome

Denials are reviewed, categorized, appealed (where appropriate), and resolved within their deadlines. CARC/RARC codes that lack a category get mapped so future denials are auto-categorized.

Prerequisites

Daily workflow

Steps

  1. View open denials in the Denials workspace, or via API:

    curl "http://localhost:3010/denials?status=OPEN"
  2. Review auto-categorization. When an 835 posts with denial CARC/RARC codes, the denial service maps them via billing.denial_category_mapping:

    SELECT carc_code, rarc_code, denial_category,
    is_correctable, default_correction_strategy
    FROM billing.denial_category_mapping
    ORDER BY carc_code;
  3. Add a new CARC/RARC mapping when the service surfaces a code without a category. This makes the next denial of the same kind auto-correct.

    INSERT INTO billing.denial_category_mapping (
    carc_code, rarc_code, denial_category,
    is_correctable, default_correction_strategy, description
    ) VALUES (
    'CO', '109', 'AUTH_MISSING', true, 'CORRECT_AND_RESUBMIT',
    'Claim not covered by this payer - missing authorization'
    );
    ColumnMeaning
    denial_categoryHigh-level bucket (AUTH_MISSING, TIMELY_FILING, DUPLICATE, BUNDLING, PATIENT_LIABILITY, …).
    is_correctableIf true, denial is eligible for the auto-correction engine.
    default_correction_strategyCORRECT_AND_RESUBMIT, APPEAL, WRITE_OFF, PATIENT_RESPONSIBILITY.
  4. File an appeal when correction isn't possible but the determination is contestable:

    curl -X POST http://localhost:3010/denials/<denial_id>/appeals \
    -H "Content-Type: application/json" \
    -d '{
    "appealLevel": 1,
    "submissionMethod": "PORTAL",
    "deadline": "2026-06-15",
    "notes": "Authorization was in place at time of service"
    }'
  5. Monitor appeal deadlines weekly:

    SELECT dr.denial_id, dr.claim_id, dr.denial_category,
    dr.appeal_deadline,
    dr.appeal_deadline - CURRENT_DATE AS days_remaining
    FROM billing.denial_record dr
    WHERE dr.status IN ('OPEN', 'IN_REVIEW', 'APPEALING')
    AND dr.appeal_deadline IS NOT NULL
    AND dr.appeal_deadline - CURRENT_DATE <= 14
    ORDER BY dr.appeal_deadline;
  6. Resolve a denial once it's worked:

    curl -X POST http://localhost:3010/denials/<denial_id>/resolve \
    -H "Content-Type: application/json" \
    -d '{
    "resolution": "CORRECTED",
    "resolvedBy": "billing_team",
    "resolutionNotes": "Corrected and resubmitted as claim <new_claim_id>"
    }'

Validation

CheckExpected
billing.denial_record.statusAdvanced past OPEN
New mappings cover the surfaced CARCsAuto-categorization fires next time
Appeal records have deadline setWeekly query finds none past due

Troubleshooting

SymptomCauseFix
Denial stays OPEN despite resolve attemptWrong actor or scopeVerify denials.update scope on the JWT.
Auto-correction didn't fireCARC missing from denial_category_mapping or is_correctable=falseAdd/update mapping; replay denial via manual trigger.
Appeal deadline missedTracking not run for > 7 daysCheck ops cadence; consider scheduled report (see Scheduled email).

Cross-references

Next

3.3 — COB adjustment snapshot ops