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

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

Asked at: Coinbase Interview Guide

Asked at: Atlassian Interview Guide

Asked at: Shopify Interview Guide

Asked at: DoorDash Interview Guide

Scroll to Top