Acme IncArchitecture reference
2026-10-15
Architecture reference/Generated 2026-10-15 15:24 UTC

Acme Inc

Discover, Explore and Document your Event Driven Architectures.

This reference is generated from the Acme Inc EventCatalog. It documents 10 domains, 18 systems and 32 services, the 71 messages they exchange (45 events, 20 commands and 6 queries), 8 channels, 15 data stores, 7 flows and 29 entities and the 8 teams that own them.

Everything links to everything else. Press ⌘K to jump to any resource.

Catalog2026-10-15
Domains
10
Systems
18
Services
32
Events
45
Commands
20
Queries
6
Channels
8
Data stores
15
Flows
7
Teams
8
Regenerate this reference
npx eventcatalog build

Domains

Business areas and the services and messages that belong to them.

Domain

Catalog

v1.0.0Core domainBusiness Critical
catalog

The Catalog domain owns everything about products — how they are created, maintained and made discoverable across Acme Inc. It is the source of truth for product data and powers product search across the business.

Owned by Product Platform5 services
Ubiquitous language
Product

A single item Acme Inc sells, with a name, price, category and lifecycle status.

SKU

Stock Keeping Unit — the unique, human-meaningful code that identifies a product.

Catalog

The complete, authoritative collection of products Acme Inc offers.

Search Index

A denormalised, search-optimised copy of the catalog that powers product search.

Lifecycle Status

Where a product sits in its life: DRAFT, ACTIVE or ARCHIVED.

Outbox

A table where product changes are recorded in the same transaction, then published as events.

Documentation

Overview

The Catalog domain is responsible for the lifecycle of every product Acme Inc sells, and for making those products discoverable. It is split into two internal systems that work together:

How the systems work together

The Product Catalog System is the authoritative source of product data. Whenever a product is created, updated or deleted it publishes a domain event. The Search System subscribes to those events, keeps its search index in sync, and exposes a search API so other teams never have to query the catalog database directly.

Value Chain

A Wardley map of the Catalog domain. Product search is where we differentiate, so it sits closest to the shopper and furthest from commodity. The data stores and compute underneath are bought, not built.

wardley-beta
title Catalog value chain

anchor Shopper [0.96, 0.66]
anchor Merchant [0.96, 0.34]
component Product Search [0.84, 0.60]
component Product Catalog [0.76, 0.42]
component Search Index [0.60, 0.58]
component Product Data Model [0.60, 0.30]
component Event Bus [0.44, 0.74]
component Search Engine [0.34, 0.78]
component Catalog Database [0.24, 0.86]
component Cloud Compute [0.10, 0.94]

Shopper -> Product Search
Merchant -> Product Catalog
Product Search -> Search Index
Product Catalog -> Product Data Model
Product Catalog -> Event Bus
Search Index -> Event Bus
Search Index -> Search Engine
Product Catalog -> Catalog Database
Search Engine -> Cloud Compute
Catalog Database -> Cloud Compute

evolve Search Engine 0.90
evolve Product Data Model 0.48

note "Search relevance is our differentiator, keep it custom" [0.90, 0.40]
note "Move self hosted search to a managed service" [0.28, 0.52]

Architecture Graph

Where Catalog sits in the wider architecture — its systems and messages, and the neighbouring domains it talks to.

The diagram below shows the domain's systems, how they relate, and the people who interact with them.

Domain

Customer

v1.0.0Core domainBusiness Critical
customer

The Customer domain owns who our customers are — how they register, how their profile is maintained, and how they are authenticated across Acme Inc. It is the source of truth for customer identity and profile data.

Owned by Customer Platform2 services
Ubiquitous language
Customer

A person with an account at Acme Inc, identified by a unique customer id and email.

Identity

The credentials and login information used to prove a customer is who they say they are.

Authentication

Verifying that a sign-in attempt belongs to a real customer.

Credential

A secret (such as a password) a customer uses to authenticate. Never stored in plain text.

Account Status

Where a customer account sits: ACTIVE, SUSPENDED or CLOSED.

User Directory

The authoritative store of customer credentials and login identities.

Documentation

Overview

The Customer domain is responsible for the lifecycle of every customer account at Acme Inc — registration, profile updates, and authentication. It is split into two systems:

How the systems work together

The Customer Management System owns customer profile data — it accepts registration and update commands and publishes events when customers change. The Identity Provider handles authentication: it verifies credentials and emits an event when a customer successfully authenticates, which the rest of the business can react to.

Subdomains

The Customer domain also contains two subdomains: Loyalty awards and reverses loyalty points as orders complete or are cancelled, and Customer Notifications keeps customers informed by email, SMS and push in response to events from across Acme Inc.

System Diagram

The systems in this domain, how they relate, and the people who interact with them.

Domain/Customer

Customer Notifications

v1.0.0Generic subdomain
notifications

The Customer Notifications subdomain keeps customers informed. It listens to key moments across Ordering, Fulfilment, Payments, Reviews, Loyalty and Returns and sends the customer an email, SMS or push notification on their preferred channel.

Owned by Customer Platform1 service
Documentation

Overview

The Customer Notifications subdomain is part of the Customer domain. It has no systems of its own — a single Notification Service consumes events from across the business and notifies customers according to their Notification Preferences.

Domain

Fulfilment

v1.0.0Core domainBusiness Critical
fulfilment

The Fulfilment domain gets a confirmed order to the customer. It reserves stock, picks and packs orders in the warehouse, and hands them to carriers for delivery.

Owned by Fulfilment Platform7 services
Ubiquitous language
Fulfilment

Everything that gets a confirmed order physically to the customer — stock, packing and shipping.

Stock

The quantity of a product physically available to sell.

Reservation

A temporary hold on stock for a specific order, taken during checkout.

Picking

Collecting an order's items from the warehouse shelves.

Packing

Boxing up a picked order into one or more parcels ready for shipping.

Shipment

A packed order handed to a carrier for delivery, tracked from dispatch to delivery.

Carrier

The external delivery company that transports shipments to customers.

Tracking Number

A code from the carrier that lets the customer follow a shipment's progress.

Documentation

Overview

The Fulfilment domain is responsible for the physical side of an order — making sure stock is available, picking and packing it, and shipping it to the customer. It owns three internal systems and integrates with external carriers:

How the systems work together

When an order is completed, the Warehouse System picks and packs it, having relied on the Inventory System to reserve stock earlier in checkout. Once packed, the Shipping System creates a shipment with an external Carrier, which delivers it to the customer and reports progress back.

Subdomains

The Returns subdomain handles the reverse journey — accepting return requests, approving them, and confirming when items arrive back so Payments can refund the customer and Inventory can restock.

Value Chain

A Wardley map of the Fulfilment domain. Delivery is the promise customers see, carriers are a commodity we rent, and warehouse automation is the most novel part of the chain.

wardley-beta
title Fulfilment value chain

anchor Customer [0.96, 0.62]
component Delivery Promise [0.86, 0.50]
component Stock Reservation [0.72, 0.46]
component Pick and Pack [0.64, 0.34]
component Shipment Booking [0.56, 0.60]
component Warehouse Automation [0.36, 0.22]
component Carrier Network [0.40, 0.88]
component Inventory Database [0.26, 0.86]
component Cloud Compute [0.10, 0.94]

Customer -> Delivery Promise
Delivery Promise -> Stock Reservation
Delivery Promise -> Shipment Booking
Stock Reservation -> Inventory Database
Shipment Booking -> Pick and Pack
Shipment Booking -> Carrier Network
Pick and Pack -> Warehouse Automation
Inventory Database -> Cloud Compute

evolve Warehouse Automation 0.52
evolve Shipment Booking 0.82

note "Robotic picking pilot in the main warehouse" [0.30, 0.06]
note "Consolidate carriers behind a multi carrier aggregator" [0.50, 0.70]

System Diagram

The systems in this domain, how they relate, and the people who interact with them.

Domain/Customer

Loyalty

v1.0.0Supporting subdomain
loyalty

The Loyalty subdomain rewards customers for shopping with Acme Inc. It awards points when orders complete, reverses them when orders are cancelled, and keeps each customer's points balance.

Owned by Customer Platform1 service
Documentation

Overview

The Loyalty subdomain is part of the Customer domain. It listens to the order lifecycle from the Ordering domain and turns completed orders into loyalty points that customers can redeem on future purchases.

TriggerOutcome
Order CompletedPoints are awarded and Loyalty Points Earned is published.
Order CancelledPreviously awarded points are removed and Loyalty Points Reversed is published.
Domain

Ordering

v1.0.0Core domainBusiness Critical
ordering

The Ordering domain turns a checked-out cart into a confirmed order. It orchestrates checkout — reserving inventory, authorizing payment and creating the order — and owns the lifecycle of every order.

Owned by Ordering Platform3 services
Ubiquitous language
Order

A confirmed intent to purchase, created from a checked-out cart and owned for its whole lifecycle.

Checkout

The flow that turns a checked-out cart into a confirmed order.

Saga

A multi-step process with compensating actions, used to coordinate checkout across systems.

Reservation

A temporary hold on stock for the items in a cart, taken during checkout.

Authorization

A hold placed on a customer's payment method for the order total, captured when the order is created.

Order Item

A single product line within an order: a product, a quantity and the price paid per unit.

Order Status

Where an order sits in its life: CREATED, COMPLETED or CANCELLED.

Documentation

Overview

The Ordering domain is responsible for everything that happens once a customer commits to buy — from the moment their cart is checked out to a confirmed, fulfilled order. It is split into two systems:

How the systems work together

When the Shopping domain checks out a cart, the Checkout System takes over. It orchestrates the steps needed to place an order — reserving inventory, authorizing payment, and finally asking the Order Management System to create the order. The Order Management System then owns that order for the rest of its life, publishing events as it is created, completed or cancelled.

Value Chain

A Wardley map of the Ordering domain. Placing an order is the most visible need in the business, the checkout orchestration behind it is custom, and the workflow tooling it runs on is evolving towards a product.

wardley-beta
title Ordering value chain

anchor Customer [0.96, 0.56]
component Place Order [0.88, 0.52]
component Checkout Orchestration [0.76, 0.40]
component Order Management [0.66, 0.52]
component Inventory Reservation [0.54, 0.50]
component Payment Authorization [0.54, 0.64]
component Workflow Engine [0.38, 0.46]
component Event Bus [0.40, 0.76]
component Order Database [0.24, 0.86]
component Cloud Compute [0.10, 0.94]

Customer -> Place Order
Place Order -> Checkout Orchestration
Checkout Orchestration -> Inventory Reservation
Checkout Orchestration -> Payment Authorization
Checkout Orchestration -> Order Management
Checkout Orchestration -> Workflow Engine
Order Management -> Event Bus
Order Management -> Order Database
Workflow Engine -> Cloud Compute
Order Database -> Cloud Compute

evolve Workflow Engine 0.74

note "Replace bespoke saga code with a managed workflow engine" [0.32, 0.24]

System Diagram

The systems in this domain, how they relate, and the people who interact with them.

Resource Diagram

The components that make up this domain.

Architecture Graph

Where Ordering sits in the wider architecture — its systems and messages, and the neighbouring domains it talks to.

Domain

Payments

v1.0.0Core domainBusiness Critical
payments

The Payments domain takes payment for orders and processes refunds. It orchestrates authorization and capture through an external payment processor, and screens payments for fraud.

Owned by Payments Platform6 services
Ubiquitous language
Payment

A charge taken from a customer to pay for an order.

Authorization

A hold placed on a customer's payment method, confirming funds are available before capture.

Capture

Taking the held funds from an authorized payment — turning an authorization into an actual charge.

Refund

Returning money to a customer for a previous payment, in full or in part.

Payment Processor

The external provider (Stripe) that charges cards and issues refunds on Acme Inc's behalf.

Fraud Screening

Checking a payment for signs of fraud before allowing the charge to proceed.

Webhook

A callback the payment processor sends to report the outcome of a charge or refund.

Documentation

Overview

The Payments domain is responsible for moving money. It authorizes and captures payment for orders, issues refunds, and screens payments for fraud. It owns one internal system and integrates with two external providers:

How the systems work together

The Payment Processing System is the internal orchestrator. When the Ordering domain authorizes a payment, it requests payment via the external Stripe system and, in parallel, asks Fraud Detection to screen the payment. Stripe reports back whether the payment succeeded or failed, and the Payment Processing System records the outcome.

Value Chain

A Wardley map of the Payments domain. Card processing and fraud screening are commodities we buy from providers, so the value we add is in orchestration, refunds and the compliance posture around them.

wardley-beta
title Payments value chain

anchor Shopper [0.96, 0.60]
anchor Finance Team [0.96, 0.30]
component Pay for Order [0.86, 0.58]
component Refund Order [0.80, 0.34]
component Payment Orchestration [0.70, 0.44]
component Fraud Screening [0.56, 0.64]
component Card Processing [0.46, 0.86]
component PCI Compliance [0.38, 0.72]
component Payment Ledger [0.26, 0.60]
component Cloud Compute [0.10, 0.94]

Shopper -> Pay for Order
Finance Team -> Refund Order
Pay for Order -> Payment Orchestration
Refund Order -> Payment Orchestration
Payment Orchestration -> Fraud Screening
Payment Orchestration -> Card Processing
Payment Orchestration -> Payment Ledger
Card Processing -> PCI Compliance
Payment Ledger -> Cloud Compute

evolve Fraud Screening 0.82
evolve Payment Ledger 0.80

note "In house rules engine is being replaced by a managed fraud provider" [0.62, 0.30]
note "Ledger moving to a hosted double entry service" [0.20, 0.36]

System Diagram

The systems in this domain, how they relate, and the people who interact with them.

Architecture Graph

Where Payments sits in the wider architecture — its systems and messages, and the neighbouring domains it talks to.

Domain/Fulfilment

Returns

v1.0.0Supporting subdomain
returns

The Returns subdomain handles items customers send back. It accepts return requests, approves them against the returns policy, and confirms when returned items arrive at the warehouse so they can be refunded and restocked.

Owned by Fulfilment Platform2 services
Documentation

Overview

The Returns subdomain is part of the Fulfilment domain and runs the reverse logistics journey through the Returns System.

  1. A customer sends Request Return and the Returns API publishes Return Requested.
  2. The Returns Processor checks the returns policy and publishes Return Approved.
  3. When the parcel reaches the warehouse it publishes Return Received — Payments refunds the customer and Inventory restocks the items.
Domain

Reviews & Ratings

v1.0.0Supporting domain
reviews

The Reviews & Ratings domain owns customer feedback on products — how reviews are submitted, moderated, published and aggregated into the star ratings shown across the storefront.

Owned by Reviews Platform3 services10 integration events
Details
Specifications
Documentation

Overview

The Reviews & Ratings domain is responsible for everything to do with customer feedback on products: accepting reviews, moderating them for quality and abuse, publishing the approved ones, and aggregating them into the star ratings shown across the storefront.

Unlike most other domains in the catalog, Reviews & Ratings is modelled without systems — its services, data stores and flows hang directly off the domain.

What's inside
ComponentTypeResponsibility
Review APIServiceAccepts review submissions and serves product reviews.
Review Moderation WorkerServiceScreens submitted reviews and publishes or rejects them.
Rating AggregatorServiceKeeps each product's aggregate rating in sync as reviews are published.
Review DatabaseData StoreSystem of record for reviews and their moderation state.
Rating CacheData StoreFast read store for aggregate product ratings.
ReviewEntityThe core review aggregate.

The diagram below shows the services, data stores and messages that make up this domain.

How it works

  1. A customer submits a review via the Review API, which stores it and publishes Review Submitted.
  2. The Review Moderation Worker screens the review and publishes either Review Published or Review Rejected.
  3. The Rating Aggregator consumes Review Published and updates the product's aggregate rating, publishing Rating Updated.

Once a review is live, customers can interact with it: Vote Review Helpful updates its helpful count (publishing Review Helpful Voted), and Flag Review reports it for re-moderation (publishing Review Flagged, which the Review Moderation Worker re-screens).

Domain

Shopping

v1.0.0Core domainBusiness Critical
shopping

The Shopping domain owns the customer's path to purchase — building a cart, applying promotions, and checking out. It coordinates the cart and the discounts that apply to it.

Owned by Shopping Platform2 services
Ubiquitous language
Cart

A customer's in-progress collection of items they intend to buy.

Cart Item

A single product line within a cart: a product, a quantity and a unit price.

Checkout

The act of finalising a cart — pricing it and committing to purchase.

Promotion

A rule that reduces the price of a cart, such as a percentage off or a fixed amount.

Discount

The actual amount taken off a specific cart after evaluating the applicable promotions.

Subtotal

The total value of a cart's items before any discounts are applied.

Promotion Code

A code a customer enters at checkout to apply a specific promotion.

Documentation

Overview

The Shopping domain is responsible for everything between browsing and buying — the shopping cart and the promotions applied to it. It is split into two systems:

How the systems work together

The Cart System owns the customer's cart and the checkout flow. When pricing a cart, it asks the Promotion System to calculate the discounts that apply. When the customer checks out, the Cart System publishes an event the rest of the business reacts to.

System Diagram

The systems in this domain, how they relate, and the people who interact with them.

Systems

Groups of services that are built, deployed and owned together.

System/Fulfilment

Carrier

Externalv1.0.0External
carrier

External carrier that delivers shipments to customers. It accepts shipment requests and reports delivery progress back.

Owned by Fulfilment Platform2 services
Talks to

delivers shipments for

Documentation

Overview

The Carrier is the external delivery company Acme Inc uses to ship orders to customers. It is owned and operated by a third party — modelled here as an external system so the catalog shows how the Shipping System integrates with it.

It receives Create Shipment and reports progress back via Shipment Created, Shipment Delivered and Shipment Failed.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services and messages that make up this system.

What's inside

ComponentTypeResponsibility
Shipping APIServiceAccepts shipment requests and dispatches parcels.
Tracking APIServiceReports delivery progress back to Acme Inc.

Messages this system publishes

System/Shopping

Cart System

v1.0.0Internal
cart-system

Internal system that owns the customer's shopping cart and the checkout flow. It is the source of truth for cart contents and publishes an event when a cart is checked out.

Owned by Shopping Platform1 service
Talks to

calculates discounts via

Used by
Shopper

Uses the system. adds items and checks out

Documentation

Overview

The Cart System owns the shopping cart at Acme Inc. It accepts commands to add and remove items and to check out, persists cart contents in the Cart Database, and asks the Promotion System to calculate the discounts that apply. When a cart is checked out it publishes a Cart Checked Out event.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services, data stores and messages that make up this system.

What's inside

ComponentTypeResponsibility
Cart APIServicePublic-facing API. Handles add/remove/checkout commands and publishes the checkout event.
Cart DatabaseData storePostgreSQL system of record for shopping carts and their items.

Messages this system publishes

Services1
Data1 stores
System/Ordering

Checkout System

v1.0.0Internal
checkout-system

Internal system that orchestrates checkout. When a cart is checked out it reserves inventory, authorizes payment, and asks the Order Management System to create the order.

Owned by Ordering Platform2 services
Talks to

creates orders via

Used by
Shopper

Uses the system. confirms checkout

Documentation

Overview

The Checkout System drives the checkout flow at Acme Inc. When the Shopping domain checks out a cart, the Checkout API receives the Checkout Cart command and hands it to the Checkout Orchestrator. The orchestrator runs the checkout saga — reserving inventory via Reserve Inventory, authorizing payment via Authorize Payment, and finally creating the order via Create Order against the Order Management System.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services and messages that make up this system.

What's inside

ComponentTypeResponsibility
Checkout APIServiceEntry point for checkout. Receives the checkout command and starts the flow.
Checkout OrchestratorServiceRuns the checkout saga — reserve inventory, authorize payment, create order.

Messages this system sends

Architecture Graph

The checkout system's neighbourhood in the wider architecture.

System/Customer

Customer Management System

v1.0.0Internal
customer-management-system

Internal system that is the source of truth for customer profile data. Owns the customer database and publishes customer change events for the rest of the business to consume.

Owned by Customer Platform1 service
Talks to

delegates authentication to

Used by
Customer

Uses the system. registers and updates their profile

Support Agent

Uses the system. looks up customer details

Documentation

Overview

The Customer Management System is the system of record for customer profiles at Acme Inc. It accepts commands to register and update customers, persists them in the Customer Database, and emits domain events whenever customer data changes so downstream systems can react. It delegates authentication to the Identity Provider.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services, data stores and messages that make up this system.

What's inside

ComponentTypeResponsibility
Customer APIServicePublic-facing API. Handles register/update commands and customer reads, and publishes customer change events.
Customer DatabaseData storePostgreSQL system of record for all customer profile data.

Messages this system publishes

When customer data changes, the system emits these events:

System/Payments

Finance Reporting System

v1.0.0
finance-reporting-system

Internal system that produces month-end finance reports. It works on its own, with no connections to other systems.

Owned by Payments Platform1 service
Documentation

Overview

The Finance Reporting System produces month-end finance reports for the finance team. It is self-contained: it has no relationships with other systems and no actors, so its context diagram shows the system on its own.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services that make up this system.

What's inside

ComponentTypeResponsibility
Ledger ExporterServiceBuilds the month-end ledger export.
System/Payments

Fraud Detection

Externalv1.0.0External
fraud-detection

External provider that screens payments for fraud. It consumes payment requests and returns a pass or fail verdict.

Owned by Payments Platform1 service
Talks to

screens payments for

Documentation

Overview

Fraud Detection is an external provider Acme Inc uses to screen payments for fraud. It is owned and operated by a third party — modelled here as an external system so the catalog shows how the Payment Processing System integrates with it.

It consumes Payment Requested and returns a verdict via Fraud Check Passed or Fraud Check Failed.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services and messages that make up this system.

What's inside

ComponentTypeResponsibility
Fraud APIServiceScreens a payment for fraud and returns a pass/fail verdict.

Messages this system publishes

Services1
System/Customer

Identity Provider

Externalv1.0.0Identity
identity-provider

