Skip to main content

Claims Service — Domain Model

Status: populated Owner: TBD Last updated: 2026-04-18 Companion: SERVICE_OVERVIEW · Service Template · 02 DDD

Aggregates

1. ClaimRecord (Root Aggregate)

Represents the full lifecycle of a single payer claim from assembly through final adjudication. Merges the ADMIN-CLAIMS aggregate family.

ID prefix: clm_

State Machine:

Fields:

FieldTypeDescription
idClaimId (clm_)ULID with prefix
tenantIdTenantIdRLS partition key
patientIdPatientIdFrom registration-service
encounterIdEncounterIdFrom scheduling-service
coverageIdCoverageIdPrimary coverage reference
billProviderIdProviderIdBilling provider NPI
renderingProviderIdProviderIdRendering provider NPI
serviceDateDateRangeService from/to dates
diagnosisCodesICD10Code[]Ordered diagnosis list (max 12)
procedureCodesProcedureCode[]CPT/HCPCS with modifiers
lineItemsClaimLineItem[]Charge items from billing-service
totalBilledMoneySum of line item billed amounts
statusClaimStatusEnum (see state machine)
submissionChannelSubmissionChannelX12_837 / PAYER_REST / XML / FILE
clearinghouseRefstring?External tracking ID
payerClaimNumberstring?Assigned by payer on acceptance
versionnumberOptimistic concurrency counter
fhirClaimIdstring?FHIR Claim resource ID
createdAtTimestamp
updatedAtTimestamp

FHIR Mapping: Claim (canonical), ClaimResponse (on acknowledgement/remittance)


2. Coverage (Aggregate)

Represents a patient's insurance coverage record. Source: ADMIN-INS aggregate family.

ID prefix: cov_

Fields:

FieldTypeDescription
idCoverageId (cov_)ULID with prefix
tenantIdTenantIdRLS partition key
patientIdPatientIdPatient this coverage belongs to
payerIdPayerIdPayer organization reference
subscriberIdstringMember/subscriber ID
groupNumberstring?Group/plan number
planNamestringHuman-readable plan name
priorityCoveragePriorityPRIMARY / SECONDARY / TERTIARY
relationshipSubscriberRelationshipSELF / SPOUSE / CHILD / OTHER
effectiveFromDateCoverage start date
effectiveToDate?Coverage end date (null = active)
copayMoney?Fixed copay amount
deductibleMoney?Annual deductible
outOfPocketMaxMoney?Out-of-pocket maximum
statusCoverageStatusACTIVE / INACTIVE / CANCELLED
fhirCoverageIdstring?FHIR Coverage resource ID
createdAtTimestamp
updatedAtTimestamp

FHIR Mapping: Coverage


3. EligibilityTransaction (Aggregate)

Represents a real-time eligibility inquiry and the stored payer response. Source: ADMIN-INS FR-INS-003..005.

ID prefix: elig_

Fields:

FieldTypeDescription
idEligibilityId (elig_)ULID with prefix
tenantIdTenantIdRLS partition key
coverageIdCoverageIdCoverage being verified
patientIdPatientId
requestedAtTimestampInquiry time
channelEligibilityChannelX12_270 / PAYER_REST
requestPayloadJsonBRaw request (X12 or JSON)
responsePayloadJsonBRaw payer response
statusEligibilityStatusACTIVE / INACTIVE / ERROR
deductibleMetMoney?YTD deductible met
oopMetMoney?YTD out-of-pocket met
coinsurancePercentage?
expiresAtTimestampCache TTL for this response
fhirEligibilityRequestIdstring?FHIR CoverageEligibilityRequest ID
fhirEligibilityResponseIdstring?FHIR CoverageEligibilityResponse ID

FHIR Mapping: CoverageEligibilityRequest, CoverageEligibilityResponse


4. PriorAuthorization (Aggregate)

Tracks prior authorization requests and decisions for covered services.

ID prefix: auth_

Fields:

FieldTypeDescription
idAuthorizationId (auth_)ULID with prefix
tenantIdTenantId
coverageIdCoverageId
patientIdPatientId
procedureCodeProcedureCodeRequested procedure
diagnosisCodesICD10Code[]Supporting diagnoses
requestedAtTimestamp
statusAuthorizationStatusPENDING / APPROVED / DENIED / EXPIRED
authorizationNumberstring?Payer-assigned auth number
approvedUnitsnumber?Approved service units
validFromDate?Auth validity start
validToDate?Auth validity end
denialReasonstring?

