Designing Multi-Platform Event Taxonomies: From Free-Text to JSON Schemas
The Chaos of Unregulated Event Names
In early-stage development, engineering teams often pass arbitrary string literals into analytics trackers:
Analytics.track("user_clicked_checkout")Tracker.log("PurchaseButtonTapped", {"val": 49.99})window.gtag("event", "buy_now_press", { order_total: "49.99" })
Within twelve months, your data warehouse contains three different names for the identical conversion event, incompatible parameter data types (float vs string), and missing metadata. Data analysts spend 60% of their time writing SQL COALESCE and regex cleanup scripts instead of generating actionable insights.
The Object-Action Standard
A clean taxonomy begins with the Object-Action Syntax. Every event is phrased as a noun (the object acted upon) followed by a past-tense verb (the action that occurred).
Examples of Object-Action Parity:
Account Created(notsignup,user_registered, ornew_account_btn)Document Exported(notexport_click,pdf_saved, ordownload_doc)Order Placed(notpurchase,checkout_complete, orbuy_now)
+-------------------------------------------------------------+
| Event: "Order Placed" |
| - Object: Order |
| - Action: Placed |
| |
| Properties: |
| - order_id: string (UUID) |
| - total_amount_cents: integer (> 0) |
| - currency_code: string (ISO 4217) |
| - payment_method: string ("card" | "qr" | "bank_transfer") |
+-------------------------------------------------------------+
Automated CI/CD Schema Validation
To ensure developers cannot ship non-compliant telemetry code, store your event definitions as formal JSON Schemas in a centralized repository or shared submodule:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "OrderPlacedEvent",
"type": "object",
"properties": {
"event_name": { "type": "string", "const": "Order Placed" },
"properties": {
"type": "object",
"properties": {
"order_id": { "type": "string", "pattern": "^[0-9a-fA-F-]{36}$" },
"total_amount_cents": { "type": "integer", "minimum": 1 },
"currency_code": { "type": "string", "pattern": "^[A-Z]{3}$" }
},
"required": ["order_id", "total_amount_cents", "currency_code"],
"additionalProperties": false
}
},
"required": ["event_name", "properties"]
}
In your build pipeline, generate type-safe wrapper classes directly from these JSON schemas using code generators for Swift, Kotlin, and TypeScript. When a developer invokes OrderPlacedEvent, the compiler enforces all required attributes at build time.
The Governance Lifecycle
- RFC Proposal: When a new product feature is designed, the product manager submits a pull request proposing new event schemas.
- Automated Schema Linting: CI verifies schema syntax and prevents collision with existing event names.
- Engineering Integration: Both iOS and Android teams generate their SDK wrappers simultaneously, guaranteeing platform parity before production release.
Specialized cross-platform telemetry engineers auditing behavioral pipelines across native iOS, Android, and Web clients.