The identity system that authenticates customers. It is the source of truth for credentials and login, verifies sign-in attempts, and emits an event when a customer successfully authenticates.

Owned by Customer Platform1 service
Talks to

provides authentication for

Used by
Customer

Uses the system. signs in

Documentation

Overview

The Identity Provider authenticates customers for Acme Inc. It exposes an OAuth-style API, verifies credentials against the User Directory, and emits a Customer Authenticated event on a successful sign-in so other systems can react. It provides authentication for the Customer Management System.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services, data stores and messages that make up this system.

What's inside

ComponentTypeResponsibility
OAuth APIServiceOAuth-style authentication API. Handles authentication requests and publishes authentication events.
User DirectoryData storeThe directory of customer credentials and identities.

Messages this system publishes

Services1
System/Fulfilment

Inventory System

v1.0.0Internal
inventory-system

Internal system that tracks stock and reserves it for orders. It is the source of truth for available inventory and confirms whether stock can be reserved.

Owned by Fulfilment Platform1 service
Talks to

provides stock for

Documentation

Overview

The Inventory System owns stock levels at Acme Inc. During checkout it receives Reserve Inventory and confirms whether stock is available — replying with Inventory Reserved or Inventory Unavailable. It also handles Release Inventory (when a reservation is no longer needed) and serves Get Stock Level lookups from the Inventory Database.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services, data stores and messages that make up this system.

What's inside

ComponentTypeResponsibility
Inventory ServiceServiceReserves and releases stock, serves stock-level queries, and publishes inventory events.
Inventory DatabaseData storePostgreSQL system of record for stock levels and reservations.

Messages this system publishes

System/Loyalty

Loyalty System

v1.0.0Internal
loyalty-system

Internal system that calculates, stores and reverses customer loyalty points in response to order events.

Owned by Customer Platform1 service
Documentation

Overview

The Loyalty System turns orders into rewards. The Loyalty Service consumes Order Completed and Order Cancelled from the Order Management System, updates balances in the Loyalty Database, and publishes points events for the rest of the business.

Resource Diagram

The services and messages that make up this system.

What's inside

ComponentTypeResponsibility
Loyalty ServiceServiceAwards and reverses loyalty points and maintains balances.
Loyalty DatabaseData storePoints ledger and customer balances.

Messages this system sends

System/Ordering

Order Management System

v1.0.0Internal
order-management-system

Internal system that is the source of truth for orders. It creates orders, tracks their lifecycle, and publishes events as orders are created, completed and cancelled.

Owned by Ordering Platform1 service
Talks to

receives orders from

Documentation

Overview

The Order Management System owns the order at Acme Inc. It accepts the Create Order command from the Checkout System, persists orders in the Order Database, and serves order lookups via Get Order. As an order moves through its lifecycle it publishes Order Created, Order Completed and Order Cancelled events for the rest of the business to react to.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services, data stores and messages that make up this system.

What's inside

ComponentTypeResponsibility
Order ServiceServiceCreates, cancels and serves orders, and publishes order lifecycle events.
Order DatabaseData storePostgreSQL system of record for orders and their items.

Messages this system publishes

System/Payments

Payment Processing System

v1.0.0Internal
payment-processing-system

Internal system that orchestrates payment for orders. It authorizes payments, requests charges from the external payment processor, handles the outcome, and issues refunds.

Owned by Payments Platform2 services
Talks to

requests charges from

screens payments with

Documentation

Overview

The Payment Processing System is the internal heart of the Payments domain. When the Ordering domain sends Authorize Payment, the Payment API records the intent in the Payment Database and the Payment Worker requests a charge from the external Stripe via Payment Requested. Stripe reports the outcome back as Payment Succeeded or Payment Failed, which the worker records. The system also issues refunds via Refund Requested.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services, data stores and messages that make up this system.

What's inside

ComponentTypeResponsibility
Payment APIServiceReceives authorization requests and records payment intent.
Payment WorkerServiceDrives charges and refunds against Stripe and records outcomes.
Payment DatabaseData storePostgreSQL system of record for payments and refunds.

Messages this system publishes

System/Catalog

Product Catalog System

v1.0.0Internal
product-catalog-system

Internal system that is the source of truth for product data. Owns the product database and publishes product change events for the rest of the business to consume.

Owned by Product Platform3 services
Talks to

notifies of product changes

Used by
Merchandiser

Uses the system. creates and updates products

Catalog Admin

Uses the system. manages categories and pricing

Documentation

Overview

The Product Catalog System is the system of record for products at Acme Inc. It accepts commands to create, update and delete products, persists them in the Product Database, and emits domain events whenever product data changes so downstream systems — like the Search System — can react.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services, data stores and messages that make up this system.

What's inside

ComponentTypeResponsibility
Product APIServicePublic-facing API. Handles create/update/delete commands and product reads.
Product WorkerServiceProcesses long-running and asynchronous catalog work off the request path.
Product Search PublisherServicePublishes product change events for the Search System to consume.
Product DatabaseData storePostgreSQL system of record for all product data.

Messages this system publishes

When product data changes, the system emits these events:

  • Product Created — a new product has been added to the catalog.
  • Product Updated — an existing product's data has changed.
  • Product Deleted — a product has been removed from the catalog.
  • adr-001-use-transactional-outbox — a product has been removed from the catalog.

Architecture decisions

The key decisions that shaped this system. Search, filter by status, or sort by clicking a column.

System/Shopping

Promotion System

v1.0.0Internal
promotion-system

Internal system that calculates the discounts and promotions that apply to a cart. It owns promotion rules and returns calculated discounts to the Cart System.

Owned by Shopping Platform1 service
Talks to

provides discounts to

Documentation

Overview

The Promotion System owns the discount and promotion rules at Acme Inc. It receives requests to calculate the discount for a cart, evaluates the applicable rules from the Promotion Database, and publishes a Discount Calculated event with the result. It provides discounts to the Cart System.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services, data stores and messages that make up this system.

What's inside

ComponentTypeResponsibility
Promotion ServiceServiceEvaluates promotion rules and calculates discounts for a cart.
Promotion DatabaseData storePostgreSQL store of promotion and discount rules.

Messages this system publishes

System/Returns

Returns System

v1.0.0Internal
returns-system

Internal system that accepts, approves and tracks customer returns through to their arrival back at the warehouse.

Owned by Fulfilment Platform2 services
Documentation

Overview

The Returns System owns the returns journey. The Returns API accepts Request Return from customers, and the Returns Processor approves returns and confirms receipt. Both share the Returns Database.

Resource Diagram

The services and messages that make up this system.

What's inside

ComponentTypeResponsibility
Returns APIServiceAccepts return requests from customers.
Returns ProcessorServiceApplies the returns policy and tracks returned parcels.
Returns DatabaseData storeReturn requests and their status.

Messages this system sends

System/Catalog

Search System

v1.0.0Internal
search-system

Internal system that keeps product data searchable. Consumes product change events from the Product Catalog System, maintains a search index, and serves fast product search to the rest of the business.

Owned by Search Platform2 services
Talks to

indexes product changes from

Used by
Shopper

Uses the system. searches for products

Storefront Team

Uses the system. integrates product search

Documentation

Overview

The Search System makes the catalog discoverable. It subscribes to product change events published by the Product Catalog System, updates its Search Index, and exposes a search API so other teams can find products without ever touching the catalog database directly.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services, data stores and messages that make up this system.

What's inside

ComponentTypeResponsibility
Search APIServicePublic-facing API. Serves product search queries from the index.
Search IndexerServiceConsumes product change events and keeps the search index up to date.
Search IndexData storeThe index that powers product search.

Messages this system consumes

The Search System reacts to product changes published by the Product Catalog System:

System/Fulfilment

Shipping System

v1.0.0Internal
shipping-system

Internal system that hands packed orders to carriers. It reacts to ready-for-shipping orders and creates shipments with an external carrier.

Owned by Fulfilment Platform2 services
Talks to

creates shipments with

Documentation

Overview

The Shipping System connects Acme Inc to its carriers. When the Warehouse System publishes Order Ready For Shipping, the Shipping API selects a carrier and the Carrier Adapter sends a Create Shipment to the external Carrier to dispatch the parcel.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services and messages that make up this system.

What's inside

ComponentTypeResponsibility
Shipping APIServiceReceives ready-for-shipping orders and selects a carrier.
Carrier AdapterServiceTranslates and sends shipment requests to the external carrier.

Messages this system sends

System/Payments

Stripe

Externalv1.0.0External
stripe

External payment processor used by Acme Inc to charge cards and issue refunds. It receives payment and refund requests and reports outcomes back via webhook events.

Owned by Payments Platform2 services
Talks to

processes payments for

Documentation

Overview

Stripe is the external payment processor Acme Inc uses to charge customer cards and issue refunds. It is owned and operated by Stripe — modelled here as an external system so the catalog shows how the Payment Processing System integrates with it.

Stripe receives Payment Requested and Refund Requested, and reports outcomes back via Payment Succeeded, Payment Failed and Refund Processed.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services and messages that make up this system.

What's inside

ComponentTypeResponsibility
Payments APIServiceAccepts charge and refund requests and processes them.
Webhook EndpointServiceDelivers payment and refund outcomes back to Acme Inc as webhook events.

Messages this system publishes

System/Fulfilment

Warehouse System

v1.0.0Internal
warehouse-system

Internal system that picks and packs orders in the warehouse. It reacts to completed orders, organises picking, and signals when an order is packed and ready to ship.

Owned by Fulfilment Platform2 services
Talks to

hands packed orders to

consumes reserved stock from

Documentation

Overview

The Warehouse System turns a completed order into a packed parcel. When the Ordering domain publishes Order Completed, the Warehouse Service creates a picking job, the Picking Worker works through it, and the system publishes Order Packed and then Order Ready For Shipping for the Shipping System.

Context Diagram

How this system relates to the other systems around it.

Resource Diagram

The services, data stores and messages that make up this system.

What's inside

ComponentTypeResponsibility
Warehouse ServiceServiceReceives completed orders and orchestrates picking and packing.
Picking WorkerServiceWorks through picking jobs on the warehouse floor.
Warehouse DatabaseData storePostgreSQL store of picking jobs and their status.

Messages this system publishes

Services

What runs, what it sends and what it listens to.

Carrier Adapter

v1.0.0
carrier-adapter

Translates Acme Inc shipment requests into the external carrier's format and sends them to create a shipment.

Owned by Fulfilment Platform1 out · 0 in
Details
Language

Go

Documentation

Overview

The Carrier Adapter is the anti-corruption layer between Acme Inc and its carriers. It takes a shipment request from the Shipping API, maps it to the external Carrier's API, and sends a Create Shipment to dispatch the parcel.

Messages1 out · 0 in
Upstream0

Nothing in the catalog sends it messages.

Downstream1

Cart API

v1.0.0
cart-api

The public-facing API for shopping carts. Handles commands to add and remove items and to check out, and publishes an event when a cart is checked out.

Owned by Shopping Platform2 out · 3 in
Details
Language

TypeScript

Specifications
Documentation

Overview

The Cart API is the front door to the Cart System. It validates incoming commands, persists cart contents to the Cart Database, asks the Promotion System to calculate discounts via Calculate Discount, and publishes a Cart Checked Out event when the customer checks out.

Responsibilities
AreaDescription
Cart managementValidates and applies Add Item To Cart, Remove Item From Cart and Checkout Cart.
DiscountsRequests pricing from the Promotion System via Calculate Discount.
Event publishingEmits Cart Checked Out when a cart is checked out.
PersistenceReads from and writes to the Cart Database (system of record).
Specifications1
Upstream0

Nothing in the catalog sends it messages.

Checkout API

v1.0.0
checkout-api

The entry point to the Checkout System. Receives the checkout command from the Shopping domain and starts the checkout flow.

Owned by Ordering Platform0 out · 1 in
Details
Language

TypeScript

Documentation

Overview

The Checkout API is the front door to the Checkout System. When the Shopping domain checks out a cart, this service receives the Checkout Cart command, validates it, and hands the work to the Checkout Orchestrator to run the checkout saga.

Responsibilities
AreaDescription
Checkout entryReceives and validates Checkout Cart from the Shopping domain.
Orchestration handoffStarts a checkout saga in the Checkout Orchestrator.
Messages0 out · 1 in
Upstream0

Nothing in the catalog sends it messages.

Downstream0

Nothing in the catalog consumes its output.

Checkout Orchestrator

v1.0.0
checkout-orchestrator

Runs the checkout saga. Reserves inventory, authorizes payment and creates the order, coordinating the steps that turn a checked-out cart into a confirmed order.

Owned by Ordering Platform3 out · 0 in
Details
Language

TypeScript

Documentation

Overview

The Checkout Orchestrator is the brain of the Checkout System. Once the Checkout API hands it a checkout, it runs the checkout saga step by step:

  1. Reserve inventory — sends Reserve Inventory to hold stock for the cart's items.
  2. Authorize payment — sends Authorize Payment to authorize the order total.
  3. Create the order — sends Create Order to the Order Management System.

If any step fails, the orchestrator compensates the earlier steps (releasing the reservation, voiding the authorization) so the customer is never left in an inconsistent state.

Responsibilities
AreaDescription
InventoryReserves stock via Reserve Inventory.
PaymentAuthorizes the order total via Authorize Payment.
Order creationCreates the order via Create Order against the Order Management System.
CompensationRolls back earlier steps if a later step fails.
Upstream0

Nothing in the catalog sends it messages.

Customer API

v1.0.0
customer-api

The public-facing API for customer profiles. Handles commands to register and update customers, serves customer reads, and publishes customer change events.

Owned by Customer Platform2 out · 3 in
Details
Language

TypeScript

Specifications
Documentation

Overview

The Customer API is the front door to the Customer Management System. It validates incoming commands, persists customer data to the Customer Database, and publishes domain events (CustomerRegistered, CustomerUpdated) so the rest of the business can react to changes.

Responsibilities
AreaDescription
Command handlingValidates and applies Register Customer and Update Customer.
ReadsServes Get Customer directly from the customer database.
Event publishingEmits Customer Registered and Customer Updated on every change.
PersistenceReads from and writes to the Customer Database (system of record).
Specifications1
Upstream0

Nothing in the catalog sends it messages.

Downstream0

Nothing in the catalog consumes its output.

Fraud API

v1.0.0
fraud-api

External fraud screening API. It consumes payment requests and returns a pass or fail verdict for each.

Owned by Payments Platform2 out · 1 in
Details
Language

External

Documentation

Overview

The Fraud API screens payments for fraud. It consumes Payment Requested from the Payment Processing System and returns a verdict — Fraud Check Passed or Fraud Check Failed — which the Payments domain uses to allow or block the charge.

Downstream0

Nothing in the catalog consumes its output.

Inventory Service

v1.0.0
inventory-service

The system of record for stock. Reserves and releases inventory, serves stock-level queries, and publishes events when stock is reserved or unavailable.

Owned by Fulfilment Platform2 out · 4 in
Details
Language

Java

Documentation

Overview

The Inventory Service is the heart of the Inventory System. It receives Reserve Inventory during checkout and replies with Inventory Reserved or Inventory Unavailable. It also handles Release Inventory and serves Get Stock Level reads, all backed by the Inventory Database. When returned items arrive it consumes Return Received to restock them.

Responsibilities
AreaDescription
ReservationsHandles Reserve Inventory and Release Inventory.
RestockingConsumes Return Received and returns resellable items to stock.
LookupsServes Get Stock Level from the Inventory Database.
Event publishingEmits Inventory Reserved and Inventory Unavailable.

Ledger Exporter

v1.0.0
ledger-exporter

Builds the month-end ledger export used for finance reporting. It runs on a schedule and doesn't send or receive any messages.

Owned by Payments Platform0 out · 0 in
Details
Language

Go

Documentation

Overview

The Ledger Exporter runs at the end of each month and builds the ledger export for the Finance Reporting System. It works on its own and doesn't send or receive any messages.

Upstream0

Nothing in the catalog sends it messages.

Downstream0

Nothing in the catalog consumes its output.

Loyalty Service

v1.0.0
loyalty-service

Awards loyalty points when orders complete and reverses them when orders are cancelled. Owns the points ledger and customer balances.

Owned by Customer Platform2 out · 2 in
Details
Language

TypeScript

Documentation

Overview

The Loyalty Service consumes Order Completed and Order Cancelled from the Ordering domain. It records points in the Loyalty Database and publishes Loyalty Points Earned or Loyalty Points Reversed so that promotions and customer notifications can react.

Responsibilities
AreaDescription
EarningAwards points on Order Completed and emits Loyalty Points Earned.
ReversalRemoves points on Order Cancelled and emits Loyalty Points Reversed.
PersistenceReads from and writes to the Loyalty Database.

Notification Service

v1.0.0
notification-service

Sends customers email, SMS and push notifications in response to events from across Acme Inc, honouring each customer's channel preferences.

Owned by Customer Platform1 out · 7 in
Details
Language

TypeScript

Documentation

Overview

The Notification Service is the single place Acme Inc talks to customers outside the storefront. It consumes events from other domains, looks up the customer's channel choices in Notification Preferences, sends the message and publishes Customer Notified.

Notifications sent
EventCustomer message
Order ConfirmedOrder confirmation with summary and delivery estimate.
Shipment DeliveredDelivery confirmation.
Payment FailedAsk the customer to update their payment method.
Refund ProcessedRefund confirmation.
Review PublishedLet the reviewer know their review is live.
Loyalty Points EarnedNew points balance.
Return ApprovedReturn label and drop-off instructions.

OAuth API

v1.0.0
oauth-api

OAuth-style authentication API for the Identity Provider. Verifies customer credentials and publishes an event when a customer successfully authenticates.

Owned by Customer Platform1 out · 1 in
Details
Language

TypeScript

Documentation

Overview

The OAuth API is the authentication entry point for Acme Inc. It verifies credentials against the User Directory and, on a successful sign-in, publishes a Customer Authenticated event so other systems can react.

Responsibilities
AreaDescription
AuthenticationHandles Authenticate Customer and verifies credentials.
Event publishingEmits Customer Authenticated on a successful sign-in.
CredentialsReads from the User Directory — the source of truth for credentials.
Upstream0

Nothing in the catalog sends it messages.

Downstream0

Nothing in the catalog consumes its output.

Order Service

v1.0.0
order-service

The system of record for orders. Creates and cancels orders, serves order lookups, and publishes events as orders move through their lifecycle.

Owned by Ordering Platform11 out · 4 in
Details
Language

Java

Specifications
Documentation

Overview

The Order Service is the heart of the Order Management System. It receives Create Order from the Checkout System, persists orders to the Order Database, and serves order lookups via Get Order. It also handles Cancel Order, and consumes Order Packed from the Fulfilment domain to track when an order has been packed. As orders move through their lifecycle it publishes detailed events covering creation, confirmation, amendments, operational holds, fulfilment, completion, cancellation, and archival.

Responsibilities
AreaDescription
Order creationHandles Create Order from the Checkout System and persists the order.
Order cancellationHandles Cancel Order and compensates downstream where needed.
Order lookupsServes Get Order from the Order Database.
Event publishingEmits a complete order lifecycle stream for fulfilment, customer communications, support, and analytics consumers.

Payment API

v1.0.0
payment-api

Receives payment authorization requests from the Ordering domain and records the payment intent, kicking off the charge against the payment processor.

Owned by Payments Platform0 out · 1 in
Details
Language

TypeScript

Documentation

Overview

The Payment API is the entry point to the Payment Processing System. It receives Authorize Payment from the Ordering domain, records the payment intent in the Payment Database, and leaves the Payment Worker to drive the charge against Stripe.

Responsibilities
AreaDescription
AuthorizationReceives and validates Authorize Payment.
PersistenceRecords payment intent in the Payment Database.

Architecture Graph

How PaymentAPI connects to the rest of the catalog — the messages it exchanges and the systems around it.

Messages0 out · 1 in
Downstream0

Nothing in the catalog consumes its output.

Payment Worker

v1.0.0
payment-worker

Drives charges and refunds against the external payment processor and records the outcomes. It requests payments and refunds, and consumes the success/failure events Stripe returns.

Owned by Payments Platform2 out · 3 in
Details
Language

Go

Documentation

Overview

The Payment Worker drives money movement. It requests charges from the external Stripe via Payment Requested and refunds via Refund Requested, then consumes the Payment Succeeded and Payment Failed events Stripe returns and records the outcome in the Payment Database. It also refunds customers for returned items when the Fulfilment domain publishes Return Received.

Responsibilities
AreaDescription
ChargingRequests charges via Payment Requested.
RefundsRequests refunds via Refund Requested.
ReturnsConsumes Return Received and requests a refund for the returned items.
OutcomesConsumes Payment Succeeded / Payment Failed and records them.
PersistenceReads from and writes to the Payment Database.

Payments API

v1.0.0
stripe-payments-api

Stripe's API for charging cards and issuing refunds. Acme Inc's Payment Processing System calls it to request payments and refunds.

Owned by Payments Platform0 out · 2 in
Details
Language

External

Documentation

Overview

The Payments API is Stripe's external interface for charging cards and issuing refunds. The Payment Processing System sends Payment Requested and Refund Requested, and Stripe processes them and reports the outcome back through its Webhook Endpoint.

Downstream0

Nothing in the catalog consumes its output.

Picking Worker

v1.0.0
picking-worker

Works through picking jobs on the warehouse floor and signals when an order has been picked and packed.

Owned by Fulfilment Platform1 out · 0 in
Details
Language

Go

Documentation

Overview

The Picking Worker processes picking jobs created by the Warehouse Service. As warehouse staff pick and pack each order, the worker updates the job in the Warehouse Database and publishes Order Packed when the order is complete.

Messages1 out · 0 in
Upstream0

Nothing in the catalog sends it messages.

Product API

v1.0.0
product-api

The public-facing API for the product catalog. Handles commands to create, update and delete products, serves product reads, and is the entry point into the Product Catalog System.

