Skip to main content

Event Storming: Collaborative Domain Discovery

Event Storming is a workshop-based technique for rapidly exploring complex business domains. Created by Alberto Brandolini, it brings together developers and domain experts to discover domain events, commands, aggregates, and bounded context boundaries.

TL;DR​

AspectDescription
WhatWorkshop using sticky notes to explore domain
WhoDevelopers + domain experts + stakeholders
Duration2-4 hours for Big Picture, 1-2 days for Design Level
OutputShared understanding, bounded contexts, aggregates

Why Event Storming?​

Traditional requirements gathering fails because:

  • Documents get outdated
  • Meetings are one-directional
  • Developers don't understand the domain
  • Domain experts don't understand technical constraints

Event Storming solves this by:

  • Collaborative - Everyone contributes
  • Visual - Sticky notes on a wall
  • Fast - Discover in hours, not weeks
  • Shared understanding - Same mental model

The Sticky Note Colors​

Each color represents a different concept:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ EVENT STORMING COLOR LEGEND β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β”‚
β”‚ 🟧 ORANGE = Domain Event β”‚
β”‚ "Something that happened" (past tense) β”‚
β”‚ Examples: OrderPlaced, PaymentReceived β”‚
β”‚ β”‚
β”‚ 🟦 BLUE = Command β”‚
β”‚ "Intent to do something" (imperative) β”‚
β”‚ Examples: PlaceOrder, ProcessPayment β”‚
β”‚ β”‚
β”‚ 🟨 YELLOW = Aggregate / Entity β”‚
β”‚ "Thing that handles commands and emits events" β”‚
β”‚ Examples: Order, Payment, Customer β”‚
β”‚ β”‚
β”‚ πŸŸͺ PURPLE / LILAC = Policy / Process β”‚
β”‚ "When X happens, then Y" (automation) β”‚
β”‚ Examples: "When OrderPlaced, reserve inventory" β”‚
β”‚ β”‚
β”‚ 🟩 GREEN = Read Model / View β”‚
β”‚ "Information needed to make decisions" β”‚
β”‚ Examples: OrderSummary, InventoryLevel β”‚
β”‚ β”‚
β”‚ πŸ‘€ SMALL YELLOW = Actor / User β”‚
β”‚ "Who triggers the command" β”‚
β”‚ Examples: Customer, Admin, System β”‚
β”‚ β”‚
β”‚ πŸ”΄ RED / PINK = Hot Spot / Question β”‚
β”‚ "Problem, confusion, or needs discussion" β”‚
β”‚ Examples: "What if payment fails?" β”‚
β”‚ β”‚
β”‚ ⬜ WHITE = External System β”‚
β”‚ "System outside our boundary" β”‚
β”‚ Examples: Stripe, SendGrid, Legacy CRM β”‚
β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Workshop Types​

1. Big Picture Event Storming​

Goal: Understand the entire domain at a high level Duration: 2-4 hours Participants: 10-20 people (diverse roles) Output: Domain overview, hot spots, bounded context candidates

Process:

  1. Chaotic exploration (everyone adds events)
  2. Timeline enforcement (order events left to right)
  3. Identify pivotal events (major state changes)
  4. Mark hot spots (problems, questions)
  5. Group into bounded contexts

2. Process Modeling Event Storming​

Goal: Model a specific business process Duration: Half day Participants: 5-10 people Output: Detailed process flow with commands, events, policies

3. Design Level Event Storming​

Goal: Design aggregates and bounded contexts for implementation Duration: 1-2 days Participants: 3-7 people (mostly developers + 1-2 domain experts) Output: Aggregate boundaries, command handlers, event flows

Running a Big Picture Session​

Preparation​

Materials:

  • Large wall or paper roll (8+ meters)
  • Sticky notes (orange, blue, yellow, purple, pink, green)
  • Markers (thick, dark colors)
  • Tape

Participants:

  • Domain experts (essential!)
  • Developers
  • Product managers
  • UX designers
  • Anyone who knows the domain

Rules to Announce:

  1. No wrong answers
  2. Use past tense for events
  3. One concept per sticky
  4. Write big and clear
  5. Questions are welcome (use pink stickies)

Phase 1: Chaotic Exploration (30-45 min)​

"Write domain events - things that happen in the business.
Use past tense. One event per orange sticky.
Don't worry about order yet."

Facilitation tips:

  • Start with an example: "OrderPlaced"
  • Encourage domain experts to lead
  • Developers should ask questions
  • Capture everything, filter later

Example events discovered:

🟧 CustomerRegistered
🟧 OrderPlaced
🟧 PaymentReceived
🟧 PaymentFailed
🟧 OrderShipped
🟧 OrderDelivered
🟧 RefundRequested
🟧 RefundProcessed
🟧 InventoryReserved
🟧 InventoryDepleted

