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;

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)
    : "—";

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;

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:

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

  1. Facts are stored, figures are derived. The record stores developments only. Latest position, incurred, movements and integrity all come from ClaimMetrics and ClaimGrid.
  2. History is appended, never rewritten. Appending a development is the only way an amount changes. A Correction source is the one legitimate way to show a lower paid amount.
  3. 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.
  4. Reference is 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

Reconnecting…
The connection to the server was interrupted. Trying to restore it…
Trying again…
The connection could not be restored. Reloading the page…
The server was updated. Reloading the page to pick up the latest version.