Owned by Product Platform0 out · 4 in
Details
Language

TypeScript

Specifications
Documentation

Overview

The Product API is the front door to the Product Catalog System. It validates incoming commands, persists product data to the Product Database, and records every change to the outbox. The Product Search Publisher then turns those changes into the domain events the rest of the business consumes.

Responsibilities
AreaDescription
Command handlingValidates and applies Create Product, Update Product and Delete Product.
ReadsServes Get Product directly from the product database.
Change captureRecords every product change to the outbox in the Product Database for the Product Search Publisher to publish.
PersistenceReads from and writes to the Product Database (system of record).
Specifications1
Upstream0

Nothing in the catalog sends it messages.

Downstream0

Nothing in the catalog consumes its output.

Product Search Publisher

v1.0.0
product-search-publisher

Reads product changes from the product database (outbox) and reliably publishes product-created, product-updated and product-deleted events for the Search System to consume.

Owned by Product Platform3 out · 0 in
Documentation

Overview

The Product Search Publisher is the bridge between the Product Catalog System and the rest of the business. It uses the transactional outbox pattern: the Product API records every product change in the Product Database, and this service reliably reads those changes and publishes them as Product Created, Product Updated and Product Deleted events.

This guarantees that product changes are never lost and are delivered to the Search System in order.

Responsibilities
AreaDescription
Outbox pollingReads unpublished product changes from the Product Database.
Reliable publishingPublishes Product Created, Product Updated and Product Deleted with at-least-once delivery.
OrderingPreserves per-product ordering of change events.

Product Worker

v1.0.0
product-worker

Background worker that handles long-running and asynchronous catalog work off the request path, such as enrichment, image processing and bulk imports.

Owned by Product Platform0 out · 0 in
Details
Language

Go

Documentation

Overview

The Product Worker keeps the Product API fast by taking slow or asynchronous work off the request path. It reads from and writes back to the Product Database, handling jobs like data enrichment, image processing and bulk catalog imports.

Responsibilities
AreaDescription
EnrichmentAugments product records with derived data after they are created or updated.
MediaProcesses and optimises product images asynchronously.
Bulk importsIngests large product feeds without blocking the API.
PersistenceReads from and writes to the Product Database.
Upstream0

Nothing in the catalog sends it messages.

Downstream0

Nothing in the catalog consumes its output.

Promotion Service

v1.0.0
promotion-service

Evaluates promotion rules and calculates the discount that applies to a cart. Receives discount requests and publishes the calculated result.

Owned by Shopping Platform1 out · 2 in
Documentation

Overview

The Promotion Service is the heart of the Promotion System. It receives Calculate Discount requests from the Cart System, evaluates the applicable rules from the Promotion Database, and publishes a Discount Calculated event with the result. It also consumes Loyalty Points Earned from the Customer domain to unlock loyalty-tier promotions.

Responsibilities
AreaDescription
Discount calculationHandles Calculate Discount and evaluates promotion rules.
Loyalty promotionsConsumes Loyalty Points Earned to unlock loyalty-tier promotions for the customer.
RulesReads promotion and discount rules from the Promotion Database.
Event publishingEmits Discount Calculated with the calculated result.

Rating Aggregator

v1.0.0
rating-aggregator

Keeps each product's aggregate star rating up to date as reviews are published, and serves it fast from a cache.

Owned by Reviews Platform1 out · 1 in
Documentation

Overview

The Rating Aggregator consumes Review Published and recomputes the affected product's aggregate rating (average score and review count). It writes the result to the Rating Cache for fast reads and publishes Rating Updated so other domains can stay in sync.

Responsibilities
AreaDescription
AggregationRecomputes average rating and review count per product.
CachingWrites aggregate ratings to the Rating Cache.
EventingPublishes Rating Updated on every change.
Messages1 out · 1 in
Downstream0

Nothing in the catalog consumes its output.

Returns API

v1.0.0
returns-api

Public API customers use to start a return. Validates the request against the original order and records it.

Owned by Fulfilment Platform1 out · 1 in
Details
Language

Java

Documentation

Overview

The Returns API receives Request Return from customers, stores the request in the Returns Database and publishes Return Requested for the Returns Processor.

Responsibilities
AreaDescription
IntakeHandles Request Return and validates the order and items.
PersistenceWrites new return requests to the Returns Database.
Event publishingEmits Return Requested.
Upstream0

Nothing in the catalog sends it messages.

Returns Processor

v1.0.0
returns-processor

Applies the returns policy to new requests and tracks returned parcels until they arrive back at the warehouse.

Owned by Fulfilment Platform2 out · 1 in
Details
Language

Java

Documentation

Overview

The Returns Processor consumes Return Requested, checks the returns window and item eligibility, and publishes Return Approved. When the warehouse scans the returned parcel it publishes Return Received, which Payments uses to refund the customer and Inventory uses to restock.

Responsibilities
AreaDescription
ApprovalApplies the returns policy and emits Return Approved.
ReceiptConfirms returned items arrived and emits Return Received.
PersistenceReads from and writes to the Returns Database.

Review API

v1.0.0
review-api

The public-facing API for product reviews. Accepts review submissions, serves published reviews, and is the entry point into the Reviews & Ratings domain.

Owned by Reviews Platform3 out · 4 in
Details
Language

TypeScript

Documentation

Overview

The Review API is the front door to the Reviews & Ratings domain. It validates incoming Submit Review commands, persists reviews to the Review Database, and publishes Review Submitted. It also serves Get Product Reviews, reading published reviews from the Review Database and aggregate ratings from the Rating Cache.

Responsibilities
AreaDescription
Command handlingValidates and applies Submit Review.
ReadsServes Get Product Reviews from the review database and rating cache.
EventingPublishes Review Submitted for moderation.
PersistenceWrites to the Review Database; reads from the Review Database and Rating Cache.

Review Moderation Worker

v1.0.0
review-moderation-worker

Asynchronous worker that screens submitted reviews for spam, abuse and policy violations, then publishes or rejects them.

Owned by Reviews Platform2 out · 2 in
Details
Language

TypeScript

Documentation

Overview

The Review Moderation Worker consumes Review Submitted (and Review Flagged for already-published reviews), screens each review (automated checks plus thresholds for manual review), and records the outcome on the Review Database. It then publishes either Review Published or Review Rejected.

Responsibilities
AreaDescription
ModerationScreens reviews for spam, abuse and policy violations.
OutcomePublishes Review Published or Review Rejected.
PersistenceRecords the moderation decision on the Review Database.

Search API

v1.0.0
search-api

Public-facing API that serves fast, relevant product search to the rest of the business, reading from the search index.

Owned by Search Platform0 out · 1 in
Details
Language

TypeScript

Specifications
Documentation

Overview

The Search API is the front door to the Search System. It answers Search Products queries by reading from the Search Index, which is kept current by the Search Indexer. Other teams use this API so they never have to query the catalog database directly.

Responsibilities
AreaDescription
SearchServes Search Products with full-text matching, filtering and pagination.
ReadsQueries the Search Index — never the catalog database.
Specifications1
Messages0 out · 1 in
Upstream0

Nothing in the catalog sends it messages.

Downstream0

Nothing in the catalog consumes its output.

Data1 stores

Search Indexer

v1.0.0
search-indexer

Consumes product change events from the Product Catalog System and keeps the search index up to date so products are discoverable.

Owned by Search Platform0 out · 3 in
Details
Language

Go

Documentation

Overview

The Search Indexer is how the Search System stays in sync with the catalog. It subscribes to Product Created, Product Updated and Product Deleted events published by the Product Catalog System and applies each change to the Search Index.

Responsibilities
EventAction
Product CreatedAdd the new product to the Search Index.
Product UpdatedRe-index the changed product.
Product DeletedRemove the product from the index.

Shipping API

v1.0.0
shipping-api

Receives ready-for-shipping orders, selects a carrier, and kicks off shipment creation.

Owned by Fulfilment Platform0 out · 1 in
Details
Language

TypeScript

Documentation

Overview

The Shipping API is the entry point to the Shipping System. It consumes Order Ready For Shipping from the Warehouse System, selects an appropriate carrier, and hands off to the Carrier Adapter to create the shipment.

Messages0 out · 1 in
Downstream0

Nothing in the catalog consumes its output.

Shipping API

v1.0.0
carrier-shipping-api

The carrier's API for creating shipments. Acme Inc's Shipping System calls it to dispatch packed orders.

Owned by Fulfilment Platform0 out · 1 in
Details
Language

External

Documentation

Overview

The Shipping API is the carrier's external interface for creating shipments. The Shipping System sends Create Shipment, and the carrier dispatches the parcel and begins reporting progress through its Tracking API.

Messages0 out · 1 in
Downstream0

Nothing in the catalog consumes its output.

Tracking API

v1.0.0
carrier-tracking-api

The carrier's API for reporting delivery progress. It notifies Acme Inc when a shipment is created, delivered, or fails.

Owned by Fulfilment Platform3 out · 0 in
Details
Language

External

Documentation

Overview

The Tracking API is how the carrier reports delivery progress back to Acme Inc. After a shipment is created via the Shipping API, it emits Shipment Created, then Shipment Delivered on success or Shipment Failed if delivery cannot be completed.

Upstream0

Nothing in the catalog sends it messages.

Warehouse Service

v1.0.0
warehouse-service

Orchestrates picking and packing in the warehouse. It reacts to completed orders, creates picking jobs, and signals when an order is ready to ship.

Owned by Fulfilment Platform1 out · 1 in
Details
Language

Java

Documentation

Overview

The Warehouse Service runs warehousing. When the Ordering domain publishes Order Completed, it creates a picking job in the Warehouse Database for the Picking Worker to work through. Once the order is packed it publishes Order Ready For Shipping for the Shipping System.

Webhook Endpoint

v1.0.0
stripe-webhook-endpoint

Stripe's webhook delivery for payment and refund outcomes. It notifies Acme Inc whether a charge succeeded or failed, and when a refund is processed.

Owned by Payments Platform3 out · 0 in
Details
Language

External

Documentation

Overview

The Webhook Endpoint is how Stripe reports outcomes back to Acme Inc. After processing a request from the Payments API, it delivers Payment Succeeded, Payment Failed or Refund Processed to the Payment Processing System.

Events

Facts that happened. Published once, read by any number of consumers.

Event/Shopping

Cart Checked Out

EVTv1.0.0Broker:Kafka
cart-checked-out

Published when a customer has checked out their cart.

Owned by Shopping Platform9 attributes
Attributes

Emitted when a customer checks out their cart

eventIdstring uuidRequired
occurredAtstring date-timeRequired
cartIdstring uuidRequired
customerIdstring uuidRequired
itemsarray of objectRequired
subtotalinteger

Total before discounts, in minor units (e.g. cents)

discountinteger

Total discount applied, in minor units (e.g. cents)

totalintegerRequired

Final total, in minor units (e.g. cents)

currencystringRequired
Pattern ^[A-Z]{3}$
Documentation

Overview

CartCheckedOut is published by the Cart API when a customer checks out. Downstream systems consume this event to create an order, take payment, and begin fulfilment.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "eventId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "occurredAt": "2026-01-01T12:00:00Z",
  "cartId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "items": [
    {
      "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
      "quantity": 1,
      "unitPrice": 0
    }
  ],
  "subtotal": 0,
  "discount": 0,
  "total": 0,
  "currency": "string"
}
Event/Customer

Customer Authenticated

EVTv1.0.0Broker:Kafka
customer-authenticated

Published when a customer has successfully authenticated.

Owned by Customer Platform5 attributes
Attributes

Emitted when a customer successfully authenticates

eventIdstring uuidRequired

Unique identifier for this event

occurredAtstring date-timeRequired

Time the customer authenticated

customerIdstring uuidRequired

Unique identifier of the customer that authenticated

methodstringRequired

How the customer authenticated

PASSWORDSSOMFA
ipAddressstring

IP address the sign-in came from

Documentation

Overview

CustomerAuthenticated is published by the OAuth API whenever a customer successfully signs in. Other systems consume this event for auditing, session tracking, and security monitoring.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "eventId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "occurredAt": "2026-01-01T12:00:00Z",
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "method": "PASSWORD",
  "ipAddress": "string"
}

Customer Notified

EVTv1.0.0Broker:Kafka
customer-notified

Published after a notification has been sent to a customer on one of their preferred channels.

Owned by Customer Platform6 attributes
Attributes

Published after a notification has been sent to a customer

notificationIdstring uuidRequired
customerIdstring uuidRequired
channelstringRequired
emailsmspush
templatestringRequired

Template key, e.g. order-confirmed

sourceEventstring

Name of the event that triggered the notification

sentAtstring date-timeRequired
Documentation

Overview

CustomerNotified is published by the Notification Service each time it delivers a notification. It gives support and analytics an audit trail of what each customer was told, when, and on which channel.

Consumed by0

Nothing in the catalog.

{
  "notificationId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "channel": "email",
  "template": "string",
  "sourceEvent": "string",
  "sentAt": "2026-01-01T12:00:00Z"
}
Event/Customer

Customer Registered

EVTv1.0.0Broker:Kafka
customer-registered

Published when a new customer has registered.

Owned by Customer Platform3 attributes
Attributes

Emitted when a new customer registers

eventIdstring uuidRequired

Unique identifier for this event

occurredAtstring date-timeRequired

Time the customer registered

customerobjectRequired

The customer that registered

Documentation

Overview

CustomerRegistered is published by the Customer API whenever a new customer successfully registers. Downstream systems consume this event to onboard the customer.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "eventId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "occurredAt": "2026-01-01T12:00:00Z",
  "customer": {
    "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
    "email": "jane@example.com",
    "name": "string",
    "status": "ACTIVE"
  }
}
Event/Customer

Customer Updated

EVTv1.0.0Broker:Kafka
customer-updated

Published when an existing customer's profile has changed.

Owned by Customer Platform4 attributes
Attributes

Emitted when an existing customer's profile changes

eventIdstring uuidRequired

Unique identifier for this event

occurredAtstring date-timeRequired

Time the customer was updated

customerIdstring uuidRequired

Unique identifier for the customer that changed

changesobjectRequired

The fields that changed and their new values

Documentation

Overview

CustomerUpdated is published by the Customer API whenever an existing customer's profile changes. Downstream systems consume this event to keep their copy of customer data in sync.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "eventId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "occurredAt": "2026-01-01T12:00:00Z",
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "changes": {
    "email": "jane@example.com",
    "name": "string",
    "status": "ACTIVE"
  }
}
Event/Shopping

Discount Calculated

EVTv1.0.0Broker:Kafka
discount-calculated

Published when a discount has been calculated for a cart.

Owned by Shopping Platform6 attributes
Attributes

Emitted when a discount has been calculated for a cart

eventIdstring uuidRequired
occurredAtstring date-timeRequired
cartIdstring uuidRequired
discountintegerRequired

Total discount applied, in minor units (e.g. cents)

Minimum 0
currencystringRequired
Pattern ^[A-Z]{3}$
appliedPromotionsarray of string

Identifiers of the promotions that were applied

Documentation

Overview

DiscountCalculated is published by the Promotion Service after evaluating the promotion rules for a cart. The Cart System uses the result to price the cart, and other systems can consume it for analytics.

Consumed by0

Nothing in the catalog.

{
  "eventId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "occurredAt": "2026-01-01T12:00:00Z",
  "cartId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "discount": 0,
  "currency": "string",
  "appliedPromotions": [
    "string"
  ]
}
Event/Payments

Fraud Check Failed

EVTv1.0.0Broker:Kafka
fraud-check-failed

Published when a payment fails fraud screening.

Owned by Payments Platform5 attributes
Attributes

Published when a payment fails fraud screening

paymentIdstring uuidRequired
orderIdstring uuidRequired
scorenumber

Fraud risk score; higher is riskier

Minimum 0Maximum 1
reasonstringRequired
HIGH_RISK_SCOREBLOCKLISTEDVELOCITYMISMATCH
checkedAtstring date-timeRequired
Documentation

Overview

FraudCheckFailed is published by the Fraud API when a payment is flagged as fraudulent. The Payment Processing System uses it to block the charge and cancel the order.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "paymentId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "score": 0,
  "reason": "HIGH_RISK_SCORE",
  "checkedAt": "2026-01-01T12:00:00Z"
}
Event/Payments

Fraud Check Passed

EVTv1.0.0Broker:Kafka
fraud-check-passed

Published when a payment passes fraud screening.

Owned by Payments Platform4 attributes
Attributes

Published when a payment passes fraud screening

paymentIdstring uuidRequired
orderIdstring uuidRequired
scorenumber

Fraud risk score; lower is safer

Minimum 0Maximum 1
checkedAtstring date-timeRequired
Documentation

Overview

FraudCheckPassed is published by the Fraud API when a payment clears fraud screening. The Payment Processing System uses it to allow the charge to proceed.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "paymentId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "score": 0,
  "checkedAt": "2026-01-01T12:00:00Z"
}

Inventory Reserved

EVTv1.0.0Broker:Kafka
inventory-reserved

Published when stock has been successfully reserved for an order.

Owned by Fulfilment Platform5 attributes
Attributes

Published when stock has been successfully reserved for an order

reservationIdstring uuidRequired
orderIdstring uuid
cartIdstring uuid
itemsarray of objectRequired
reservedAtstring date-timeRequired
Documentation

Overview

InventoryReserved is published by the Inventory Service when stock for an order has been successfully reserved. The Ordering domain's checkout saga relies on this to continue placing the order.

Consumed by0

Nothing in the catalog.

{
  "reservationId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "cartId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "items": [
    {
      "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
      "quantity": 1
    }
  ],
  "reservedAt": "2026-01-01T12:00:00Z"
}

Inventory Unavailable

EVTv1.0.0Broker:Kafka
inventory-unavailable

Published when stock could not be reserved for an order.

Owned by Fulfilment Platform4 attributes
Attributes

Published when stock could not be reserved for an order

orderIdstring uuid
cartIdstring uuid
unavailableItemsarray of objectRequired
checkedAtstring date-timeRequired
Documentation

Overview

InventoryUnavailable is published by the Inventory Service when stock for an order cannot be reserved. The Ordering domain's checkout saga uses it to fail checkout and cancel the order.

Consumed by0

Nothing in the catalog.

{
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "cartId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "unavailableItems": [
    {
      "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
      "requested": 1,
      "available": 0
    }
  ],
  "checkedAt": "2026-01-01T12:00:00Z"
}
Event/Loyalty

Loyalty Points Earned

EVTv1.0.0Broker:Kafka
loyalty-points-earned

Published when a customer earns loyalty points for a completed order.

Owned by Customer Platform6 attributes
Attributes

Published when a customer earns loyalty points for a completed order

customerIdstring uuidRequired
orderIdstring uuidRequired
pointsEarnedintegerRequired
Minimum 1
newBalanceintegerRequired
Minimum 0
tierstring
bronzesilvergold
earnedAtstring date-timeRequired
Documentation

Overview

LoyaltyPointsEarned is published by the Loyalty Service after it awards points for an Order Completed. The Shopping domain uses it to unlock loyalty promotions, and Customer Notifications tells the customer about their new balance.

Produced by1
{
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "pointsEarned": 1,
  "newBalance": 0,
  "tier": "bronze",
  "earnedAt": "2026-01-01T12:00:00Z"
}
Event/Loyalty

Loyalty Points Reversed

EVTv1.0.0Broker:Kafka
loyalty-points-reversed

Published when loyalty points are removed from a customer because the order that earned them was cancelled.

Owned by Customer Platform6 attributes
Attributes

Published when loyalty points are reversed for a cancelled order

customerIdstring uuidRequired
orderIdstring uuidRequired
pointsReversedintegerRequired
Minimum 1
newBalanceintegerRequired
Minimum 0
reasonstring
order_cancelledorder_refunded
reversedAtstring date-timeRequired
Documentation

Overview

LoyaltyPointsReversed is published by the Loyalty Service when it handles an Order Cancelled for an order that had already earned points. It keeps downstream balances and promotions consistent with the points ledger.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "pointsReversed": 1,
  "newBalance": 0,
  "reason": "order_cancelled",
  "reversedAt": "2026-01-01T12:00:00Z"
}
Event/Ordering

Order Amended

EVTv1.0.0Broker:Kafka
order-amended

Published when an accepted order is changed before fulfilment begins.

Owned by Ordering Platform9 attributes
Attributes

Published when an accepted order is amended

orderIdstring uuidRequired
revisionintegerRequired
Minimum 2
changedFieldsarray of stringRequired
Min items 1Unique items
itemsdeliveryAddressdeliveryMethodpromotionCode
previousTotalintegerRequired
Minimum 0
newTotalintegerRequired
Minimum 0
currencystringRequired
Pattern ^[A-Z]{3}$
amendedBystringRequired

Customer, support agent, or automated policy identifier

reasonstring
Max length 250
amendedAtstring date-timeRequired
Documentation

Overview

OrderAmended records an approved change to an order, such as a quantity adjustment, delivery method change, or promotional correction. Consumers use the revision and changed fields to update projections without rebuilding the full order history.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "orderId": "7e86e1d8-cd5f-4d6f-ae8e-bdc5ed3a0d13",
  "revision": 2,
  "changedFields": [
    "items",
    "promotionCode"
  ],
  "previousTotal": 12999,
  "newTotal": 11999,
  "currency": "GBP",
  "amendedBy": "support-agent:maya.chen",
  "reason": "Removed duplicate accessory and applied verified welcome offer",
  "amendedAt": "2026-07-29T09:48:03Z"
}
Event/Ordering

Order Archived

EVTv1.0.0Broker:Kafka
order-archived

Published when a terminal order is moved from operational storage to the long-term archive.

Owned by Ordering Platform7 attributes
Attributes

Published when a terminal order is moved to long-term storage

orderIdstring uuidRequired
terminalStatusstringRequired
COMPLETEDCANCELLED
retentionCategorystringRequired
STANDARDFINANCIAL_RECORDLEGAL_HOLD
archiveReferencestringRequired
recordChecksumstringRequired
Pattern ^[a-f0-9]{64}$
terminalAtstring date-timeRequired
archivedAtstring date-timeRequired
Documentation

