• contact@verticalserve.com
Home / Engineering / Post 18
Engineering Blog · Post #18

Bot-Ingested Loss Runs: How InsightXtract and RPA Bots Feed Structured Claims Data into the Renewal Workflow

How InsightUW ingests 23 Workers Comp claims spanning 5 policy years for Ironclad Construction — extracted by InsightXtract from carrier loss run PDFs — validates every field, calculates development factors, and presents the underwriter with a clean loss summary showing an experience mod trending from 1.28 down to 1.15.


The Problem

Loss runs are the underwriter's most important document and the most painful to work with. A Workers Compensation renewal for a mid-market contractor might involve loss runs from 2-3 prior carriers, each in a different PDF format, covering 5 years of claims history. The underwriter needs structured data — claim number, date of loss, claimant, status, paid, reserved, incurred, claim type — but what they receive is a 15-page PDF designed for human reading, not system consumption.

The current workflow at most carriers:

  1. Broker emails loss run PDFs. These arrive as attachments — sometimes scanned, sometimes system-generated, sometimes both in the same email.
  2. Underwriter opens each PDF. Manually reads through 23 claims, looking for patterns: frequency, severity, open claims, large losses, claim types.
  3. Underwriter manually keys summary data. Total incurred, total paid, total reserves, claim count by year — typed into a spreadsheet or rating tool. This takes 20-45 minutes for a complex account.
  4. No validation. The underwriter may misread a reserve figure, transpose digits, or miss a claim entirely. There is no system check.
  5. No development tracking. Loss runs from the same account received 6 months apart should show claim development (reserves increasing or decreasing). Manual processes do not track this.

The math for a Workers Comp book:
- 3,000 WC renewals per year
- Average 12 claims per loss run
- 25 minutes average to manually extract and key loss data
- 1,250 hours/year of manual loss run data entry — equivalent to 0.6 FTEs doing nothing but transcribing PDFs

And the error rate on manual keying is 4-8%. On a $2M account, a single transposed digit in a reserve field can swing the loss ratio calculation by 15 points.

The InsightUW Bot-to-API Pipeline

InsightUW provides a structured API that accepts loss run data from any extraction source — InsightXtract (Anthropic Claude-powered document extraction), UiPath bots, Automation Anywhere bots, or custom scripts. The pipeline has four stages: ingestion, validation, enrichment, and presentation.

graph TD subgraph Extract["Extraction Layer"] A["Loss Run PDF<br/>(broker email attachment)"] B["Insight Xtract<br/>AI-powered extraction"] C["Ui Path / AA Bot<br/>RPA extraction"] D["Manual Upload<br/>(fallback)"] end subgraph Ingest["Ingestion API"] E["Post /api/uw loss runs/ingest<br/>Structured Json payload"] F["Schema Validation<br/>Required fields, types, ranges"] G["Duplicate Detection<br/>Claim number + DOL matching"] end subgraph QC["Quality Checks"] H["Incurred = Paid + Reserve"] I["Date Logic (DOL < Report < Today)"] J["Reserve Reasonableness"] K["Missing Field Detection"] L["Cross-Year Consistency"] end subgraph Enrich["Enrichment"] M["Loss Development Factors"] N["Ultimate Loss Projection"] O["Frequency / Severity Analysis"] P["Experience Mod Impact"] end subgraph Present["UW Presentation"] Q["5-Year Loss Summary"] R["Claim-Level Detail Table"] S["Development Triangle"] T["Flag: Large Loss / High Frequency"] end A --> B A --> C A --> D B --> E C --> E D --> E E --> F F --> G G --> H H --> I I --> J J --> K K --> L L --> M M --> N N --> O O --> P P --> Q Q --> R R --> S S --> T

POST /api/uw_loss_runs/ingest

This endpoint accepts a complete loss run payload — metadata about the source document, the policy period, and an array of individual claims with full financial detail.

Note: The full payload contains all 23 claims. Four representative claims are shown above — a medical-only, a lost-time, a severe/litigated, and a current-year open claim.

Quality Check Engine

The quality check engine runs 8 automated validations on every ingested loss run. These checks catch extraction errors before they reach the underwriter.

