# Low-Level Design: Insurance Claims System — Claim Submission, Review Workflow, Settlement, and Fraud Detection

Source: https://www.techinterview.org/post/3233464992/lld-insurance-claims-system/
Updated: 2026-04-17 · techinterview.org

## Core Entities

**Policy**: (policy_id, policyholder_id, policy_type=AUTO|HOME|HEALTH|LIFE, coverage_amount_cents, premium_cents, deductible_cents, start_date, end_date, status=ACTIVE|EXPIRED|CANCELLED). **Claim**: (claim_id, policy_id, claimant_id, incident_date, reported_date, claim_type, description, claimed_amount_cents, status, assigned_adjuster_id). **ClaimDocument**: (doc_id, claim_id, doc_type=PHOTO|RECEIPT|POLICE_REPORT|MEDICAL_RECORD, url, uploaded_at). **ClaimAssessment**: (assessment_id, claim_id, adjuster_id, approved_amount_cents, denial_reason, notes, created_at). **Settlement**: (settlement_id, claim_id, payment_amount_cents, payment_method, payment_date, status).

## Claim Submission and Validation

On claim submission: validate policy is active at the incident_date (incident must occur within policy period). Check policy type matches claim type (cannot file auto claim on home policy). Verify claimant is the policyholder or a listed beneficiary. Check for duplicate claims (same incident_date, same policy -- prevent double-filing). Auto-assign a claim number (formatted: CLM-{year}-{sequence}). Set initial status=SUBMITTED. Apply first-pass validation rules (claimed_amount > coverage_amount: flag; incident_date > reported_date: flag). Acknowledge receipt via email with the claim number and expected processing timeline.

## Adjuster Assignment and Review Workflow

Claims are routed to adjusters based on claim type and complexity. Simple claims (auto, amount  $50K, disputed liability, health claims): assign to a specialist adjuster. Assignment: load-balance by active claim count per adjuster, considering specialization. Status machine: SUBMITTED -> UNDER_REVIEW (adjuster assigned) -> ADDITIONAL_INFO_REQUIRED (adjuster requests more documents) -> ASSESSMENT_COMPLETE (adjuster makes a decision) -> APPROVED or DENIED -> SETTLED (payment processed). Each transition creates an audit log entry with actor, timestamp, and notes.

## Auto-Adjudication

Many simple claims can be decided automatically using rule-based systems. Rules engine: define decision trees for each claim type. Auto-approve criteria: claim amount <= deductible + some threshold, no prior claims in the last 12 months, all required documents present, incident is in a low-risk category. Auto-deny criteria: policy was expired at incident date, claimed amount exceeds coverage, required documents missing after 30 days. Auto-adjudication reduces human review load by 60-80% for standard claims. Track auto-adjudication accuracy: sample auto-approved claims for manual review to detect rule gaps.

## Fraud Detection

Fraud signals: (1) Velocity: multiple claims in a short period (3+ claims in 6 months from the same policyholder). (2) Amount patterns: claimed amount always just below the auto-approve threshold. (3) Document quality: uploaded photos show metadata from a different date than the claimed incident date. Check EXIF data on images. (4) Network analysis: same repair shop on 10+ different claims -- potentially colluding with claimants. (5) Address/device clustering: multiple claims submitted from the same IP address or device. Scoring: each signal contributes to a fraud risk score (0-100). Score > 70: flag for manual review. Score > 90: auto-deny and notify the special investigations unit (SIU). Store fraud_score and fraud_signals[] on the claim record.

## Settlement and Payment

On claim approval: calculate settlement amount = min(approved_amount, coverage_amount) - deductible. Create a Settlement record. Process payment via ACH (bank transfer) or check. Track payment status: PENDING -> PROCESSING -> PAID. For health insurance: payer-provider model -- pay the healthcare provider directly, not the claimant. Subrogation: if a third party is at fault (car accident caused by another driver), the insurance company pays the claimant and then seeks reimbursement from the at-fault party's insurer. Track subrogation opportunities on the claim record.

## Interview Tips

- The claim status machine has many states -- draw it explicitly. Missing a state transition (like ADDITIONAL_INFO_REQUIRED -> UNDER_REVIEW on document resubmission) shows incomplete thinking.

- Auto-adjudication is the key scalability feature. Without it, every claim requires a human adjuster -- not scalable at millions of claims per year.

- Regulatory compliance: in most jurisdictions, insurers must acknowledge claims within 24 hours and make a decision within 30 days. Build SLA tracking into the system (analogous to the customer support SLA design).

Asked at: [Stripe Interview Guide](https://techinterview.org/stripe-interview/)

Asked at: [Coinbase Interview Guide](https://techinterview.org/coinbase-interview/)

Asked at: [Atlassian Interview Guide](https://techinterview.org/atlassian-interview/)

Asked at: [Shopify Interview Guide](https://techinterview.org/shopify-interview/)

Asked at: [DoorDash Interview Guide](https://techinterview.org/doordash-interview/)