Overview

OrderArchived marks the end of the operational retention period for a completed or cancelled order. Reporting, compliance, and support systems use the archive reference to locate historical data after it leaves the primary order database.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "orderId": "7e86e1d8-cd5f-4d6f-ae8e-bdc5ed3a0d13",
  "terminalStatus": "COMPLETED",
  "retentionCategory": "FINANCIAL_RECORD",
  "archiveReference": "orders/2026/07/7e86e1d8-cd5f-4d6f-ae8e-bdc5ed3a0d13.json",
  "recordChecksum": "a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447",
  "terminalAt": "2026-08-01T14:22:09Z",
  "archivedAt": "2033-08-01T02:15:00Z"
}
Event/Ordering

Order Cancelled

EVTv1.0.0Broker:Kafka
order-cancelled

Published when an order has been cancelled.

Owned by Ordering Platform4 attributes
Attributes

Published when an order has been cancelled

orderIdstring uuidRequired
customerIdstring uuid
reasonstringRequired
CUSTOMER_REQUESTEDPAYMENT_FAILEDOUT_OF_STOCKFRAUD
cancelledAtstring date-timeRequired
Documentation

Overview

OrderCancelled is published by the Order Service when an order is cancelled — whether at the customer's request or because a downstream step (payment, inventory) failed. Downstream systems consume it to release inventory, refund or void payment, and stop fulfilment.

Produced by1
{
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "reason": "CUSTOMER_REQUESTED",
  "cancelledAt": "2026-01-01T12:00:00Z"
}
Event/Ordering

Order Completed

EVTv1.0.0Broker:Kafka
order-completed

Published when an order has been fulfilled and completed.

Owned by Ordering Platform3 attributes
Attributes

Published when an order has been fulfilled and completed

orderIdstring uuidRequired
customerIdstring uuidRequired
completedAtstring date-timeRequired
Documentation

Overview

OrderCompleted is published by the Order Service when an order has been fully fulfilled. It marks the end of the happy path for an order. Downstream systems consume it to close out fulfilment, capture payment, and update reporting.

Produced by1
{
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "completedAt": "2026-01-01T12:00:00Z"
}
Event/Ordering

Order Confirmed

EVTv1.0.0Broker:Kafka
order-confirmed

Published when payment, inventory, and order validation have succeeded and the order is ready for fulfilment.

Owned by Ordering Platform8 attributes
Attributes

Published when an order is confirmed and ready for fulfilment

orderIdstring uuidRequired
customerIdstring uuidRequired
confirmationNumberstringRequired
Pattern ^ORD-[0-9]{8}$
paymentAuthorizationIdstring
inventoryReservationIdstring
totalintegerRequired

Confirmed total in minor units

Minimum 0
currencystringRequired
Pattern ^[A-Z]{3}$
confirmedAtstring date-timeRequired
Documentation

Overview

OrderConfirmed is published by the Order Service once an order has passed validation and its payment and inventory reservations are secured. Fulfilment, customer notification, and analytics consumers use this as the reliable signal that the order can progress.

Produced by1
{
  "orderId": "7e86e1d8-cd5f-4d6f-ae8e-bdc5ed3a0d13",
  "customerId": "5d1db561-4ce3-4f92-956a-b787c2f55342",
  "confirmationNumber": "ORD-10428371",
  "paymentAuthorizationId": "pa_9f38c0f0",
  "inventoryReservationId": "res_48721",
  "total": 12999,
  "currency": "GBP",
  "confirmedAt": "2026-07-29T09:42:18Z"
}
Event/Ordering

Order Created

EVTv1.0.0Broker:Kafka
order-created

Published when a new order has been created.

Owned by Ordering Platform7 attributes
Attributes

Published when a new order has been created

orderIdstring uuidRequired
customerIdstring uuidRequired
totalintegerRequired

Order total in minor units (e.g. cents)

currencystringRequired
Pattern ^[A-Z]{3}$
statusstringRequired

Initial lifecycle status for the order

created
itemsarray of objectRequired

Line items captured at order creation time

createdAtstring date-timeRequired
Documentation

Overview

OrderCreated is published by the Order Service when a new order is created from a checked-out cart. Downstream systems consume this event to begin fulfilment, send confirmation to the customer, and update reporting.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "total": 0,
  "currency": "string",
  "status": "created",
  "items": [
    {
      "sku": "string",
      "quantity": 1,
      "unitPrice": 0
    }
  ],
  "createdAt": "2026-01-01T12:00:00Z"
}
Event/Ordering

Order Delivery Address Changed

EVTv1.0.0Broker:Kafka
order-delivery-address-changed

Published when the validated delivery address changes before dispatch.

Owned by Ordering Platform6 attributes
Attributes

Published when the validated delivery address for an order changes

orderIdstring uuidRequired
addressRevisionintegerRequired
Minimum 2
previousPostalCodestringRequired
deliveryAddressobjectRequired
changedBystringRequired
changedAtstring date-timeRequired
Documentation

Overview

OrderDeliveryAddressChanged provides fulfilment and carrier integrations with the latest validated delivery destination. The previous postal code and revision make stale updates detectable without exposing unnecessary customer details.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "orderId": "7e86e1d8-cd5f-4d6f-ae8e-bdc5ed3a0d13",
  "addressRevision": 2,
  "previousPostalCode": "SW1A 1AA",
  "deliveryAddress": {
    "recipientName": "Alex Morgan",
    "line1": "18 Market Street",
    "line2": "Apartment 4B",
    "city": "London",
    "postalCode": "E1 6AN",
    "countryCode": "GB"
  },
  "changedBy": "customer:5d1db561-4ce3-4f92-956a-b787c2f55342",
  "changedAt": "2026-07-29T09:46:41Z"
}
Event/Ordering

Order Fulfilment Started

EVTv1.0.0Broker:Kafka
order-fulfilment-started

Published when an order is released to a fulfilment location for picking and packing.

Owned by Ordering Platform8 attributes
Attributes

Published when an order is released for picking and packing

orderIdstring uuidRequired
fulfilmentIdstring uuidRequired
warehouseIdstringRequired
itemCountintegerRequired
Minimum 1
prioritystringRequired
STANDARDEXPEDITEDSAME_DAY
deliveryMethodstringRequired
HOME_DELIVERYCLICK_AND_COLLECT
estimatedDispatchAtstring date-time
startedAtstring date-timeRequired
Documentation

Overview

OrderFulfilmentStarted marks the handoff from order management to warehouse execution. Customer communications use it to update delivery expectations, while analytics consumers measure the time from confirmation to operational fulfilment.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "orderId": "7e86e1d8-cd5f-4d6f-ae8e-bdc5ed3a0d13",
  "fulfilmentId": "65c36d91-fe6c-4ea1-bc4c-95e73afece2b",
  "warehouseId": "wh-london-02",
  "itemCount": 3,
  "priority": "EXPEDITED",
  "deliveryMethod": "HOME_DELIVERY",
  "estimatedDispatchAt": "2026-07-29T16:30:00Z",
  "startedAt": "2026-07-29T10:06:12Z"
}
Event/Ordering

Order Hold Released

EVTv1.0.0Broker:Kafka
order-hold-released

Published when an operational hold is resolved and the order can continue.

Owned by Ordering Platform7 attributes
Attributes

Published when an operational hold on an order is released

orderIdstring uuidRequired
holdIdstring uuidRequired
previousReasonstringRequired
PAYMENT_REVIEWFRAUD_REVIEWADDRESS_VERIFICATIONINVENTORY_RECHECK
resolutionstringRequired
Max length 250
releasedBystringRequired
nextStatusstringRequired
CONFIRMEDAWAITING_FULFILMENT
releasedAtstring date-timeRequired
Documentation

Overview

OrderHoldReleased resumes processing after the concern represented by an order hold has been resolved. The event correlates to the original hold and records the resolution for support, audit, and fulfilment consumers.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "orderId": "7e86e1d8-cd5f-4d6f-ae8e-bdc5ed3a0d13",
  "holdId": "49c81188-c99a-4af4-97c9-2e9516bba8f7",
  "previousReason": "ADDRESS_VERIFICATION",
  "resolution": "Postal address matched the carrier validation service",
  "releasedBy": "address-verification-policy:v3",
  "nextStatus": "AWAITING_FULFILMENT",
  "releasedAt": "2026-07-29T10:04:51Z"
}

Order Packed

EVTv1.0.0Broker:Kafka
order-packed

Published when an order has been picked and packed in the warehouse.

Owned by Fulfilment Platform4 attributes
Attributes

Published when an order has been picked and packed in the warehouse

orderIdstring uuidRequired
pickingJobIdstring uuid
parcelCountinteger
Minimum 1
packedAtstring date-timeRequired
Documentation

Overview

OrderPacked is published by the Picking Worker when an order has been fully picked and packed. The Warehouse Service consumes it to mark the order ready and publish Order Ready For Shipping.

Produced by1
{
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "pickingJobId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "parcelCount": 1,
  "packedAt": "2026-01-01T12:00:00Z"
}
Event/Ordering

Order Placed On Hold

EVTv1.0.0Broker:Kafka
order-placed-on-hold

Published when order progression is paused for a review or dependency check.

Owned by Ordering Platform7 attributes
Attributes

Published when an order is paused for operational review

orderIdstring uuidRequired
holdIdstring uuidRequired
reasonstringRequired
PAYMENT_REVIEWFRAUD_REVIEWADDRESS_VERIFICATIONINVENTORY_RECHECK
ownerTeamstringRequired
customerMessagestring
Max length 280
reviewBystring date-timeRequired
placedAtstring date-timeRequired
Documentation

Overview

OrderPlacedOnHold tells fulfilment and customer-facing systems to pause work while a payment, fraud, address, or inventory concern is reviewed. It includes the owning team and review deadline so operational tooling can route and escalate the hold.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "orderId": "7e86e1d8-cd5f-4d6f-ae8e-bdc5ed3a0d13",
  "holdId": "49c81188-c99a-4af4-97c9-2e9516bba8f7",
  "reason": "ADDRESS_VERIFICATION",
  "ownerTeam": "ordering-operations",
  "customerMessage": "We are confirming one detail of your delivery address. No action is required yet.",
  "reviewBy": "2026-07-29T11:00:00Z",
  "placedAt": "2026-07-29T09:51:26Z"
}

Order Ready For Shipping

EVTv1.0.0Broker:Kafka
order-ready-for-shipping

Published when a packed order is ready to be handed to a carrier for shipping.

Owned by Fulfilment Platform5 attributes
Attributes

Published when a packed order is ready to be handed to a carrier

orderIdstring uuidRequired
customerIdstring uuid
parcelCountinteger
Minimum 1
shippingAddressobjectRequired
readyAtstring date-timeRequired
Documentation

Overview

OrderReadyForShipping is published by the Warehouse Service once an order has been packed. The Shipping System consumes it to create a shipment with a carrier.

Consumed by1
{
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "parcelCount": 1,
  "shippingAddress": {
    "line1": "string",
    "city": "string",
    "postcode": "string",
    "country": "string"
  },
  "readyAt": "2026-01-01T12:00:00Z"
}
Event/Ordering

Order Status Changed

EVTv1.0.0Broker:Kafka
order-status-changed

Published for every accepted transition in the order lifecycle state machine.

Owned by Ordering Platform7 attributes
Attributes

Published for every accepted order lifecycle transition

orderIdstring uuidRequired
previousStatusstringRequired
CREATEDCONFIRMEDON_HOLDAWAITING_FULFILMENTFULFILLINGCOMPLETEDCANCELLED
newStatusstringRequired
CONFIRMEDON_HOLDAWAITING_FULFILMENTFULFILLINGCOMPLETEDCANCELLEDARCHIVED
sequenceintegerRequired

Monotonic transition number for the order

Minimum 1
changeReasonstring
Max length 250
correlationIdstring uuid
changedAtstring date-timeRequired
Documentation

Overview

OrderStatusChanged is the canonical state-transition event for projections and operational timelines. More specific business events remain the preferred integration points, while this event supports generic history, search, support, and analytics use cases.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "orderId": "7e86e1d8-cd5f-4d6f-ae8e-bdc5ed3a0d13",
  "previousStatus": "AWAITING_FULFILMENT",
  "newStatus": "FULFILLING",
  "sequence": 5,
  "changeReason": "Released to warehouse wh-london-02",
  "correlationId": "896f860b-aea5-4b98-91c5-ef4d188778dd",
  "changedAt": "2026-07-29T10:06:12Z"
}
Event/Payments

Payment Failed

EVTv1.0.0Broker:Kafka
payment-failed

Published by Stripe when a charge fails.

Owned by Payments Platform4 attributes
Attributes

Published when a charge fails

paymentIdstring uuidRequired
orderIdstring uuidRequired
reasonstringRequired
CARD_DECLINEDINSUFFICIENT_FUNDSEXPIRED_CARDPROCESSING_ERROR
failedAtstring date-timeRequired
Documentation

Overview

PaymentFailed is delivered by Stripe's Webhook Endpoint when a requested charge fails — for example a declined card. The Payment Worker consumes it and records the payment as failed, which ultimately leads the order to be cancelled.

{
  "paymentId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "reason": "CARD_DECLINED",
  "failedAt": "2026-01-01T12:00:00Z"
}
Event/Payments

Payment Requested

EVTv1.0.0Broker:Kafka
payment-requested

Published when the Payment Processing System requests a charge from the payment processor.

Owned by Payments Platform6 attributes
Attributes

Published when a charge is requested from the payment processor

paymentIdstring uuidRequired
orderIdstring uuidRequired
payeroneOfRequired

The user or customer account responsible for the payment

One of 2 options
Authenticated user
Customer account
amountintegerRequired

Amount to charge, in minor units (e.g. cents)

Minimum 0
currencystringRequired
Pattern ^[A-Z]{3}$
requestedAtstring date-timeRequired
Documentation

Overview

PaymentRequested is published by the Payment Worker to ask the external Stripe to charge a customer for an order. Stripe responds with Payment Succeeded or Payment Failed. The Fraud Detection system also consumes this event to screen the payment.

Produced by1
{
  "paymentId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "payer": {
    "userId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
    "email": "jane@example.com"
  },
  "amount": 0,
  "currency": "string",
  "requestedAt": "2026-01-01T12:00:00Z"
}
Event/Payments

Payment Succeeded

EVTv1.0.0Broker:Kafka
payment-succeeded

Published by Stripe when a charge succeeds.

Owned by Payments Platform6 attributes
Attributes

Published when a charge succeeds

paymentIdstring uuidRequired
orderIdstring uuidRequired
amountintegerRequired

Amount charged, in minor units (e.g. cents)

currencystringRequired
Pattern ^[A-Z]{3}$
processorReferencestring

Stripe's charge identifier

succeededAtstring date-timeRequired
Documentation

Overview

PaymentSucceeded is delivered by Stripe's Webhook Endpoint when a requested charge succeeds. The Payment Worker consumes it and records the payment as succeeded.

Consumed by1
{
  "paymentId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "amount": 0,
  "currency": "string",
  "processorReference": "string",
  "succeededAt": "2026-01-01T12:00:00Z"
}
Event/Catalog

Product Created

EVTv1.0.0Broker:Kafka
product-created

Published when a new product has been added to the catalog.

Owned by Product Platform3 attributes
Attributes

Emitted when a new product is added to the catalog

eventIdstring uuidRequired

Unique identifier for this event

occurredAtstring date-timeRequired

Time the product was created

productobjectRequired

The product that was created

Documentation

Overview

ProductCreated is published by the Product Search Publisher whenever a new product is successfully added to the catalog by the Product API. The Search System consumes this event to index the new product so it becomes discoverable.

Consumed by1
{
  "eventId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "occurredAt": "2026-01-01T12:00:00Z",
  "product": {
    "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
    "sku": "string",
    "name": "string",
    "description": "string",
    "price": 0,
    "currency": "string",
    "category": "string",
    "status": "DRAFT"
  }
}
Event/Catalog

Product Deleted

EVTv1.0.0Broker:Kafka
product-deleted

Published when a product has been removed from the catalog.

Owned by Product Platform4 attributes
Attributes

Emitted when a product is removed from the catalog

eventIdstring uuidRequired

Unique identifier for this event

occurredAtstring date-timeRequired

Time the product was deleted

productIdstring uuidRequired

Unique identifier for the product that was deleted

reasonstring

Optional reason the product was removed

DISCONTINUEDDUPLICATEMERCHANT_REQUESTOTHER
Documentation

Overview

ProductDeleted is published by the Product Search Publisher when a product is removed from the catalog via the Product API. The Search System consumes this event to remove the product from the search index.

Consumed by1
{
  "eventId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "occurredAt": "2026-01-01T12:00:00Z",
  "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "reason": "DISCONTINUED"
}
Event/Catalog

Product Updated

EVTv1.0.0Broker:Kafka
product-updated

Published when an existing product's data has changed.

Owned by Product Platform4 attributes
Attributes

Emitted when an existing product's data changes

eventIdstring uuidRequired

Unique identifier for this event

occurredAtstring date-timeRequired

Time the product was updated

productIdstring uuidRequired

Unique identifier for the product that changed

changesobjectRequired

The fields that changed and their new values

Documentation

Overview

ProductUpdated is published by the Product Search Publisher whenever an existing product is changed via the Product API. The Search System consumes this event to re-index the product so search results stay accurate.

Consumed by1
{
  "eventId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "occurredAt": "2026-01-01T12:00:00Z",
  "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "changes": {
    "name": "string",
    "description": "string",
    "price": 0,
    "currency": "string",
    "category": "string",
    "status": "DRAFT"
  }
}

Rating Updated

EVTv1.0.0Broker:Kafka
rating-updated

Published when a product's aggregate rating changes as a result of a newly published review.

Owned by Reviews Platform4 attributes
Attributes
productIdstringRequired
averageRatingnumberRequired
Minimum 0Maximum 5
reviewCountintegerRequired
Minimum 0
updatedAtstring date-timeRequired
Documentation

Overview

RatingUpdated is published by the Rating Aggregator whenever a product's aggregate rating changes. Other domains (such as the storefront and search) can consume it to keep displayed ratings fresh.

Consumed by0

Nothing in the catalog.

{
  "productId": "string",
  "averageRating": 0,
  "reviewCount": 0,
  "updatedAt": "2026-01-01T12:00:00Z"
}
Event/Payments

Refund Processed

EVTv1.0.0Broker:Kafka
refund-processed

Published by Stripe when a refund has been processed.

Owned by Payments Platform5 attributes
Attributes

Published when a refund has been processed

refundIdstring uuidRequired
paymentIdstring uuidRequired
amountintegerRequired

Amount refunded, in minor units (e.g. cents)

currencystringRequired
Pattern ^[A-Z]{3}$
processedAtstring date-timeRequired
Documentation

Overview

RefundProcessed is delivered by Stripe's Webhook Endpoint when a requested refund has been processed. The Payment Worker consumes it and records the refund as complete.

{
  "refundId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "paymentId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "amount": 0,
  "currency": "string",
  "processedAt": "2026-01-01T12:00:00Z"
}
Event/Payments

Refund Requested

EVTv1.0.0Broker:Kafka
refund-requested

Published when the Payment Processing System requests a refund from the payment processor.

Owned by Payments Platform7 attributes
Attributes

Published when a refund is requested from the payment processor

refundIdstring uuidRequired
paymentIdstring uuidRequired
orderIdstring uuid
amountintegerRequired

Amount to refund, in minor units (e.g. cents)

Minimum 0
currencystringRequired
Pattern ^[A-Z]{3}$
reasonstring
requestedAtstring date-timeRequired
Documentation

Overview

RefundRequested is published by the Payment Worker to ask the external Stripe to refund a previous charge — for example when an order is cancelled after payment. Stripe responds with Refund Processed.

Produced by1
Consumed by1
{
  "refundId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "paymentId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "amount": 0,
  "currency": "string",
  "reason": "string",
  "requestedAt": "2026-01-01T12:00:00Z"
}
Event/Returns

Return Approved

EVTv1.0.0Broker:Kafka
return-approved

Published when a return request passes the returns policy and the customer can send the items back.

Owned by Fulfilment Platform6 attributes
Attributes

Published when a return request has been approved

returnIdstring uuidRequired
orderIdstring uuidRequired
customerIdstring uuidRequired
returnLabelUrlstring uri
returnBystring date
approvedAtstring date-timeRequired
Documentation

Overview

ReturnApproved is published by the Returns Processor once a Return Requested passes policy checks. The Notification Service uses it to send the customer a return label and drop-off instructions.

{
  "returnId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "returnLabelUrl": "https://example.com",
  "returnBy": "2026-01-01",
  "approvedAt": "2026-01-01T12:00:00Z"
}
Event/Returns

Return Received

EVTv1.0.0Broker:Kafka
return-received

Published when returned items have arrived at the warehouse and been inspected.

Owned by Fulfilment Platform6 attributes
Attributes

Published when returned items have arrived at the warehouse

returnIdstring uuidRequired
orderIdstring uuidRequired
itemsarray of objectRequired
refundAmountnumberRequired
Minimum 0
currencystringRequired
Min length 3Max length 3
receivedAtstring date-timeRequired
Documentation

Overview

ReturnReceived is published by the Returns Processor when a returned parcel is scanned in at the warehouse. The Payment Worker refunds the customer and the Inventory Service restocks resellable items.

{
  "returnId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "items": [
    {
      "sku": "string",
      "quantity": 1,
      "condition": "resellable"
    }
  ],
  "refundAmount": 0,
  "currency": "string",
  "receivedAt": "2026-01-01T12:00:00Z"
}
Event/Returns

Return Requested

EVTv1.0.0Broker:Kafka
return-requested

Published when a customer has requested to return items from an order.

Owned by Fulfilment Platform6 attributes
Attributes

Published when a customer has requested a return

