Event schemas that survive refactors
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.