Pulse As Adapter, Workstation As Decision Surface: How InsightUW Builds a Customer 360 Without Replicating InsightPulse
From "we already have InsightPulse with analyst feeds, ratings, news, market intelligence — and we're about to rebuild a chunk of it in the underwriting workstation because UWs need a 360 view at decision time" to "Pulse stays the depth-of-data source-of-truth, the workstation owns the contract via the multi-adapter framework, ratings flow through pulse ratings, and a single composition page wires together what nine prior modules already shipped" — through one new table, two new adapters, one new service for client relationship + cross-sell, and a renewal-time T&Cs differ that reuses the existing prior policy id FK.
The Problem
The org owns InsightPulse. Pulse aggregates analyst commentary, S&P / Moody's / Fitch / A.M. Best credit ratings, MSCI ESG scores, market intelligence, news, financial events. Pulse handles the licensing, the scraping compliance, the GDPR posture. Pulse has its own UI; analysts go deep there.
Underwriters don't go to Pulse to underwrite. They live in the workstation. The submission is in front of them. Pulse is a tab they switch to, then context-switch back.
Asking "build a Customer 360 in the workstation" splits two ways:
- Naive A: rebuild Pulse in the workstation. Now the org has two analyst surfaces, two licensing conversations, two refresh cadences, and twice the maintenance. Compliance has two posture documents. The deep-data tail (ten-year MSCI ESG history, broker-prior-firm career chains, debt issuance schedules) lives in Pulse and stays in Pulse — UWs end up bouncing between systems anyway.
- Naive B: iframe Pulse into every UW page. Now the workstation can't make decisions when Pulse is degraded. The auth flow is Pulse's. The audit is Pulse's. The styling diverges. UWs feel like they're "in Pulse" even when they're inside a submission workspace, which slows them down.
The workstation has nine already-shipped modules that touch the customer-360 surface — Research Assistant news, board/executives/capital-raises enrichment, claims-priority signals, research shortcuts, BI peer panel, BI NAICS benchmark, ratings (just shipped), submission queue + quote + policy state. It also has a multi-adapter intelligence framework (cap #1) where UW owns the contract and adapters supply the data.
The right framing: Pulse is one (big) adapter among many. The workstation owns the data contract, surfaces the data UWs need at decision time, and deep-links to Pulse for the depth tail.
The InsightUW Approach
Insured External Rating extends the same multi-adapter pattern that handles board / executives / capital raises / news / claims signals. Pulse provides ratings via a thin pulse ratings adapter. Manual paste available for fallback. Customer-360 page composes existing components + four small gap-fillers + a deep-link to Pulse for analysts who want the full experience.
One new table: Insured External Rating
Mirrors the cap #1 enrichment table conventions exactly:
Same is_primary / multi-source pattern as cap #1's board, executives, capital_raises. Multiple sources can publish credit long term (S&P + Moody's both); is_primary flagged per priority order at write time. UW sees primary chips by default with an "alt sources" toggle.
Two new adapters
pulse ratings — calls Pulse's /api/insurance/360/insured/{duns}/ratings endpoint, maps the structured payload to AdapterRecord(data_type=DATA_TYPE_RATINGS, payload=...). Active when INSIGHT_PULSE_API_URL env is set. Priority 40 (lower than pulse=50 for the rest of the intelligence tail, since ratings have a separate Pulse endpoint). Underlying vendor (S&P, Moody's etc.) lands in the notes column on the rating row so UWs can see whose data Pulse is forwarding.
manual rating — UWs paste from a vendor portal screenshot or a broker email. Always-on at priority 10. Same pattern as the cap #1 manual entry adapter; manual data wins is_primary by default because a UW typed it.
One coordinator change: extend cap #1's data-type routing
Five edits, total. The framework absorbs ratings as a first-class data type without anyone writing a separate "ratings service."
Gap C: client relationship + cross-sell finder
uw_customer_360_service.client_relationship_summary(insured_guid). Pure read; zero new tables.
The cross-sell badges on the customer-360 page show "Cyber (47)" — meaning the org wrote 47 cyber policies in the last 36 months at peers in this insured's NAICS. UW reads it as: "this insured is in an industry where we write cyber; we haven't pitched them. Worth a conversation."
Gap D: prior policy T&Cs diff for renewals
Submission Queue.prior_policy_id is a real FK (not a snapshot — the schema promoted it from properties JSON). For renewal submissions, find the prior bound policy + the in-flight renewal quote, diff the field set:
classify change produces same | increased | decreased | new | removed | modified | later | earlier. The UI shows up/down arrows + change-kind chips. Hide-unchanged toggle keeps the table compact for big policies.
Field-level only; clause-text-level semantic diff is a Phase 2 — needs manuscript-template alignment and isn't blocking the renewal cycle.
Composition: customer-360-page
/uw/customer-360/:insured_guid (with optional ?submission_guid=... for renewal context). Pure markup; the only TS logic is fetching the insured's intelligence (for the NAICS passthrough into news + benchmark) and resolving the Pulse deep-link from the research-shortcuts library if registered.
Layout:
- Header: insured ID + (optional) "Open in InsightPulse" deep-link
- external-ratings-panel (Gap A — chip strip)
- submission-summary-card (Gap B — when submission_guid present)
- Two-column row: insured-news-panel + insured-intelligence-panel (existing)
- Two-column row: client-relationship-panel (Gap C) + prior-policy-tc-panel (Gap D — when submission_guid present)
- bi-tile-host for anchor='insured_360' (Power BI tiles registered to this surface)
- research-shortcuts-widget compact (top 8)
The page is ~80 lines of HTML + ~70 lines of TS. Most of the value is the components it composes — every one of which already shipped, was already memory-captured, and continues to work standalone.
Worked Example: Sarah's Renewal Decision on Acme Construction
Acme is up for renewal. Their current $50M Excess Casualty policy expires in 45 days. Sarah is reviewing the renewal submission.
She lands on customer-360
URL: /uw/customer-360/acme-construction-guid?submission_guid=sub-2026-ex-0188. She gets:
Header: "Customer 360 · Acme Construction" + an "Open in InsightPulse" button (the research-shortcuts library has a pulse 360 shortcut registered with {{ insured.guid }} substitution).
External ratings strip:
- Credit (LT) A− stable · S&P (primary, fetched via pulse ratings)
- Financial strength A− stable · A.M. Best (primary, also via pulse ratings)
- ESG 62 stable · MSCI (primary)
- "Show 2 alt" toggle reveals Moody's and Fitch ratings.
She notices: A− is one notch below last year's A. Outlook stable. Click reveals the CAPIQ summary: "Construction sector exposure to higher input costs has compressed margins; balance sheet remains solid; no near-term rating action expected."
Submission summary card (because submission guid is in the URL):
- Status: in_review · 12 days in queue
- LOB: Excess Casualty · effective 2026-07-01
- Quoted premium: $625K (USD) · prior premium $510K · +22.5% (highlighted amber)
- Total TIV: $94M · 8 locations · 2,400 employees
- Open follow-ups: 1 · priority: high
News panel: filtered to last 30d, severity ≥ medium. Three items:
- "Acme Construction announces $30M Series E led by Sequoia" (capital_raise · severity: medium · 12 days ago)
- "Construction sector facing OSHA enforcement uptick in TX" (regulatory_action · severity: high · 8 days ago)
- "Acme CEO interviewed on Bloomberg; expansion into Mexico" (leadership · severity: low · 4 days ago)
She clicks the "$" toggle — financial-events preset (Gap E). News filters to capital_raise + m_and_a only. Just the Sequoia round is left. She makes a mental note: recent capital injection means Acme has runway, lower likelihood of mid-term cancellation, but the capital influx may also signal expansion (which will need an exposure-management review next renewal cycle). Cap #2 already emitted a recent capital raise priority signal on this insured; she sees it on the priority-signals badge.
Intelligence panel: board members (4 sources from Pulse), executives (CEO + CFO + COO from Pulse), capital raises (Series D 2024 $25M from Pulse, Series E 2026 $30M just emitted). is_primary chips show Pulse-sourced rows (priority 50) winning over manual rows (priority 10) wherever both exist.
Claims decision panel (cap #4): two open claims, neither high-severity. Loss ratio 47% over 3yr. Decision band: "low-medium" — green.
Client relationship panel (Gap C):
- 11 lifetime submissions, 4 in last 24mo
- 6 bound policies, $2.3M lifetime premium
- Outcome chips: 6 bound, 2 quoted_lost, 2 declined, 1 withdrawn
- Per-LOB grid: GL (3 bound), Excess Casualty (2 bound, 1 quoted_lost), Auto (1 bound), Property (1 declined)
- Cross-sell opportunities: Cyber (47), D&O (12), Workers Comp (89)
She sees: Acme has never submitted for Workers Comp, but the org wrote 89 WC policies in the last 36mo at peer construction firms in this NAICS. She makes a note for the producer to ask about WC at the renewal touch-point.
Prior policy T&Cs diff (Gap D — visible because submission_guid is set):
| Field | Prior | Renewal | Change |
|---|---|---|---|
| Total limit | $50,000,000 | $50,000,000 | same |
| Deductible | $250,000 | $500,000 | ↑ increased |
| SIR | 0 | $100,000 | + new |
| Premium | $510,000 | $625,000 | ↑ increased |
| Effective date | 2025-07-01 | 2026-07-01 | → later |
Coverage JSON delta:
- subjectivity count: prior 2 → renewal 4 (modified)
- endorsements: prior ["WC1234"] → renewal ["WC1234", "EX9921"] (modified)
She reviews the new EX9921 endorsement to make sure it's correct for Acme's expanded operations.
Power BI tile (bottom of page): the BI team's "Construction Sector — Bound vs. Lost" report for anchor='insured_360', filtered by NAICS 23 + Sarah's RLS (LOB Excess Casualty). She sees the org's win rate at NAICS 23 trended down 4pp last quarter — context for why the carrier is firming up retentions on construction risk this year.
Research shortcuts strip: 8 most-used shortcuts. The Capital IQ link substitutes Acme's cik; the SEC EDGAR link substitutes the same; Yahoo Finance substitutes the ticker. One click each.
She makes the renewal decision, drafts the broker email via the cap-#14 personalized AI followup (which uses her voice profile), and the audit trail captures every component of the 360 view she consulted.
The Pulse fall-through
Three weeks later, Pulse has scheduled maintenance. The pulse ratings adapter returns success=False for an hour. The customer-360 page still loads. The ratings panel shows the cached rows from Insured External Rating (cached_until 30d ahead). The intelligence panel shows cached board / execs / capital_raises. News panel still works (cached items). The "Open in InsightPulse" link is broken for the hour — but UW workflow continues. Pulse comes back; next intelligence refresh repopulates.
The workstation never blocks on Pulse. It uses Pulse when available, caches the data, and continues when it's not.
What's Deferred (Phase 2)
- Per-vendor direct adapters. S&P direct, Moody's direct, Fitch direct, A.M. Best direct, CAPIQ direct, MSCI ESG direct. Stubs only today — Pulse aggregates these. If a deployment loses Pulse access or needs vendor data Pulse doesn't carry, the adapter slots in (~half day each).
- Clause-level semantic diff for T&Cs. Field-level + JSON-key-level today. Clause text-comparison ("the 'demolition exclusion' wording differs by these phrases") needs manuscript-template alignment. Not blocking the renewal cycle.
- Auto-classify quoted_lost. Today, "quoted but ultimately not bound" submissions sit in in review. A heuristic that promotes them to quoted lost based on cancellation notes + age threshold is a follow-up.
- TIV from Location rollup. Native peer scorer (BI cap #2) uses
Insured.revenueas a proxy. Lift to true TIV when location data is available; revenue-only fallback when not. - Pulse iframe in-page. Today the workstation deep-links to Pulse in a new tab. Iframe-embed is possible but locks UW into Pulse's auth flow inside the workstation — usually slower. Deep-link is the right default; iframe an option per client.
- Cross-sell denominator config. Native cross-sell finder uses the org-wide LOB book in Policy. A specialty MGA may want only its own LOBs in the denominator, not the parent carrier's. Add config row when asked.
What This Means for Underwriters
- Pulse stays the depth-of-data source-of-truth. Workstation reads via
pulse+ pulse ratings adapters; deep-links to Pulse for the full-experience tail. No duplication of vendor licensing. - Workstation owns the contract. Insured External Rating is the canonical row. If Pulse is replaced or supplemented, the contract doesn't move; only the adapters change.
- Multi-source ratings tracked correctly. S&P + Moody's both publish credit long term; both are kept; is_primary set per priority order at write time. UW sees the primary chip with an "alt" toggle.
- Customer 360 = composition, not new code. The
customer-360-pageis mostly markup. Every panel it composes already shipped — news, intelligence, claims-decision, ratings (new), submission-summary (new), relationship (new), prior-policy-diff (new), Power BI tiles, research shortcuts. - Cross-sell finder is mechanical. Org's LOB book MINUS this insured's LOBs, intersected with peer NAICS volume. No ML, no judgment call — surfaces opportunity, leaves the decision to the producer.
- Renewal T&Cs diff is field-level + JSON-key-level today. Field-by-field comparison covers 90% of the "did we change anything?" question. Clause-text diff is deferred but the schema's there.
- Financial-events news preset is a one-line toggle. Cap #2 already classifies capital raise, m and a. Gap E is a
visibleItems()getter on the news widget. ~15 minutes of work, end to end. - Graceful degradation on Pulse outage. Cached rows render with "stale" indicators (via expires_at). Page never blocks. UW workflow continues.
- Audit captures everything. External ratings flow through Audit Entry (entity_type='intelligence'); manual rating entries write a "external_rating_manual_added" row. Cross-sell + relationship are read-only — no audit needed.
- Manager un-anonymization writes audit. The peer panel (BI module) anonymizes broker + insured names by default; managers un-anonymize, audit row written. Same privacy posture extends to client relationship view if the org wants it.
- Submission summary card pulls from existing aggregates. Zero new schema. Reuses Submission Queue + Quote + Policy + Location. Drop-in for any submission-context page.
- Power BI tiles compose into the same page.
bi-tile-hostforanchor='insured_360'lets the BI team ship insured-360 reports without code changes; admin registers, the tile appears, RLS overlay applies per UW.
What's Next
The Customer 360 module composition is the last piece of the workstation's account-surface story. Future work tilts toward operational depth: per-vendor adapter slots when Pulse coverage falls short, semantic clause-level T&C diff, and richer end-to-end traces (data integration hub) embedded in submission workspace for compliance.
Want to see how Pulse + the workstation share one contract, two surfaces, and zero duplication of analyst-data licensing? Request a demo.