Claim Auto-Adjudication Engine Development

Challenges such as fragmented data can impede insurance claims processing. This article unravels these complexities and explores the future of healthcare insurance claims adjudication. Discover how to enhance data accuracy and enable cost-effective claims processing with advanced technologies like FHIR.

Processing and adjudication of medical claims is an important part of healthcare administration. The US medical claims processing services market will be $4.9B in 2023. Many factors contribute to the high cost of healthcare administrative services, including various intricacies of claims adjudication processes, manual input, and lengthy review times. 

Today, we will share how to create healthcare claims adjudication software to streamline insurance claims processing and improve its accuracy while keeping data secure and well-organized. 

The auto-adjudication of medical claims: its essence and benefits

Insurance companies perform a review process in medical claims to determine whether a claim is approved or denied. An auto-adjudicated claims engine can help streamline claims processing and workflows for healthcare professionals.

For hospitals, timely payments are vital, and an adjudicated insurance claim engine can become a solution to expedite the payment process. Hospitals can now experience smoother cash flows by skipping the time-consuming manual adjudication. Auto-adjudication holds potential benefits for employers by speeding up the billing cycle.

The issue arises when auto-adjudicated claims are incorrect. Medical bills that contain errors can make insurers pay more than they should initially due to these wrong approvals. 

Why would an automated claims adjudication system give incorrect results? 

Using fragmented and unstructured data during the auto-adjudication of claims can lead to significant pitfalls for insurance companies. Here are some issues caused by non-formalized healthcare data:

  • Inaccurate Adjudication: incomplete data creates gaps in the claim information, making it hard to understand the whole picture. This lack of context can lead to wrong approvals or denials, causing financial losses for insurance companies.
  • Data Integrity Issues: lack of data standardization complicates the data exchange between various systems and departments. Moreover, it affects data quality and can cause misinterpretations during claims assessment.
  • Delays: processing unstructured data requires more time and effort. Auto-adjudication software need to be fast to deliver real-time results. However, if the data is unstructured, it can cause delays in claim approvals and payments.

To solve these issues, insurance companies need to focus on organizing and making their data consistent. Some will say it is easier said than done. However, we know exactly how to reduce the impact of fragmented healthcare data on the results of the claims auto-adjudication process.

Healthcare claims adjudication engine development: Edenlab’s experience

Before we dive into explaining how the Edenlab team performed auto-adjudication for our client, it’s crucial to grasp the critical concepts in insurance terminology. So, let’s start with an insurance glossary:

Deductible: This is the amount that the policyholder must pay out of their own pocket before the insurance provider covers any expenses. Deductibles accumulate and typically apply to the entire insurance plan rather than specific coverage or benefits. Specifying which costs incurred by the policyholder count toward the deductible is essential. For instance, patient co-insurance payments may not be included, and costs exceeding the service or benefit limit are typically excluded. In simpler terms, with a $2,000 deductible, you would pay the first $2,000 of covered services.

Co-pay (or Co-payment): This is a fixed amount that patients must pay for utilizing services covered by their insurance plan. For example, a plan might require co-pays of $20 for office visits, $100 for emergency room visits, or $15 for generic prescriptions. To illustrate, imagine a patient with a $2,000 deductible, and their insurance plan specifies a $20 co-pay for office visits. If the patient has already met their deductible, they would pay only $20 for the office visit. However, if the deductible hasn’t been met, they would pay the total allowable amount for the visit, which is $100.

Co-insurance (or Coinsurance): This is similar to a co-pay but is expressed as a percentage rather than a fixed dollar amount. Co-insurance comes into play after the deductible has been satisfied. For instance, if a plan has a $100 deductible and 30% co-insurance and a patient incurs $1,000 in services:

  • If the deductible is met, the patient pays the $100 deductible plus 30% of the remaining $900 up to the out-of-pocket maximum.
  • If the deductible isn’t met, the patient pays the full amount.

Out of Pocket Maximum: This represents the maximum amount a patient pays within a given period. After reaching this threshold, the insurance provider assumes responsibility for certain expenses. However, the patient still bears costs exceeding the limit for a specific service or benefit. It’s crucial to specify which patient expenses count towards the out-of-pocket maximum.

Auto-adjudication: This is how consumed services or billable items are assessed to determine whether they qualify for insurance coverage and, if so, to what extent.

Additional Conditions: Limits and Constraints for Insurance Plans Used by the Client

