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

The Quote-Readiness Gate: Why InsightUW Refuses to Send a Quote With Open Referrals

From "the broker got a quote letter on a $14M D&O risk before our chief UW even saw it" to "the Send button is grayed out, the banner names the two open referrals, and the manager's override path is logged with a reason" — through one helper that gates two routes and an override mechanism that doesn't drop the audit trail.


The Problem

A UW finishes a manuscript quote, clicks Send, the broker's inbox pings — and only then does someone notice the quote referenced an aggregate limit that needed senior-UW sign-off. The damage is done in two ways: the broker treats it as a binding offer, and compliance has no record of who approved a referral that was supposed to be required.

The usual fixes don't fix:

  • Manager email approval before send. Tomorrow's emergencies will outrun yesterday's politeness — UWs work around it.
  • A workflow flag on the submission. UW unticks it. No accountability.
  • Block at bind time. Too late. The quote letter is already with the broker.
  • A custom "is referral cleared?" check at every send call site. Eight call sites, six get it wrong, the seventh is a script.

The root cause: there's no single point in the pipeline that says "this is the moment a broker-facing artefact leaves the building." Without that point, the controls scatter.

The InsightUW Approach

InsightUW puts the gate at the broker-facing-artefact moment — quote send and quote-letter generation — and centralises it in one helper. Bind isn't the right gate (subjectivities cover that, separately). The two routes that produce something the broker reads are the gate.

graph TD subgraph Send["Broker-Facing Routes"] S1["Post /quotes/{guid}/send"] S2["Post /quotes/{guid}/generate/quote-letter"] PRE["GET /quotes/{guid}/send-gate<br/>(preflight)"] end subgraph Gate["quote send gate"] Q["Open referrals?<br/>(pending OR escalated)"] OVR["override referral guids<br/>(manager bypass)"] DEC{"Any blocking left?"} end subgraph OK["Pass"] Send["quote.quote status = sent<br/>OR PDF rendered"] end subgraph Blk["Block"] REJ["Http 409<br/>{source: 'referral',<br/>blocking: [...],<br/>count blocking: N}"] end subgraph UI["UI"] BAN["Red banner +<br/>disabled Send button"] Ovrbtn["'Override & send'<br/>(manager, logged reason)"] Q Link["'Open queue' deep link"] end S1 --> Q S2 --> Q PRE --> Q Q --> OVR OVR --> DEC DEC -->|"none"| Send DEC -->|"blocking"| REJ REJ --> BAN BAN --> Ovrbtn BAN --> Q Link

What the Gate Looks At

quote send gate returns a {ok, blocking, count_blocking, source: 'referral'} object. The query is small:

  • Referral Queue.referral_status IN ('pending', 'escalated')
  • Scoped to the quote's submission (so submission-level manual referrals also block — capability #3's manual triggers are first-class here).
  • Excludes anything in override referral guids.

Manual referrals count. The whole reason a UW manually triggers a referral is to block the send until a manager looks. If the gate let manual referrals through, the manual path would be theatre.

Three Hook Points, One Helper

Caller What changes
POST /quotes/{guid}/send Refuses with 409 + structured payload. Accepts override referral guids + override reason for manager bypass.
POST /quotes/{guid}/generate/quote-letter Same gate. The letter is the other artefact the broker reads.
GET /quotes/{guid}/send-gate Preflight. UI calls on quote-select to disable the Send button before the user clicks.

Override Path

A manager can bypass — they need to. The bypass is structured, not a backdoor:

  1. UI's red banner has an Override & send button (visible only when the gate would block).
  2. Clicking prompts for a reason. Empty reason → no override.
  3. The send call goes out with override_referral_guids=[<all blocking guids>] and override_reason="<text>".
  4. The send service logs: "Quote {guid} sent with referral override by {actor}: {reason} (overridden guids=...)".
  5. The referral itself is not approved or declined by the override — it stays open. The manager has overridden the send gate, not the referral.

Why keep the referral open? Because the question "should we have written this risk?" is still live. The override says "we needed to send the quote letter today; we'll resolve the referral in parallel." Closing the referral on override would erase the audit story.

