FEATURES / AUDIT LOG
An append-only
paper trail.
Every state-changing action lands in the audit log with actor, target, IP, user-agent, and a structured diff. Queryable by org, user, or aggregate.
What gets logged, automatically.
Every command
Application services emit AuditEvent records when commands succeed. Domain stays clean; the bus does the writing.
Structured diffs
Before/after snapshots of changed fields. JSON, queryable, indexed.
Actor + context
User ID, org ID, IP, UA, request ID. Impersonation captured separately so support actions are auditable.
Anonymization
After GDPR hard-delete, actor IDs are replaced with tombstones. The trail survives; identity does not.
Why a separate log instead of just DB triggers?
Triggers can't see the application context — who clicked what, from where, with which intent. The audit log is written from the application layer, captures the use case name, and ships with a CLI to reconstruct an aggregate at any point in time.
Soc 2 starts here.
A paper trail your security team will recognize as serious.