Knockouts & Eligibility
Knockouts prevent ineligible customers from proceeding through the quote flow. They're enforced at two layers: client-side (before API calls) and server-side (from Safeco API responses).
Client-Side Knockouts
Checked in the portal before submitting to the API. Navigates to /carriers/safeco/auto/knockout immediately.
Driver Knockouts
| Condition | Field |
|---|---|
| License suspended | driver.licenseStatus === 'suspended' |
| License revoked | driver.licenseStatus === 'revoked' |
Vehicle Knockouts
| Condition | Field |
|---|---|
| Delivery use | vehicle.use === 'delivery' or empty string |
| Commercial/business use | vehicle.use === 'commercial' or 'business' |
Policy Knockouts
| Condition | Field |
|---|---|
| Delivery use flag | policy.deliveryUse === true |
| Commercial use flag | policy.commercialUse === true |
| License suspended (policy-level) | policy.licenseSuspended === true |
| Insurance previously canceled | policy.insuranceCanceled === true |
Source: apps/fastlane-portal/src/app/pages/carriers/safeco/auto/knockout-validations.ts
Server-Side Knockouts
Detected from Safeco API responses after rate calls. Checked via checkKnockoutResponse().
Knockout Types
| Type | Trigger | Meaning |
|---|---|---|
declined | MsgStatusCd === 'Rejected' | Safeco declined the risk |
error | MsgStatusCd === 'Error' | Safeco returned an error |
pending | Zero premium returned | Quote came back with $0 premium (likely data issue) |
Zero Premium Detection
A quote is considered zero-premium when com__safeco_QuoteRq_PremiumTotal === 0 or the FullTermAmt across all vehicles sums to zero. This typically indicates Safeco couldn't rate the risk but didn't explicitly reject it.
Extended Status Codes
When Safeco rejects a quote, the response includes ExtendedStatus entries with detail:
| ExtendedStatusCd | Meaning |
|---|---|
QuoteKickout | Risk doesn't meet underwriting guidelines |
FieldError | Missing or invalid field in the request |
DataError | Legacy CRN error pattern |
The ExtendedStatusDesc field contains human-readable details shown on the knockout page.
Source: apps/fastlane-portal/src/app/pages/carriers/safeco/auto/knockout-utils.ts
Knockout Page
The knockout page (knockout.tsx) displays:
- The knockout type (declined, error, or pending)
- Reasons extracted from the API response
- A "Talk with Agent" option for assistance
- A "Return to DA" link to go back to the quoting tool
Custom Error Class
class KnockoutError extends Error {
type: 'generic' | 'declined' | 'error' | 'pending';
reasons: string[];
}
Flow Integration
Knockout checks happen at multiple points:
| Step | Check Type | When |
|---|---|---|
| Drivers Confirm | Client-side | Before proceeding (license status) |
| Vehicles Confirm | Client-side | Before proceeding (vehicle use) |
| Policy Coverages | Server-side | After initial quote response |
| Discounts | Server-side | After update quote response |
| Summary | Server-side | After rate-with-reports response |