Your schema, without a schema migration
Every Infralytiqs event carries two open maps alongside its standard fields. custom_dimensions holds strings — the things you slice by. custom_metrics holds numbers — the things you add up. Between them they are how a generic event pipeline learns your business vocabulary without anyone altering a table.
There is no registry to fill in first. You do not declare a dimension in the console and then start sending it; you send it, and the platform finds it. A background catalogue scans recent events for distinct keys and offers them in the report builder’s field picker within minutes. The practical consequence is pleasant: shipping a new dimension is a change to your application, not a change request against your analytics platform.
The split between the two maps is not cosmetic. Dimensions are stored as Map(LowCardinality(String), String), which is optimised for repeated values you group by. Metrics are Map(String, Float64), which is optimised for arithmetic. Putting a number in the dimensions map works, but you will not be able to average it without casting; putting an identifier in the metrics map mostly does not work at all.