Zen Algorithms · Insurance Lab ← Home
Architecture · Presale Onboarding & Distribution

Onboarding Architecture

How three distribution channels — direct, producer, and mortgage — feed one platform without duplicate spend, privacy leaks, or premium games. Identity verification is staged so no paid external call runs before the trust tier that justifies it; concurrent flows on one property are detected and resolved by rules the customer controls. Below: the flows, the gates, the collision state machine, and the schema shown as real tables with sample rows from three worked storylines.

1 · Channel flows 2 · Trust tiers & the two-gate rule 3 · Collision state machine 4 · Schema with sample rows 5 · Events 6 · Storylines

1 · Channel flows

Each lane is one channel's path to a bound policy. The tier chips mark where identity trust rises — and therefore which vendor calls become spendable. Whatever the channel, T3 (bind) is always the customer personally: OTP + e-sign. A producer can never e-sign for the insured.

Channel A — Direct

Customer self-serves on the carrier site.

Browse anonymouslyindicative estimate from free/cached data onlyT0
OTP verify contactemail/SMS code → submission(channel='direct')T1
Resolve identitydoc-scan / device signals (KBA fallback) → paid Groundwork prefill unlocksT2
Bind intentpayment instrument + e-sign → consumer reports per the two-gate rule → final premium → bindT3

Channel B — Producer (independent agent / broker)

Harbor Lane Insurance Group initiates on the customer's behalf; the customer is invited in.

Standing trust (once)NPN + state licenses + carrier appointments + E&O + commission schedule
Initiate on behalf ofinitiator=producer, on_behalf_of=customer · consent attestation recorded → prefill unlocksT2
Invite the customermagic link scoped view | modify | renewT1 (customer)
Customer binds personallyOTP + e-sign — never the producerT3

Compensation is carrier-paid commission per schedule — never a premium discount (anti-rebating, ~48 states). Representation moves only by customer-signed BOR on carrier-configured clocks.

Channel C — Mortgage (two distinct sub-flows)

Pacific Crest Home Loans — the lender never buys the borrower's policy at origination; it requires proof of one.

C1 · Originationclosing registered → EOI needed by closing date
Borrower buys via A or Bbound policy adds the mortgagee clause (templated; never MERS) + optional escrow billing
Continuing dutyannual EOI verification (Fannie B7-3-07/08)
C2 · Lapse detectedreasonable basis documented → lpi_cycle opens
Notice 1 → Notice 2≥45 days before any charge; reminder ≥30 days after notice 1 — method + template version stored
Place LPImaster policy · structure-only warning mandatory
Evidence arrivescancel + refund over the overlap within 15 days

2 · Trust tiers & the two-gate rule

Every prefill or report pull costs real money. Verification level is the API budget gate — unverified visitors never trigger paid calls. But the tier is a business control, not the legal line: for FCRA-governed consumer reports the legal gate is permissible purpose (15 U.S.C. §1681b), which attaches earlier and carries its own duties. The price book records both gates; conflating them causes either under-use of reports or off-ledger exceptions.