returnIdstring uuidRequired
orderIdstring uuidRequired
customerIdstring uuidRequired
itemsarray of objectRequired
reasonstring
requestedAtstring date-timeRequired
Documentation

Overview

ReturnRequested is published by the Returns API after it accepts a Request Return. The Returns Processor consumes it to apply the returns policy.

Produced by1
{
  "returnId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "items": [
    {
      "sku": "string",
      "quantity": 1
    }
  ],
  "reason": "string",
  "requestedAt": "2026-01-01T12:00:00Z"
}

Review Flagged

EVTv1.0.0Broker:Kafka
review-flagged

Published when a published review is flagged and needs to be screened again.

Owned by Reviews Platform5 attributes
Attributes
reviewIdstring uuidRequired
productIdstringRequired
reasonstringRequired
spamabuseoff_topicinappropriateother
flagCountinteger

Total flags this review has now received.

Minimum 1
flaggedAtstring date-timeRequired
Documentation

Overview

ReviewFlagged is published by the Review API when a published review is flagged. The Review Moderation Worker consumes it and re-screens the review, which may lead to it being rejected.

{
  "reviewId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "productId": "string",
  "reason": "spam",
  "flagCount": 1,
  "flaggedAt": "2026-01-01T12:00:00Z"
}

Review Helpful Voted

EVTv1.0.0Broker:Kafka
review-helpful-voted

Published when a review's helpful count changes as a result of a customer vote.

Owned by Reviews Platform4 attributes
Attributes
reviewIdstring uuidRequired
productIdstringRequired
helpfulCountintegerRequired
Minimum 0
updatedAtstring date-timeRequired
Documentation

Overview

ReviewHelpfulVoted is published by the Review API whenever a review's helpful count changes. It lets other surfaces (such as the storefront) keep "most helpful" ordering fresh.

Consumed by0

Nothing in the catalog.

{
  "reviewId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "productId": "string",
  "helpfulCount": 0,
  "updatedAt": "2026-01-01T12:00:00Z"
}

Review Published

EVTv1.0.0Broker:Kafka
review-published

Published when a submitted review passes moderation and becomes visible on the storefront.

Owned by Reviews Platform5 attributes
Attributes
reviewIdstring uuidRequired
productIdstringRequired
customerIdstring
ratingintegerRequired
Minimum 1Maximum 5
publishedAtstring date-timeRequired
Documentation

Overview

ReviewPublished is published by the Review Moderation Worker when a review passes moderation. The Rating Aggregator consumes it to update the product's aggregate rating.

{
  "reviewId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "productId": "string",
  "customerId": "string",
  "rating": 1,
  "publishedAt": "2026-01-01T12:00:00Z"
}

Review Rejected

EVTv1.0.0Broker:Kafka
review-rejected

Published when a submitted review fails moderation (spam, abuse or policy violation) and will not be shown.

Owned by Reviews Platform4 attributes
Attributes
reviewIdstring uuidRequired
productIdstringRequired
reasonstringRequired
spamabuseoff_topicpolicy_violation
rejectedAtstring date-timeRequired
Documentation

Overview

ReviewRejected is published by the Review Moderation Worker when a review fails moderation. The review is kept for audit but never published to the storefront.

Consumed by0

Nothing in the catalog.

{
  "reviewId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "productId": "string",
  "reason": "spam",
  "rejectedAt": "2026-01-01T12:00:00Z"
}

Review Submitted

EVTv1.0.0Broker:Kafka
review-submitted

Published when a customer submits a review. The review is stored but not yet visible — it awaits moderation.

Owned by Reviews Platform7 attributes
Attributes
reviewIdstring uuidRequired
productIdstringRequired
customerIdstringRequired
ratingintegerRequired
Minimum 1Maximum 5
titlestring
bodystring
submittedAtstring date-timeRequired
Documentation

Overview

ReviewSubmitted is published by the Review API once a review has been accepted and stored. The Review Moderation Worker consumes it to screen the review before it can be published.

{
  "reviewId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "productId": "string",
  "customerId": "string",
  "rating": 1,
  "title": "string",
  "body": "string",
  "submittedAt": "2026-01-01T12:00:00Z"
}

Shipment Created

EVTv1.0.0Broker:Kafka
shipment-created

Published by the carrier when a shipment has been created and dispatched.

Owned by Fulfilment Platform6 attributes
Attributes

Published when a shipment has been created and dispatched

shipmentIdstring uuidRequired
orderIdstring uuidRequired
trackingNumberstringRequired
carrierstring
estimatedDeliverystring date
createdAtstring date-timeRequired
Documentation

Overview

ShipmentCreated is published by the carrier's Tracking API when a shipment has been created and dispatched. Acme Inc consumes it to give the customer a tracking number and expected delivery date.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "shipmentId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "trackingNumber": "string",
  "carrier": "string",
  "estimatedDelivery": "2026-01-01",
  "createdAt": "2026-01-01T12:00:00Z"
}

Shipment Delivered

EVTv1.0.0Broker:Kafka
shipment-delivered

Published by the carrier when a shipment has been delivered to the customer.

Owned by Fulfilment Platform4 attributes
Attributes

Published when a shipment has been delivered to the customer

shipmentIdstring uuidRequired
orderIdstring uuidRequired
deliveredAtstring date-timeRequired
signedBystring

Name of the person who accepted delivery, if captured

Documentation

Overview

ShipmentDelivered is published by the carrier's Tracking API when a shipment reaches the customer. This is the happy-path end of the fulfilment journey — Acme Inc consumes it to close out the order and prompt the customer for feedback.

Produced by1
{
  "shipmentId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "deliveredAt": "2026-01-01T12:00:00Z",
  "signedBy": "string"
}

Shipment Failed

EVTv1.0.0Broker:Kafka
shipment-failed

Published by the carrier when a shipment could not be delivered.

Owned by Fulfilment Platform4 attributes
Attributes

Published when a shipment could not be delivered

shipmentIdstring uuidRequired
orderIdstring uuidRequired
reasonstringRequired
FAILED_DELIVERYLOSTDAMAGEDRETURNED_TO_SENDER
failedAtstring date-timeRequired
Documentation

Overview

ShipmentFailed is published by the carrier's Tracking API when a shipment cannot be delivered — for example a failed delivery attempt or a lost parcel. Acme Inc consumes it to trigger a redelivery, refund, or customer follow-up.

Produced by1
Consumed by0

Nothing in the catalog.

{
  "shipmentId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "reason": "FAILED_DELIVERY",
  "failedAt": "2026-01-01T12:00:00Z"
}

Commands

Requests for one service to do something. They can be rejected.

Command/Shopping

Add Item To Cart

POST /carts/{cartId}/itemsv1.0.0
add-item-to-cart

Command to add an item to a shopping cart.

Owned by Shopping Platform3 attributes
Attributes

Command to add an item to a shopping cart

cartIdstring uuidRequired

Unique identifier of the cart

productIdstring uuidRequired

Identifier of the product to add

quantityintegerRequired

Number of units to add Defaults to 1.

Minimum 1
Documentation

Overview

AddItemToCart is handled by the Cart API. It adds an item (or increases its quantity) in the cart and persists the change to the Cart Database.

RoutingHTTP
POST/carts/{cartId}/items
Sent by0

Nothing in the catalog.

Handled by1
{
  "cartId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "quantity": 1
}
Command/Customer

Authenticate Customer

POST /oauth/tokenv1.0.0
authenticate-customer

Command to authenticate a customer with their credentials.

Owned by Customer Platform2 attributes
Attributes

Command to authenticate a customer with their credentials, and the token returned

requestobjectRequired

The credentials to authenticate

responseobjectRequired

The access token issued on a successful sign-in

Documentation

Overview

AuthenticateCustomer is handled by the OAuth API. It verifies the supplied credentials against the User Directory and, on success, returns an access token and publishes a Customer Authenticated event.

RoutingHTTP
POST/oauth/token
Sent by0

Nothing in the catalog.

Handled by1
{
  "request": {
    "email": "jane@example.com",
    "password": "string"
  },
  "response": {
    "accessToken": "string",
    "tokenType": "Bearer",
    "expiresIn": 0
  }
}
Command/Payments

Authorize Payment

POST /payments/authorizev1.0.0
authorize-payment

Command to authorize payment for the total of a checked-out cart.

Owned by Ordering Platform4 attributes
Attributes

Command to authorize payment for the total of a checked-out cart

cartIdstring uuidRequired

Identifier of the cart being checked out

customerIdstring uuid

Identifier of the customer paying

amountintegerRequired

Amount to authorize, in minor units (e.g. cents)

Minimum 0
currencystringRequired

ISO 4217 currency code

Pattern ^[A-Z]{3}$
Documentation

Overview

AuthorizePayment is sent by the Checkout Orchestrator to authorize payment for the order total. Authorization places a hold on the customer's payment method; the funds are captured once the order is created. If a later step fails, the authorization is voided.

RoutingHTTP
POST/payments/authorize
Handled by1
{
  "cartId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "amount": 0,
  "currency": "string"
}
Command/Shopping

Calculate Discount

POST /discounts/calculatev1.0.0
calculate-discount

Command to calculate the discount that applies to a cart.

Owned by Shopping Platform2 attributes
Attributes

Command to calculate the discount for a cart, and the discount returned

requestobjectRequired
responseobjectRequired
Documentation

Overview

CalculateDiscount is handled by the Promotion Service. It is sent by the Cart API when pricing a cart. The service evaluates the applicable promotion rules and returns the discount, also publishing a Discount Calculated event.

Channels1 channel
Sent by1
{
  "request": {
    "cartId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
    "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
    "subtotal": 0,
    "currency": "string",
    "promotionCode": "string"
  },
  "response": {
    "discount": 0,
    "appliedPromotions": [
      "string"
    ]
  }
}
Command/Ordering

Cancel Order

POST /orders/{orderId}/cancelv1.0.0
cancel-order

Command to cancel an existing order.

Owned by Ordering Platform2 attributes
Attributes

Command to cancel an existing order

orderIdstring uuidRequired

Identifier of the order to cancel

reasonstringRequired

Why the order is being cancelled

CUSTOMER_REQUESTEDPAYMENT_FAILEDOUT_OF_STOCKFRAUD
Documentation

Overview

CancelOrder is handled by the Order Service. It cancels an order that has not yet been completed — releasing any reservations and voiding the payment authorization where needed. On success the Order Service publishes an Order Cancelled event.

RoutingHTTP
POST/orders/{orderId}/cancel
Sent by0

Nothing in the catalog.

Handled by1
{
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "reason": "CUSTOMER_REQUESTED"
}
Command/Shopping

Checkout Cart

POST /carts/{cartId}/checkoutv1.0.0
checkout-cart

Command to check out a shopping cart.

Owned by Shopping Platform3 attributes
Attributes

Command to check out a shopping cart

cartIdstring uuidRequired

Unique identifier of the cart to check out

customerIdstring uuidRequired

Identifier of the customer checking out

promotionCodestring

Optional promotion code to apply at checkout

Documentation

Overview

CheckoutCart is handled by the Cart API. It finalises the cart — pricing it (including discounts from the Promotion System) — and on success publishes a Cart Checked Out event.

RoutingHTTP
POST/carts/{cartId}/checkout
Sent by0

Nothing in the catalog.

{
  "cartId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "promotionCode": "string"
}
Command/Ordering

Create Order

POST /ordersv1.0.0
create-order

Command to create a new order from a checked-out cart.

Owned by Ordering Platform6 attributes
Attributes

Command to create a new order from a checked-out cart

cartIdstring uuidRequired

Identifier of the cart this order was created from

customerIdstring uuidRequired

Identifier of the customer placing the order

itemsarray of objectRequired

The items in the order

totalintegerRequired

Order total in minor units (e.g. cents)

Minimum 0
currencystringRequired

ISO 4217 currency code

Pattern ^[A-Z]{3}$
paymentAuthorizationIdstring

Identifier of the payment authorization for this order

Documentation

Overview

CreateOrder is sent by the Checkout Orchestrator and handled by the Order Service. It is the final step of the checkout saga — once inventory is reserved and payment is authorized, this command creates the order. On success the Order Service publishes an Order Created event.

RoutingHTTP
POST/orders
Handled by1
{
  "cartId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "items": [
    {
      "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
      "quantity": 1,
      "unitPrice": 0
    }
  ],
  "total": 0,
  "currency": "string",
  "paymentAuthorizationId": "string"
}
Command/Catalog

Create Product

POST /productsv1.0.0
create-product

Command to add a new product to the catalog.

Owned by Product Platform7 attributes
Attributes

Command to add a new product to the catalog

skustringRequired

Stock keeping unit — must be unique

namestringRequired

Display name of the product

Min length 1
descriptionstring

Long-form product description

priceintegerRequired

Price in minor units (e.g. cents)

Minimum 0
currencystringRequired

ISO 4217 currency code

Pattern ^[A-Z]{3}$
categorystring

Category the product belongs to

statusstring

Initial lifecycle status — defaults to DRAFT

DRAFTACTIVEARCHIVED
Documentation

Overview

CreateProduct is handled by the Product API. It validates the incoming product, writes it to the Product Database, and on success publishes a Product Created event.

RoutingHTTP
POST/products
Sent by0

Nothing in the catalog.

Handled by1
{
  "sku": "string",
  "name": "string",
  "description": "string",
  "price": 0,
  "currency": "string",
  "category": "string",
  "status": "DRAFT"
}
Command/Fulfilment

Create Shipment

POST /shipmentsv1.0.0
create-shipment

Command to create a shipment with a carrier for a packed order.

Owned by Fulfilment Platform5 attributes
Attributes

Command to create a shipment with a carrier for a packed order

orderIdstring uuidRequired
carrierstring

The carrier to ship with

servicestring
STANDARDEXPRESSNEXT_DAY
parcelCountinteger
Minimum 1
destinationobjectRequired
Documentation

Overview

CreateShipment is sent by the Carrier Adapter to the external Carrier to dispatch a packed order. The carrier responds asynchronously with Shipment Created and later Shipment Delivered or Shipment Failed.

RoutingHTTP
POST/shipments
Handled by1
{
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "carrier": "string",
  "service": "STANDARD",
  "parcelCount": 1,
  "destination": {
    "line1": "string",
    "city": "string",
    "postcode": "string",
    "country": "string"
  }
}
Command/Catalog

Delete Product

DELETE /products/{productId}v1.0.0
delete-product

Command to remove a product from the catalog.

Owned by Product Platform2 attributes
Attributes

Command to remove a product from the catalog

productIdstring uuidRequired

Unique identifier of the product to delete

reasonstring

Optional reason the product is being removed

DISCONTINUEDDUPLICATEMERCHANT_REQUESTOTHER
Documentation

Overview

DeleteProduct is handled by the Product API. It removes a product from the Product Database and, on success, publishes a Product Deleted event so downstream systems can clean up.

RoutingHTTP
DELETE/products/{productId}
Sent by0

Nothing in the catalog.

Handled by1
{
  "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "reason": "DISCONTINUED"
}

Flag Review

CMDv1.0.0Broker:Kafka
flag-review

Command issued by a customer or moderator to flag a published review for re-moderation.

Owned by Reviews Platform5 attributes
Attributes
reviewIdstring uuidRequired
flaggedBystringRequired

Customer or moderator id raising the flag.

reasonstringRequired
spamabuseoff_topicinappropriateother
notesstring
Max length 1000
flaggedAtstring date-timeRequired
Documentation

Overview

FlagReview is sent to the Review API when someone reports a published review as inappropriate. The API records the flag and publishes Review Flagged so the review can be screened again.

Sent by0

Nothing in the catalog.

{
  "reviewId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "flaggedBy": "string",
  "reason": "spam",
  "notes": "string",
  "flaggedAt": "2026-01-01T12:00:00Z"
}
Command/Customer

Register Customer

POST /customersv1.0.0
register-customer

Command to register a new customer.

Owned by Customer Platform3 attributes
Attributes

Command to register a new customer

emailstring emailRequired

Customer's email address — must be unique

namestring

Customer's full name

Min length 1
passwordstringRequired

Initial password for the customer's credentials

Min length 8
Documentation

Overview

RegisterCustomer is handled by the Customer API. It validates the new customer, writes it to the Customer Database, and on success publishes a Customer Registered event.

RoutingHTTP
POST/customers
Sent by0

Nothing in the catalog.

Handled by1
{
  "email": "jane@example.com",
  "name": "string",
  "password": "string"
}
Command/Fulfilment

Release Inventory

POST /reservations/{reservationId}/releasev1.0.0
release-inventory

Command to release a previously held inventory reservation.

Owned by Fulfilment Platform2 attributes
Attributes

Command to release a previously held inventory reservation

reservationIdstring uuidRequired
reasonstring
CHECKOUT_FAILEDORDER_CANCELLEDEXPIRED
Documentation

Overview

ReleaseInventory is handled by the Inventory Service. It releases a reservation that is no longer needed — for example when checkout fails after stock was reserved, or an order is cancelled.

RoutingHTTP
POST/reservations/{reservationId}/release
Sent by0

Nothing in the catalog.

{
  "reservationId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "reason": "CHECKOUT_FAILED"
}
Command/Shopping

Remove Item From Cart

DELETE /carts/{cartId}/items/{productId}v1.0.0
remove-item-from-cart

Command to remove an item from a shopping cart.

Owned by Shopping Platform3 attributes
Attributes

Command to remove an item from a shopping cart

cartIdstring uuidRequired

Unique identifier of the cart

productIdstring uuidRequired

Identifier of the product to remove

quantityinteger

Number of units to remove. If omitted, removes the item entirely.

Minimum 1
Documentation

Overview

RemoveItemFromCart is handled by the Cart API. It removes an item from the cart (or decreases its quantity) and persists the change to the Cart Database.

RoutingHTTP
DELETE/carts/{cartId}/items/{productId}
Sent by0

Nothing in the catalog.

Handled by1
{
  "cartId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "quantity": 1
}
Command/Returns

Request Return

POST /returnsv1.0.0
request-return

Command sent by a customer to return one or more items from a delivered order.

Owned by Fulfilment Platform5 attributes
Attributes

Request to return items from a delivered order

orderIdstring uuidRequired
customerIdstring uuidRequired
itemsarray of objectRequired
Min items 1
reasonstringRequired
damagedwrong_itemnot_as_describedno_longer_neededother
commentstring
Documentation

Overview

RequestReturn is handled by the Returns API. If the order is within the returns window the request is recorded and Return Requested is published.

RoutingHTTP
POST/returns
Sent by0

Nothing in the catalog.

Handled by1
{
  "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "items": [
    {
      "sku": "string",
      "quantity": 1
    }
  ],
  "reason": "damaged",
  "comment": "string"
}
Command/Fulfilment

Reserve Inventory

POST /reservationsv1.0.0
reserve-inventory

Command to reserve stock for the items in a checked-out cart.

Owned by Ordering Platform3 attributes
Attributes

Command to reserve stock for the items in a checked-out cart

cartIdstring uuidRequired

Identifier of the cart being checked out

customerIdstring uuid

Identifier of the customer checking out

itemsarray of objectRequired

The items to reserve

Documentation

Overview

ReserveInventory is sent by the Checkout Orchestrator to hold stock for the items in a checked-out cart. A successful reservation guarantees the inventory is available while payment is authorized. If a later checkout step fails, the reservation is released.

RoutingHTTP
POST/reservations
{
  "cartId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "items": [
    {
      "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
      "quantity": 1
    }
  ]
}

Submit Review

CMDv1.0.0Broker:Kafka
submit-review

Command issued by a customer to submit a review and rating for a product.

Owned by Reviews Platform7 attributes
Attributes
reviewIdstring uuidRequired

Client-generated id for the review.

productIdstringRequired

The product being reviewed.

customerIdstringRequired

The customer submitting the review.

ratingintegerRequired

Star rating from 1 to 5.

Minimum 1Maximum 5
titlestring
Max length 120
bodystringRequired
Max length 5000
submittedAtstring date-timeRequired
Documentation

Overview

SubmitReview is sent to the Review API when a customer submits a review for a product they have purchased. The API validates and stores the review, then publishes Review Submitted.

Sent by0

Nothing in the catalog.

{
  "reviewId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "productId": "string",
  "customerId": "string",
  "rating": 1,
  "title": "string",
  "body": "string",
  "submittedAt": "2026-01-01T12:00:00Z"
}
Command/Customer

Update Customer

PATCH /customers/{customerId}v1.0.0
update-customer

Command to update an existing customer's profile.

Owned by Customer Platform4 attributes
Attributes

Command to update an existing customer. Only the fields supplied are changed.

customerIdstring uuidRequired

Unique identifier of the customer to update

emailstring email

New email address

namestring

New full name

Min length 1
statusstring

New account status

ACTIVESUSPENDEDCLOSED
Documentation

Overview

UpdateCustomer is handled by the Customer API. It applies a partial update to an existing customer in the Customer Database and, on success, publishes a Customer Updated event describing what changed.

RoutingHTTP
PATCH/customers/{customerId}
Sent by0

Nothing in the catalog.

Handled by1
{
  "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "email": "jane@example.com",
  "name": "string",
  "status": "ACTIVE"
}
Command/Catalog

Update Product

PATCH /products/{productId}v1.0.0
update-product

Command to update an existing product in the catalog.

Owned by Product Platform7 attributes
Attributes

Command to update an existing product. Only the fields supplied are changed.

productIdstring uuidRequired

Unique identifier of the product to update

namestring

New display name

Min length 1
descriptionstring

New long-form description

priceinteger

New price in minor units (e.g. cents)

Minimum 0
currencystring

ISO 4217 currency code

Pattern ^[A-Z]{3}$
categorystring

New category

statusstring

New lifecycle status

DRAFTACTIVEARCHIVED
Documentation

Overview

UpdateProduct is handled by the Product API. It applies a partial update to an existing product in the Product Database and, on success, publishes a Product Updated event describing what changed.

RoutingHTTP
PATCH/products/{productId}
Sent by0

