Skip to content
Event storming templates

Event Storm — Mortgage Origination

Application, underwriting and completion contexts for a building society, surfacing an affordability recalculation and a land registry charge that no command produces, either side of a surveyor-panel boundary.

Template previewEvent storming
Mortgage origination — decision in principle to completionBounded contexts3Domain events9Event coverage77.8%Hotspots3Model smells2Domain eventCommandActorAggregatePolicyRead modelExternal systemHotspotApplication2 events · 2 commands · 1 policy · 1 hotspotApplicationUnderwriting4 events · 3 commands · 1 policy · 1 hotspotUnderwriting caseUnderwriting caseCompletion3 events · 2 commands · 0 policies · 1 hotspotLoan accountMortgage brokerSubmit decision inprincipleDecision in principleissuedProduct and ratesheetApplicantSubmit fullapplicationFull applicationreceivedCredit referenceagencyBroker resubmitsunder a differentproduct to beat a…When full applicationreceived, instructvaluationCase serviceInstruct valuationValuation returnedSurveyor panelUnderwriterAssess affordabilityAffordabilityassessedAffordabilityrecalculatedUnderwriterIssue offerOffer issuedCase pipeline boardDown valuation —reprice, reduce theloan, or decline?When offer issued,notify conveyancerOffer serviceNotify conveyancerCompletion dateagreedConveyancerRelease fundsFunds releasedCharge registeredCompletion diaryHM Land RegistryChain collapses afterfunds are drawn downWorkshop checksEvents with no producing command2Affordability recalculated · Charge registeredCommands with no resulting event0noneCommands with no aggregate0noneAggregates with no events0nonePolicies with a missing trigger event0nonePolicies with a missing command0noneHotspots per context3Application 1 · Underwriting 1 · Completion 1Cross-context flows2Application → Underwriting · Underwriting → Completion

Make it your own.

title "Mortgage origination — decision in principle to completion"

context "Application"
  actor "Mortgage broker"
  actor Applicant
  aggregate Application
  command "Submit decision in principle" by "Mortgage broker" on Application emits "Decision in principle issued"
  event "Decision in principle issued"
  readmodel "Product and rate sheet"
  command "Submit full application" by Applicant on Application
  event "Full application received" from "Submit full application"
  external "Credit reference agency"
  hotspot "Broker resubmits under a different product to beat a rate change"
  policy "When full application received, instruct valuation" then "Instruct valuation"

context "Underwriting"
  actor Underwriter
  aggregate "Underwriting case"
  command "Instruct valuation" by "Case service" on "Underwriting case"
  event "Valuation returned" from "Instruct valuation"
  external "Surveyor panel"
  command "Assess affordability" by Underwriter on "Underwriting case"
  event "Affordability assessed" from "Assess affordability"
  event "Affordability recalculated"
  command "Issue offer" by Underwriter on "Underwriting case" emits "Offer issued"
  event "Offer issued"
  readmodel "Case pipeline board"
  hotspot "Down valuation — reprice, reduce the loan, or decline?"
  policy "When offer issued, notify conveyancer" then "Notify conveyancer"

context "Completion"
  actor Conveyancer
  aggregate "Loan account"
  command "Notify conveyancer" by "Offer service" on "Loan account"
  event "Completion date agreed" from "Notify conveyancer"
  command "Release funds" by Conveyancer on "Loan account"
  event "Funds released" from "Release funds"
  event "Charge registered"
  external "HM Land Registry"
  readmodel "Completion diary"
  hotspot "Chain collapses after funds are drawn down"