Cardinality
Date: 2026-08-16
How many distinct values a property takes. Tools cap it, and past the cap everything gets swept into “(other)” — silently, with no record of what was lost, and it’s the values you most wanted that go first.
What it is
Cardinality is the count of unique values in a property.
low device 3 values mobile, desktop, tablet
medium category 40 values
high product_id 12,000 values
unbounded page_url millions every parameter combination
search_term millions free text
Unbounded is the category that causes problems, because it grows without limit as traffic grows.
What happens at the limit
Analytics tools store pre-aggregated tables per dimension. Beyond a threshold of distinct values, everything past the top N is bucketed:
requested: conversion rate by search_term
wool socks 412 sessions 3.4%
merino 208 4.1%
walking socks 190 2.8%
...
(other) 84,000 1.1% ← 60,000 distinct terms
The (other) bucket is unrecoverable. You can’t drill into it, you can’t find out what was in it, and you can’t tell whether the answer you wanted was in there. Worse, the aggregate rate for (other) is meaningless — it’s an average across tens of thousands of unrelated things.
[CHECK: cardinality limits are tool- and tier-specific and change — verify yours rather than assuming a threshold.]
In plain terms: the tool quietly stops counting the long tail and doesn’t tell you which part of your question it stopped answering.
Where it comes from
- Identifiers as properties.
product_id,order_id,user_id— high by nature, and sometimes necessary - URLs with parameters. Every UTM combination is a distinct page path unless stripped — UTM Governance
- Free text. Search terms, form input, error messages
- Concatenated values.
mobile|paid|uk|newmultiplies four low-cardinality dimensions into one high-cardinality field - Variables in event names. The failure Event Taxonomy Design exists to prevent —
product_viewed_wool_sockscreates one event name per product - Timestamps as properties. Every event has a unique value
Handling it
Bucket at collection. Store the useful shape rather than the raw value:
price_pence 2400 → price_band "£20–30"
search_term free text → search_length "1 word" / "2–3" / "4+"
→ search_matched true / false
Keep both where you can — the bucketed version for reporting, the raw in the warehouse.
Split into dimensions. mobile|paid|uk|new as four properties is four low-cardinality fields you can cross freely, rather than one field with hundreds of values.
Keep high-cardinality analysis in the warehouse. A warehouse has no cardinality limit — it has a cost curve instead, which is a budget question rather than a silent truncation. This is one of the clearer arguments for Warehouse-First Analytics.
Don’t send what you won’t query. Every unique value is storage and index cost forever — Events and Properties.
Checking for it
select count(distinct property_value) as distinct_values,
count(*) as events
from events
where property_name = 'search_term'Run it across your properties periodically. Two signals worth acting on:
- A property near the tool’s threshold — it’s about to start truncating, or already is
- A property whose distinct count grows linearly with traffic — it’s unbounded, and it will only get worse
Add it to the property checks in Guide - Auditing a Tracking Plan — a property specified as five values holding four thousand is a variable that leaked in, and it’s usually a symptom of a taxonomy problem rather than a storage one.