Phase 2: Timeline Enforcement (20-30 min)​

"Now let's arrange events in order.
Time flows left to right.
Events that happen around the same time can be vertical."

Phase 3: Identify Pivotal Events (15 min)​

"Which events represent major state changes?
These are 'pivotal events' that change everything after them."

Pivotal events (mark with vertical line or different border):

  • OrderPlaced - Starts the fulfillment process
  • PaymentReceived - Enables shipping
  • OrderShipped - Inventory committed
  • OrderDelivered - Transaction complete

Phase 4: Add Commands and Actors (30 min)​

"What triggers each event? Add blue command stickies.
Who performs the command? Add small yellow actor stickies."
πŸ‘€ Customer
🟦 PlaceOrder
🟧 OrderPlaced

πŸ‘€ System
🟦 ReserveInventory
🟧 InventoryReserved

πŸ‘€ PaymentGateway
🟦 ConfirmPayment
🟧 PaymentReceived

Phase 5: Mark Hot Spots (15 min)​

"Add pink stickies for:
- Questions we can't answer
- Disagreements
- Complex areas
- Missing information"

Example hot spots:

πŸ”΄ "What if payment fails after inventory reserved?"
πŸ”΄ "Who handles partial shipments?"
πŸ”΄ "How long do we hold inventory?"
πŸ”΄ "What's the refund policy?"

Phase 6: Identify Bounded Contexts (30 min)​

"Look for natural groupings:
- Events that belong together
- Different languages/terms
- Different teams
- Different lifecycles"

Draw boundaries around related events:

Design Level Event Storming​

After Big Picture, zoom into specific bounded contexts:

Add Aggregates (Yellow)​

πŸ‘€ Customer
🟦 PlaceOrder
🟨 Order (Aggregate)
🟧 OrderPlaced

Add Policies (Purple)​

🟧 OrderPlaced
πŸŸͺ "When OrderPlaced, reserve inventory"
🟦 ReserveInventory
🟧 InventoryReserved

Add Read Models (Green)​

🟩 ProductCatalog
(needed to place order)
πŸ‘€ Customer
🟦 PlaceOrder

Complete Flow Example​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ DESIGN LEVEL: ORDER PLACEMENT FLOW β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β”‚
β”‚ 🟩 ProductCatalog 🟩 ShoppingCart β”‚
β”‚ β”‚ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚ β”‚
β”‚ β–Ό β”‚
β”‚ πŸ‘€ Customer ──► 🟦 PlaceOrder ──► 🟨 Order β”‚
β”‚ β”‚ β”‚
β”‚ β–Ό β”‚
β”‚ 🟧 OrderPlaced β”‚
β”‚ β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β–Ό β–Ό β–Ό β”‚
β”‚ πŸŸͺ ReserveStock πŸŸͺ SendConfirmation πŸŸͺ ChargePayment β”‚
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β–Ό β–Ό β–Ό β”‚
β”‚ 🟦 Reserve 🟦 SendEmail 🟦 Charge β”‚
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β–Ό β–Ό β–Ό β”‚
β”‚ 🟨 Inventory ⬜ SendGrid ⬜ Stripe β”‚
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β–Ό β–Ό β–Ό β”‚
β”‚ 🟧 StockReserved 🟧 EmailSent 🟧 PaymentReceived β”‚
β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Facilitation Tips​

Do's​

βœ… Invite the right people - Domain experts are essential βœ… Start with events - They're the most intuitive βœ… Encourage questions - Hot spots are valuable βœ… Keep it moving - Don't get stuck on details βœ… Take photos - Document the wall βœ… Follow up - Turn insights into action

Don'ts​

❌ Don't let developers dominate - Domain experts should lead ❌ Don't debate implementation - Focus on business concepts ❌ Don't skip hot spots - They reveal important problems ❌ Don't expect perfection - It's exploration, not specification ❌ Don't rush to code - Understanding first

Common Problems​

ProblemSolution
Domain experts are quietAsk them to describe their daily work
Too many eventsFocus on one process at a time
DisagreementsMark as hot spot, discuss later
Getting stuckMove to another area, come back
Too technicalRedirect to business outcomes

Remote Event Storming​

For distributed teams:

Tools​

  • Miro - Most popular, great templates
  • Mural - Good collaboration features
  • FigJam - Figma's whiteboard
  • Excalidraw - Simple, free

Adaptations​

  1. Shorter sessions - 90 min max, multiple sessions
  2. Smaller groups - 5-8 people per session
  3. Clear facilitation - One person controls the board
  4. Breakout rooms - For parallel exploration
  5. Async prep - Share context before session