Worked Example: Stronghold Capital, Continued

(Picking up where blog #87 left off — Sarah's $14M Private D&O quote tripped two referrals.)

Sarah opens the quote in /uw/quotes/QT-2026-DO-0319. The page loads:

  1. Quote-manager component calls refreshSendGate(quote.guid) on mount.
  2. GET /quotes/QT-2026-DO-0319/send-gate returns {ok: false, count_blocking: 2, blocking: [...]}.
  3. The component sets sendGate state. The Send button picks up [disabled]="sendGate && !sendGate.ok" and shows a count badge: "Send Quote 2" (in red).
  4. A red banner renders below the action bar:

    Quote is not ready to send. 2 open referral(s) must be approved, declined, withdrawn, or overridden before this quote can be sent or its quote letter generated.

    • policy limit · Quote QT-2026-DO-0319 for Stronghold Capital requests a $14,000,000 limit, which exceeds the US private D&O underwriting threshold of $10,000,000. · routed to Jennifer Walsh · status pending
    • authority exceeded · Quote ($14M / $385k) exceeds the assigned UW's authority. Routing to the smallest authorized approver. · routed to Jennifer Walsh · status pending

  5. Two buttons in the banner: Open queue (deep link to /uw/referrals/queue) and Override & send (manager only).

Jennifer (the manager) sees the bell, opens her queue (capability #6), clicks the row for Stronghold, opens the Approve with note flow (capability #10), authors the structured approval note, clicks "Finalize & APPROVE" — both referrals close in one transaction. Sarah's banner clears. She refreshes; the Send button enables. Send goes out. Audit trail: complete.

What If Jennifer's Out for the Day?

Reassign (capability #6) — Jennifer's coverage flags Patricia, hands off both rows in one click. Banner unchanged for Sarah; she just sees a new referred to. Same gate, same path — Patricia approves.

What If the Broker Has Already Promised Bind by Noon?

Jennifer (or any user with _can_decide_on_referral=true for those referrals) clicks Override & send in Sarah's banner, types "BR/Marsh CEO bind commitment 11:30; reviewing referral in parallel; chief_uw notified.", hits enter. The send goes out. The two referrals stay pending — Jennifer's queue still shows them, Patricia gets the back-notify when Jennifer formally approves later, and the audit log carries the override reason against this user, this minute, this quote.

What Doesn't Block

Three things explicitly don't gate quote send:

  • Subjectivities — handled by their own bind-time gate, separate module. Subjectivities are conditions for binding, not for sending the quote letter. (The subjectivities/referrals double-gate idea was raised during the capability #6 review and explicitly deferred — different lifecycle moments.)
  • Approved or declined referrals. A declined referral is a closed loop — the broker sees the decline letter, not the quote.
  • Withdrawn referrals. The originator pulled it back; nothing to block.

What This Means for Underwriters

  1. Two routes, one gate. Send and generate-quote-letter share quote send gate. New broker-facing routes pick up the gate by calling the same helper — no duplicate checks scattered through the codebase.
  2. The Send button is honest. Disabled when blocked, count badge tells you how many. UWs don't waste a click on something the server will reject.
  3. Override is a tool, not a backdoor. Reason is required, audit row is written, the referral stays open. The override bypasses the gate, not the decision.
  4. Manual referrals block too. Capability #3's manual trigger ("Bermuda needs the ability to refer all quotes") works through the gate the same way rule-fired ones do.
  5. 409 carries structured detail. The error response includes the blocking list — UI re-renders the banner from the server payload. No re-fetch round-trip.
  6. Preflight is cheap. The UI hits /send-gate on quote-select; it's a single SQL query against Referral Queue indexed by submission. Sub-millisecond at typical scale.

What's Next

Next: Two Notes, One Audit Trail — How UW Summaries and Manager Approval Notes Close the Referral Loop


Want to see how a single helper protects every broker-facing artefact across your underwriting pipeline? Request a demo.

See InsightUW run on your data

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

Request a demo