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
denials.readto browse,denials.updateto change status or file appeals.- For auto-correction: see Auto-correction operator playbook and Manual auto-correction trigger.
Daily workflow
Steps
View open denials in the Denials workspace, or via API:
curl "http://localhost:3010/denials?status=OPEN"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_strategyFROM billing.denial_category_mappingORDER BY carc_code;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');Column Meaning 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.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"}'Monitor appeal deadlines weekly:
SELECT dr.denial_id, dr.claim_id, dr.denial_category,dr.appeal_deadline,dr.appeal_deadline - CURRENT_DATE AS days_remainingFROM billing.denial_record drWHERE dr.status IN ('OPEN', 'IN_REVIEW', 'APPEALING')AND dr.appeal_deadline IS NOT NULLAND dr.appeal_deadline - CURRENT_DATE <= 14ORDER BY dr.appeal_deadline;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
| Check | Expected |
|---|---|
billing.denial_record.status | Advanced past OPEN |
| New mappings cover the surfaced CARCs | Auto-categorization fires next time |
Appeal records have deadline set | Weekly query finds none past due |
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
Denial stays OPEN despite resolve attempt | Wrong actor or scope | Verify denials.update scope on the JWT. |
| Auto-correction didn't fire | CARC missing from denial_category_mapping or is_correctable=false | Add/update mapping; replay denial via manual trigger. |
| Appeal deadline missed | Tracking not run for > 7 days | Check ops cadence; consider scheduled report (see Scheduled email). |
Cross-references
- Auto-correction operator playbook — full handler coverage, idempotency, dashboards.
- Manual auto-correction trigger — re-running a handler after upstream context changed.
- COB tertiary waterfall — for denials that should escalate to the next-priority payer.