Healthcare Denial Management
Remittance-to-claim matching, denial pattern analysis, and automated appeal drafting. Revenue cycle teams spend 65+ hours per week on denials: most of which follow predictable patterns that an agent can identify, analyze, and draft responses for.
What Gets Automated
Matching ERA/835 remittance records to submitted claims. Parsing denial reason codes (CARC/RARC). AI agent analyzes denial patterns, cross-references payer-specific rules, identifies root causes, and drafts appeal letters with supporting documentation references.
What Humans Still Own
Final review of appeal language before submission. Payer negotiation on contested amounts. Process changes based on systemic denial patterns.
Pipeline
Workflow Definition
{
"name": "denial_management",
"definition": {
"actions": [
{
"type": "matcher",
"properties": {
"left": "@input.submitted_claims",
"right": "@input.remittances",
"matchOn": ["claim_id", "payer_id"],
"tolerance": 5,
"dateWindowDays": 90,
"outputMatched": "remittance_matched",
"outputUnmatchedLeft": "no_response_claims",
"outputUnmatchedRight": "unmatched_remittances"
}
},
{
"type": "loop",
"properties": {
"mode": "foreach",
"items_path": "@remittance_matched",
"item_variable_name": "pair",
"actions_to_execute": [
{
"type": "custom-table",
"filter": {
"condition": {
"notEqual": ["@pair.right.payment_status", "paid_in_full"]
}
},
"properties": {
"table": "denial_review_cases",
"operation": "upsert",
"key_fields": ["run_id", "claim_id"],
"keys": ["run_id", "claim_id", "payer_name", "denial_codes", "billed_amount", "paid_amount", "status"],
"values": ["@__run_id", "@pair.left.claim_id", "@pair.right.payer_name", "@pair.right.denial_codes", "@pair.left.billed_amount", "@pair.right.paid_amount", "pending_review"]
}
}
],
"max_concurrency": 5,
"failure_strategy": "fail_fast",
"collect_results": false,
"result_key": "denial_case_writes"
}
},
{
"type": "loop",
"properties": {
"mode": "react",
"objective": "Read the current run's denial review cases. For each case, interpret the denial codes, check payer rules and prior outcomes, and classify it as correctable, appealable, or non-recoverable. Draft supporting language when appropriate, but do not submit an appeal or write off a balance.",
"tools": [
{ "type": "action", "name": "read_denial_review_cases" },
{ "type": "action", "name": "lookup_denial_codes" },
{ "type": "action", "name": "get_payer_rules" },
{ "type": "action", "name": "search_denial_history" },
{ "type": "action", "name": "get_clinical_documentation" },
{ "type": "action", "name": "draft_appeal_letter" }
],
"max_iterations": 12,
"on_stuck": {
"iterations": 4,
"action": "escalate"
},
"result_key": "all_analyses"
}
},
{
"type": "PbotApproval",
"properties": {
"comment": "Denial analyses complete. Review appeal drafts, corrected claims, and write-off recommendations before submission.",
"request_payload": {
"total_matched": "@remittance_matched.length",
"no_response": "@no_response_claims.length",
"analyses": "@all_analyses"
}
}
},
{
"type": "custom-table",
"properties": {
"table": "denial_tracking",
"operation": "write",
"keys": ["batch_id", "run_date"],
"values": ["@__run_id", "@now"],
"fields": {
"claims_analyzed": "@remittance_matched.length",
"no_response_flagged": "@no_response_claims.length",
"status": "completed"
}
}
}
]
}
}
Required Registered Actions
| Action | Kind | Purpose |
|---|---|---|
lookup_denial_codes |
db | Translate CARC/RARC codes to reasons and appeal guidance |
get_payer_rules |
http | Retrieve payer-specific billing and appeal rules |
search_denial_history |
db | Find prior denials with same codes for pattern detection |
get_clinical_documentation |
http | Pull relevant clinical notes for appeal support |
draft_appeal_letter |
llm | Generate appeal letter from denial analysis and documentation |
read_denial_review_cases |
custom-table | Read the current run's persisted denial rows |
The workflow writes denied or underpaid claims to denial_review_cases, keyed by run_id and claim_id. Bind read_denial_review_cases to that table with operation: "read" and where: { "run_id": "@__run_id" }. This keeps the source classification deterministic and gives the agent a read-only batch to explain.
The draft_appeal_letter action generates text with an AI model. The agent uses it to prepare drafts that a human reviewer can edit before submission.
Date window. 90 days covers typical payer response timelines. Adjust it for your payer mix.
Tolerance. The tight $5 tolerance is appropriate for claims where payment amounts should closely match billed amounts. Widen it for payers with known contractual adjustment patterns or narrow it further when exact reimbursement parity matters.
Prior appeal search. The search_denial_history action is critical for pattern detection. The agent uses historical appeal outcomes to predict which denials are worth appealing vs. writing off.
Batch size. Keep each agent batch within the model and tool limits you have configured. For one agent per denial, launch bounded agent runs from your application with one case or doc: reference in each objective.