The Claims data model
Learn the model · Claims data model · Reinsurance data model · The reinsurance suite
A claim in this module is a durable record. Every amount changes only by appending a development, and every figure a page shows is derived by a business-rules scope rather than stored. This page follows one shipped claim through its developments, then states the rules and the references.
The platform draws the module's types and the Reinsurance types they point at:
Prerequisite: the class diagrams on this page are embedded from the Data Modelling plugin's explorer (/DataModelling/Explorer), which Claims does not require. On an installation without it they render nothing; each type's own page under /Claims still lists its properties.
Follow one claim
CL-2023-001 — Motorway pile-up A2 is a sample claim in the demo book. Its facts (Claims/Source/Claim.cs):
| Field | Value |
|---|---|
Reference |
CL-2023-001 — the cedent's reference, used as the join key |
Cedent |
Reinsurance/Samples/AlpinaCedent |
LineOfBusiness |
Reinsurance/LineOfBusiness/Casualty |
Currency |
Reinsurance/Currency/EUR |
Programme |
MTPL |
DateOfLoss |
2023-11-04 |
Peril |
Motorway pile-up |
Status |
Open |
Its Developments, oldest first:
AsOf |
Paid |
Outstanding |
Source |
Note |
|---|---|---|---|---|
| 2023-12-31 | 150,000 | 600,000 | Internal | Initial reserve |
| 2024-12-31 | 400,000 | 450,000 | Cedent advice | |
| 2025-12-31 | 700,000 | 250,000 | Cedent advice |
These values are declared once, in Claims/SampleData/Source/Fixtures/MtplClaimFixtures.cs (MotorwayPileUp). The Claims tests (ClaimsSampleData.DevelopingClaim) and the generated demo node both build from that one declaration, so their numbers cannot drift apart.
Step 1 — incurred at each development
Incurred is never stored. The development grid computes it per row (Claims/Source/ClaimGrid.cs):
var incurred = d.Paid + d.Outstanding;
- 2023-12-31:
150,000 + 600,000 = 750,000 - 2024-12-31:
400,000 + 450,000 = 850,000 - 2025-12-31:
700,000 + 250,000 = 950,000
Step 2 — the movement against the previous development
var movement = previous is double p
? (incurred - p >= 0 ? "+" : "−") + Math.Abs(incurred - p).ToString("N0", CultureInfo.InvariantCulture)
: "—";
- 2023:
—(the first row has no predecessor) - 2024:
850,000 − 750,000 = +100,000 - 2025:
950,000 − 850,000 = +100,000
Paid rises while the reserve is released, so incurred still grows by 100,000 each year.
Step 3 — the latest position, from the scope
ClaimMetrics (Claims/Source/ClaimMetrics.cs) is the claim's business-rules scope:
ClaimDevelopment? Latest => GetStorage().Developments.OrderBy(d => d.AsOf).LastOrDefault();
double LatestPaid => Latest?.Paid ?? 0d;
double LatestOutstanding => Latest?.Outstanding ?? 0d;
double LatestIncurred => LatestPaid + LatestOutstanding;
Latestis the 2025-12-31 development. It is chosen byAsOfdate, not by list order.LatestPaid = 700,000,LatestOutstanding = 250,000,LatestIncurred = 950,000.IsOpenis true, because the status isOpen.
ClaimTests.LatestPosition_FromDevelopments pins these numbers.
Step 4 — the integrity checks
The same scope carries four checks. Each one trips when its member is true:
| Check | Rule | CL-2023-001 |
|---|---|---|
DevelopmentsOutOfOrder |
AsOf dates strictly increasing |
2023 < 2024 < 2025 — clean |
PaidDecreases |
cumulative paid never falls, except into a Correction |
150k → 400k → 700k — clean |
ClosedWithOutstanding |
a Closed claim carries no outstanding |
open — clean |
NoDevelopments |
at least one development | three — clean |
IsConsistent is true when none of the four trips, and it is true for CL-2023-001. The test probe ClaimsSampleData.InconsistentClaim shows the opposite case. It is Closed with 100,000 outstanding, and its developments run 2024 then 2023 with paid falling from 350,000 to 300,000, so three checks trip.
Step 5 — a new figure arrives
The 2027 renewal submission Alpina MTPL XL 2027 reports the bordereau as of 2026-06-30. For CL-2023-001 it reports 700,000 paid and 250,000 outstanding, which agrees with our record.
For CL-2025-001 — Bodily injury, cyclist it reports 60,000 paid and 750,000 outstanding. We hold 20,000 paid and 500,000 outstanding. The Underwriting reconciliation offers two ways forward:
- Take the figure over. Append a development with
Source = "Submission". The history is never rewritten. - Ask the cedent. Raise an Enquiry that carries
ReportedOutstandingandOutstandingOnFile. The submission's claims review creates it under<submission>/Enquiries/<id>; itsClaimfield names the claim.
The entities
Claim — Name, Reference, Programme, DateOfLoss, Peril and Description are plain text. Status is one of Open, Reopened or Closed (ClaimStatuses); it is stored, and only workflow actions advance it. Cedent, LineOfBusiness, Currency and the optional Acceptance (the policy the claim falls under) are node paths into Reinsurance. Developments is the appended history. Each claim also has a mounted files collection (<claim>/files, configured in Claims/Claim.json) for adjuster reports and cedent advices.
ClaimDevelopment — a value record inside the claim: AsOf, cumulative Paid, the Outstanding case reserve, Source (one of Internal, Cedent advice, Submission, Correction from DevelopmentSources) and Note.
Enquiry — the question sent to the cedent (Claims/Source/Enquiry.cs). Claim is the node path of the claim it concerns, and Reference is the cedent's claim reference. Target is Claims or Client. To, Subject and Message hold the mail. Submission is the path of the submission that triggered it. ReportedOutstanding and OutstandingOnFile hold the amounts. Status moves through Draft, Sent and Answered, and CreatedAt records when it was raised.
Register — ClaimsRegister stores only a Name and optional extra Partitions. Everything it shows is derived from the claims it reads: the book by stored status and the per-programme paid, outstanding and incurred totals. It always reads its own partition and the sample-book partition ReinsuranceDemo (Claims/Source/QueryReach.cs). The shipped instance is the Claims Book.
The rules behind it
- Facts are stored, figures are derived. The record stores developments only. Latest position, incurred, movements and integrity all come from
ClaimMetricsandClaimGrid. - History is appended, never rewritten. Appending a development is the only way an amount changes. A
Correctionsource is the one legitimate way to show a lower paid amount. - References are node paths.
[MeshNode("namespace:Reinsurance scope:descendants nodeType:Reinsurance/Cedent", "namespace:ReinsuranceDemo scope:descendants nodeType:Reinsurance/Cedent")]lists both partitions where a cedent can live. The dependency is one-way: Claims → Reinsurance. Referenceis the join key. It must be unique per cedent and programme. A submission's reported claims reconcile on it.
Check yourself
Question. A fourth development for CL-2023-001 arrives as of 2026-12-31 with paid 680,000, outstanding 300,000 and Source = "Cedent advice". What are the incurred and the movement, and which check trips?
Answer. Incurred is 680,000 + 300,000 = 980,000, and the movement is +30,000. PaidDecreases trips because paid falls from 700,000 to 680,000 and the source is not Correction. IsConsistent becomes false.
Reference
| Entity | Kind | Key fields | References (node paths) | Source |
|---|---|---|---|---|
| Claim | NodeType | Reference, Programme, DateOfLoss, Peril, Status, Developments |
Cedent, LineOfBusiness, Currency, Acceptance (Reinsurance) | Claims/Source/Claim.cs |
| ClaimDevelopment | value | AsOf, Paid, Outstanding, Source, Note |
— | Claims/Source/Claim.cs |
| ClaimMetrics | scope | Latest*, IsOpen, four checks, IsConsistent |
— | Claims/Source/ClaimMetrics.cs |
| Enquiry | NodeType | Reference, Target, Message, amounts, Status |
Claim; Submission (path string) | Claims/Source/Enquiry.cs |
| ClaimsRegister | NodeType | Name, Partitions |
— (derives from Claim nodes) | Claims/Register/Source/RegisterAreas.cs |
Next: The Reinsurance data model · How the cash-flow model works · The reinsurance suite