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

    100%

    Loading diagram…

    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

    Parent containers — shown for reference; their own content lives in the sections below.

    Transaction

    transaction (root)

    No scalar fields on this object — pure container.

    Chain

    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

    Milestones

    milestones

    No scalar fields on this object — pure container.

    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…