Nothing in the catalog.

Handled by1
{
  "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "name": "string",
  "description": "string",
  "price": 0,
  "currency": "string",
  "category": "string",
  "status": "DRAFT"
}

Vote Review Helpful

CMDv1.0.0Broker:Kafka
vote-review-helpful

Command issued by a customer to mark a published review as helpful (or remove their vote).

Owned by Reviews Platform4 attributes
Attributes
reviewIdstring uuidRequired
customerIdstringRequired
votestringRequired

Add a helpful vote or remove an existing one.

helpfulremove
votedAtstring date-timeRequired
Documentation

Overview

VoteReviewHelpful is sent to the Review API when a customer marks a review as helpful. The API updates the helpful count and publishes Review Helpful Voted.

Sent by0

Nothing in the catalog.

{
  "reviewId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
  "customerId": "string",
  "vote": "helpful",
  "votedAt": "2026-01-01T12:00:00Z"
}

Queries

Requests for information. They return data and change nothing.

Query/Customer

Get Customer

GET /customers/{customerId}v1.0.0
get-customer

Query to fetch a single customer by their identifier.

Owned by Customer Platform2 attributes
Attributes

Query to fetch a single customer by their identifier, and the customer returned

requestobjectRequired

Parameters used to look up the customer

responseobjectRequired

The customer returned by the query

Documentation

Overview

GetCustomer is handled by the Customer API. It returns the current state of a single customer, read directly from the Customer Database.

RoutingHTTP
GET/customers/{customerId}
Called by0

Nothing in the catalog.

Answered by1
{
  "request": {
    "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b"
  },
  "response": {
    "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
    "email": "jane@example.com",
    "name": "string",
    "status": "ACTIVE",
    "registeredAt": "2026-01-01T12:00:00Z"
  }
}
Query/Ordering

Get Order

GET /orders/{orderId}v1.0.0
get-order

Query to fetch a single order by its identifier.

Owned by Ordering Platform2 attributes
Attributes

Query to fetch a single order by its identifier, and the order returned

requestobjectRequired

Parameters used to look up the order

responseobjectRequired

The order returned by the query

Documentation

Overview

GetOrder is handled by the Order Service. It returns the current state of a single order, read directly from the Order Database.

RoutingHTTP
GET/orders/{orderId}
Called by0

Nothing in the catalog.

Answered by1
{
  "request": {
    "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b"
  },
  "response": {
    "orderId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
    "customerId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
    "status": "CREATED",
    "items": [
      {
        "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
        "quantity": 1,
        "unitPrice": 0
      }
    ],
    "total": 0,
    "currency": "string",
    "createdAt": "2026-01-01T12:00:00Z"
  }
}
Query/Catalog

Get Product

GET /products/{productId}v1.0.0
get-product

Query to fetch a single product by its identifier.

Owned by Product Platform2 attributes
Attributes

Query to fetch a single product by its identifier, and the product returned

requestobjectRequired

Parameters used to look up the product

responseobjectRequired

The product returned by the query

Documentation

Overview

GetProduct is handled by the Product API. It returns the current state of a single product, read directly from the Product Database. Use the Search System when you need to search across many products instead.

RoutingHTTP
GET/products/{productId}
Called by0

Nothing in the catalog.

Answered by1
{
  "request": {
    "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b"
  },
  "response": {
    "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
    "sku": "string",
    "name": "string",
    "description": "string",
    "price": 0,
    "currency": "string",
    "category": "string",
    "status": "DRAFT"
  }
}

Get Product Reviews

QRYv1.0.0
get-product-reviews

Query to fetch the published reviews and aggregate rating for a product.

Owned by Reviews Platform4 attributes
Attributes
productIdstringRequired

The product to fetch reviews for.

pageinteger

Defaults to 1.

Minimum 1
pageSizeinteger

Defaults to 20.

Minimum 1Maximum 100
sortstring

Defaults to newest.

newesthighestlowestmost_helpful
Documentation

Overview

GetProductReviews is served by the Review API. It returns the published reviews for a product along with its aggregate rating, read from the Review Database and the Rating Cache.

Called by0

Nothing in the catalog.

{
  "productId": "string",
  "page": 1,
  "pageSize": 20,
  "sort": "newest"
}

Get Stock Level

GET /stock/{productId}v1.0.0
get-stock-level

Query to fetch the current available stock level for a product.

Owned by Fulfilment Platform2 attributes
Attributes

Query to fetch the current available stock level for a product, and the level returned

requestobjectRequired
responseobjectRequired
Documentation

Overview

GetStockLevel is handled by the Inventory Service. It returns the current available stock for a product, read directly from the Inventory Database.

RoutingHTTP
GET/stock/{productId}
Called by0

Nothing in the catalog.

{
  "request": {
    "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b"
  },
  "response": {
    "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
    "available": 0,
    "reserved": 0
  }
}
Query/Catalog

Search Products

GET /search/productsv1.0.0
search-products

Query to search the catalog for products matching a term, with optional filters and pagination.

Owned by Search Platform2 attributes
Attributes

Query to search the catalog for products, and the paginated result returned

requestobjectRequired

Search parameters

responseobjectRequired

Paginated search results

Documentation

Overview

SearchProducts is handled by the Search API. It runs a full-text search over the Search Index and returns a paginated list of matching products. Use this whenever you need to find products across the catalog, rather than fetching a single product by id with Get Product.

RoutingHTTP
GET/search/products
Called by0

Nothing in the catalog.

Answered by1
{
  "request": {
    "query": "string",
    "filters": {
      "category": "string",
      "status": "DRAFT",
      "minPrice": 0,
      "maxPrice": 0
    },
    "page": 1,
    "pageSize": 20
  },
  "response": {
    "total": 0,
    "page": 0,
    "pageSize": 0,
    "results": [
      {
        "productId": "3f6b2b8e-9a4c-4f0e-8f2a-1c2d3e4f5a6b",
        "sku": "string",
        "name": "string",
        "category": "string",
        "price": 0,
        "currency": "string",
        "score": 0
      }
    ]
  }
}

Channels

Where messages travel: topics, queues and endpoints.

Channel/sqs

Discount Commands

v1.0.0
shopping-discount-commands

SQS queue used to send discount calculation commands to the Promotion Service.

Documentation

Overview

The Cart API sends Calculate Discount commands to this queue, and the Promotion Service consumes them.

Channelsqs
Address
shopping-discount-commands
Protocols
sqs
Delivery
at-least-once
Messages
1
Channel/kafka

Loyalty Events

v1.0.0
customer.loyalty-events

Kafka topic that carries loyalty points events from the Loyalty System.

Documentation

Overview

The Loyalty Service publishes Loyalty Points Earned and Loyalty Points Reversed to this topic as customers earn and lose points.

ConsumerDomainWhy
Promotion ServiceShoppingOffers promotions based on a customer's points.
Notification ServiceCustomer (Notifications)Tells the customer about the points they've earned.
Channelkafka
Address
customer.loyalty-events
Protocols
kafka
Delivery
at-least-once
Messages
2
Channel/kafka

Order Events

v1.0.0
ordering.order-events

Kafka topic that carries order lifecycle events from the Order Management System to the rest of Acme Inc.

Documentation

Overview

The Order Service publishes the order lifecycle to this topic: Order Created, Order Confirmed, Order Completed and Order Cancelled. Other domains subscribe to it rather than calling the Ordering domain directly:

ConsumerDomainWhy
Warehouse ServiceFulfilmentStarts picking once an order completes.
Loyalty ServiceCustomer (Loyalty)Awards points for completed orders and reverses them for cancelled ones.
Notification ServiceCustomer (Notifications)Tells the customer their order is confirmed.
Channelkafka
Address
ordering.order-events
Protocols
kafka
Delivery
at-least-once
Messages
4
Channel/http

Payment Outcomes

v1.0.0
/webhooks/stripe

HTTP webhook channel used to deliver payment and refund outcomes from Stripe.

Documentation

Overview

The Webhook Endpoint delivers payment and refund outcome events through this webhook channel. The Payment Worker consumes payment success and failure events from it.

Channelhttp
Address
/webhooks/stripe
Protocols
http
Delivery
at-least-once
Messages
3
Channel/kafka

Product Events

v1.0.0
catalog.product-events

Kafka topic that carries product lifecycle events from the Product Catalog System.

Documentation

Overview

The Product Search Publisher publishes product lifecycle events to this topic. Events needed by the Search System are routed to the Search Product Events topic for downstream processing.

Channelkafka
Address
catalog.product-events
Protocols
kafka
Delivery
at-least-once
Messages
3
Channel/kafka

Returns

v1.0.0
fulfilment.returns

Kafka topic that carries return events from the Returns System as a return moves from request to receipt.

Documentation

Overview

The Returns System publishes the lifecycle of a return to this topic. The Returns API publishes Return Requested, and the Returns Processor publishes Return Approved and Return Received.

ConsumerDomainWhy
Returns ProcessorFulfilment (Returns)Reviews new return requests.
Payment WorkerPaymentsRefunds the customer once the items are received.
Inventory ServiceFulfilmentRestocks returned items.
Notification ServiceCustomer (Notifications)Tells the customer their return is approved.
Channelkafka
Address
fulfilment.returns
Protocols
kafka
Delivery
at-least-once
Messages
3
Channel/sqs

Search Indexer Queue

v1.0.0
catalog-search-indexer

SQS queue from which the Search Indexer consumes product lifecycle events.

Documentation

Overview

The Search Indexer consumes product events from this queue and applies them to the search index. The queue is the final channel in the product-event routing chain.

Channelsqs
Address
catalog-search-indexer
Protocols
sqs
Delivery
at-least-once
Messages
3
Channel/kafka

Search Product Events

v1.0.0
catalog.product-events.search

Filtered Kafka topic containing product changes that must be applied to the search index.

Messages

No messages in the catalog use this channel.

Documentation

Overview

This topic receives the search-relevant subset of product events from Product Events and routes them to the Search Indexer Queue queue.

Channelkafka
Address
catalog.product-events.search
Protocols
kafka
Delivery
at-least-once
Messages
0
Routed from1

Data stores

Where data lives: databases, caches, object stores and warehouses.

Data store/Cart System

Cart Database

System of recordv1.0.0
cart-database

PostgreSQL database that is the system of record for shopping carts and their items.

Owned by Shopping Platformpostgres@16
Purpose

System of record for shopping carts

Documentation
What is this?

The Cart Database is the authoritative store for shopping carts at Acme Inc. The Cart API reads from and writes to it as customers add, remove and check out items.

What does it store?
  • Carts — one row per cart: id, customer, status and timestamps.
  • Cart Items — one row per item in a cart: product, quantity and unit price.
Retention

Carts are transient. Abandoned carts are pruned after 90 days (see frontmatter). A checked-out cart's contents live on in the Cart Checked Out event and downstream order records.

Data storedatabase
Type
database
Technology
postgres@16
Access
readWrite
Classification
internal
Residency
eu-west-1
Retention
90d
System of record
Yes

Customer Database

System of recordv1.0.0
customer-database

PostgreSQL database that is the system of record for all customer profile data.

Owned by Customer Platformpostgres@16
Purpose

System of record for customer profiles

Documentation
What is this?

The Customer Database is the authoritative store for every customer profile at Acme Inc. The Customer API reads from and writes to it. It stores profile data only — credentials and authentication live in the Identity Provider's User Directory, not here.

What does it store?
  • Customers — one row per customer: id, email, name and account status.
Access patterns
  • The Customer API is the only writer on the request path.
  • No credentials or passwords are stored here — only profile data. Authentication is owned by the Identity Provider.
Classification

Customer profile data is confidential. Access is role-based and least-privilege; PII handling follows Acme's data policies.

Data storedatabase
Type
database
Technology
postgres@16
Access
readWrite
Classification
confidential
Residency
eu-west-1
Retention
indefinite
System of record
Yes
Data store/Inventory System

Inventory Database

System of recordv1.0.0
inventory-database

PostgreSQL database that is the system of record for stock levels and reservations.

Owned by Fulfilment Platformpostgres@16
Purpose

System of record for stock levels and reservations

Documentation
What is this?

The Inventory Database is the authoritative store for stock levels at Acme Inc. The Inventory Service reads from and writes to it as stock is reserved and released.

What does it store?
  • Stock — one row per product: available quantity and reserved quantity.
  • Reservations — one row per reservation: id, order, items and status.
Data storedatabase
Type
database
Technology
postgres@16
Access
readWrite
Classification
internal
Residency
eu-west-1
Retention
3y
System of record
Yes
Data store

Loyalty Database

System of recordv1.0.0
loyalty-database

PostgreSQL database that holds the loyalty points ledger and each customer's points balance.

Owned by Customer Platformpostgres@16
Purpose

System of record for loyalty points transactions and balances

Documentation
What is this?

The Loyalty Database is the authoritative store for loyalty points. The Loyalty Service appends a ledger entry for every award or reversal and keeps a running balance per customer.

What does it store?
  • Points ledger — one row per award or reversal, linked to the order that caused it.
  • Balances — current points balance and tier per customer.
Data storedatabase
Type
database
Technology
postgres@16
Access
readWrite
Classification
internal
Residency
eu-west-1
Retention
7y
System of record
Yes
Data store

Notification Preferences

System of recordv1.0.0
notification-preferences

PostgreSQL database holding each customer's notification channels, opt-ins and quiet hours.

Owned by Customer Platformpostgres@16
Purpose

System of record for customer notification and marketing consent preferences

Documentation
What is this?

The Notification Preferences store records how each customer wants to be contacted. The Notification Service reads it before every send so customers only hear from us on channels they have opted into.

What does it store?
  • Channels — email address, phone number and push tokens, with per-channel opt-in.
  • Topics — which notification types (orders, delivery, loyalty, reviews) the customer wants.
  • Quiet hours — times when non-urgent notifications are held back.
Data storedatabase
Type
database
Technology
postgres@16
Access
readWrite
Classification
confidential
Residency
eu-west-1
Retention
indefinite
System of record
Yes
Written by0

Nothing in the catalog writes to it.

Order Database

System of recordv1.0.0
order-database

PostgreSQL database that is the system of record for orders and their items.

Owned by Ordering Platformpostgres@16
Purpose

System of record for orders

Documentation
What is this?

The Order Database is the authoritative store for orders at Acme Inc. The Order Service reads from and writes to it as orders are created, cancelled and completed.

What does it store?
  • Orders — one row per order: id, customer, status, total and timestamps.
  • Order Items — one row per item in an order: product, quantity and unit price.
Retention

Orders are financial records and are retained for 7 years (see frontmatter) to meet accounting and audit requirements.

Data storedatabase
Type
database
Technology
postgres@16
Access
readWrite
Classification
confidential
Residency
eu-west-1
Retention
7y
System of record
Yes

Payment Database

System of recordv1.0.0
payment-database

PostgreSQL database that is the system of record for payments and refunds.

Owned by Payments Platformpostgres@16
Purpose

System of record for payments and refunds

Documentation
What is this?

The Payment Database is the authoritative store for payments and refunds at Acme Inc. The Payment API and Payment Worker read from and write to it as payments are authorized, charged and refunded.

What does it store?
  • Payments — one row per payment: id, order, amount, status and timestamps.
  • Refunds — one row per refund: id, payment, amount, status and timestamps.
Retention

Payments and refunds are financial records and are retained for 7 years (see frontmatter) to meet accounting and audit requirements.

Data storedatabase
Type
database
Technology
postgres@16
Access
readWrite
Classification
confidential
Residency
eu-west-1
Retention
7y
System of record
Yes

Product Database

System of recordv1.0.0
product-database

PostgreSQL database that is the system of record for all product data.

Owned by Product Platformpostgres@16
Purpose

System of record for products, plus the change outbox used to publish events

Documentation
What is this?

The Product Database is the authoritative store for every product in the catalog. The Product API reads from and writes to it, and the Product Worker uses it for asynchronous enrichment. It also holds the outbox table that the Product Search Publisher reads to publish product change events.

What does it store?
  • Products — one row per product: SKU, name, description, price, currency, category and lifecycle status.
  • Outbox — one row per product change, used to reliably publish Product Created, Product Updated and Product Deleted events.
Access patterns
Why an outbox?

Writing the product change and the event in the same transaction guarantees we never persist a change without an event, or publish an event for a change that rolled back. The publisher reads the outbox and emits events with at-least-once delivery.

Data storedatabase
Type
database
Technology
postgres@16
Access
readWrite
Classification
internal
Residency
eu-west-1
Retention
indefinite
System of record
Yes
Data store/Promotion System

Promotion Database

System of recordv1.0.0
promotion-database

PostgreSQL store of promotion and discount rules.

Owned by Shopping Platformpostgres@16
Purpose

System of record for promotion and discount rules

Documentation
What is this?

The Promotion Database holds the promotion and discount rules that the Promotion Service evaluates when pricing a cart. It is the source of truth for what promotions exist, who they apply to, and when they are valid.

What does it store?
  • Promotions — one row per promotion: code, type (percentage / fixed amount), value, and validity window.
  • Eligibility rules — the conditions under which a promotion applies (minimum spend, customer segment, etc.).
Access patterns
Data storedatabase
Type
database
Technology
postgres@16
Access
readWrite
Classification
internal
Residency
eu-west-1
Retention
indefinite
System of record
Yes
Written by0

Nothing in the catalog writes to it.

Data store

Rating Cache

v1.0.0
rating-cache

Redis cache that serves each product's aggregate star rating with low latency.

Owned by Reviews Platformredis@7
Purpose

Fast read store for aggregate product ratings

Documentation
What is this?

The Rating Cache holds the aggregate rating (average score and review count) for each product. It is a derived read model — never a source of truth — so it can be rebuilt at any time by replaying published reviews.

What does it store?
  • Aggregate rating — one entry per product: average rating, review count and last-updated timestamp.
Access patterns
Data storecache
Type
cache
Technology
redis@7
Access
readWrite
Classification
internal
Residency
eu-west-1
Retention
transient
System of record
No
Data store

Returns Database

System of recordv1.0.0
returns-database

PostgreSQL database that is the system of record for return requests and their status.

Owned by Fulfilment Platformpostgres@16
Purpose

System of record for customer returns and their lifecycle

Documentation
What is this?

The Returns Database stores every return request. The Returns API writes new requests, and the Returns Processor reads them and records approval and receipt.

What does it store?
  • Returns — one row per return: order, customer, reason and status (requested, approved, received).
  • Return items — SKUs, quantities and inspected condition.
Data storedatabase
Type
database
Technology
postgres@16
Access
readWrite
Classification
internal
Residency
eu-west-1
Retention
7y
System of record
Yes
Data store

Review Database

System of recordv1.0.0
review-database

PostgreSQL database that is the system of record for reviews and their moderation state.

Owned by Reviews Platformpostgres@16
Purpose

System of record for reviews, ratings and moderation decisions

Documentation
What is this?

The Review Database is the authoritative store for every review in the Reviews & Ratings domain. The Review API writes new reviews to it, and the Review Moderation Worker records each moderation decision against the stored review.

What does it store?
  • Reviews — one row per review: product, customer, rating, title, body and lifecycle status (submitted, published, rejected).
  • Moderation decisions — the outcome and reason for each moderated review, kept for audit.
Access patterns
Data storedatabase
Type
database
Technology
postgres@16
Access
readWrite
Classification
internal
Residency
eu-west-1
Retention
indefinite
System of record
Yes
Data store/Search System

Search Index

v1.0.0
search-index

The denormalised, search-optimised index of products that powers product search.

Owned by Search Platformopensearch@2
Purpose

Serve fast, relevant product search

Documentation
What is this?

The Search Index is a denormalised, search-optimised copy of the catalog. It is not a source of truth — it can be rebuilt at any time by replaying product events from the Product Catalog System. The Search Indexer keeps it up to date, and the Search API reads from it to answer Search Products queries.

What does it store?

One document per product, optimised for search:

  • Searchable text — name and description, analysed for full-text matching.
  • Filterable fields — category, status, price, currency.
  • A relevance signal used to rank results.
Why is it not authoritative?

The system of record is the Product Database. The index is a derived read model: if it is ever lost or corrupted, we rebuild it by replaying Product Created, Product Updated and Product Deleted events. This keeps search fast without coupling other teams to the catalog database.

Operational notes
  • Rebuildable: a full reindex is a supported, routine operation.
  • Eventually consistent: changes appear in search shortly after the Search Indexer processes the corresponding event.
Data storesearchIndex
Type
searchIndex
Technology
opensearch@2
Access
readWrite
Classification
internal
Residency
eu-west-1
Retention
rebuildable
System of record
No

User Directory

System of recordv1.0.0
user-directory

The directory of customer credentials and identities — the source of truth for authentication.

Owned by Customer Platformpostgres@16
Purpose

System of record for credentials and login identities

Documentation
What is this?

The User Directory is the authoritative store for customer credentials and login identities. The OAuth API reads from it to verify sign-in attempts. It holds only authentication data — customer profile data lives separately in the Customer Management System's Customer Database.

What does it store?
  • Identities — one record per customer: the login email and a securely hashed credential.
  • Login metadata — last login time, multi-factor settings, lockout state.
Why is it separate from the customer profile?

Keeping credentials in a dedicated, regulated-classification store isolates the most sensitive data from general profile data. Authentication is owned by the Identity Provider; the Customer Management System never sees raw credentials.

Security
  • Credentials are stored only as salted, hashed values — never in plaintext.
  • Access is tightly restricted to the OAuth API under least-privilege roles.
Data storedatabase
Type
database
Technology
postgres@16
Access
readWrite
Classification
regulated
Residency
eu-west-1
Retention
indefinite
System of record
Yes
Written by0

Nothing in the catalog writes to it.

Data store/Warehouse System

Warehouse Database

System of recordv1.0.0
warehouse-database

PostgreSQL database that stores picking jobs and their status.

Owned by Fulfilment Platformpostgres@16
Purpose

System of record for picking and packing jobs

Documentation
What is this?