Limits:

  • Max Amount Per Period: The maximum amount the insurer can cover within a specific period. It can be applied at the benefit, coverage, or plan level. There’s also a family limit that combines limits for all family members.

Constraints:

  • Max Amount of Visits for the Given Period: Usually applied to a specific service or benefit, such as a maximum of 10 visits to a given specialist per year. Violating these constraints can result in benefits not being covered by the insurer.
  • Pre-Authorization (PA): Some services can only be provided if pre-authorization is available, and there might be associated pre-conditions. For instance, no pre-authorization is needed for the first 10 visits.
  • Patient Age: There may be minimum or maximum age constraints. Violating these constraints can also result in benefits not being covered by the insurer.

The difference between a limit and a constraint lies in their impact: limits affect the calculation process during auto-adjudication, while constraints determine whether a benefit can be covered by the insurer. These limits and constraints can be applied at different levels: plan, group, and benefit.

Now, with a clear understanding of these pre-conditions, let’s create a well-detailed and machine-readable InsurancePlan. In FHIR R4 and FHIR R5, InsurancePlan has a maturity level of 0 and is in trial use. This means it hasn’t seen widespread production use and may undergo significant changes in the future. 

Consequently, we faced challenges with this resource and had to use numerous extensions. Therefore, it may not be as modern as other FHIR resources.

Here’s an example of an InsurancePlan.

