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

Handling BOR Disputes: Contest Workflow, Resolution, and Account-Level History

How InsightUW manages Broker of Record contests through a structured modal workflow, a defined status state machine, and a searchable account-level history — replacing ad hoc emails and spreadsheet notes with auditable resolution.


The Problem

When an incumbent broker contests a Broker of Record change, most carriers enter a gray zone. The contest arrives as an email, gets forwarded to the underwriter, who replies to the operations manager, who updates a spreadsheet — maybe. There is no structured way to capture who contested, why, what the resolution was, or how it affects the grace period countdown. When regulators or auditors ask about a contested BOR from six months ago, the carrier scrambles through email archives and shared drives to reconstruct what happened.

Worse, the lack of a defined status machine means BOR records get stuck in limbo. Is this BOR still active? Was it denied? Did the countdown pause? Nobody knows without reading the email thread.

The InsightUW Approach

InsightUW provides a structured contest workflow with a dedicated modal interface (no JavaScript prompt dialogs), a defined status state machine with clear transitions, automatic countdown pausing, underwriter notification, and a searchable BORHistory log for account-level tracking. Every action creates an audit trail entry, and every resolution is captured with who decided, when, and why.

graph TD subgraph Pending["Pending"] A["BOR Created<br/>status: pending"] end subgraph Active["Active Grace Period"] B["Countdown Running<br/>status: active"] end subgraph Expired["Grace Expired"] C["5 Days Passed<br/>status: expired"] end subgraph Contested["Contested"] D["Incumbent Files Contest<br/>status: contested"] E["Countdown Paused"] F["UW Reviews Contest"] end subgraph Resolution["Resolution"] G["Approve & Finalize<br/>status: completed"] H["Deny BOR<br/>status: denied"] I["Withdrawn<br/>status: withdrawn"] end A --> B B --> C B --> D C --> G C --> D D --> E E --> F F --> G F --> H F --> I

Status State Machine

The Bor model's status field follows a defined state machine with six possible values and controlled transitions:

Current Status Allowed Transitions Trigger
pending active Grace period start time reached
active expired, contested Countdown reaches zero, or incumbent files contest
expired completed, contested UW approves finalization, or late contest filed
contested completed, denied, withdrawn UW resolves the contest
completed — (terminal) Broker change finalized
denied — (terminal) Contest upheld, BOR rejected
withdrawn — (terminal) New broker withdraws BOR request

Invalid transitions are rejected by the API with a 400 Bad Request and a descriptive error message. The state machine is enforced server-side — the UI simply reflects allowed actions based on current status.

Contest Modal

When the "Contest" action is selected from the BOR detail modal, InsightUW opens a structured contest form — not a JavaScript prompt dialog. The modal captures:

Field Type Required Description
Contested By Text input Yes Name of the party filing the contest (e.g., "Lockton Risk Advisors")
Contest Reason Textarea Yes Detailed reason for the contest (e.g., "Valid appointment letter on file, signed BOR not received from insured")

On submission, the system:

  1. Updates BOR status from active or expired to contested
  2. Records contested by and contest reason on the BOR record
  3. Pauses the grace period countdown (remaining time is frozen)
  4. Sends a critical (red) notification to the assigned underwriter
  5. Creates an audit trail entry: bor_contested | {contested_by} | {reason}
  6. Creates a BORHistory entry for account-level tracking

Contest Review and Resolution

The assigned underwriter reviews the contest from the BOR detail modal, which now shows the contest information prominently:

Section Content
Contest Banner Red banner at top: "This BOR is contested by {contested_by}"
Contest Details Contested by, reason, date filed
Resolution Actions Three buttons: Approve & Finalize, Deny BOR, Mark as Withdrawn

Each resolution action opens a confirmation modal with a required "Resolution Notes" field:

Approve & Finalize (status: completed)

The UW determines the new broker's BOR is valid despite the contest. The broker change is finalized, and the BOR moves to completed status. The incumbent broker's contest is overruled.

Deny BOR (status: denied)

The UW determines the contest has merit — the incumbent broker retains the account. The BOR is denied, the new broker is notified, and the account remains with the incumbent.

Mark as Withdrawn (status: withdrawn)