The Warehouse Database stores the picking and packing jobs for the warehouse. The Warehouse Service creates jobs and the Picking Worker updates them as orders are picked.

What does it store?
  • Picking Jobs — one row per order being fulfilled: order, status and timestamps.
  • Picking Job Items — the items to pick for each job.
Data storedatabase
Type
database
Technology
postgres@16
Access
readWrite
Classification
internal
Residency
eu-west-1
Retention
1y
System of record
Yes

Flows

How the pieces work together, step by step.

Flow

Checkout Saga

v1.0.0
checkout-saga

How the Checkout Orchestrator turns a checked-out cart into an order — reserving inventory, authorizing payment and creating the order, with compensation when a step fails.

Owned by Ordering Platform8 steps
Steps
  1. EVT
    Cart Checked Out
    Receive checkout
  2. SVC
    Checkout API
    Start saga
  3. SVC
    Checkout Orchestrator
    Step 1 — reserve inventory
  4. CMD
    Reserve Inventory
    Reserved → Authorize PaymentOut of stock → Compensate
  5. CMD
    Authorize Payment
    Authorized → Create OrderDeclined → Compensate
  6. CMD
    Create Order
    Order created
  7. ACTOR
    Saga complete
  8. ACTOR
    Compensate and abort
Documentation

Overview

The Checkout Saga is the heart of the Checkout System. It coordinates the steps that turn a checked-out cart into a confirmed order. Each step has a compensating action so a failure never leaves the customer in an inconsistent state.

Steps

  1. Reserve inventory — Reserve Inventory holds stock for the cart's items.
  2. Authorize payment — Authorize Payment places a hold on the order total.
  3. Create order — Create Order persists the order in the Order Management System.

If reservation or authorization fails, the orchestrator compensates — releasing the reservation and voiding the authorization — and aborts without creating an order.

Flow

Order Cancellation

v1.0.0
order-cancellation

How an order is cancelled — whether requested by the customer or triggered by a failure — and the events that tell the rest of the business to unwind it.

Owned by Ordering Platform8 steps
Steps
  1. ACTOR
    Shopper or System

    A customer asks to cancel, or a downstream failure (payment, inventory) forces a cancellation.

    Cancel order
  2. CMD
    Cancel Order
    Handle cancellation
  3. SVC
    Order Service
    Check eligibility → Cancellation policy checkAlready completed → Cannot cancel
  4. ACTOR
    Cancellation policy
    Mark cancelled
  5. DB
    Order Database
    Persist + publish
  6. EVT
    Order Cancelled
    Unwind downstream
  7. ACTOR
    Release and refund
  8. ACTOR
    Cannot cancel
Documentation

Overview

Order Cancellation documents how the Order Management System cancels an order. Cancellation can be requested by a shopper or forced by a downstream failure during checkout. Only orders that have not yet completed can be cancelled.

How it works

  1. A Cancel Order command reaches the Order Service.
  2. The service checks the cancellation policy — only CREATED orders are cancellable.
  3. If eligible, the order is marked cancelled in the Order Database and Order Cancelled is published.
  4. Downstream consumers react to Order Cancelled to release inventory, refund payment and stop fulfilment.
  5. If the order is already completed, cancellation is rejected and the customer is sent to the returns process.
Flow

Order to Doorstep

v1.0.0End-to-endCross-domain
order-to-doorstep

The end-to-end journey of an order, from a shopper finding a product to the parcel arriving at their door — and what happens when payment fails, stock runs out, delivery goes wrong or the customer sends it back. Crosses every business domain in the catalog.

Owned by Ordering Platform73 steps
Steps
  1. ACTOR
    Shopper

    A customer browsing the storefront on web or mobile.

    Searches the catalog
  2. QRY
    Search Products

    The storefront asks the search index for products matching the shopper's query.

    Query
  3. SVC
    Search API
    Shopper picks a product
  4. CMD
    Add Item To Cart
    Add to basket
  5. SVC
    Cart API

    Holds the shopper's basket while they keep browsing.

    Shopper checks out
  6. CMD
    Checkout Cart
    Sign in first
  7. CMD
    Authenticate Customer
    Verify session
  8. SVC
    OAuth API

    The third-party identity provider confirms who the shopper is.

    Session valid
  9. EVT
    Customer Authenticated
    Continue checkout
  10. SVC
    Cart API

    Freezes the basket and prices it before handing it to Ordering.

    Look up live prices
  11. QRY
  12. SVC
    Product API
    Prices returned
  13. CMD
    Calculate Discount
    Apply promotions
  14. SVC
    Promotion Service
    Codes and offers applied
  15. EVT
    Discount Calculated
    Final total known
  16. EVT
    Cart Checked Out
    Hand over to Ordering
  17. SVC
    Checkout API
    Start checkout saga
  18. SVC
    Checkout Orchestrator

    Coordinates stock, payment and order creation, compensating if any step fails.

    Step 1 — hold the stock
  19. CMD
    Reserve Inventory
    Reserve items
  20. SVC
    Inventory Service
    In stock → Inventory ReservedOut of stock → Inventory Unavailable
  21. EVT
    Inventory Reserved
    Step 2 — take payment → Authorize Payment
  22. EVT
    Inventory Unavailable
    Abort checkout → Order Cancellation
  23. CMD
    Authorize Payment
    Charge the order total
  24. SVC
    Payment API
    Queue the payment
  25. EVT
    Payment Requested
    Screen for fraud
  26. SVC
    Fraud API

    A third-party fraud service scores the payment before any money moves.

    Low risk → Fraud Check PassedHigh risk → Fraud Check Failed
  27. EVT
    Fraud Check Failed
    Block and abort → Order Cancellation
  28. EVT
  29. SVC
    Payments API
    Result via webhook
  30. SVC
    Webhook Endpoint
    Card charged → Payment SucceededCard declined → Payment Failed
  31. EVT
    Payment Failed
    Abort checkout → Order Cancellation
  32. EVT
    Payment Succeeded
    Step 3 — create the order → Create OrderBook the revenue → Ledger Exporter
  33. SVC
    Ledger Exporter

    Posts the payment to the finance ledger for reporting and reconciliation.

  34. FLW
    Order Cancellation

    Releases held stock, voids any payment and tells the customer. Click to expand the sub-flow.

    Checkout aborted
  35. ACTOR
    Order not placed
  36. CMD
    Create Order
    Persist the order
  37. SVC
    Order Service
    Order placed
  38. EVT
    Order Confirmed

    The moment the sale is real. Three domains react to it in parallel.

    Award points → Loyalty ServiceEmail confirmation → Notification ServiceStart fulfilment → Warehouse Service
  39. SVC
    Loyalty Service
    Points credited
  40. EVT
  41. SVC
    Notification Service
    Confirmation sent
  42. EVT
  43. SVC
    Warehouse Service
    Create pick list
  44. SVC
    Picking Worker
    Items boxed
  45. EVT
    Order Packed
    Ready at the dock
  46. EVT
  47. CMD
    Create Shipment
    Pick the cheapest carrier
  48. SVC
    Carrier Adapter
    Parcel handed over
  49. SVC
    Tracking API

    The external courier reports progress back to us.

    Tracking number issued
  50. EVT
    Shipment Created
    Delivered → Shipment DeliveredDelivery failed → Shipment Failed
  51. EVT
    Shipment Failed
    Needs a human
  52. ACTOR
    Delivery exception
    Tell the customer
  53. SVC
    Notification Service

    Emails the customer that their parcel is delayed and what happens next.

  54. EVT
    Shipment Delivered
    Close the order
  55. EVT
    Order Completed
    Happy path → Order deliveredCustomer reviews it → Submit ReviewCustomer sends it back → Request Return
  56. ACTOR
    Order delivered
  57. CMD
    Submit Review
    Rate the product
  58. SVC
    Review API
    Queued for moderation
  59. EVT
    Review Submitted
    Recalculate stars
  60. SVC
  61. EVT
  62. CMD
    Request Return
    Start a return
  63. SVC
    Returns API
    Return label issued
  64. EVT
    Return Requested
    Parcel comes back
  65. SVC
    Returns Processor
    Item inspected
  66. EVT
    Return Approved
    Refund the customer
  67. SVC
    Payment Worker
    Issue refund
  68. EVT
    Refund Requested
    Refund the card
  69. SVC
    Payments API
    Money returned
  70. EVT
    Refund Processed
    Take back points
  71. SVC
    Loyalty Service
    Points removed
  72. EVT
  73. ACTOR
    Return complete
Documentation

Overview

Order to Doorstep follows a single order across the whole business — from a shopper searching the catalog to the parcel arriving at their door. It's the best flow in this catalog for seeing how the domains fit together:

DomainWhat it does in this flow
ShoppingHolds the basket and applies promotions
CatalogSearch and live product prices
CustomerSigns the shopper in, awards loyalty points and sends emails (the Loyalty and Notifications subdomains)
OrderingRuns the checkout saga and owns the order
PaymentsFraud screening, charging the card via Stripe and booking revenue
FulfilmentStock, picking, packing, shipping — and the Returns subdomain
ReviewsRatings once the order arrives

Try it

  • Group by (top right) — group the steps by Domain, System, Team or Domain › System to see where work hands over between teams. Switch between Boxes and Lanes.
  • Walk through (bottom left) — step through the order one hop at a time. At each branch, pick what happens next: in stock or out of stock, card charged or declined, delivered or failed, reviewed or returned.
  • Order Cancellation is a sub-flow — click it to expand the compensation steps in place.

Paths through the flow

  1. Happy path — search, basket, sign in, price, reserve stock, pass fraud checks, charge the card, create the order, then loyalty, email and fulfilment run in parallel until the parcel is delivered.
  2. Checkout aborted — out of stock, high fraud risk or a declined card all hand over to the Order Cancellation sub-flow.
  3. Delivery exception — the courier fails to deliver and support takes over.
  4. Review — the customer rates the product and the average rating updates.
  5. Return — the item comes back, the card is refunded and loyalty points are reversed.
Flow

Place an Order

v1.0.0
place-an-order

The end-to-end journey from a customer checking out their cart to a confirmed order — spanning the Shopping and Ordering domains, including the checkout saga and its failure path.

Owned by Ordering Platform14 steps
Steps
  1. ACTOR
    Shopper

    The customer confirms their cart and starts checkout.

    Check out cart
  2. CMD
    Checkout Cart
    Price and finalise cart
  3. SVC
    Cart API
    Publish checkout
  4. EVT
    Cart Checked Out
    Start checkout flow
  5. SVC
    Checkout API
    Run checkout saga
  6. SVC
    Checkout Orchestrator
    Reserve inventory → Reserve InventoryAuthorize payment → Authorize Payment
  7. CMD
    Reserve Inventory
    Inventory held
  8. CMD
    Authorize Payment
    Payment authorized → Create OrderAuthorization declined → Checkout failed
  9. CMD
    Create Order
    Persist order
  10. SVC
    Order Service
    Publish order created
  11. EVT
    Order Created
    Confirm to customer
  12. ACTOR
    Order confirmed
  13. ACTOR
    Checkout failed
    Cancel order
  14. EVT
Documentation

Overview

Place an Order is the headline business flow at Acme Inc. It begins in the Shopping domain, when a shopper checks out their cart, and finishes in the Ordering domain, with a confirmed order — or a compensated, cancelled one if a step fails.

How it works

  1. The shopper checks out — the Cart API prices the cart and publishes Cart Checked Out.
  2. The Checkout API picks this up and hands it to the Checkout Orchestrator.
  3. The orchestrator runs the saga: Reserve Inventory then Authorize Payment.
  4. On success it sends Create Order to the Order Service, which publishes Order Created.
  5. If any step fails, the orchestrator compensates the earlier steps and the order is cancelled via Order Cancelled.
Flow

Product Launch

v1.0.0Cross-domainLaunch checklist
product-launch

How a new product goes from a merchandiser's draft to live on the storefront — enriched, indexed for search, stocked, given a launch offer and announced to customers — and how it's pulled if customers report a fault.

Owned by Product Platform33 steps
Steps
  1. ACTOR
    Merchandiser

    Someone on the trading team adding a new product to the range.

    Submits the new product
  2. CMD
  3. SVC
    Product API

    Validates the product and saves it with an outbox record in one transaction.

    Valid → Product DatabaseMissing data → Rejected
  4. ACTOR
    Rejected
  5. DB
    Product Database
    Outbox publishes
  6. EVT
    Product Created

    Three teams pick the new product up in parallel.

    Enrich → Product WorkerCheck stock → Get Stock LevelSet a launch offer → Calculate Discount
  7. SVC
    Product Worker

    Generates image renditions and variant data for the new product.

    Images and variants added
  8. EVT
    Product Updated
    Index for search
  9. FLW
    Product Search Indexing

    Gets the product into the search index. Click to expand the sub-flow.

    Indexed
  10. DB
    Search Index
    Searchable → Launch checklist
  11. QRY
  12. SVC
    Inventory Service
    Stock received → Launch checklistNothing in the warehouse → Awaiting stock
  13. ACTOR
    Awaiting stock
  14. CMD
    Calculate Discount
    10% launch week offer
  15. SVC
    Promotion Service
    Offer scheduled
  16. EVT
  17. ACTOR
    Launch checklist
    Announce the launch
  18. SVC
    Notification Service

    Emails customers who opted in to new-product announcements.

    Launch email sent
  19. EVT
    Customer Notified
    Opens the email
  20. ACTOR
    Shopper

    A customer who clicked through from the launch email.

    Searches for it
  21. QRY
  22. SVC
    Search API
    Opens the product page
  23. QRY
  24. SVC
    Product API
    Load reviews
  25. QRY
  26. SVC
    Review API
    Good reviews → Product liveCustomers report a fault → Flag Review
  27. ACTOR
    Product live
  28. CMD
    Flag Review
    Report a safety issue
  29. EVT
    Review Flagged
    Merchandiser pulls it
  30. CMD
  31. SVC
    Product API
    Removed from the range
  32. EVT
    Product Deleted
    Dropped from search
  33. ACTOR
    Product withdrawn
Documentation

Overview

Product Launch follows a new product from a merchandiser's draft to selling on the storefront. It's a good flow for showing how several teams work on the same event in parallel, and how their work comes together before launch.

DomainWhat it does in this flow
CatalogCreates and enriches the product, and gets it into search
FulfilmentConfirms there's stock to sell
ShoppingSets up the launch week offer
CustomerAnnounces the launch (the Notifications subdomain)
ReviewsShows reviews — and raises the alarm if something's wrong

Try it

  • Group by (top right) — try Team: three teams react to one ProductCreated event in parallel, then their work comes together at the launch checklist.
  • Walk through (bottom left) — step through the launch. At each branch, pick what happens next: valid or missing data, stock or no stock, good reviews or a reported fault.
  • Product Search Indexing is a sub-flow — click it to expand how the product gets into search.

Paths through the flow

  1. Launch — the product is created and saved, then enriched and indexed, stocked and given a launch offer in parallel. Once all three are done it's announced, and shoppers find it through search.
  2. Rejected — the product is missing required details and goes back to the merchandiser.
  3. Awaiting stock — nothing is in the warehouse yet, so the launch waits.
  4. Recall — customers report a fault and the product is pulled from the storefront and search.
Flow

Product Search Indexing

v1.0.0
product-search-indexing

How a change to a product in the catalog reliably flows into the search index — via the outbox, product events and the indexer — so search stays in sync without coupling to the catalog database.

Owned by Search Platform11 steps
Steps
  1. ACTOR
    Merchant

    A merchant creates or updates a product in the catalog.

    Apply change
  2. SVC
    Product API
    Write change + outbox row
  3. DB
    Product Database
    Outbox row committed
  4. ACTOR
    Transactional outbox
    Drain outbox
  5. SVC
    Product Search Publisher
    Created → Product CreatedUpdated → Product UpdatedDeleted → Product Deleted
  6. EVT
    Product Created
    Index product → Search Indexer
  7. EVT
    Product Updated
    Re-index product → Search Indexer
  8. EVT
    Product Deleted
    Remove from index
  9. SVC
    Search Indexer
    Apply to index
  10. DB
    Search Index
    Available to search
  11. ACTOR
    Product is searchable
Documentation

Overview

Product Search Indexing documents how the Search System keeps its index in sync with the catalog. The search index is a derived read model — never a source of truth — so it can be rebuilt at any time by replaying product events.

How it works

  1. A merchant changes a product via the Product API, which writes the change and an outbox row to the Product Database in one transaction.
  2. The Product Search Publisher reliably drains the outbox and publishes Product Created, Product Updated or Product Deleted.
  3. The Search Indexer consumes those events and applies them to the Search Index.
  4. The change is now searchable via the Search API — with no direct coupling between search and the catalog database.
Flow

Review Submission

v1.0.0
review-submission

How a customer's product review travels from submission, through moderation, to being published and folded into the product's aggregate rating.

Owned by Reviews Platform11 steps
Steps
  1. ACTOR
    Customer

    A customer writes a review and rating for a product they purchased.

    Submit review
  2. SVC
    Review API
    Store review
  3. DB
    Review Database
    Review stored
  4. EVT
    Review Submitted
    Screen review
  5. SVC
    Review Moderation Worker
    Approved → Review PublishedRejected → Review Rejected
  6. EVT
    Review Published
    Update rating → Rating Aggregator
  7. EVT
    Review Rejected
    Not shown → Review rejected
  8. SVC
    Rating Aggregator
    Write aggregate
  9. DB
    Rating Cache
    Visible on storefront
  10. ACTOR
    Review is live
  11. ACTOR
    Review rejected
Documentation

Overview

Review Submission documents the journey of a customer review from submission through moderation to publication. A review is only ever folded into a product's rating once it has been approved.

How it works

  1. A customer submits a review via the Review API, which stores it in the Review Database and publishes Review Submitted.
  2. The Review Moderation Worker screens the review and publishes either Review Published or Review Rejected.
  3. On approval, the Rating Aggregator updates the product's aggregate rating in the Rating Cache and the review goes live.

Entities

The domain model behind the messages.

Entity/Customer

Authentication Session

v1.0.0
authentication-session

A successful customer authentication session.

Properties
sessionIdUUIDRequired

Unique authentication session identifier.

accountIdUUID → customer-accountRequired

Account authenticated in the session.

authenticatedAtdatetimeRequired

Time authentication succeeded.

expiresAtdatetimeRequired

Time the session expires.

Documentation

Overview

Authentication Session represents successful login behavior emitted by Customer Authenticated.

TypeScript
/** A successful customer authentication session. */
export interface AuthenticationSession {
  /** Unique authentication session identifier. */
  sessionId: unknown;
  /** Account authenticated in the session. */
  accountId: unknown;
  /** Time authentication succeeded. */
  authenticatedAt: unknown;
  /** Time the session expires. */
  expiresAt: unknown;
}
Entity/Shopping

Cart

Aggregate Rootv1.0.0
cart

The customer's active collection of items before an order exists.

Properties
cartIdUUIDRequired

Unique cart identifier.

customerIdUUID → customer-profile

Customer that owns the cart, if authenticated.

statusstringRequired

Current cart state.

activechecked-outabandoned
updatedAtdatetimeRequired

Time the cart last changed.

Documentation

Overview

Cart is the Shopping domain aggregate. It accepts item changes and emits Cart Checked Out when the customer commits to buy.

TypeScript
/** The customer's active collection of items before an order exists. */
export interface Cart {
  /** Unique cart identifier. */
  cartId: unknown;
  /** Customer that owns the cart, if authenticated. */
  customerId?: unknown;
  /** Current cart state. */
  status: "active" | "checked-out" | "abandoned";
  /** Time the cart last changed. */
  updatedAt: unknown;
}
Entity/Shopping

Cart Item

v1.0.0
cart-item

A product variant and quantity inside a cart.

Properties
cartItemIdUUIDRequired

Unique cart item identifier.

cartIdUUID → cartRequired

Cart this item belongs to.

productIdUUID → productRequired

Product selected by the customer.

quantityintegerRequired

Quantity requested.

Documentation

Overview

Cart Item records the customer's intent to buy a product variant before checkout. It is owned by Cart.

TypeScript
/** A product variant and quantity inside a cart. */
export interface CartItem {
  /** Unique cart item identifier. */
  cartItemId: unknown;
  /** Cart this item belongs to. */
  cartId: unknown;
  /** Product selected by the customer. */
  productId: unknown;
  /** Quantity requested. */
  quantity: number;
}
Entity/Catalog

Category

Aggregate Rootv1.0.0
category

A merchandising grouping used to organize products for discovery.

Properties
categoryIdUUIDRequired

Unique category identifier.

slugstringRequired

Stable URL-safe category key.

displayNamestringRequired

Customer-facing category name.

parentCategoryIdUUID → category

Parent category for hierarchy navigation.

Documentation

Overview

Category defines how products are grouped for browsing. It is owned by the Catalog domain and projected into the Search System for discovery.

TypeScript
/** A merchandising grouping used to organize products for discovery. */
export interface Category {
  /** Unique category identifier. */
  categoryId: unknown;
  /** Stable URL-safe category key. */
  slug: string;
  /** Customer-facing category name. */
  displayName: string;
  /** Parent category for hierarchy navigation. */
  parentCategoryId?: unknown;
}
Entity/Ordering

Checkout Session

Aggregate Rootv1.0.0
checkout-session

The orchestration state for turning a checked-out cart into an order.

Properties
checkoutSessionIdUUIDRequired

Unique checkout session identifier.

cartIdUUID → cartRequired

Cart being checked out.

statusstringRequired

Current checkout state.

startedAtdatetimeRequired

Time checkout orchestration started.

Documentation

Overview

Checkout Session tracks the saga managed by Checkout Orchestrator across inventory reservation, payment authorization and order creation.

TypeScript
/** The orchestration state for turning a checked-out cart into an order. */
export interface CheckoutSession {
  /** Unique checkout session identifier. */
  checkoutSessionId: unknown;
  /** Cart being checked out. */
  cartId: unknown;
  /** Current checkout state. */
  status: string;
  /** Time checkout orchestration started. */
  startedAt: unknown;
}
Entity/Customer