graph TD subgraph Checks["8 Quality Checks"] A["1. Incurred = Paid + Reserve<br/>Mathematical consistency"] B["2. Date Logic<br/>DOL < Reported < Today"] C["3. Reserve Reasonableness<br/>Age-based reserve ratio limits"] D["4. Missing Fields<br/>Required fields present"] E["5. Cross-Year Consistency<br/>Premium progression, claim counts"] F["6. Claim Type Distribution<br/>Statistical outlier detection"] G["7. Large Loss Detection<br/>Incurred > $250K threshold"] H["8. Extraction Confidence<br/>Bot confidence > 0.85"] end subgraph Outcomes["Check Outcomes"] I["ALL Pass → Auto-approve<br/>Loss run available to UW immediately"] J["Pass With Warnings → Flag<br/>Available to UW with warning badges"] K["ANY Fail → Hold<br/>CBP review required before release"] end A --> I B --> I C --> J D --> K E --> I F --> I G --> I H --> K I --> J J --> K

Quality Check Thresholds

Check PASS WARNING FAIL
Incurred = Paid + Reserve Exact match (all claims) Off by < $100 (rounding) Off by > $100 (extraction error)
Date Logic All dates valid and sequential Report date = DOL (same-day, unusual but valid) DOL > Report, or future dates
Reserve Reasonableness Reserve ratio within age-based norms Reserve ratio 1.5x expected for claim age Reserve > incurred, or negative reserve
Missing Fields 0 missing required fields 1-2 missing optional fields Missing claim_number, DOL, or incurred
Cross-Year Premium Year-over-year change < 25% Change 25-50% Change > 50% or missing year
Claim Type Distribution Within 2 std deviations of LOB norms Unusual but possible Impossible (e.g., 100% fatal)
Large Loss Detection Detection only (always PASS) N/A N/A
Extraction Confidence >= 0.90 0.85 - 0.89 < 0.85

The Loss Summary API

After ingestion and quality checks, the enrichment engine calculates summary analytics. The underwriter accesses these through the loss summary API or the renewal UI.

The Scenario

Ironclad Construction LLC is a commercial general contractor specializing in multi-story steel frame construction. They employ 73 workers across 4 active job sites in Pennsylvania and New Jersey. Their Workers Comp policy expires July 1, 2026. The expiring premium is $172,000. Their current experience modification rate is 1.15, trending down from 1.28 three years ago.

The broker emails a 12-page Hartford loss run PDF covering 5 policy years and 23 claims. Here is what happens.

Timeline: Bot Ingestion to UW Review

Time Step Actor Detail
9:00 AM Broker emails loss run PDF Broker "Attached: Hartford loss run for Ironclad Construction, 5 years, for July 1 renewal"
9:01 AM InsightUW monitored mailbox captures email System Email parsed, PDF attachment identified, linked to RNW-2026-WC-00394
9:01 AM PDF sent to InsightXtract for extraction System InsightXtract queues the 12-page PDF for AI extraction
9:01:14 AM InsightXtract extracts 23 claims InsightXtract Extraction confidence: 0.94. All 23 claims extracted with full financial detail
9:01:15 AM Structured payload POSTed to /api/uw_loss_runs/ingest InsightXtract JSON payload with 23 claims, 5 policy periods, source metadata
9:01:16 AM Schema validation: PASS System All required fields present, types valid, ranges valid
9:01:16 AM Duplicate detection: 0 duplicates System First ingestion for this submission
9:01:17 AM Quality checks: 7 PASS, 1 WARNING System Warning: Reserve ratio on HF-2024-WC-63847 (64% reserve ratio at 20 months)
9:01:18 AM Large loss flag generated System HF-2024-WC-63847: $600K incurred, amputation, litigated
9:01:19 AM Loss development factors applied System Ultimate incurred estimate: $1,298,420
9:01:20 AM Loss summary generated and attached to renewal System 5-year summary, development triangle, insights — all attached to RNW-2026-WC-00394
9:01:20 AM Notification sent to UW System Bell: "Loss Run Ingested: Ironclad Construction — 23 claims, 1 large loss flag"
9:05 AM UW opens renewal, reviews loss summary David Kim (UW) Sees 5-year development, experience mod trend, frequency improvement, large loss detail
9:15 AM UW adjusts renewal pricing based on loss data David Kim Factors in improving frequency, large loss reserve development, experience mod trend