The new broker voluntarily withdraws the BOR request. This can happen when the new broker learns the insured did not actually sign the BOR letter, or when the contest reveals a valid existing appointment.

Account-Level History: BORHistory

Every BOR action — creation, status change, contest, resolution — generates a BORHistory record. This provides a complete, searchable history of all BOR activity for any given insured account.

Field Type Description
id Integer Auto-increment primary key
bor id ForeignKey Link to the Bor record
insured name String Denormalized for search performance
action String bor_created, countdown_started, grace_expired, contested, approved, denied, withdrawn
performed by String User who performed the action
details Text JSON blob with contextual data (broker names, reason, notes)
created at DateTime Timestamp of the action

History Tab

The BOR dashboard's "Account History" tab provides a searchable list of all BORHistory entries:

  • Search by insured name — type-ahead search filters history entries by insured
  • Chronological display — entries shown newest first with action badges
  • Expandable details — click any entry to see full context (broker names, contest reason, resolution notes)
  • Export — download history for an insured as CSV for compliance reporting

This is particularly valuable when an account has multiple BOR changes over time. The history tab shows every change, every contest, and every resolution in a single searchable view.

Audit Trail Integration

Every BOR action creates an audit trail entry in the standard InsightUW audit log:

Workers Compensation: Ironclad Construction Services

Scenario: Gallagher Specialty Group files a BOR letter to take over the Workers Compensation account for Ironclad Construction Services, currently brokered by Lockton Risk Advisors. The assigned underwriter is Jennifer Walsh.

Field Value
Insured Ironclad Construction Services
LOB Workers Compensation
Policy Number POL-2026-WC-0893
Incumbent Broker Lockton Risk Advisors (Marcus Cole, m.cole@lockton.com)
New Broker Gallagher Specialty Group (Anna Reeves, a.reeves@gallagher.com)
Grace Period April 20 - April 25, 2026
Assigned UW Jennifer Walsh

Timeline:

Day Event Status Action
Monday Apr 20 BOR created pendingactive Jennifer notified: "Do not quote Gallagher"
Wednesday Apr 22 Lockton files contest activecontested Countdown paused at 2.0 days remaining
Wednesday Apr 22 Jennifer reviews contest contested Contest modal shows: "Lockton has valid appointment letter signed by insured on Jan 15, 2026. BOR letter from Gallagher not countersigned by insured."
Thursday Apr 23 Jennifer denies BOR contesteddenied Resolution notes: "Lockton appointment verified via signed letter dated Jan 15, 2026. Gallagher BOR lacks insured countersignature. Account remains with Lockton."

What the History Tab shows for "Ironclad Construction Services":

Timestamp Action Performed By Details
Apr 23, 10:30 AM BOR Denied Jennifer Walsh Lockton appointment verified, Gallagher BOR lacks countersignature
Apr 22, 2:15 PM BOR Contested System Contested by Lockton — valid appointment letter on file
Apr 20, 9:01 AM Countdown Started System Grace period: Apr 20 - Apr 25
Apr 20, 9:00 AM BOR Created System Gallagher replacing Lockton, WC, Ironclad Construction

What This Means for Underwriters

  1. Structured contest capture — the contest modal with required "Contested By" and "Reason" fields replaces ad hoc emails and ensures every contest is recorded with full context from the moment it is filed.

  2. Clear status machine — six defined statuses with controlled transitions eliminate ambiguity about where a BOR stands, and invalid transitions are blocked server-side so the UI always reflects reality.

  3. Automatic countdown pause — when a contest is filed, the grace period countdown freezes immediately, preventing the BOR from expiring while the dispute is under review.

  4. Account-level history — the BORHistory log and searchable History tab give underwriters a complete chronological view of every BOR change, contest, and resolution for any insured, across all time.

  5. Auditable resolution — every contest resolution requires notes, every action creates an audit trail entry, and every status change is logged with who, when, and why — ready for regulatory review.

What's Next

In the next post, we will explore the BOR dashboard — how underwriters track every active countdown, filter BOR records by status, and manage their entire BOR book from a single page with summary cards, detail modals, and broker transition indicators.


InsightUW is an AI-powered underwriting workstation for P&C carriers. Request a demo to see the BOR contest workflow in action.

See InsightUW run on your data

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

Request a demo