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:

Text
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:

Text
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.

Each viewer sees only their own region
{
  "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

Text
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.