On this page
Approach 1: The Thin Event (Only an ID)
Approach 2: The Fat Event (Full Details)
Which Approach Is Better?
Best Practices for Event Content
Wrapping Up
Grokking Events in System Design: What They Are and What to Include


On This Page
Approach 1: The Thin Event (Only an ID)
Approach 2: The Fat Event (Full Details)
Which Approach Is Better?
Best Practices for Event Content
Wrapping Up
This post demystifies events in event-driven microservices architecture, comparing thin vs. fat event payloads and sharing tips to keep your systems loosely coupled.
Imagine your microservices don’t call each other directly, but instead broadcast messages about things that happen.
That’s the idea behind event-driven architecture (EDA).
One service emits an event (a message that “something happened”), and other services interested in that event can react to it asynchronously. This decouples services and helps systems scale.
But it raises a key question: what information should an event carry?
For example, an OrderPlaced event in an e-commerce app could prompt the shipping service to pack the order and the notification service to email a confirmation – all triggered by one event without direct calls between services.
So, what goes inside an event like OrderPlaced?
Should it just contain an order ID, or include all the details of the order (items, prices, customer info, etc.)?
In practice, system designers typically choose one of two approaches:
Approach 1: The Thin Event (Only an ID)
Keep events minimal.
Our OrderPlaced event might include only an order ID (say { order_id: 1234 }).
Any service that receives this event and needs more data would then call back to the Order Service to fetch those details.
This makes the event lightweight, but thin events have drawbacks:
-
Coupling via lookups: Every consumer must contact the Order Service for details. Your “decoupled” microservices become indirectly coupled since they all rely on the Order Service for info.
-
Extra network calls: If multiple services get the event, each one calls the Order Service for data. That’s a lot of duplicate traffic. These calls add latency and can overwhelm the Order Service under load.
In short, a thin event saves on message size, but shifts complexity (and load) onto the consumers and the source service.
Approach 2: The Fat Event (Full Details)
Alternatively, make events self-contained.
A “fat” event carries the details so listeners don’t need to ask anyone else.
Our OrderPlaced event would then include not just the order ID, but everything a subscriber might need – item details, prices, customer info, shipping address, etc.
Detailed events have benefits:
-
Looser coupling: Consumers don’t need to call the Order Service; they can act independently with the data in the event.
-
Fewer calls: No matter how many services receive the event, it’s one broadcast message. There’s no flurry of follow-up requests, meaning less chatter and lower latency overall.
However, fat events come with trade-offs:
-
Bigger messages: Each event is larger. Message brokers (Kafka, RabbitMQ) have size limits, and hefty events use more bandwidth. Be mindful of event size.
-
Schema evolution: More fields mean a tighter schema contract with consumers. If you change the event format later, you could break consumers. Plan for versioning to maintain compatibility.
-
Data duplication: A detailed event duplicates data from the source service (often an acceptable cost for decoupling).
Which Approach Is Better?
Engineers often favor fatter events because they reduce dependencies and chatter between services.
If information will be useful to consumers (and isn’t huge or sensitive), include it in the event.
Thin events can work for simple notifications, but usually they just shift complexity elsewhere.
Best Practices for Event Content
Regardless of approach, a few best practices apply:
-
Standardize your events: Use a consistent structure (type, timestamp, IDs, etc.) for all events, and manage schema versions so you can update events without breaking subscribers.
-
Keep events focused: Include the data consumers truly need so they don’t have to make extra calls. Don’t overload events with info nobody uses – find the sweet spot where an event is informative but not bloated.
Wrapping Up
Events are the backbone of EDA, and designing their content well is key to effective microservice communication.
In general, rich events lead to more decoupled and efficient services, while overly sparse ones create hidden dependencies and extra work.
The goal is to include enough data that other services can do their job without extra calls, but not so much that events become unwieldy.
Design your events with that balance in mind – always ask “Will a consumer need this?”
If yes, include it.
With the right context in each event, your microservices can work together in harmony.
What our users say
Tonya Sims
DesignGurus.io "Grokking the Coding Interview". One of the best resources I’ve found for learning the major patterns behind solving coding problems.
Steven Zhang
Just wanted to say thanks for your Grokking the system design interview resource (https://lnkd.in/g4Wii9r7) - it helped me immensely when I was interviewing from Tableau (very little system design exp) and helped me land 18 FAANG+ jobs!
KAUSHIK JONNADULA
Thanks for a great resource! You guys are a lifesaver. I struggled a lot in design interviews, and this course gave me an organized process to handle a design problem. Please keep adding more questions.
Designgurus on Substack
Deep dives, systems design teardowns, and interview tactics delivered daily.
Access to 50+ courses
New content added monthly
Certificate of completion
$29.08
/month
Billed Annually
Recommended Course

Grokking the Object Oriented Design Interview
58,682+ students
3.9
Learn how to prepare for object oriented design interviews and practice common object oriented design interview questions. Master low level design interview.
View Course