{
  "resourceType": "Bundle",
  "type": "searchset",
  "entry": [
      {
          "resourceType": "InsurancePlan",
          "id": "149299b3-1450-4d81-add9-c77db822b5d6",
          "status": "active",
          "name": "Indemnity silver outpatient",
          "alias": [
              "Indemnity silver"
          ],
          "period": {
              "start":"2023-07-31T22:25:59.306Z",
              "end":"2023-12-30T23:25:59.306Z"
          },
          "identifier": [
              {
                  "value": "indemnity-silver"
              }
          ],
          "ownedBy": {
              "type": "Organization",
              "reference": "Organization/6602087e-be3b-4a38-a2ef-9ac3dadf05a4"
          },
          "extension": [
              {
                  "url": "http://example.com/StructureDefinition/extension-maxAmountPerPeriod",
                  "extension": [
                      {
                          "url": "maxAmount",
                          "valueMoney": {
                              "value": 15000000,
                              "currency": "USD"
     
                          }
                      },
                      {
                          "url": "frequency",
                          "valueCode": "yearly"
                      }
                  ]
              },
              {
                  "url": "http://example.com/StructureDefinition/extension-familyLimit",
                  "valueMoney": {
                      "value": 20000000,
                      "currency": "USD"

                  }
              },
              {
                  "url": "http://example.com/StructureDefinition/extension-insurance-patient-share",
                  "valueQuantity": {
                      "value": 0,
                      "code": "%",
                      "unit": "%",
                      "system": "http://unitsofmeasure.org"
                  }
              }
          ],
          "plan": [
              {
                  "identifier": [
                      {
                          "value": "OUT001"
                      }
                  ],
                  "extension": [
                      {
                          "url": "http://example.com/StructureDefinition/extension-maxAmountPerPeriod",
                          "extension": [
                              {
                                  "url": "maxAmount",
                                  "valueMoney": {
                                      "value": 1000000,
                                      "currency": "USD"
             
                                  }
                              },
                              {
                                  "url": "frequency",
                                  "valueCode": "yearly"
                              }
                          ]
                      },
                      {
                          "url": "http://example.com/StructureDefinition/extension-coInsurance",
                          "valueQuantity": {
                              "value": 0,
                              "code": "%",
                              "unit": "%",
                              "system": "http://unitsofmeasure.org"
                          }
                      },
                      {
                          "url": "http://example.com/StructureDefinition/extension-outOfPocketMaximum",
                          "valueMoney": {
                              "value": 3000,
                              "currency": "USD"
     
                          }
                      },
                      {
                          "url": "http://example.com/StructureDefinition/extension-status",
                          "valueCode": "active"
                      }
                  ],
                  "specificCost": [
                      {
                          "category": {
                              "coding": [
                                  {
                                      "code": "OP04",
                                      "display": "OP04"
                                  }
                              ]
                          },
                          "benefit": [
                              {
                                  "type": {
                                      "coding": [
                                          {
                                              "system": "http://snomed.com",
                                              "code": "288568004",
                                              "display": "General practice consulting room (environment)"
                                          }
                                      ]
                                  },
                                  "extension": [
                                      {
                                          "url": "http://example.com/StructureDefinition/extension-maxAmountPerPeriod",
                                          "extension": [
                                              {
                                                  "url": "maxAmount",
                                                  "valueMoney": {
                                                      "value": 125,
                                                      "currency": "USD"
                             
                                                  }
                                              },
                                              {
                                                  "url": "frequency",
                                                  "valueCode": "perVisit"
                                              }
                                          ]
                                      },
                                      {
                                          "url": "http://example.com/StructureDefinition/extension-constraint-maxNumberOfVisitsPerPeriod",
                                          "extension": [
                                              {
                                                  "url": "maxNumber",
                                                  "valueInteger": 15
                                              },
                                              {
                                                  "url": "frequency",
                                                  "valueCode": "yearly"
                                              }
                                          ]
                                      },
                                      {
                                          "url": "http://example.com/StructureDefinition/extension-specific-cost-status",
                                          "valueCode": "active"
                                      },
                                      {
                                          "url": "http://example.com/StructureDefinition/extension-autoAdjudicated",
                                          "valueBoolean": true
                                      },
                                      {
                                          "url": "http://example.com/StructureDefinition/extension-limitsAndConstraintsDescription",
                                          "valueString": "$125 limit per visit, up to 15 visits per year"
                                      }
                                  ]
                              },
                              {
                                  "type": {
                                      "coding": [
                                          {
                                              "system": "http://snomed.com",
                                              "code": "371883000",
                                              "display": "Outpatient procedure"
                                          }
                                      ]
                                  },
                                  "extension": [
                                      {
                                          "url": "http://example.com/StructureDefinition/extension-maxAmountPerPeriod",
                                          "extension": [
                                              {
                                                  "url": "maxAmount",
                                                  "valueMoney": {
                                                      "value": 2500,
                                                      "currency": "USD"
                             
                                                  }
                                              },
                                              {
                                                  "url": "frequency",
                                                  "valueCode": "yearly"
                                              }
                                          ]
                                      },
                                      {
                                          "url": "http://example.com/StructureDefinition/extension-specific-cost-status",
                                          "valueCode": "active"
                                      },
                                      {
                                          "url": "http://example.com/StructureDefinition/extension-autoAdjudicated",
                                          "valueBoolean": false
                                      },
                                      {
                                          "url": "http://example.com/StructureDefinition/extension-limitsAndConstraintsDescription",
                                          "valueString": "No pre-auth with the exception of CT scans, PET scans and MRI"
                                      }
                                  ]
                              }
                          ]
                      }
                  ],
                  "id": "5540aa9e-887c-44b1-944d-a61afd440e8b"
              }
          ]
      },
      {
          "resourceType": "Coverage",
          "id": "i-76_Gaqi5mU8BjkY3eAI",
          "identifier": [
              {
                  "system": "http://clinic.com/memberid",
                  "value": "0987654321"
              }
          ],
          "class": [
              {
                  "type": {
                      "coding": [
                          {
                              "code": "plan",
                              "system": "http://terminology.hl7.org/CodeSystem/coverage-class"
                          }
                      ]
                  },
                  "value": "indemnity-silver",
                  "name": "Indemnity silver outpatient"
              }
          ],
          "status": "active",
          "type": {
              "coding": [
                  {
                      "system": "http://nphies.sa/terminology/CodeSystem/coverage-type",
                      "code": "EHCPOL"
                  }
              ]
          },
          "subscriber": {
              "reference": "http://clinic.com/Patient/Q2ZK3qNHwiqjwnVKhKd0i"
          },
          "subscriberId": "0987654321",
          "beneficiary": {
              "reference": "http://clinic.com/Patient/Q2ZK3qNHwiqjwnVKhKd0i"
          },
          "relationship": {
              "coding": [
                  {
                      "system": "http://terminology.hl7.org/CodeSystem/subscriber-relationship",
                      "code": "self"
                  }
              ]
          },
          "period": {
              "start": "2023-08-31T13:54:28.973Z",
              "end": "2024-08-31T13:54:28.973Z"
          },
          "payor": [
              {
                  "reference": "Organization/6602087e-be3b-4a38-a2ef-9ac3dadf05a4"
              }
          ]
      }
  ]
}

