The filter shape
A filter has a match mode and a list of conditions:matchisall(every condition must be true, an AND) orany(at least one condition must be true, an OR). In the audience builder this is the “Show flow when ALL / ANY conditions match” toggle.- Each condition is a
property(the attribute key), anoperator, and avalue.
Operators
The resolution engine supports the operators below. The dashboard’s audience builder currently lets you pick the first group (equality and numeric); the others are evaluated by the engine and are useful to know when you inspect a stored filter or manage placements through the API.Selectable in the audience builder
Also supported by the engine
The
version_* operators parse versions part by part (3.10.0 is greater than 3.9.0) and strip non-numeric suffixes, so 1.0.0-beta is treated as 1.0.0.Properties (the attributes contract)
A condition’sproperty is a key the SDK includes in the resolve request’s attributes map. Only what the SDK sends is reachable. The dashboard’s audience builder suggests a curated set of properties:
The first two are populated for you by the iOS SDK (from the app bundle). The Expo SDK does not set
app.version or app.build automatically; if you want to target on app version there, pass your own key (for example app_version) in the SDK context. The rest are custom: your app supplies them. You are not limited to this list, any key you put in the SDK context can be targeted, but the dashboard only suggests these.
Setting attributes from the SDK
Attributes that you control are set through the SDK context. Both SDKs accept an initialcontext at configuration time; they differ in how you change it afterward.
- iOS
- Expo
app.version, app.build, and device info). See Variables and SDK context (iOS) for the full list.Example: premium users with enough sessions
This filter targets users on thepremium plan who have opened the app at least five times.
Dashboard side (the stored audience_filter):
equals premium and Sessions Count greater or equal 5.
App side (the matching attributes your iOS app sends):
plan, sessions_count) must match the property names in the filter exactly. Numeric operators like gte work whether the value arrives as a number or a numeric string, so 5 and "5" both compare correctly.
Common mistakes
- Property name mismatch. The filter property and the attribute key must be identical. A filter on
planwill never match an attribute namedsubscription_plan. - Expecting server-side enrichment. The backend only evaluates what the SDK sends. It does not look up user records or enrich attributes. If you do not send
is_verified, a filter on it cannot match (useexistscarefully, an absent attribute is treated as not present). - Treating
regexas full regex. Theregexoperator is glob-style: only*is a wildcard. A PCRE pattern like^prem.*$will not behave as you expect. - Case assumptions.
equalsis case-sensitive, butcontains,starts_with, andends_withare case-insensitive. Normalize values you care about. - Dotted property names. See the warning above. Use flat custom keys for targeting you depend on.