---
title: "Event Sourcing made Simple"
description: "Event Sourcing stores application changes as immutable events, providing a history that can explain how current data came to be. The post introduces four components: Events record changes, Calculators update Aggregates from those events, and Reactors trigger side effects or create further events. Kickstarter implemented a minimal framework for d.rip using regular Active Record aggregates, a regular SQL database, synchronous atomic updates, and roughly 200 lines of home-made code. The approach supports replaying history to reconstruct past state, repair calculator bugs, backfill new aggregate fields, optimize read models, and forward events to analytics platforms, while presenting naming and mutation-to-event decomposition as important challenges."
---

# Event Sourcing made Simple

[Kickstarter](https://yomu.fyi/company/kickstarter) · Philippe Creux · Apr 20, 2018

**Type:** Explainer

## Summary

Event Sourcing stores application changes as immutable events, providing a history that can explain how current data came to be. The post introduces four components: Events record changes, Calculators update Aggregates from those events, and Reactors trigger side effects or create further events. Kickstarter implemented a minimal framework for d.rip using regular Active Record aggregates, a regular SQL database, synchronous atomic updates, and roughly 200 lines of home-made code. The approach supports replaying history to reconstruct past state, repair calculator bugs, backfill new aggregate fields, optimize read models, and forward events to analytics platforms, while presenting naming and mutation-to-event decomposition as important challenges.

## Context

The post addresses the difficulty of understanding how database state was produced, answering support and debugging questions, and maintaining hand-crafted data-history fields and event tracking. It also concerns reconstructing past states, correcting derived data after calculator bugs, and backfilling new aggregate fields.

## Approach / What changed

The described system persists immutable Events, uses Calculators to update current-state Aggregates, and uses Reactors to trigger side effects or publish further events. Kickstarter’s implementation for d.rip uses regular Active Record models, a regular SQL database, synchronous atomic updates, and a home-made framework of about 200 lines. Events can be replayed to rebuild aggregates and forwarded to analytics platforms.

## Takeaways

- Events are immutable records of application changes; replaying them can reconstruct state at a chosen point in time and help restore valid state after a Calculator bug is fixed.
- The minimal framework has four components: Events for history, Aggregates for current state, Calculators for applying events, and Reactors for side effects or additional events.
- Adding an aggregate field can be handled by adding the column, updating the Calculator, replaying events, and thereby backfilling the data; missing historical values may use implicit defaults or backfilling events.

**Tags:** [Architecture](https://yomu.fyi/topic/architecture), [GraphQL](https://yomu.fyi/topic/graphql), [Reliability](https://yomu.fyi/topic/reliability), [Testing](https://yomu.fyi/topic/testing)

- Source: [Kickstarter](https://medium.com/kickstarter-engineering/event-sourcing-made-simple-4a2625113224)
- Source URL: https://medium.com/kickstarter-engineering/event-sourcing-made-simple-4a2625113224
- Ingested by Yomu: 2026-08-30T12:07:43.077Z

[Read original post](https://medium.com/kickstarter-engineering/event-sourcing-made-simple-4a2625113224)
