Insurance Claims Adjudication

Claim-to-policy matching, coverage verification, and graduated adjudication. The insurance industry processes billions of claims annually — the majority through manual review queues that this pipeline replaces.

What Gets Automated

Matching claims to policies on policy number, member ID, and date of service. Auto-adjudicating clean claims that fall within coverage limits and have standard procedure codes. AI analysis of coding ambiguities, coverage edge cases, and multi-provider claims.

What Humans Still Own

Complex multi-party claims. Fraud referrals. Policy exception decisions. Appeal adjudication on contested denials.

Pipeline

flowchart TD A[Input: New Claims + Policy Records] --> B[Matcher: Claim-to-Policy] B -->|Policy found| C[Matcher: Duplicate Detection] B -->|No policy match| D[Deny: No Coverage] C -->|No duplicate| E{Auto-Approve Eligible?} C -->|Duplicate found| F[Flag + Halt] E -->|Clean claim ~60%| G[Auto-Adjudicate] E -->|Requires review ~40%| H[ReAct Agent] H --> H1[Verify coverage terms] H1 --> H2[Validate procedure codes] H2 --> H3[Calculate allowed amount] H3 -->|High confidence| I[Auto-Resolve] H3 -->|Low confidence| J[Human Adjudicator] J -->|Approve| K[Process Payment] J -->|Deny| L[Issue Denial Code] J -->|Refer SIU| M[Flag for Investigation] D --> N[Custom Table: Adjudication Log] G --> N I --> N K --> N L --> N F --> N style B fill:#e8a84c,color:#09090b,stroke:none style C fill:#e8a84c,color:#09090b,stroke:none style H fill:#4ade80,color:#09090b,stroke:none style J fill:#60a5fa,color:#09090b,stroke:none

This template uses two matcher steps in sequence — first for claim-to-policy matching, then for duplicate detection. This is the only template with chained matchers.

## Workflow Definition
json
{
  "name": "claims_adjudication",
  "definition": {
    "actions": [
      {
        "type": "matcher",
        "properties": {
          "left": "@input.claims",
          "right": "@input.policies",
          "matchOn": ["policy_number", "member_id"],
          "dateWindowDays": 0,
          "outputMatched": "claims_with_policy",
          "outputUnmatchedLeft": "no_policy_claims",
          "outputUnmatchedRight": "unused_policies"
        }
      },
      {
        "type": "matcher",
        "filter": {
          "condition": {
            "greaterThan": [{ "length": "@claims_with_policy" }, 0]
          }
        },
        "properties": {
          "left": "@claims_with_policy",
          "right": "@input.recent_claims",
          "matchOn": ["member_id", "procedure_code", "service_date"],
          "tolerance": 0,
          "dateWindowDays": 1,
          "outputMatched": "potential_duplicates",
          "outputUnmatchedLeft": "unique_claims",
          "outputUnmatchedRight": "no_dup_match"
        }
      },
      {
        "type": "loop",
        "filter": {
          "condition": {
            "greaterThan": [{ "length": "@unique_claims" }, 0]
          }
        },
        "properties": {
          "mode": "foreach",
          "items_path": "@unique_claims",
          "item_variable_name": "claim",
          "actions_to_execute": [
            {
              "type": "loop",
              "properties": {
                "mode": "react",
                "objective": "Adjudicate claim {{claim.a.claim_id}}. Policy: {{claim.b.policy_number}}. Procedure: {{claim.a.procedure_code}}. Billed: ${{claim.a.billed_amount}}. Verify: 1) Coverage active for service date, 2) Procedure covered under plan, 3) Deductible and benefit limits, 4) In-network status. Recommend: approve with allowed amount, deny with reason code, or escalate.",
                "tools": [
                  { "type": "action", "name": "verify_coverage" },
                  { "type": "action", "name": "lookup_procedure_codes" },
                  { "type": "action", "name": "check_benefit_limits" },
                  { "type": "action", "name": "calculate_allowed_amount" }
                ],
                "max_iterations": 12,
                "on_stuck": {
                  "iterations": 4,
                  "action": "escalate"
                },
                "result_key": "adjudication"
              }
            }
          ],
          "max_concurrency": 10,
          "failure_strategy": "continue_on_error",
          "collect_results": true,
          "result_key": "all_adjudications"
        }
      },
      {
        "type": "PbotApproval",
        "properties": {
          "comment": "{{unique_claims.length}} claims adjudicated. {{potential_duplicates.length}} duplicates flagged. Review AI decisions.",
          "request_payload": {
            "adjudications": "@all_adjudications",
            "duplicates": "@potential_duplicates",
            "no_policy_denials": "@no_policy_claims.length"
          }
        }
      },
      {
        "type": "custom-table",
        "properties": {
          "table": "adjudication_log",
          "operation": "write",
          "keys": ["batch_id"],
          "values": ["@__run_id"],
          "fields": {
            "claims_processed": "@input.claims.length",
            "auto_denied_no_policy": "@no_policy_claims.length",
            "duplicates_flagged": "@potential_duplicates.length",
            "adjudicated": "@unique_claims.length",
            "completed_at": "@now"
          }
        }
      }
    ]
  }
}

Required Registered Actions

Action Kind Purpose
verify_coverage http Check policy status and effective dates
lookup_procedure_codes db Retrieve allowed procedure codes for policy type
check_benefit_limits db Query remaining benefit limits for member/year
calculate_allowed_amount http Compute allowed amount per fee schedule

Customization Notes

Duplicate detection window. The 1-day dateWindowDays on the second matcher catches same-day duplicate submissions. Extend to 3–5 days if your intake has batch delays.

Agent concurrency. 10 concurrent adjudications works for typical batch sizes. Reduce if your coverage verification API has rate limits.

Stuck detection. The escalate action on stuck sends complex claims directly to a human adjudicator rather than retrying — appropriate for claims where incorrect auto-decisions have financial and regulatory consequences.