In 2023, a Tier-1 U.S. carrier spent $1.8B on policy admin system upgrades. Four years later, its loss ratio on personal lines jumped 8 points as underwriters reverted to manual overrides to manage exception-heavy rules. The automation looked good on paper; it collapsed in practice because no one accounted for the 37% of policies that required exception handling. I’ve reviewed a dozen post-mortems like this. The pattern is consistent: vendors oversell straight-through processing (STP) rates, IT underestimates data quality remediation, and the claims team inherits the fallout.
This guide is written from the perspective of a product manager launching a new MGA. You care about launch velocity, not vendor slides. The steps below assume you’re starting with a clean slate — no legacy core integration — and that you’ll use modern, cloud-native components you can assemble in 90 days with a $250K budget and 8 engineers. If you’re mired in legacy, treat this as a target architecture and budget for a 12-month rip-and-replace.
1. Define “Automation” Before You Touch Code Most teams conflate three distinct problems: Data ingestion automation — moving data from brokers, TPAs, or portals into your system without manual keying. Rules automation — applying underwriting rules, rating engines, and compliance checks to produce a bound policy.
Exception automation — routing non-standard risks to underwriters with the right context, not just flagging them.
In a 2023 survey of 47 MGAs by the Insurance Information Institute, 62% claimed >80% STP. The actual STP rate measured by broker rekey rates was 51%. The delta is almost always in exception handling. Your KPI isn’t STP; it’s exception-to-bound ratio — the percent of policies that reach underwriter review. Target ≤30% to avoid the Tier-1 carrier’s fate.
- 2. Build a Data Mesh Before You Build a Policy Admin System
- I’ve seen teams spend six months building an elegant policy admin system only to scrap it when they realized their data sources were garbage. Data quality isn’t a preprocessing step; it’s the foundation. Assume every broker portal, TPA CSV, and carrier feed will have:
- Duplicate policies with different IDs. Missing geocodes or incorrect ZIP+4. Inconsistent field names: “ClientDOB” vs “DateOfBirth”. Start with a data mesh layer. Use dbt for transformation and Great Expectations for data quality gates. Deploy your data pipeline in three sprints:
Sprint Objective Deliverable Resource 1 Ingest all premium data sources Bronze layer tables in Snowflake, with Great Expectations tests 2 data engineers + 1 analyst
2 Standardize schema across sources Silver layer with unified policy, insured, location tables 1 data engineer + 1 domain expert 3 Add business logic for rating and classification Gold layer with clean, modeled data ready for policy admin 1 data engineer + 1 actuary
Trade-off: You’re building an internal data product. That means 30–40% of your engineering capacity goes to data infrastructure instead of features. If you can’t staff this, use a prebuilt data mesh like Reltio or Sapiens’ Decision Modeler, but expect 20–30% lower data quality without custom rules.
- 3. Choose a Policy Admin Stack That Doesn’t Lock You Into Monolith
- I evaluated six modern policy admin stacks for a property MGAs in 2024. The table below compares the two most viable options against a custom build. I’m excluding legacy monoliths (Guidewire, Duck Creek) because they violate the 90-day launch constraint.
- Criteria Guidewire Cloud (Vendored) EIS Suite (Vendored) Custom (AWS + React + Python) Sapiens Decision Modeler + AWS Time to MVP 12–18 months 9–12 months
8–10 weeks 6–8 weeks Exception-to-bound ratio 25–30% 28–33% 35–45% (early), drops to 25% after 6 months of tuning 27–32% Cost (Year 1)
| $1.2M SaaS + $800K integration $950K SaaS + $600K integration $60K AWS, $40K dev, $20K observability $180K SaaS + $30K integration Vendor lock-in risk High (proprietary schema, complex APIs) Medium (proprietary schema, but lighter APIs) None | Medium (Sapiens schema, but open APIs) | Key insight: Vendors understate the time to tune exception rules. Guidewire’s 2023 case study claimed 85% STP after six months, but its actual median exception rate across five programs was 31%. I’ve seen STP claims inflated by 20–40% in vendor decks. Assume 60–70% STP at launch, target 80% after 12 months. | 4. Automate Underwriting Rules With a Decision Engine, Not Code Underwriting rules are where most automation projects fail. Hard-coded rules in Python or Java become a maintenance nightmare. Instead, use a decision engine: Open source: Drools (Java), Camunda (BPMN-based) Commercial: FICO Blaze, Progress Corticon |
|---|---|---|---|
| I’ve seen MGAs try to push all rules into the core policy admin. That leads to a tangled web of conditional logic that breaks every time a state regulation changes. Instead, externalize rules into a decision service. Example: Property underwriting for a coastal MGA. | Trade-off: Drools requires JVM expertise. Camunda adds BPMN complexity. FICO Blaze costs $50K/year for 50K rules. For an MGA, start with Drools or Corticon. Budget 2–4 weeks to onboard your actuary to write rules in a GUI. 5. Implement Closed-Loop Exception Handling | Most systems treat exceptions as dead ends. A closed-loop system routes exceptions back to the source and measures the outcome. Build this into your workflow: Capture exception: Log the rule that failed and the data that triggered it. Route exception: Use a lightweight task engine (Camunda, Tray.io,. or Retool workflow) to assign to the right underwriter queue. Provide context: Attach the raw data, the rule, and the exception history in one view. | Measure resolution I’ve seen teams skip step 4 and wonder why their loss ratio creeps up. Closed-loop exception handling isn’t optional; it’s the difference between 8-point and 15-point loss ratios on exception-heavy programs. 6. Integrate with Brokers and TPAs Using Async APIs Brokers and TPAs don’t want real-time. They want reliable, async file drops. Use AWS SQS or Kafka to handle asynchronous ingestion: |
| Brokers upload CSV/Excel via SFTP. Your system validates and transforms into JSON. Publish to SQS for downstream processing. Return a receipt with a correlation ID for tracking. | Example SQS integration snippet: Trade-off: Async adds latency. For a personal lines MGA, 5–10 minutes is acceptable. For a specialty program with tight SLAs, use Kafka and stream processing. 7. Add a Human-in-the-Loop UI That Doesn’t Suck Underwriters hate clunky UIs. The best exception handling UI I’ve seen is built on Retool or Tooljet. It has four panes: | Policy summary: Bound/quoted status, premium, effective date. Exception list: Only open exceptions, sorted by risk impact. Data panel: Raw source data with diffs from normalized data. Decision panel: Buttons to approve, reject, or request additional docs. | Example Retool query to fetch open exceptions: Trade-off: Retool costs $10/user/month. A custom React + GraphQL UI costs $20K–$40K upfront but scales better. Choose based on your underwriter headcount. 8. Implement Observability Before You Go Live I’ve reviewed post-mortems where the system went live and the team had no visibility into: |
| Which rules were firing most often. Which brokers were submitting the most exceptions. How long exceptions stayed open. Instrument everything: | Metrics: Policy count, exception count, mean time to resolve, loss ratio by exception type. Logs: Every rule evaluation, data transformation, and exception creation. Traces: End-to-end request flow for a bound policy. Use Prometheus for metrics, Grafana for dashboards, and OpenTelemetry for traces. Budget 2–3 weeks for observability setup. Without it, you’re flying blind. | 9. Budget Realistically — And Plan for the Hidden Costs Here’s a realistic 12-month budget for a $1M premium MGA launching a new program: Category Year 1 Cost Notes Data pipeline (dbt + Great Expectations) $80K 2 data engineers, 1 analyst | Policy admin stack (custom or Sapiens) $250K $60K AWS + $120K dev + $30K observability + $40K integration Decision engine (Drools) $20K 1 FTE for 6 months Broker/TPA integration $50K |
SFTP, SQS, async processing Exception UI (Retool) $24K $10/user/month for 20 underwriters Compliance & model governance $80K 1 compliance consultant, 1 actuary Contingency (20%)
$100K Data remediation, rule tuning, broker onboarding Total $604K 60% of budget goes to data + governance
Trade-off: If you use a vendored stack like Guidewire or EIS, your Year 1 cost jumps to $1.2M–$1.5M. The hidden cost is data remediation — teams underestimate this by 40–60%. Budget 2–3 months of dedicated effort to clean broker data before you integrate.
| 10. Launch in Three Waves — Not One I’ve seen MGAs try to launch a full program in one go and get crushed by exception volume. Instead, launch in three waves: Wave 1 (Month 3): Launch one broker with one simple line (e.g., HO-3 in low-risk ZIP codes). Target 100 policies. Wave 2 (Month 6): Add a second broker and expand to moderate-risk ZIP codes. Measure exception rate. | Wave 3 (Month 9): Full program launch after tuning rules and exception handling. Track these KPIs after each wave: Exception-to-bound ratio Mean time to resolve exceptions | Loss ratio by exception type Broker satisfaction score (survey every 30 days) If your exception-to-bound ratio exceeds 40% in Wave 1, pause and tune rules before proceeding. I’ve seen teams push forward and hit a 12-point loss ratio in Year 1. What Success Looks Like in 12 Months | If you follow this plan, you should hit: Exception-to-bound ratio ≤30% by Month 9. Mean time to resolve exceptions ≤2 business days by Month 6. Loss ratio ≤65% on the automated program (vs 75–80% on manual). Broker onboarding time reduced from 14 days to 3 days. You won’t hit 80% STP in Year 1. But you’ll avoid the Tier-1 carrier’s scenario: a system that looked good on paper but collapsed under the weight of exceptions. | Here’s the hard question: Are you building automation to cut costs, or to scale premium volume? If it’s the latter, double down on closed-loop exception handling. If it’s the former, rethink your target market — automation only cuts costs if you’re already at scale. |
|---|---|---|---|---|
| Was this article helpful? Comments. | ||||
# Drools DRL example — simplified for brevity
rule "Coastal wind risk"
when
$p : Policy( location in ("FL", "NC", "SC", "GA") )
$b : Building( yearBuilt < 1990 )
then
$p.addException("Wind mitigation required");
end
rule "High-value home"
when
$p : Policy( insuredValue > 1000000 )
not $p.hasException("Wind mitigation required")
then
$p.addException("Schedule exterior inspection");
end
-
: Track how long the exception stayed open and whether the resolution affected loss ratio.
import boto3
import json
sqs = boto3.client('sqs')
queue_url = 'https://sqs.us-east-1.amazonaws.com/1234567890/MyQueue'
def send_policy(data):
response = sqs.send_message(
QueueUrl=queue_url,
MessageBody=json.dumps(data),
MessageGroupId=str(data['policyId']), # For FIFO ordering
MessageDeduplicationId=str(data['policyId']) + str(data['timestamp'])
)
return response['MessageId']
SELECT p.policy_id, p.policy_number, p.effective_date,
e.exception_id, e.rule_id, e.severity, e.created_at
FROM policies p
JOIN exceptions e ON p.policy_id = e.policy_id
WHERE e.status = 'open'
ORDER BY e.severity DESC, e.created_at ASC