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