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β
| Aspect | Description |
|---|---|
| What | Workshop using sticky notes to explore domain |
| Who | Developers + domain experts + stakeholders |
| Duration | 2-4 hours for Big Picture, 1-2 days for Design Level |
| Output | Shared 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:
- Chaotic exploration (everyone adds events)
- Timeline enforcement (order events left to right)
- Identify pivotal events (major state changes)
- Mark hot spots (problems, questions)
- 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:
- No wrong answers
- Use past tense for events
- One concept per sticky
- Write big and clear
- 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 processPaymentReceived- Enables shippingOrderShipped- Inventory committedOrderDelivered- 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β
| Problem | Solution |
|---|---|
| Domain experts are quiet | Ask them to describe their daily work |
| Too many events | Focus on one process at a time |
| Disagreements | Mark as hot spot, discuss later |
| Getting stuck | Move to another area, come back |
| Too technical | Redirect 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β
- Shorter sessions - 90 min max, multiple sessions
- Smaller groups - 5-8 people per session
- Clear facilitation - One person controls the board
- Breakout rooms - For parallel exploration
- 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:
- Photograph everything - Document the wall
- Identify bounded contexts - From event clusters
- Prioritize - Which context to implement first
- Design level session - Zoom into priority context
- Extract aggregates - From yellow stickies
- Define events - From orange stickies
- 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β
- Domain Discovery - Other discovery techniques
- Aggregates - Implementing what you discovered
- Domain Events - Event design patterns