Total time from broker email to structured loss data in UW's hands: 1 minute 20 seconds.

What David Kim Sees in the Renewal UI

The loss run data is presented in the renewal submission as a structured panel with four views:

  1. Summary View: 5-year totals, overall loss ratio, experience mod trend chart, frequency trend chart
  2. Year-by-Year View: Table with premium, claim count, paid, reserved, incurred, and loss ratio for each policy year
  3. Claim Detail View: Sortable table of all 23 claims with expandable rows for each claim's full financial detail
  4. Development View: Loss development triangle showing how each policy year's incurred has developed over time, with projected ultimates

The QC warning on claim HF-2024-WC-63847 appears as a yellow badge: "Reserve ratio 64% at 20 months — higher than typical for WC lost-time claims at this maturity. Review recommended."

Handling Multiple Loss Runs

Real-world renewals often involve loss runs from multiple carriers or multiple valuation dates. InsightUW handles this through versioning and merging:

graph TD subgraph Multiple["Multiple Loss Run Sources"] A["Hartford Loss Run<br/>2021-2026 (23 claims)"] B["Prior Carrier: Zurich<br/>2019-2021 (8 claims)"] C["Updated Hartford Run<br/>June 2026 valuation (23 claims)"] end subgraph Merge["Merge Engine"] D["Deduplicate by claim number"] E["Detect development<br/>(reserve changes between valuations)"] F["Merge into unified timeline"] end subgraph Unified["Unified Loss History"] G["7-Year Combined View<br/>31 claims across 2 carriers"] H["Development tracking<br/>Per-claim reserve movement"] end A --> D B --> D C --> E D --> F E --> F F --> G F --> H

When a second loss run is ingested for the same submission, the system:
1. Matches claims by claim number
2. Identifies new claims not in the prior run
3. Detects reserve changes (development) for existing claims
4. Flags significant development (reserve increase > 25% or reserve decrease > 50%)
5. Updates the loss summary with the latest valuation

Metrics: Before and After Bot-Ingested Loss Runs

Metric Before InsightUW After InsightUW Improvement
Time from loss run receipt to structured data 25-45 minutes (manual keying) 80 seconds (bot extraction + ingestion) 95% faster
Data entry error rate 4-8% of fields < 0.5% (bot + QC checks) 90% reduction
Large losses missed on first review 12% (UW skims PDF, misses buried claim) 0% (auto-flagged) 100% detection
Loss development tracking None (manual, ad hoc) Automatic (per-claim, per-valuation) New capability
UW hours saved per year (3,000 WC renewals) 0 1,250 hours (data entry eliminated) Recovered capacity
Experience mod trend visibility Manual calculation Auto-calculated and displayed Instant insight
Quality check coverage 0% (no validation) 100% (8 checks per loss run) Complete coverage
Time from loss run to pricing decision 1-3 days Same day (often within 30 minutes) 80% faster

Key Takeaways

  1. Loss runs are data extraction problems, not underwriting problems. InsightUW moves the extraction to a bot and the validation to a rules engine, so the underwriter's first interaction with loss data is analysis, not transcription.

  2. Quality checks catch what humans miss. The incurred-equals-paid-plus-reserve check catches transposition errors. The reserve reasonableness check flags claims where development may be understated. These checks run in milliseconds and catch errors that a fatigued underwriter at 4 PM would miss.

  3. Development tracking is automatic. When an updated loss run is ingested, the system shows exactly which claims developed and by how much. The underwriter sees "Claim HF-2024-WC-63847: reserves increased $45K since last valuation" — not a PDF they must compare page-by-page with the prior version.

  4. The loss summary is the underwriter's starting point. Frequency trend, severity trend, experience mod trend, large loss identification, and claim type analysis — all calculated and presented before the UW opens the file.

  5. 80 seconds, not 80 minutes. From broker email to structured, validated, enriched loss data in the UW's renewal package — the entire pipeline executes in under 90 seconds.


InsightUW turns loss run PDFs into structured, validated, enriched data in under 90 seconds — so your underwriters analyze losses instead of transcribing them. See the bot ingestion pipeline in action with your own loss runs.

See InsightUW run on your data

A 45-minute working session with a real broker email and your LOBs.

Request a demo