T0 · Anonymousjust browsingSpend: none. Free/cached only — geocode cache, flat-rate public GIS.
T1 · Contact-verifiedOTP (direct) · invitation-accept (producer's customer)Spend: cheap metered — address normalization, parcel lookup.
T2 · Identity-resolveddoc-scan/KBA · producer attestation + consent artifact · lender KYC + insurer-held consentSpend: paid Groundwork bundle — assessor, aerial/roof, reconstruction cost, hazard layers.
T3 · Bind-intentpayment instrument + e-sign — always the customer personallySpend: consumer reports (loss history, credit-based insurance score) — subject to the two-gate rule.
Vendor call requestede.g. A-PLUS loss history for SUB-7312
AND
Gate 2 · BUSINESSbusiness_min_trust_tier — is this visitor worth the spend yet? Owned by the carrier's cost/fraud policy.
Buy — or reusesame risk_entity within the dedupe window ⇒ reused_from_call_id, $0. Every call lands in the ledger.

See the external_call_ledger sample rows — one Groundwork pull bought by the direct flow, reused twice by the other channels. Collision becomes a cost saving.

3 · Channel collision — the state machine

Same property, three flows in flight. Detection keys on multi-source entity resolution — normalized address + unit + geocode + APN + jurisdiction + confidence — because APN alone false-collides condo units sharing a master parcel. Disclosure is neutral before authority: channel identity is sensitive (it can reveal a closing in progress), so each flow sees only "another active workflow exists."

OPEN
≥2 active submissions resolve
to one risk_entity
MatchDetected
DISCLOSED
neutral banner to each flow,
logged per member
MatchDisclosed
RESOLVED
resolution ∈ bor (customer designates a producer; clocks run)
· withdrawn (a flow expires/exits) · first_bind (atomic bind lock; later binds allow | suppress | refer per carrier config, default refer)
· merged (same actor, one flow absorbs the other)
Side path — low confidence: a candidate match below the confidence threshold (e.g. unit 3A vs 2B on one master APN) routes to a human review queue instead of auto-colliding. No disclosure is issued for unconfirmed matches.
Premium discrepancies: the rating engine is deterministic over (risk data, product version, rate program) — so any quote difference between colliding flows decomposes into filed factors (DOI filing ref) or data differences, shown side-by-side. That labeling is the anti-rebating compliance story. See it live on the producer dashboard →

4 · Schema — the tables, with the storylines' actual rows

Extends the platform's canonical tables (submission, quote, policy, outbox already exist). Sample rows are drawn from the three storylines in §6 — highlighted rows belong to storyline 1 (J. Rivera, risk RSK-2207). Dates are illustrative; vendor prices are illustrative (real pricing is contract-confidential).

party + party_contact + party_identity

One row per person/org across all channels; contacts and verifications are append-only children — the audit trail of how trust was earned.

party_idkindlegal_nametrust_tieridentity events (from party_identity)
PTY-1001personJ. RiveraT3otp_sms ✓ Jun 8doc_scan ✓ Jun 9producer_attest ✓ Jun 10
PTY-1014orgHarbor Lane Insurance Groupstanding (producer)npn_registry ✓ 2024
PTY-1022orgPacific Crest Home Loansstanding (lender)nmls_registry ✓ 2024
PTY-1008personE. SandovalT3otp_email ✓ May 18doc_scan ✓ May 19
PTY-1031personL. FarrowT1lender_kyc ✓ 2023 (loan file) — not insurer authorization by itself

consent_artifact

Insurer-held authorization — who consented to what, captured by whom. Lender KYC alone is never enough; lender-originated flows still capture one of these.

consent_idparty_idscopechannelcaptured_bycaptured_at
CNS-5510PTY-1001property_prefilldirectself (web)Jun 9
CNS-5521PTY-1001property_prefillproducerPRD-204 (attestation)Jun 10
CNS-5538PTY-1001property_prefilllender_originationLND-77 + borrower e-consentJun 10
CNS-5544PTY-1001consumer_reportproducerself (e-sign, bind intent)Jun 20

producer + producer_license + producer_appointment + commission_schedule

Standing trust, verified once at onboarding. Licenses and appointments are per-state / per-carrier child tables with effective dates — an array column can't carry status history.

producer_idnpneo_policy_reflicenses (state · status · expires)appointmentcommission (new / renewal)
PRD-20417204931EO-44812 ($1M/$2M)CA active 2027-01 · WA active 2026-11 · TX renewal-due 2026-07 · OR expiredthis carrier · appointed 2024-03CS-12 · 12% / 10% — carrier-paid

lender_org + mortgagee_clause_template

Lender standing trust + versioned clause templates. Clause text is rendered per loan from a template — never a free-text string on the lender row.

lender_idnmls_idis_servicertemplate_idinvestor_rulebody (placeholders)
LND-77991204trueTPL-FNMA-v3fnma{{servicer_legal_name}}, its successors and/or assigns… — servicer named, MERS prohibited (B7-3-08)

risk_entity

One row per insurable property/unit. Multi-source resolution — note the two condo units sharing one master APN that must NOT collide.

risk_idaddr_normalizedunitgeoapnapn_jurisdictionconfidence
RSK-220714 ALDER CT, SANTA ROSA CA 954042B38.4521, −122.7140037-220-014Sonoma County0.97
RSK-220814 ALDER CT, SANTA ROSA CA 954043A38.4521, −122.7139037-220-014Sonoma County0.97
RSK-26712 DRIFTWOOD CT, HALF MOON BAY CA 9401937.4636, −122.4286064-310-022San Mateo County0.99
RSK-331088 QUARRY ST, STOCKTON CA 9520537.9577, −121.2730149-082-007San Joaquin County0.99

Same APN, different units, different risks — unit + geocode + confidence keep RSK-2207 and RSK-2208 apart. APN-only matching would have falsely collided them.

submission (extended with channel provenance)

Who started the flow, for whom, on which risk — the channel facts every other table hangs off.

submission_idchannelinitiator_party_idon_behalf_ofrisk_idbilling_methodstatus
SUB-7299directPTY-1001RSK-2207directwithdrawn (BOR effective)
SUB-7312producerPTY-1014PTY-1001RSK-2207escrowbound → POL-88471
SUB-7305lender_originationPTY-1022PTY-1001RSK-2207EOI satisfied
SUB-7341directPTY-1008RSK-2671directbound → POL-88502…
SUB-7344producerPTY-1014PTY-1008RSK-2671expired (quote validity)

submission_match + submission_match_member

Collision header + one member row per submission, carrying disclosure audit and an append-only state history — a bare array of submission IDs can't support the BOR inbox or disclosure log.

match_idrisk_idstatusresolutionmember (submission)disclosed_atdisclosure shown
MTCH-0098RSK-2207resolvedborSUB-7299 (direct)Jun 10"another active workflow exists" (neutral)
MTCH-0098SUB-7312 (producer)Jun 10neutral → full detail after BOR-2214 authority
MTCH-0098SUB-7305 (lender)Jun 10"another active workflow exists" (neutral)
MTCH-0102RSK-2671resolvedwithdrawnSUB-7341 · SUB-7344May 20neutral both ways; producer flow expired unbound

bor_request

Representation change with carrier-configured clocks. Commission & servicing move only at effective_at — never on signature.

bor_idmatch_idinsuredgaining_producerlosingsigned_atnotified_atrescind_deadlineeffective_atstatus
BOR-2214MTCH-0098PTY-1001PRD-204— (direct channel)Jun 9Jun 10Jun 19Jun 21effective
BOR-2199K. MehtaPRD-310PRD-204May 30Jun 1Jun 11rescinded Jun 8

invitation

Scoped customer access into a producer-initiated flow. The token is stored hashed; viewing is low-trust, binding is always the customer at T3.

invitation_idsubmission_idfrom → toscopeexpires_ataccepted_atrevoked_at
INV-3320SUB-7312PTY-1014 → PTY-1001modifyJun 24Jun 10
INV-3344SUB-7344PTY-1014 → PTY-1008viewMay 26— (expired)

rate_program + rate_program_state

Filed factors — the legal way premiums differ by affiliation. A factor with a DOI filing reference, never a producer favor.

program_idnamefiling_reffactoreligibility_rulestates (effective)
RP-AFF-PCAffinity — Pacific Crest Home LoansCA-2025-04410.985verified loan_link with the partner lender — any channelCA (2025-11-01)

policy_interest + premium_schedule

Who is named on the policy (clause rendered from the versioned template, with validation state) and how installments are paid — the join the escrow calendar reads.

policy_idinterest kindpartyclause_templatevalidationinstallments (due · amount · payer · paid)
POL-88471mortgageeLND-77 (Pacific Crest)TPL-FNMA-v3validJul 1 · $1,206 · escrow · —  |  Jan 1 · $1,206 · escrow · —
POL-88412mortgageeLND-77TPL-FNMA-v3validJun 15 · $990 · escrow · paid Jun 12  |  Dec 15 · $990 · escrow · —

loan_link

The lender's portfolio tracking row — the EOI grid on the mortgagee dashboard is exactly this table.

loan_idlender_idrisk_idborrowerescrow_billedeoi_statusclosing_datelast_verified_at
LN-30417LND-77RSK-2207PTY-1001trueverifiedJun 27Jun 21
LN-28560LND-77RSK-3310PTY-1031truelapsed → verified2023May 30

lpi_cycle (storyline 3 — every Reg X evidence field)

The compliance record. The mortgagee dashboard's notice timeline must be reconstructible from stored facts — so every method, template version, and date is a column.

fieldCYC-883 (LN-28560 · L. Farrow)
basis_reasonEOI expired Mar 31; no renewal on file (reasonable basis documented)
notice1_sent_at · method · template_verApr 3 · first-class mail + email · LPI-N1 v4
notice2_sent_at · method · template_verMay 4 · first-class mail · LPI-N2 v4
charge_assessed_atMay 19 (≥45 days after notice 1)
placed_at · master_policy_ref · premiumMay 19 · MP-PROP-2026 · $1,612/yr
contents_warning_showntrue (notices 1 & 2 — structure-only, no liability/contents)
evidence_received_at · coverage_from → toMay 30 · May 12 → (in force) — borrower policy POL-88502
cancelled_at · cancel_reasonJun 2 · borrower evidence received (within 15 days)
refund_overlap_from → to · refund_amountMay 12 → Jun 2 · $94.30

vendor_price_book + external_call_ledger

The cost-control spine. The price book carries both gates per product; the ledger records every call — and the dedupe that turns a collision into a saving.

vendor · productunit_pricedata_classfcra_flaglegal_basis_requiredbusiness_min_trust_tier
Groundwork · property bundle$14.50property_intelfalseconsent artifactT2
A-PLUS · loss history$9.75consumer_reporttruepermissible purpose §1681b + consent + adverse-action dutiesT3
VeriDoc · doc-scan identity$1.80identity_kycfalseuser-initiatedT1 (to reach T2)
geocode cache$0.00property_intelfalseT0
call_idvendor · productpricetier_at_callconsent_idrisk_idreused_from_call_idcalled_at
CALL-9015Groundwork · property bundle$14.50T2CNS-5510RSK-2207Jun 9 (direct flow)
CALL-9022Groundwork · property bundle$0.00T2CNS-5521RSK-2207CALL-9015Jun 10 (producer flow)
CALL-9031Groundwork · property bundle$0.00T2CNS-5538RSK-2207CALL-9015Jun 10 (lender flow)
CALL-9054A-PLUS · loss history$9.75T3CNS-5544RSK-2207Jun 20 (bind intent)

One $14.50 pull served three channels. Each reuse carries its own consent artifact — reuse rules are per data_class (consumer reports get stricter windows than property intel).

5 · Events

All emitted via the platform-standard transactional outbox → event bus. Dashboards are projections of these.

eventemitted whenstoryline example
PartyVerified(tier)a party_identity row raises the trust tierRivera → T2 on doc-scan, Jun 9
ConsentCaptureda consent_artifact is recordedCNS-5521 (producer attestation)
InvitationAccepted / InvitationExpired / InvitationRevokedscoped-access lifecycleINV-3320 accepted Jun 10 · INV-3344 expired May 26
MatchDetected / MatchDisclosedcollision opens; neutral banner logged per memberMTCH-0098, Jun 10
BORRequested / BORRescinded / BOREffectivebor_request lifecycle — servicing moves only on BOREffectiveBOR-2214 effective Jun 21 · BOR-2199 rescinded Jun 8
MatchResolved(bor|withdrawn|first_bind|merged)terminal state of the collisionMTCH-0098 → bor · MTCH-0102 → withdrawn
ExternalCallReusedledger dedupe hit — money saved, loggedCALL-9022, CALL-9031
EOIVerified / EOIDeadlineBreached / EOILapsedloan_link EOI lifecycleLN-30417 verified Jun 21 · LN-28560 lapsed Mar 31
LPINoticeSent(1|2) / LPIPlaced / LPICancelledReg X cycle steps, each with its evidenceCYC-883: Apr 3 · May 4 · May 19 · Jun 2

6 · The three storylines behind the rows

① BOR-resolved — three channels, one property, one vendor pull J. Rivera quotes direct (SUB-7299, Jun 8–9; Groundwork bought once, CALL-9015). Harbor Lane Insurance Group initiates on his behalf the next day (SUB-7312; pull reused, CALL-9022). Pacific Crest registers his closing needing EOI (SUB-7305; reused again, CALL-9031). Match MTCH-0098 opens with three members — each sees only the neutral banner. Rivera signs BOR-2214; clocks run (notified Jun 10 → rescind Jun 19 → effective Jun 21); the producer flow wins, Rivera binds personally at T3 → POL-88471 with the mortgagee interest rendered from TPL-FNMA-v3; LN-30417 flips to eoi_status='verified'. No LPI ever starts.
② Customer keeps direct — the producer flow simply expires E. Sandoval starts direct (SUB-7341); the same producer initiates for her (SUB-7344). Match MTCH-0102 opens, neutral disclosure both ways. She ignores the BOR draft; SUB-7344 lapses at quote-validity end (InvitationExpired, May 26); her direct flow binds. Resolution: withdrawn — no one's channel identity was ever revealed to the other.
③ LPI cancel/refund — the Reg X clock, with receipts L. Farrow's coverage lapses Mar 31 (LN-28560). Notice 1 (Apr 3) and notice 2 (May 4) go out — method + template version stored; both carry the structure-only warning. LPI placed May 19 under MP-PROP-2026. Her own policy (effective May 12) surfaces May 30 → cancelled Jun 2, refund $94.30 computed over the May 12 → Jun 2 overlap. Every step of that sentence is a column in lpi_cycle — the dashboard timeline is just a projection of the row.

See the working mockups: Producer dashboard · Mortgagee dashboard. Design source: the platform's onboarding research doc (channels, gates, collision rules — reviewed by independent AI partners before these pages were built).