Docs
grovs.io Start for free

Condition types

Every segment condition, the fields and operators it accepts, and its limits.

All Grovs Cloud plans and self-hosted Enterprise

Each condition has a type plus fields that depend on it. The examples show each condition in a segment definition's JSON form.

DashboardtypeMatches
Did an eventeventA built-in event, a custom event, or any activity
DevicedeviceDevice and app fields
Profile propertyprofileA property your app set on the user
First seenfirst_seenWhen the person first appeared
IdentifieridentifierYour own user ID, or an uploaded list
Acquired viaacquisitionThe install or reinstall that brought the person in
PurchasepurchaseIn-app purchases and subscriptions

Shared rules

  • Values. 1 to 100 per condition, each a non-empty string of up to 256 bytes.
  • Operators on text. is and is_not compare exact values. contains is a case-insensitive substring match.
  • Windows. See Time windows. A window is {"last_days": N} or {"from": "YYYY-MM-DD", "to": "YYYY-MM-DD"}.
  • Negative conditions. Those marked "negative" below must sit in an and group with a positive condition.

Did an event

Matches people who raised an event at least count times in the window.

JSON
{ "type": "event", "event_name": "checkout",
  "filters": [{ "field": "properties.plan", "op": "is", "value": "pro" }],
  "count": 3, "window": { "last_days": 30 } }
FieldRequiredNotes
event_typeone of threeA built-in event: app_open, view, open, install, reinstall, time_spent, reactivation, user_referred, screen_view, custom
event_nameone of threeA custom event name, up to 256 bytes
anyone of threetrue matches any activity
countnoAt least this many times. Default 1
windowyesUp to 90 days
filtersnoUp to 25. Each has field, op (is, is_not, contains) and value
negatenotrue means "did not". Negative

Give exactly one of event_type, event_name or any.

Filter fields: screen_name, platform, app_version, country, city, device_model, os, os_version, language, tracking_source, tracking_medium, tracking_campaign, ads_platform, or an event property as properties.<key>. In the dashboard, click where on the condition to add one.

Message events, such as push_open and in_app_viewed, do not count toward Any activity or Any custom event, because a message shown is not something the person did. Target a message event by its name instead.

Device

Matches on a device or app field.

JSON
{ "type": "device", "field": "platform", "op": "is", "value": ["ios"], "mode": "current" }
FieldRequiredNotes
fieldyesplatform, os, os_version, app_version, device_model, language, country
opyesis, is_not, contains
valueyes1 to 100 values
modenocurrent (default) or used
windowfor usedUp to 90 days

The two modes:

  • current device (current): the latest value seen in the last 30 days. No window. is_not means "has a known current value that is not this one", so it counts as positive.
  • any device used (used): any event with that value in the window. is_not means "not seen with that value in the window", so people with no activity in the window also match. This is_not is negative.

On self-hosted deployments, SEGMENT_DEVICE_CURRENT_DAYS sets the 30-day lookback of current.

Profile property

Matches the current value of a profile property your app set through the SDK, not its value at the time of an event.

JSON
{ "type": "profile", "field": "properties.plan", "op": "is", "value": ["pro"] }
FieldRequiredNotes
fieldyesproperties.<key>
opyesis, is_not, contains, is_set, is_not_set
valuenot for is_set, is_not_set1 to 100 values

is_not and is_not_set are negative. A person with no profile also matches is_not.

A dotted key such as user.plan and the nested path user › plan are the same property.

First seen

Matches the date of the person's earliest built-in event.

JSON
{ "type": "first_seen", "op": "gte", "value": "2026-01-01" }
FieldRequiredNotes
opyesgte (on or after) or lte (on or before)
valueyesAn ISO date, YYYY-MM-DD

Only built-in events set first seen. A person whose only activity is custom events never matches.

Identifier

Matches the user identifier your app set through the SDK.

JSON
{ "type": "identifier", "op": "is", "value": ["member-4471"] }
opValueMeaning
is_setnoneThe person has an identifier
is_not_setnoneThe person has no identifier. Negative
is1 to 100 valuesExact match
contains1 to 100 valuesCase-insensitive substring
in_listnoneThe identifier is in the segment's uploaded list
not_in_listnoneThe identifier is not in the uploaded list. Negative

in_list and not_in_list only work on a saved segment that has an uploaded list. See Identifier lists.

Acquired via

Matches people who had an install or reinstall from a link, campaign, source or medium in the window.

JSON
{ "type": "acquisition", "field": "campaign_id", "op": "is", "value": [41], "window": { "last_days": 365 } }
FieldRequiredNotes
fieldyeslink_id, campaign_id, tracking_source, tracking_medium
opyesis or is_not for link_id and campaign_id. is, is_not or contains for the other two
valueyesPositive integer IDs for link_id and campaign_id, text for the others. 1 to 100 values
windownoUp to 365 days. Without one, Grovs uses 365 days, or your retention if it is shorter

is_not is negative.

Purchase

Matches people with at least count purchases in the window, optionally above a spending total.

JSON
{ "type": "purchase", "product_id": ["pro_yearly"], "purchase_type": ["subscription"],
  "count": 1, "min_total_usd_cents": 999, "window": { "last_days": 90 } }
FieldRequiredNotes
product_idnoProduct IDs. Omit for any product
purchase_typenosubscription, one_time
store_sourcenoThe store. In the dashboard: on the App Store, on Google Play
countnoAt least this many purchases. Default 1
min_total_usd_centsnoMinimum total spend in US cents. Default 0. In the dashboard: totalling ≥ $
windowyesUp to 365 days, on the purchase date
negatenotrue means "did not buy". Negative

How purchases count:

  • One transaction counts once, from its buy. Renewals and repeat purchases are separate transactions.
  • A refunded transaction does not count, unless the refund was later reversed.
  • quantity raises the spend total. It does not multiply the count.
  • Totals use the purchase's US dollar value.

Saving a segment with a purchase condition fails while revenue tracking is off.

Limits

LimitValue
Groups per definition5
Conditions per group10
Filters per event condition25
Values per condition or filter100
Value length256 bytes
Identifiers per uploaded list200,000
Event and device windows90 days
Acquisition and purchase windows365 days

Self-hosted deployments can change the window caps with environment variables. The other limits are fixed.

Last updated 2026-10-26
Was this page helpful?