We’ve also built a custom tool that tracks how much is left in each plan, group, or benefit. When the balance is set to -1, there are no restrictions on the amount. Additionally, we keep a record of all patient visits, considering that there are visit limits over a certain period. This tool has been a big help in speeding up our calculations, even when dealing with complex rules.

{
  "_id": "e14d5509-0d5d-4855-b469-b1b9921effa9",
  "memberId": "indemnity-silver-0001",
  "planId": "indemnity-silver",
  "planPeriods": [
    {
      "planPeriodBalance": 15000000,
      "periodStart": "2020-07-07",
      "periodEnd": "2021-07-06",
      "outOfPocketBalance": 3000,
      "deductibleBalance": 1000,
      "periodModifier": 1,
      "coverages": [
        {
          "code": "01",
          "coveragePeriodBalance": 15000000,
          "coverageDeductibleBalance": 0,
          "coverageOutOfPocketBalance": -1
        }
      ],
      "benefits": [
        {
          "benefitPeriodBalance": -1,
          "benefitCode": "02",
          "paidTotal": 0,
          "visits": []
        }
      ]
    }
  ],
  "createdAt": "2020-07-07T10:03:55.616Z",
  "updatedAt": "2020-07-07T10:03:55.616Z"
}

Example

Auto-adjudication Calculation Process

Input:

  • Claimed amount for the provided service (within the claim)
  • Plan configuration with benefits (within the system)
  • Plan usage data (within the system), including deductibles, out-of-pocket, global, coverage, and service balances.

Output: Distribution of the claimed amount, determining how much the patient should pay and what amount is covered by insurance.

Steps:

  1. Check if there is a remaining deductible balance. If it’s positive (not yet exhausted), use the maximum available amount to cover the claimed amount. For instance, if the deductible’s balance is $70 and the claimed amount is $250, use $70.
  2. Determine if the out-of-pocket balance is still positive. If yes, apply the co-pay or co-insurance if specified by the plan. This step calculates how much the patient should pay within the co-insurance/co-pay, leaving the rest to be covered by the insurer. For example, after step 1, we had $250 – $70 = $180 remaining. Suppose co-insurance is 10%, then the patient pays $18 within co-insurance, and the total paid by the patient becomes $70 + $18.
  3. Calculate the amount covered by insurance. Check the remaining global balance, coverage balance, benefit balance, and the maximum limit for the specific service. Determine the minimum value among these three balances and the limit for the service per claim; this is the amount covered by the insurer. For instance, after step 2, we had $250 – $70 – $18 = $162 remaining. Let’s say we have $10,000 remaining for the global balance, $3,000 for the coverage balance, $2,000 for the service balance, and a $125 limit per claim. In this case, the insurer covers $125.
  4. Determine if there’s any unpaid balance after step 3; this is covered by the patient.
  5. Update all balances according to the distribution and plan configuration.

Overall Distribution:

$250 (claimed amount):

  • $70 (deductible) – paid by the patient
  • $18 (co-insurance) – paid by the patient
  • $125 (for the service, limited by the maximum limit per claim) – covered by the insurer
  • $37 (exceeding the maximum limit for the service) – paid by the patient

Notes: In general, the algorithm sequence is as follows: deductible → out-of-pocket max → co-pay or co-insurance → (service/benefit limit & category/coverage limit & global limit)

Possible patient expenses include deductible, co-insurance or co-pay, and amounts exceeding the limit.

What is the future of auto-adjudication in healthcare? 

The future of auto-adjudication hinges on industry-wide efforts to address fragmented healthcare data. Embracing standards like FHIR, advanced technologies, and FHIR-first tools can help overcome healthcare data processing challenges. Edenlab’s auto-adjudication engine showcases FHIR’s potential by automating the claims adjudication process in healthcare, ensuring data consistency and accuracy.

Insurance companies can benefit significantly from FHIR-based solutions, enabling data interoperability and ushering in cost-effective claims processing and improved healthcare services. Join us in shaping the future of healthcare auto-adjudication, driving healthcare industry improvement.

Post author

Sveta Vedmed

Business Analyst at Edenlab

More article about Blog about Healthcare Data

Let`s chat

We would be glad to share more details about our enterprise-level FHIR software solutions and other cases based on the HL7 FHIR standard.

    Your form has been submitted successfully

    We will contact your shortly

    Kodjin White Paper

    Please leave your email to get Kodjin White Paper

      By downloading files from this site you agree to the Policy

      The Kodjin White Paper has been successfully sent to your email

      We have sent a copy to your email

      Back to website content