5. RemittanceRecord (Aggregate)

Represents a processed ERA (Electronic Remittance Advice) — X12 835 or payer REST equivalent.

ID prefix: rem_

Fields:

FieldTypeDescription
idRemittanceId (rem_)ULID with prefix
tenantIdTenantId
payerIdPayerId
checkNumberstring?EFT/check reference
paymentDateDate
totalPaidMoney
rawPayloadJsonBParsed X12 835 or REST payload
lineAllocationsRemittanceAllocation[]Per-claim allocations
processedAtTimestamp?Time allocations applied
fhirEobIdsstring[]Generated ExplanationOfBenefit IDs

FHIR Mapping: ExplanationOfBenefit (generated per claim from remittance)


6. DenialCase (Entity — owned by ClaimRecord)

Tracks denial details and the appeal workflow for a denied claim line or claim.

ID prefix: dnl_

Fields:

FieldTypeDescription
idDenialId (dnl_)ULID with prefix
claimIdClaimIdParent claim
denialCodestringCARC / RARC denial reason code
denialReasonstringHuman-readable reason
appealDeadlineDateDeadline for appeal submission
appealStatusAppealStatusNONE / FILED / PENDING / APPROVED / DENIED
appealFiledAtTimestamp?
appealNotesstring?
resubmitClaimIdClaimId?Replacement claim on resubmission

Domain Events

Event TypeTriggerPayload Summary
claims.claim.created.v1Claim assembled from encounterclaimId, patientId, encounterId, totalBilled
claims.claim.submitted.v1Claim sent to payer/clearinghouseclaimId, channel, clearinghouseRef
claims.claim.accepted.v1Positive acknowledgement receivedclaimId, payerClaimNumber
claims.claim.denied.v1Denial received via remittanceclaimId, denialCode, denialReason
claims.claim.paid.v1Full payment appliedclaimId, remittanceId, amountPaid
claims.claim.appealed.v1Appeal filedclaimId, denialId, appealDeadline
claims.remittance.received.v1ERA received and parsedremittanceId, payerId, totalPaid
claims.remittance.applied.v1ERA allocations posted to claimsremittanceId, claimsAffected[]
claims.coverage.created.v1New coverage record addedcoverageId, patientId, priority
claims.coverage.updated.v1Coverage modifiedcoverageId, changes
claims.eligibility.verified.v1Eligibility response receivedeligibilityId, coverageId, status
claims.auth.approved.v1Prior auth approvedauthorizationId, authNumber, validTo

Value Objects

Value ObjectDescription
ClaimIdBranded ULID clm_*
CoverageIdBranded ULID cov_*
EligibilityIdBranded ULID elig_*
AuthorizationIdBranded ULID auth_*
RemittanceIdBranded ULID rem_*
DenialIdBranded ULID dnl_*
Money{ amount: number; currency: string } — ISO 4217
ICD10CodeValidated ICD-10-CM code string
ProcedureCode{ system: 'CPT' | 'HCPCS'; code: string; modifier?: string }
DateRange{ from: Date; to: Date }
ClaimStatusdraft | ready | submitted | accepted | rejected | partial_paid | paid | denied | appealed | closed
CoverageStatusactive | inactive | cancelled
CoveragePriorityprimary | secondary | tertiary
SubmissionChannelx12_837 | payer_rest | xml | file
EligibilityChannelx12_270 | payer_rest

Ubiquitous Language

TermDefinition
ClaimA request for payment submitted to a payer for services rendered
CoverageAn active insurance policy/plan for a patient
EligibilityReal-time verification that a patient's coverage is active and what benefits apply
Prior AuthorizationAdvance payer approval required for certain services before they are rendered
RemittanceThe payment and explanation advice returned by a payer after claim adjudication (ERA/835)
EOBExplanation of Benefits — FHIR resource generated from remittance detailing payment and adjustments
DenialPayer decision to not pay all or part of a claim
AppealFormal dispute of a denial requesting reconsideration
ClearinghouseThird-party intermediary that translates and routes claims between providers and payers
CARCClaim Adjustment Reason Code — standard denial/adjustment code on EOBs
RARCRemittance Advice Remark Code — supplemental explanation code
ScrubbingPre-submission validation of claim required fields, coding rules, and payer-specific edits
Line ItemA single service/procedure entry within a claim
837X12 837 EDI transaction — electronic claim submission format (837P professional, 837I institutional)
835X12 835 EDI transaction — electronic remittance advice format
270/271X12 270 (eligibility request) / 271 (eligibility response) EDI transactions