OPDA Knowledge base
Schema Page 36 Generated 2026-05-17 DAMA · Data Modeling & Design

Chain, milestones & contracts

38 leaves 100.0% Declaration 0.0% Evidence 0.0% Derivation 0 in overlays 0 with worked example

The process artefacts of a transaction — its lifecycle state machine, the linked transactions ahead and behind it in a chain, and the contract documents that settle it. Everything here happens at the transaction level, not the property level.

Entity relationships

--- config: layout: elk elk: direction: DOWN nodePlacementStrategy: BRANDES_KOEPF mergeEdges: false --- erDiagram Transaction ||--o{ Contract : "contracts" Transaction ||--o| Chain : "chain" Transaction ||--o| Milestones : "milestones" Chain ||--o{ OnwardPurchase : "onwardPurchase" OnwardPurchase ||--o| Address : "address" Contract ||--o| Contract : "contract" Contract ||--o{ Signature : "signatures" Contract ||--o| Template : "template" Template ||--o{ RequiredSignatorie : "requiredSignatories" Milestones ||--o| Listed : "listed" Milestones ||--o| LegalForms : "legalForms" Milestones ||--o| SoldSubjectToContract : "soldSubjectToContract" Milestones ||--o| Searches : "searches" Milestones ||--o| Enquiries : "enquiries" Milestones ||--o| ExchangeOfContracts : "exchangeOfContracts" Milestones ||--o| Completion : "completion" Transaction { } Chain { } OnwardPurchase { object externalIds "externalIds" string sellingAgent "Estate Agent selling the property" string transactionId "UUID for an onward transaction" integer uprn "Unique Property Reference Number" } Address { string buildingName "Building name" string buildingNumber "Building number" string homeNation "Home nation" string line_3 "Address 3" string line1 "Address 1" string line2 "Address 2" string postcode "Postcode" string street "Street" string subBuilding "Sub building name" string town "Town" } Contract { object terms "terms" } Template { string name "name" string url "url" object externalIds "externalIds" } RequiredSignatorie { boolean requiresAll "requiresAll" string role "role" } Signature { string name "name" string signedOn "signedOn" object externalIds "externalIds" } Milestones { } Completion { string completed "completed" string expected "expected" string started "started" } Enquiries { string completed "completed" string started "started" } ExchangeOfContracts { string completed "completed" string expected "expected" } LegalForms { string completed "completed" string started "started" } Listed { string completed "completed" string expected "expected" } Searches { string completed "completed" string expected "expected" string started "started" } SoldSubjectToContract { string completed "completed" }
Physical model — every JSON object owned by this page is a node, every scalar field a row. 17 objects, 38 scalar fields. Generated from the schema walk; click any node to jump to its table.

Lifecycle state machine

stateDiagram-v2 [*] --> Listed Listed --> OfferAccepted: "offer received & accepted" OfferAccepted --> Searches: "conveyancing starts" Searches --> Enquiries: "searches returned" Enquiries --> ContractDrafted: "enquiries resolved" ContractDrafted --> Exchanged: "contracts exchanged" Exchanged --> Completed: "completion day" Completed --> [*] OfferAccepted --> Withdrawn: "fall-through" Searches --> Withdrawn Enquiries --> Withdrawn Withdrawn --> [*]
Milestone state machine, implicit in the schema today. Valid transitions are documented here in prose but not enforced by SHACL — the schema permits a Completed milestone before an Exchanged one, which is a real defect this diagram makes visible.

Timeline

gantt title Typical UK residential transaction timeline (12 weeks) dateFormat YYYY-MM-DD axisFormat %b %d section Listing Listed :done, a1, 2026-01-06, 14d section Offer & memo Offer accepted :active, a2, 2026-01-20, 5d Memorandum of sale : a3, after a2, 3d section Conveyancing Searches ordered : a4, after a3, 21d Mortgage offer : a5, after a3, 28d Enquiries raised & answered : a6, after a4, 14d section Contract Contract drafted : a7, after a6, 7d Exchange :crit, a8, after a7, 1d Completion :crit, a9, after a8, 14d
Indicative timeline. The schema records dates per milestone (`expected` vs `actual`) but does not encode dependencies. This Gantt shows the typical 12-week shape — exchange and completion are the critical path.

Object model

Chain

Transaction

transaction (root)

No scalar fields on this object — pure container.

Chain

chain

No scalar fields on this object — pure container.

Onward Purchase[]

chain.onwardPurchase[]
Title Description Type Kind Field Required Overlays Affordance
externalIds object Declaration externalIds
Estate Agent selling the property Estate Agent selling the property string Declaration sellingAgent
UUID for an onward transaction string Declaration transactionId
Unique Property Reference Number integer Declaration uprn

Address

chain.onwardPurchase[].address
Title Description Type Kind Field Required Overlays Affordance
Building name string Declaration buildingName
Building number string Declaration buildingNumber
Home nation string Declaration homeNation
Address 3 string Declaration line 3
Address 1 string Declaration line1
Address 2 string Declaration line2
Postcode string Declaration postcode
Street string Declaration street
Sub building name string Declaration subBuilding
Town string Declaration town

Milestones

Completion

milestones.completion
Title Description Type Kind Field Required Overlays Affordance
completed string Declaration completed
expected string Declaration expected
started string Declaration started

Enquiries

milestones.enquiries
Title Description Type Kind Field Required Overlays Affordance
completed string Declaration completed
started string Declaration started

Exchange Of Contracts

milestones.exchangeOfContracts
Title Description Type Kind Field Required Overlays Affordance
completed string Declaration completed
expected string Declaration expected

Legal Forms

milestones.legalForms
Title Description Type Kind Field Required Overlays Affordance
completed string Declaration completed
started string Declaration started

Listed

milestones.listed
Title Description Type Kind Field Required Overlays Affordance
completed Actual date of first public listing for sale string Declaration completed
expected Planned date of listing, for example when scheduled in advance around e.g. Boxing Day activity string Declaration expected

Searches

milestones.searches
Title Description Type Kind Field Required Overlays Affordance
completed string Declaration completed
expected string Declaration expected
started The date the legal form were shared with the vendor for completion string Declaration started

Sold Subject To Contract

milestones.soldSubjectToContract
Title Description Type Kind Field Required Overlays Affordance
completed string Declaration completed

Contracts

Contracts[]

contracts[]

No scalar fields on this object — pure container.

Contract

contracts[].contract
Title Description Type Kind Field Required Overlays Affordance
terms Data group capturing term information. object Declaration terms* yes

Signatures[]

contracts[].signatures[]
Title Description Type Kind Field Required Overlays Affordance
name string Declaration name* yes
signedOn Date and time of signature in ISO 8601 format string Declaration signedOn* yes
externalIds object Declaration externalIds

Template

contracts[].contract.template
Title Description Type Kind Field Required Overlays Affordance
name string Declaration name* yes
url A Uniform Resource Locator is the unique web address of a resource on the internet, such as an API, webpage, image, or file. It tells your web browser how and where to access that resource, functioning like a street address for the web. Link to application on council planning portal string Declaration url* yes
externalIds object Declaration externalIds

Required Signatories[]

contracts[].contract.template.requiredSignatories[]
Title Description Type Kind Field Required Overlays Affordance
requiresAll Boolean flag: require all. boolean Declaration requiresAll
role string Declaration role

Comments

Loading comments…