Business flow
The InsureLink platform sits between four actors and supports two acquisition channels that share the same downstream pipeline:
Channel A (agent-mediated): CLIENT ⇄ AGENT ⇄ ZFA (InsureLink) ⇄ INSURER
Channel B (ZFA-direct): CLIENT ⇄ ZFA (InsureLink) ⇄ INSURER
Money and information move along the chain. Three rules that everything else derives from:
- Clients pay insurers directly. InsureLink never touches the client's premium. Proof-of-Payment (POP) evidence is what proves the payment happened. This holds on both channels.
- Insurers pay commissions to ZFA. ZFA remits to registered agents (agent-mediated), net of ZFA fees, URA WHT, and IIU membership. On ZFA-direct referrals there is no agent leg — commission settles to a dedicated ZFA house wallet (URA WHT still applies; ZFA-fee and IIU levy are skipped because you can't charge yourself).
- One pipeline, one state machine. The referral / POP / policy /
claim / commission stack does not fork between channels. What differs
is the front (who creates the referral) and the commission payee
(agent vs house wallet). Every referral carries a
channelSource ∈ { agent_referral, zfa_direct, client_self_service }so reporting and authorisation can branch cleanly.
Actors at a glance
| Actor | What they do | What they access |
|---|---|---|
| Client | Buys the insurance. Pays the insurer directly. Shares POP with the agent (Channel A) or directly with ZFA via the portal (Channel B). Views their own policies + claims via the client portal. | Public inquiry form (anonymous) or client portal (magic-link + OTP session — no password) |
| Agent | Introduces clients, submits referrals, uploads the client's POP to InsureLink. Licensed agents can sponsor introducers. Only present on Channel A. | Platform JWT with agent-scoped permissions |
| ZFA (InsureLink) | On Channel A: reviews referrals, verifies POPs, forwards to the insurer, receives commissions, remits to agents net of deductions. On Channel B: additionally owns the client relationship, runs the direct-inquiry desk, converts inquiries to referrals, and reconciles the house wallet. | Platform JWT with ZFA-staff / super-admin / finance / compliance permissions |
| Insurer | Underwrites, quotes, issues policies, confirms POPs on their side, pays commissions to ZFA. Contract-neutral to channel — sees the referral either way. | Insurer inbound webhooks (HMAC-signed), or ZFA staff acting on their behalf via POST /proof-of-payment/:id/insurer-confirm |
Choosing the channel
| Signal | Channel |
|---|---|
| Client walked in / called ZFA, no agent involved | ZFA-direct — ZFA staff creates the inquiry via POST /admin/zfa-direct/inquiries |
| Client submitted the public web form | ZFA-direct (self-service) — via POST /public/client-inquiries; magic-link creates the portal session |
| Returning client with an active portal session | ZFA-direct (portal) — via POST /client-portal/inquiries |
| Licensed agent introduced the client | Agent-mediated — via POST /referrals from the agent's session |
| Introducer (non-licensed) brought the client | Agent-mediated — the introducer's sponsor-agent is credited (see sponsor tree) |
Channel A — agent-mediated lifecycle
Channel B — ZFA-direct lifecycle
Client contacts ZFA without an agent. Three entry points feed the same inquiry queue, which converts to a referral that then flows through the identical downstream pipeline as Channel A.
Referral state machine (shared)
Both channels share the same 20-state referral machine. The initial
creator differs (agent vs client-inquiry conversion), but from draft
onward the transitions are identical:
POP verification detail (two stages)
Because the client pays the insurer directly, both ZFA and the insurer must independently confirm the payment before commission is recognised. The POP record has its own status track that runs alongside the referral:
Only insurer_confirmed transitions the referral to premium_paid.
zfa_verified alone is not enough — ZFA's verification is a first-line
sanity check (does the POP look real, does the amount match), but only
the insurer can confirm the money actually landed in their account.
Endpoints in the API Reference:
- Upload POP (agent):
POST /referrals/:id/proof-of-payment - List POPs for a referral:
GET /referrals/:id/proof-of-payment - ZFA verifies POP:
POST /referrals/:id/proof-of-payment/:popId/verify - Insurer confirms (staff on their behalf, or inbound webhook):
POST /referrals/:id/proof-of-payment/:popId/insurer-confirm - Reject at either stage:
POST /referrals/:id/proof-of-payment/:popId/reject
Commission flow (Insurer → ZFA → payee wallet)
Commission is the reverse leg. It originates at the insurer and lands
in a wallet selected by Referral.channelSource:
Every deduction row carries beneficiaryTypes so the engine knows which
wallet types it applies to (agent, zfa_house, or both). The schedule
seeded today is the default, not immutable — ZFA can add / retire /
version rules over time. See
/deduction-types/preview
to see the net effect on a specific gross amount and beneficiary type.
House-wallet endpoints:
- Read balance + activity:
GET /admin/zfa-house/wallet - Read ledger:
GET /admin/zfa-house/wallet/ledger - Withdraw / reconcile with ops account:
POST /admin/zfa-house/wallet/withdraw - Manual adjustment (finance-only, audit-heavy):
POST /admin/zfa-house/wallet/adjust
ZFA-direct desk & client entities
Direct-channel introduces a first-class Client entity and a triaging
desk. Endpoints:
- Public inquiry:
POST /public/client-inquiries(anonymous, rate-limited) - Admin desk create-on-behalf:
POST /admin/zfa-direct/inquiries - Assign to handler:
POST /admin/zfa-direct/inquiries/:id/assign - Convert to referral:
POST /admin/zfa-direct/inquiries/:id/convert-to-referral - Client CRUD:
GET /clients,GET /clients/:id,GET /clients/:id/timeline,POST /clients/merge - Portal-side inquiry submission:
POST /client-portal/inquiries - Portal-side POP upload:
POST /client-portal/referrals/:id/pop - Direct-channel report:
GET /reports/zfa-direct
Design deep-dive: ZFA-direct channel design doc.
Sponsor / introducer tree (agent-mediated only)
Licensed agents can sponsor introducers — non-licensed people who bring in business but cannot transact with insurers directly. Every introducer must attach to a licensed sponsor at self-registration time:
The sponsor sees every downstream introducer's referrals via
GET /agents/:id/internal-referrals
— "book-of-business" view.
Where to go next
- Quickstart: step-by-step first API call
- All endpoints: the endpoint matrix with public / restricted / client-session tiers
- Sandbox: try the whole flow in a wiped-nightly sandbox
- Features: full feature inventory
- Compliance coverage: full regulatory matrix — IRA, URA, FIA, DPPA, CPA, and OWASP controls implemented on both channels
- ZFA-direct design: the deep-dive design doc — schema, permissions, migration phases