Skip to content

Reinsurance Management

The @openinsure/reinsurance package manages treaty-based reinsurance programs for MGAs and captives. It calculates cessions, compiles statements, and tracks recoveries across quota share (QS), excess of loss (XOL), and aggregate excess of loss (AXL) structures.


Quota Share

The reinsurer shares a fixed percentage of every risk and every loss in the treaty portfolio.

Excess of Loss (XOL)

The reinsurer pays losses above the retention (attachment) up to a defined limit per occurrence.

Aggregate XL

The reinsurer pays when total portfolio losses for the year exceed the aggregate attachment.


import { calcQuotaShareCession } from '@openinsure/reinsurance';
const cession = calcQuotaShareCession({
treaty: {
id: 'qs-gl-2025',
cedingPercentage: 0.3, // 30% ceded to reinsurer
reinsurers: [
{ name: 'Munich Re', share: 0.5 },
{ name: 'Swiss Re', share: 0.5 },
],
effectiveDate: '2025-01-01',
expirationDate: '2025-12-31',
profitCommission: 0.15, // 15% profit commission if LR < 60%
},
premium: 2_500_000,
losses: 850_000,
expenses: 375_000,
});
// cession.cedingPremium: 750_000 (30% × 2,500,000)
// cession.cedingLosses: 255_000 (30% × 850,000)
// cession.commission: 150_000 (reinsurer's ceding commission)
// cession.profitCommission: 73_500 (15% × [(750k - 255k - 150k)])
// cession.netCession: 271_500 (cedingPremium - cedingLosses - commission)

Key terms:

TermDefinition
Ceding percentageThe share of every premium dollar and loss dollar ceded to reinsurers
Ceding commissionThe reinsurer’s payment to the cedant for acquisition costs (typically 25–35%)
Profit commissionAdditional commission paid when the reinsurer’s loss ratio is below a threshold

Per-occurrence XOL protects against individual large losses.

import { calcXOLCession } from '@openinsure/reinsurance';
const cession = calcXOLCession({
treaty: {
id: 'xol-gl-2025',
retention: 250_000, // Cedant pays first $250k per occurrence
limit: 750_000, // Reinsurer pays $250k–$1m per occurrence
rateOnLine: 0.035, // 3.5% of subject premium
reinstatements: 2, // 2 free reinstatements
},
subjectPremium: 2_500_000,
occurrences: [
{ claimId: 'CLM-001', totalIncurred: 850_000 },
{ claimId: 'CLM-002', totalIncurred: 125_000 },
{ claimId: 'CLM-003', totalIncurred: 1_100_000 },
],
});
// cession.xolPremium: 87_500 (3.5% × 2,500,000)
// cession.recoveries: [
// { claimId: 'CLM-001', recovery: 600_000 }, (850k - 250k, capped at 750k)
// { claimId: 'CLM-002', recovery: 0 }, (below retention)
// { claimId: 'CLM-003', recovery: 750_000 }, (1.1m - 250k, capped at 750k)
// ]
// cession.totalRecovery: 1_350_000

Reinstatements: After the reinsurer pays its limit on an occurrence, the treaty limit is reinstated (subject to an additional reinstatement premium). The reinstatements field tracks how many reinstatements remain.


AXL protects against an adverse portfolio year.

import { calcAggregateXLCession } from '@openinsure/reinsurance';
const cession = calcAggregateXLCession({
treaty: {
id: 'axl-2025',
aggregateAttachment: 3_000_000, // Cedant absorbs first $3m in losses
aggregateLimit: 2_000_000, // Reinsurer pays up to $2m above attachment
rateOnLine: 0.08,
},
subjectPremium: 2_500_000,
totalLossesIncurred: 4_200_000,
});
// cession.axlPremium: 200_000 (8% × 2,500,000)
// cession.recovery: 1_200_000 (4.2m - 3m attachment)
// cession.netRetained: 3_000_000

Quarterly cession statements are compiled from all active treaties and reported to reinsurers.

import { compileCessionStatement } from '@openinsure/reinsurance';
const statement = await compileCessionStatement({
orgId: '00000000-0000-4000-a000-000000000001',
quarter: '2025-Q2',
treaties: [qsTreaty, xolTreaty],
db,
});
// statement.period: '2025-Q2'
// statement.treaties: [...per-treaty breakdown...]
// statement.totals: { cedingPremium, cedingLosses, netCession, outstandingRecoveries }
// statement.cashCallRequired: true (if recoveries exceed cash collateral threshold)
Terminal window
POST /v1/reports/cession-statement
Authorization: Bearer <token>
Content-Type: application/json
{
"orgId": "...",
"quarter": "2025-Q2",
"format": "pdf" // pdf | excel | json
}

When reinsurer-owed recoveries exceed the trust fund balance, a cash call is triggered.

Terminal window
POST /v1/reinsurance/cash-call
Authorization: Bearer <underwriter_token>
Content-Type: application/json
{
"treatyId": "xol-gl-2025",
"amount": 750_000,
"dueDate": "2025-09-15",
"invoiceNumber": "CC-2025-003",
"reinsurerId": "munich-re"
}

Cash calls appear in the Finance Portal under AR Aging — they age like any other receivable and trigger escalation notifications if unpaid past the due date.

When a reinsurer contests a cash call amount, a dispute is created:

import { raiseDispute, resolveDispute } from '@openinsure/reinsurance';
const dispute = raiseDispute({
statementId: 'stmt-2025-q2',
treatyId: 'xol-gl-2025',
disputedAmount: 125_000,
reason: 'Loss allocation methodology disagreement — XOL layer attachment applied incorrectly',
});
// Resolution: accepted (full amount), rejected, or compromised (partial)
const resolved = resolveDispute(dispute, {
resolution: 'compromise',
settledAmount: 87_500,
notes: 'Parties agreed on revised attachment calculation per treaty addendum.',
});

Disputes track status transitions (openunder_reviewresolved), support documentation references, and maintain a full audit trail for regulatory reporting.


NAIC Schedule F reports reinsurance assumed and ceded annually. The compileCessionStatement() output can be formatted for Schedule F submission:

Terminal window
GET /v1/reports/schedule-f?orgId=...&year=2025&format=pdf

The Finance Portal also provides a Schedule F button under Statutory Reports.


Stop-loss programs appear as XOL treaties in the cession statement. The @openinsure/stop-loss package calculates recoveries, and @openinsure/reinsurance incorporates them into the quarterly statement alongside traditional reinsurance treaties.

See Stop-Loss Insurance for the calculation reference.