28 Feb 2026 ยท 11 min read

Event schemas that survive refactors

Code projected on a wall in a studio

Every major version is a small act of forgetting. If your telemetry names mirror internal class names, the next rename orphans a year of charts. Schema design is therefore a product decision, not a plumbing detail.

Prefer stable intents

Name events after user intents โ€” auth.token_refreshed, upload.completed โ€” rather than TokenManagerV3.refresh. When classes move, intents usually remain. Document aliases when you must rename; never silently overwrite.

Carry a schema_version field

Embed an integer schema version on every payload. Warehouses can branch transformations without guessing which build emitted which shape. In class we practice dual-writing for one release cycle, then cutting the old path with a dated note in the decision log.

Deprecate like you mean it

Mark fields deprecated in the catalog with an owner and a removal target. Dashboards that still rely on them should fail loudly in staging. Quiet breakage is how teams lose faith in application analytics for developer library engagement altogether.

โ† All posts