Customer Account

Aggregate Rootv1.0.0
customer-account

The identity account used to authenticate a customer.

Properties
accountIdUUIDRequired

Unique account identifier.

customerIdUUID → customer-profileRequired

Customer profile linked to this account.

providerstringRequired

Identity provider name.

statusstringRequired

Account lifecycle state.

Documentation

Overview

Customer Account belongs to the Identity Provider boundary and should not be queried directly by order, payment or review services.

TypeScript
/** The identity account used to authenticate a customer. */
export interface CustomerAccount {
  /** Unique account identifier. */
  accountId: unknown;
  /** Customer profile linked to this account. */
  customerId: unknown;
  /** Identity provider name. */
  provider: string;
  /** Account lifecycle state. */
  status: string;
}
Entity/Customer

Customer Address

v1.0.0
customer-address

A saved address attached to a customer profile.

Properties
addressIdUUIDRequired

Unique address identifier.

customerIdUUID → customer-profileRequired

Customer who owns the address.

countryCodestringRequired

ISO country code.

postalCodestringRequired

Postal or ZIP code.

Documentation

Overview

Customer Address supports checkout and fulfilment while remaining owned by the Customer domain.

TypeScript
/** A saved address attached to a customer profile. */
export interface CustomerAddress {
  /** Unique address identifier. */
  addressId: unknown;
  /** Customer who owns the address. */
  customerId: unknown;
  /** ISO country code. */
  countryCode: string;
  /** Postal or ZIP code. */
  postalCode: string;
}
Entity/Customer

Customer Profile

Aggregate Rootv1.0.0
customer-profile

The customer details Acme uses for commerce interactions.

Properties
customerIdUUIDRequired

Unique customer identifier.

emailstringRequired

Customer email address.

displayNamestring

Preferred customer display name.

statusstringRequired

Customer profile state.

Documentation

Overview

Customer Profile is owned by Customer Management System and is separate from authentication credentials.

TypeScript
/** The customer details Acme uses for commerce interactions. */
export interface CustomerProfile {
  /** Unique customer identifier. */
  customerId: unknown;
  /** Customer email address. */
  email: string;
  /** Preferred customer display name. */
  displayName?: string;
  /** Customer profile state. */
  status: string;
}
Entity/Shopping

Discount

v1.0.0
discount

The calculated benefit applied to a cart or cart item.

Properties
discountIdUUIDRequired

Unique discount identifier.

promotionIdUUID → promotion

Promotion that produced the discount.

amountdecimalRequired

Monetary value of the discount.

reasonstringRequired

Human-readable explanation for the discount.

Documentation

Overview

Discount is a calculated result from Calculate Discount. It is separate from cart persistence so promotion logic can evolve independently.

TypeScript
/** The calculated benefit applied to a cart or cart item. */
export interface Discount {
  /** Unique discount identifier. */
  discountId: unknown;
  /** Promotion that produced the discount. */
  promotionId?: unknown;
  /** Monetary value of the discount. */
  amount: unknown;
  /** Human-readable explanation for the discount. */
  reason: string;
}
Entity/Payments

Fraud Check

v1.0.0
fraud-check

Fraud screening result associated with a payment attempt.

Properties
fraudCheckIdUUIDRequired

Unique fraud check identifier.

paymentIdUUID → paymentRequired

Payment attempt being screened.

resultstringRequired

Screening result.

passedfailedreview
checkedAtdatetimeRequired

Time screening completed.

Documentation

Overview

Fraud Check documents the screening outcome from Fraud Detection so payment decisions are auditable.

TypeScript
/** Fraud screening result associated with a payment attempt. */
export interface FraudCheck {
  /** Unique fraud check identifier. */
  fraudCheckId: unknown;
  /** Payment attempt being screened. */
  paymentId: unknown;
  /** Screening result. */
  result: "passed" | "failed" | "review";
  /** Time screening completed. */
  checkedAt: unknown;
}
Entity/Fulfilment

Inventory Reservation

Aggregate Rootv1.0.0
inventory-reservation

Stock held for a checkout or order before fulfilment.

Properties
reservationIdUUIDRequired

Unique reservation identifier.

orderIdUUID → order

Order associated with the reservation once created.

productIdUUID → productRequired

Product being reserved.

expiresAtdatetimeRequired

Time the reservation expires if not committed.

Documentation

Overview

Inventory Reservation is created during checkout by Reserve Inventory and released if the saga fails.

TypeScript
/** Stock held for a checkout or order before fulfilment. */
export interface InventoryReservation {
  /** Unique reservation identifier. */
  reservationId: unknown;
  /** Order associated with the reservation once created. */
  orderId?: unknown;
  /** Product being reserved. */
  productId: unknown;
  /** Time the reservation expires if not committed. */
  expiresAt: unknown;
}

Moderation Decision

v1.0.0
moderation-decision

The outcome of reviewing submitted customer feedback.

Properties
moderationDecisionIdUUIDRequired

Unique moderation decision identifier.

reviewIdUUID → reviewRequired

Review being moderated.

outcomestringRequired

Moderation result.

publishedrejected
decidedAtdatetimeRequired

Time the decision was made.

Documentation

Overview

Moderation Decision records why a review became published or rejected and supports audit of Review Moderation Worker behavior.

TypeScript
/** The outcome of reviewing submitted customer feedback. */
export interface ModerationDecision {
  /** Unique moderation decision identifier. */
  moderationDecisionId: unknown;
  /** Review being moderated. */
  reviewId: unknown;
  /** Moderation result. */
  outcome: "published" | "rejected";
  /** Time the decision was made. */
  decidedAt: unknown;
}
Entity/Ordering

Order

Aggregate Rootv1.0.0
order

The durable customer order created after successful checkout.

Properties
orderIdUUIDRequired

Unique order identifier.

customerCustomer → customer-profileRequired

Customer who placed the order.

statusstringRequired

Current order lifecycle state.

totalAmountdecimalRequired

Total order value at creation.

deliveryAddressobjectRequired

Delivery address captured when the order was placed.

adjustmentsarray of object

Discounts and credits captured as part of this order.

Documentation

Overview

Order is the main aggregate in Order Management System. It emits order lifecycle events used by Fulfilment and support workflows.

TypeScript
/** The durable customer order created after successful checkout. */
export interface Order {
  /** Unique order identifier. */
  orderId: unknown;
  /** Customer who placed the order. */
  customer: unknown;
  /** Current order lifecycle state. */
  status: string;
  /** Total order value at creation. */
  totalAmount: unknown;
  /** Delivery address captured when the order was placed. */
  deliveryAddress: {
    /** First line of the delivery address. */
    line1: string;
    /** Delivery city. */
    city: string;
    /** Delivery postal code. */
    postalCode: string;
    /** ISO 3166-1 alpha-2 delivery country code. */
    countryCode: string;
  };
  /** Discounts and credits captured as part of this order. */
  adjustments?: {
    /** Reason for the adjustment. */
    description: string;
    /** Signed amount applied to the order total. */
    amount: unknown;
  }[];
}
Entity/Ordering

Order Line

v1.0.0
order-line

A purchased product and quantity within an order.

Properties
orderLineIdUUIDRequired

Unique order line identifier.

orderIdUUID → orderRequired

Order this line belongs to.

productIdUUID → productRequired

Product purchased.

quantityintegerRequired

Quantity purchased.

Documentation

Overview

Order Line snapshots the products bought at checkout. It should not replace the Catalog domain's authoritative product data.

TypeScript
/** A purchased product and quantity within an order. */
export interface OrderLine {
  /** Unique order line identifier. */
  orderLineId: unknown;
  /** Order this line belongs to. */
  orderId: unknown;
  /** Product purchased. */
  productId: unknown;
  /** Quantity purchased. */
  quantity: number;
}
Entity/Ordering

Order Status History

v1.0.0
order-status-history

Audit history of order lifecycle state changes.

Properties
orderStatusHistoryIdUUIDRequired

Unique status history record.

orderIdUUID → orderRequired

Order whose status changed.

statusstringRequired

New order status.

changedAtdatetimeRequired

Time the status changed.

Documentation

Overview

Order Status History provides an audit trail for customer support, fulfilment exceptions and order lifecycle debugging.

TypeScript
/** Audit history of order lifecycle state changes. */
export interface OrderStatusHistory {
  /** Unique status history record. */
  orderStatusHistoryId: unknown;
  /** Order whose status changed. */
  orderId: unknown;
  /** New order status. */
  status: string;
  /** Time the status changed. */
  changedAt: unknown;
}
Entity/Payments

Payment

Aggregate Rootv1.0.0
payment

Acme's internal record of payment intent and outcome for an order.

Properties
paymentIdUUIDRequired

Unique payment identifier.

orderIdUUID → orderRequired

Order being paid for.

amountdecimalRequired

Amount requested.

statusstringRequired

Payment lifecycle status.

Documentation

Overview

Payment is the Payments domain aggregate. It records Acme's view of payment state regardless of external provider retries or webhook order.

TypeScript
/** Acme's internal record of payment intent and outcome for an order. */
export interface Payment {
  /** Unique payment identifier. */
  paymentId: unknown;
  /** Order being paid for. */
  orderId: unknown;
  /** Amount requested. */
  amount: unknown;
  /** Payment lifecycle status. */
  status: string;
}
Entity/Payments

Payment Authorization

v1.0.0
payment-authorization

Approval from a payment provider to reserve funds for an order.

Properties
authorizationIdUUIDRequired

Unique authorization identifier.

paymentIdUUID → paymentRequired

Payment this authorization belongs to.

providerReferencestringRequired

External payment provider reference.

authorizedAtdatetimeRequired

Time authorization was granted.

Documentation

Overview

Payment Authorization captures the result of Authorize Payment and links Acme payment state to provider state.

TypeScript
/** Approval from a payment provider to reserve funds for an order. */
export interface PaymentAuthorization {
  /** Unique authorization identifier. */
  authorizationId: unknown;
  /** Payment this authorization belongs to. */
  paymentId: unknown;
  /** External payment provider reference. */
  providerReference: string;
  /** Time authorization was granted. */
  authorizedAt: unknown;
}
Entity/Catalog

Product

Aggregate Rootv1.0.0
product

The sellable item Acme manages in the product catalog.

Properties
productIdUUIDRequired

Unique product identifier.

skustringRequired

Primary merchandising SKU.

namestringRequired

Customer-facing product name.

statusstringRequired

Product publication state.

draftactivearchived
Documentation

Overview

The Product is the Catalog domain's core aggregate. It is created and maintained by Product API and published to downstream consumers through product events.

TypeScript
/** The sellable item Acme manages in the product catalog. */
export interface Product {
  /** Unique product identifier. */
  productId: unknown;
  /** Primary merchandising SKU. */
  sku: string;
  /** Customer-facing product name. */
  name: string;
  /** Product publication state. */
  status: "draft" | "active" | "archived";
}
Entity/Catalog

Product Variant

v1.0.0
product-variant

A purchasable variation of a product, such as size or color.

Properties
variantIdUUIDRequired

Unique variant identifier.

productIdUUID → productRequired

Product this variant belongs to.

skustringRequired

Variant-level SKU.

attributesobjectRequired

Variant dimensions such as size, color or material.

Documentation

Overview

Product Variant captures the concrete option a customer can buy. It belongs to a Product and is indexed into search when product data changes.

TypeScript
/** A purchasable variation of a product, such as size or color. */
export interface ProductVariant {
  /** Unique variant identifier. */
  variantId: unknown;
  /** Product this variant belongs to. */
  productId: unknown;
  /** Variant-level SKU. */
  sku: string;
  /** Variant dimensions such as size, color or material. */
  attributes: unknown;
}
Entity/Shopping

Promotion

Aggregate Rootv1.0.0
promotion

A commercial offer evaluated against a cart.

Properties
promotionIdUUIDRequired

Unique promotion identifier.

codestring

Optional customer-entered promotion code.

categoryIdUUID → category

Category the promotion applies to when scoped.

statusstringRequired

Promotion lifecycle state.

startsAtdatetimeRequired

When the promotion becomes active.

Documentation

Overview

Promotion is owned by the Promotion System and is evaluated when Shopping calculates discounts for a cart.

TypeScript
/** A commercial offer evaluated against a cart. */
export interface Promotion {
  /** Unique promotion identifier. */
  promotionId: unknown;
  /** Optional customer-entered promotion code. */
  code?: string;
  /** Category the promotion applies to when scoped. */
  categoryId?: unknown;
  /** Promotion lifecycle state. */
  status: string;
  /** When the promotion becomes active. */
  startsAt: unknown;
}

Rating Summary

v1.0.0
rating-summary

Aggregated review statistics for a product.

Properties
productIdUUID → productRequired

Product being summarized.

averageRatingdecimalRequired

Average published rating.

reviewCountintegerRequired

Number of published reviews.

updatedAtdatetimeRequired

Time the summary was recalculated.

Documentation

Overview

Rating Summary is the read model maintained by Rating Aggregator and stored in Rating Cache.

TypeScript
/** Aggregated review statistics for a product. */
export interface RatingSummary {
  /** Product being summarized. */
  productId: unknown;
  /** Average published rating. */
  averageRating: unknown;
  /** Number of published reviews. */
  reviewCount: number;
  /** Time the summary was recalculated. */
  updatedAt: unknown;
}
Entity/Payments

Refund

Aggregate Rootv1.0.0
refund

A request to return money to a customer after payment.

Properties
refundIdUUIDRequired

Unique refund identifier.

paymentIdUUID → paymentRequired

Payment being refunded.

amountdecimalRequired

Refund amount.

statusstringRequired

Refund lifecycle state.

Documentation

Overview

Refund is owned by Payments and records refund requests and provider outcomes such as Refund Processed.

TypeScript
/** A request to return money to a customer after payment. */
export interface Refund {
  /** Unique refund identifier. */
  refundId: unknown;
  /** Payment being refunded. */
  paymentId: unknown;
  /** Refund amount. */
  amount: unknown;
  /** Refund lifecycle state. */
  status: string;
}

Review

Aggregate Rootv1.0.0
review

A customer's review and rating of a product, including its moderation lifecycle.

Properties
reviewIdUUIDRequired

Unique identifier for the review.

productIdstring → productRequired

The product being reviewed.

customerIdstring → customer-profileRequired

The customer who wrote the review.

ratingintegerRequired

Star rating from 1 to 5.

titlestring

Short headline for the review.

bodystringRequired

The review text.

statusstringRequired

Lifecycle status of the review.

submittedpublishedrejected
submittedAtdatetimeRequired

When the review was submitted.

Documentation

Overview

The Review is the core aggregate of the Reviews & Ratings domain. It captures a customer's rating and written feedback for a product, along with the moderation status that controls whether it is visible on the storefront.

A review moves through three states:

  1. submitted — stored by the Review API, awaiting moderation.
  2. published — passed moderation and visible (the Rating Aggregator folds it into the product's rating).
  3. rejected — failed moderation and never shown, but kept for audit.
TypeScript
/** A customer's review and rating of a product, including its moderation lifecycle. */
export interface Review {
  /** Unique identifier for the review. */
  reviewId: unknown;
  /** The product being reviewed. */
  productId: unknown;
  /** The customer who wrote the review. */
  customerId: unknown;
  /** Star rating from 1 to 5. */
  rating: number;
  /** Short headline for the review. */
  title?: string;
  /** The review text. */
  body: string;
  /** Lifecycle status of the review. */
  status: "submitted" | "published" | "rejected";
  /** When the review was submitted. */
  submittedAt: unknown;
}

Review Flag

v1.0.0
review-flag

A customer report that a review may violate policy.

Properties
flagIdUUIDRequired

Unique review flag identifier.

reviewIdUUID → reviewRequired

Review being reported.

reasonstringRequired

Reason selected by the customer.

flaggedAtdatetimeRequired

Time the review was flagged.

Documentation

Overview

Review Flag captures Flag Review interactions and can send a published review back through moderation.

TypeScript
/** A customer report that a review may violate policy. */
export interface ReviewFlag {
  /** Unique review flag identifier. */
  flagId: unknown;
  /** Review being reported. */
  reviewId: unknown;
  /** Reason selected by the customer. */
  reason: string;
  /** Time the review was flagged. */
  flaggedAt: unknown;
}

Review Vote

v1.0.0
review-vote

A customer's helpfulness vote on a product review.

Properties
voteIdUUIDRequired

Unique review vote identifier.

reviewIdUUID → reviewRequired

Review being voted on.

customerIdUUID → customer-profileRequired

Customer who voted.

votedAtdatetimeRequired

Time the vote was submitted.

Documentation

Overview

Review Vote captures Vote Review Helpful interactions and contributes to review helpfulness ranking.

TypeScript
/** A customer's helpfulness vote on a product review. */
export interface ReviewVote {
  /** Unique review vote identifier. */
  voteId: unknown;
  /** Review being voted on. */
  reviewId: unknown;
  /** Customer who voted. */
  customerId: unknown;
  /** Time the vote was submitted. */
  votedAt: unknown;
}
Entity/Catalog

Search Document

v1.0.0
search-document

The denormalized representation of product data indexed by Search.

Properties
documentIdstringRequired

Search index document identifier.

productIdUUID → productRequired

Product represented by the document.

searchableTextstringRequired

Text used for matching and ranking.

indexedAtdatetimeRequired

Time the document was last indexed.

Documentation

Overview

Search Document is the read model maintained by Search System. It is eventually consistent with the Product Catalog System.

TypeScript
/** The denormalized representation of product data indexed by Search. */
export interface SearchDocument {
  /** Search index document identifier. */
  documentId: string;
  /** Product represented by the document. */
  productId: unknown;
  /** Text used for matching and ranking. */
  searchableText: string;
  /** Time the document was last indexed. */
  indexedAt: unknown;
}
Entity/Fulfilment

Shipment

Aggregate Rootv1.0.0
shipment

A carrier delivery for a packed customer order.

Properties
shipmentIdUUIDRequired

Unique shipment identifier.

orderIdUUID → orderRequired

Order being shipped.

carrierReferencestring

External carrier tracking reference.

statusstringRequired

Shipment delivery status.

Documentation

Overview

Shipment is created by the Shipping System and updated from carrier events such as Shipment Created and Shipment Delivered.

TypeScript
/** A carrier delivery for a packed customer order. */
export interface Shipment {
  /** Unique shipment identifier. */
  shipmentId: unknown;
  /** Order being shipped. */
  orderId: unknown;
  /** External carrier tracking reference. */
  carrierReference?: string;
  /** Shipment delivery status. */
  status: string;
}
Entity/Fulfilment

Stock Item

Aggregate Rootv1.0.0
stock-item

The inventory record for a product variant at a location.

Properties
stockItemIdUUIDRequired

Unique stock item identifier.

productIdUUID → productRequired

Product held in stock.

locationIdstringRequired

Warehouse or fulfilment location.

availableQuantityintegerRequired

Quantity available to reserve.

Documentation

Overview

Stock Item is the Inventory System's view of available stock for a product at a fulfilment location.

TypeScript
/** The inventory record for a product variant at a location. */
export interface StockItem {
  /** Unique stock item identifier. */
  stockItemId: unknown;
  /** Product held in stock. */
  productId: unknown;
  /** Warehouse or fulfilment location. */
  locationId: string;
  /** Quantity available to reserve. */
  availableQuantity: number;
}
Entity/Fulfilment

Warehouse Pick

v1.0.0
warehouse-pick

A warehouse task to pick items for a completed order.

Properties
pickIdUUIDRequired

Unique warehouse pick identifier.

orderIdUUID → orderRequired

Order being picked.

assignedTostring

Warehouse worker or automation lane assigned.

statusstringRequired

Pick task status.

Documentation

Overview

Warehouse Pick represents the operational task handled by the Warehouse System before an order can be packed and shipped.

TypeScript
/** A warehouse task to pick items for a completed order. */
export interface WarehousePick {
  /** Unique warehouse pick identifier. */
  pickId: unknown;
  /** Order being picked. */
  orderId: unknown;
  /** Warehouse worker or automation lane assigned. */
  assignedTo?: string;
  /** Pick task status. */
  status: string;
}

Teams

Who owns what, and how to reach them.

Team

Customer Platform

customer-platform

Owns the Customer domain — customer profiles and authentication across Acme Inc.

Owns 29 resources1 member
Contact
Email

customer-platform@acme.test

Team

Fulfilment Platform

fulfilment-platform

Owns the Fulfilment domain — reserving stock, picking and packing orders, and shipping them to customers.

Owns 38 resources1 member
Contact
Email

fulfilment-platform@acme.test

Team

Ordering Platform

ordering-platform

Owns the Ordering domain — turning a checked-out cart into a confirmed order.

Owns 32 resources1 member
Contact
Email

ordering-platform@acme.test

Team

Payments Platform

payments-platform

Owns the Payments domain — authorizing payments, processing refunds, and integrating with external payment and fraud providers.

Owns 24 resources1 member
Contact
Email

payments-platform@acme.test

Team

Product Platform

product-platform

Owns the Product Catalog System — the source of truth for product data at Acme Inc.

Owns 18 resources1 member
Contact
Email

product-platform@acme.test

Team

Reviews Platform

reviews-platform

Owns the Reviews & Ratings domain — how customers review products and how those reviews are moderated, published and aggregated into ratings.

Owns 22 resources1 member
Contact
Email

reviews-platform@acme.test

Team

Search Platform

search-platform

Owns the Search System — keeps the catalog discoverable through fast, relevant product search.

Owns 9 resources1 member
Contact
Email

search-platform@acme.test

Team

Shopping Platform

shopping-platform

Owns the Shopping domain — the cart and the promotions applied to it.

Owns 18 resources1 member
Contact
Email

shopping-platform@acme.test

People

Individual owners in the catalog.

Person

David Boyne

dboyne

Lead developer

Owns 0 resources8 teams
Contact
Email

test@test.com

Made with EventCatalog