Event sourcing has a reputation for being the kind of decision a senior engineer makes to justify their existence. It is slow to start, the tooling is thinner than ORMs, and the onboarding curve for new hires is real. We did it anyway. Here is why.
The architectural case
In a CRUD system, the current state is the source of truth and history is a side effect. In an event-sourced system, history is the source of truth and current state is a projection. Those two positions look symmetric on paper. In practice they behave completely differently the moment something goes wrong.
When a finance lead at one of our customers asked, "what did this number look like on the fifteenth?", we did not need to query a backup. We replayed the log. The number appeared in nine seconds. That is the moment event sourcing pays for itself.
Every screen in Aixys has a "rewind" gesture. It is a UX affordance, but it is only possible because the underlying memory is an append-only log.
The compliance case
Auditors love event-sourced systems. The audit log is not a bolted-on feature — it is the system. When SOC 2 asks "who changed this record and when?", the answer is a row lookup, not a forensic exercise. HIPAA-grade access traces work the same way.
Compliance should be boring. Event sourcing makes it boring.
The AI case
If the AI citing "customer closed on 2026-03-14" can point to the exact event that recorded the close, the citation is no longer marketing copy. It is a pointer to a row that cannot be edited. Hallucinations get expensive fast when the grounding is literal.
What you trade away
- Write throughput — you pay for the append. We mitigate with per-entity partitioning.
- Schema evolution — renaming a field is not a rename; it is a new projection. We have versioned every event type from day one.
- Team learning curve — we hire for curiosity on this, and pair-program the first three weeks of every new hire.
None of those are dealbreakers for a platform whose job is to remember a company. They would be dealbreakers for a consumer app. That is why we are not one.