Filters
Dashboard filters, chart-level filters, and how they combine.
Filters narrow what a dashboard shows without changing the underlying datasets. They apply at three
levels, and they combine with AND.
| Level | Scope | Set by |
|---|---|---|
| Dashboard filter | Every chart bound to a matching field | Dashboard editor |
| Chart filter | One chart | Chart editor |
| Row-level rule | Every query, per viewer | Team Admin |
Dashboard filters
Add one from the dashboard header and bind it to a field. It reaches every chart on the dashboard bound to that field.
| Control | Good for |
|---|---|
| Date range | Time — supports relative ranges |
| Select | One value from a list |
| Multi-select | Several values |
| Search | High-cardinality fields such as email |
| Toggle | Booleans — “exclude test orders” |
| Numeric range | Amounts, counts |
Filters currently reach one dataset at a time
A filter on Orders.status touches charts reading Orders. Filtering across datasets needs
field mapping, which is coming soon.
Defaults and persistence
| Setting | Behaviour |
|---|---|
| Default value | What every viewer sees on first open |
| Remember per viewer | Their last selection is restored |
| Lock | Viewers cannot change it — used with embeds |
| Required | The dashboard renders only once a value is chosen |
Default to a narrow range
“Last 30 days” loads fast and answers most questions. A default of “all time” makes the first impression of the dashboard a slow one.
Filter state is encoded in the URL, so a filtered view can be shared as a link:
https://app.chartizer.com/d/weekly-dealers?region=EU&range=last_90d
Chart-level filters
Set in the chart editor, always applied, and not adjustable by viewers. Use them for definitional constraints — the ones that are part of what the chart means:
status != 'test'
created_at >= '2026-01-01'
Definitional filters belong on the chart, not the dashboard
If a viewer can clear a filter that makes the number correct, eventually someone will, and they will screenshot the result.
Row-level rules
Row-level rules restrict which rows a person can see, whatever chart they open. They are defined per dataset by a team Admin.
{
"dataset_id": "ds_8f2a",
"rule": "region = {{user.attributes.region}}",
"on_missing_attribute": "deny"
}
| Attribute | Source |
|---|---|
user.email |
Account email |
user.attributes.* |
Set manually, or synced from SSO/SCIM |
user.groups |
Group membership |
Set on_missing_attribute to deny
With allow, anyone lacking the attribute sees everything. New members and service accounts
routinely lack attributes, so allow fails open exactly when it matters.
Row-level rules apply to exports, embeds, and the API — there is no path around them.
Interaction order
1. Row-level rules (cannot be overridden)
2. Chart filters (fixed by the chart author)
3. Dashboard filters (chosen by the viewer)
4. Chart transforms Top N, cumulative, moving average
Transforms run after filtering, which is why “Top 10 dealers” changes when the date range changes — as it should.
Debugging
A filter changes nothing
It is bound to a field the charts on this dashboard do not use. The filter editor lists which charts it currently reaches.
Two people see different numbers
Different filter state (check the URL) or different row-level rules. ⋮ → View as renders the dashboard as another member sees it.
Filtering makes the total go up
Almost always a join fanning out rows. Check the mapping’s cardinality on the charts involved.