Remote Template​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ MIRO BOARD SETUP β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ LEGEND β”‚ β”‚ TIMELINE β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ 🟧 Event β”‚ β”‚ ←── Past Future ──→ β”‚ β”‚
β”‚ β”‚ 🟦 Command β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ 🟨 Aggregateβ”‚ β”‚ β”‚ β”‚
β”‚ β”‚ πŸŸͺ Policy β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ πŸ”΄ Hot Spot β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ PARKING LOT β”‚ β”‚
β”‚ β”‚ (Questions and ideas to discuss later) β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

From Event Storming to Code​

Events β†’ Domain Events​

// From sticky: 🟧 OrderPlaced
public record OrderPlaced(
OrderId OrderId,
CustomerId CustomerId,
List<OrderLineItem> Items,
Money Total,
DateTime PlacedAt
) : IDomainEvent;

Commands β†’ Command Handlers​

// From sticky: 🟦 PlaceOrder
public record PlaceOrder(
CustomerId CustomerId,
List<OrderLineItem> Items
) : ICommand;

public class PlaceOrderHandler : ICommandHandler<PlaceOrder>
{
public async Task Handle(PlaceOrder command)
{
var order = Order.Place(command.CustomerId, command.Items);
await _repository.Save(order);
}
}

Aggregates β†’ Domain Entities​

// From sticky: 🟨 Order
public class Order : AggregateRoot
{
public OrderId Id { get; }
public CustomerId CustomerId { get; }
public List<OrderLine> Lines { get; }
public OrderStatus Status { get; private set; }

public static Order Place(CustomerId customerId, List<OrderLineItem> items)
{
var order = new Order(OrderId.New(), customerId);
foreach (var item in items)
{
order.AddLine(item);
}
order.AddDomainEvent(new OrderPlaced(...));
return order;
}
}

Policies β†’ Event Handlers​

// From sticky: πŸŸͺ "When OrderPlaced, reserve inventory"
public class ReserveInventoryOnOrderPlaced : IEventHandler<OrderPlaced>
{
public async Task Handle(OrderPlaced @event)
{
foreach (var item in @event.Items)
{
await _inventoryService.Reserve(item.ProductId, item.Quantity);
}
}
}

Staff+ Interview Questions​

Q: When would you use Event Storming vs other discovery techniques?

A: Event Storming is best when:

  • Domain is complex and poorly understood
  • Multiple stakeholders with different perspectives
  • Need shared understanding quickly
  • Want to discover bounded contexts

I'd use other techniques when:

  • Domain is simple (just talk to experts)
  • Remote-only with poor tooling (interviews might be better)
  • Need detailed requirements (combine with user story mapping)

Q: How do you handle resistance from domain experts?

A: Common concerns and responses:

  • "I don't have time" β†’ "2 hours now saves weeks of rework"
  • "I'm not technical" β†’ "We need your business knowledge, not technical skills"
  • "Just tell me what you need" β†’ "We need to discover together what's possible"

Start small - a 1-hour session on one process. Success builds buy-in.

Q: How do you go from Event Storming to implementation?

A:

  1. Photograph everything - Document the wall
  2. Identify bounded contexts - From event clusters
  3. Prioritize - Which context to implement first
  4. Design level session - Zoom into priority context
  5. Extract aggregates - From yellow stickies
  6. Define events - From orange stickies
  7. Implement - Start with core aggregate

Quick Reference Card​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ EVENT STORMING QUICK REFERENCE β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β”‚
β”‚ Colors: β”‚
β”‚ 🟧 Orange = Domain Event (past tense) β”‚
β”‚ 🟦 Blue = Command (imperative) β”‚
β”‚ 🟨 Yellow = Aggregate β”‚
β”‚ πŸŸͺ Purple = Policy ("when X, then Y") β”‚
β”‚ πŸ”΄ Pink = Hot Spot (question/problem) β”‚
β”‚ 🟩 Green = Read Model β”‚
β”‚ β”‚
β”‚ Big Picture (2-4 hours): β”‚
β”‚ 1. Chaotic exploration (events) β”‚
β”‚ 2. Timeline enforcement β”‚
β”‚ 3. Pivotal events β”‚
β”‚ 4. Commands and actors β”‚
β”‚ 5. Hot spots β”‚
β”‚ 6. Bounded contexts β”‚
β”‚ β”‚
β”‚ Key Rules: β”‚
β”‚ β€’ Domain experts lead β”‚
β”‚ β€’ Past tense for events β”‚
β”‚ β€’ No wrong answers β”‚
β”‚ β€’ Questions are valuable β”‚
β”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Next Steps​