Criteria tell a query which records to include in the results. In the query designer, choose Edit Criteria... to open Edit Query Criteria. Add your conditions and groups, then choose Save Changes. After you save, the designer summarizes the criteria in plain language. If you have not added criteria, it shows This query has no criteria - all records will be returned.
Use this page to understand each condition type, which records it keeps, and the rules behind common surprises. For step-by-step instructions, see Design and Run a Query.
Groups: All and Any
Each group starts with All or Any, followed by of the following conditions are true:.
| Choice | Keeps a record when | Use it for |
|---|---|---|
All | Every condition and nested group in it is true | Narrowing: members of type X and joined after a date |
Any | At least one condition or nested group in it is true | Alternatives: type X or type Y |
Choose Add Condition to add a condition to the current group. Choose Add Group to add a nested group with its own All or Any. You can nest groups to any depth.
If any row in that group is incomplete, both buttons are unavailable. Finish the row, or delete it with its trash icon. If Add Condition or Add Group still seems unavailable when every row looks complete, zoom out your browser or display. At some zoom levels, these controls and the field dropdowns on later conditions can move out of reach after a group has several conditions.
When you need to replace one condition with another, add the new condition before you remove the old one. A group must have at least one condition before you can save it, so a group with its only condition removed will not save.
A common mistake is putting alternatives and restrictions in the same Any group. If a query must return several donation types but only within a date range, keep the date conditions in the top All group. Put the types in a nested Any group, or use is in list. If you mix the date and type conditions together, records from any date come back when they match one type.
If a query you copied or adapted from a working example returns no rows, check that you copied its All/Any grouping exactly. The same conditions can return zero rows when they are arranged in a different group structure.
If contains text does not reliably match partial values for a picklist-style field, list the exact values you want instead. Use several equals conditions in an Any group, or use is in list, instead of relying on partial text matching.
Operators
The operators you see depend on the field's data type.
| Operator | Field types | Keeps records where | Notes |
|---|---|---|---|
equals | Text, number, yes/no, list, date | The field equals the value | Text ignores letter case; identifiers must match exactly, including case. Dates match the whole day. Yes/No fields use Yes or No. For a multi-select field, equals and does not equal compare against one specific option at a time, not a set of several; use contains/does not contain to match against multiple selected values |
does not equal | Text, number, list, date | The field has a value other than the one you enter | See Blank Values |
is in list | Text, number | The field equals any value in the list | Enter one value per line (Enter values on each line), not separated by commas. Blank lines and repeated values are ignored. You need at least one value. Numeric fields such as a contact's Number field support this operator, so you can filter by a pasted list of numeric identifiers the same way as a list of text values. Very large lists, with thousands of values, can make the run fail; keep a list to roughly a thousand values or fewer, and split a larger one into batches. A value containing an apostrophe has occasionally kept this operator from previewing or running; if a list with an apostrophe stalls, try the record's ID instead of its name |
is not in list | Text, number | The field equals none of the values in the list | Use the same one-value-per-line format. Blank lines and repeated values are ignored. You need at least one value. The same numeric-field support and the same large-list and apostrophe notes as is in list apply |
contains text | Text | The field contains the text anywhere | Ignores letter case. The whole entry is treated as one piece of text |
does not contain text | Text | The field does not contain the text | Records where the field is blank are not kept |
contains | List (for example multi-select pick lists and checkboxes) | The field includes any of the chosen values | When two options share overlapping text — for example one label is fully contained inside another — you may need an inclusion condition for one option plus an explicit exclusion condition for the other overlapping option |
does not contain | List | The field includes none of the chosen values | Records where the field is blank are not kept |
is greater than, is greater than or equal to | Number, date | The field is above the value, or at least the value | These operators do not work on text fields; see Ranges |
is less than, is less than or equal to | Number, date | The field is below the value, or at most the value | As above |
is blank | Any | The field has no value | An empty text value is not blank |
is not blank | Any | The field has a value | |
matches pattern | Text | The field matches a regular expression | Case-sensitive. An invalid pattern makes the run fail |
In text searches, % and _ are wildcards. % stands for any run of characters, and _ stands for any single character. That means a search for "50%" matches more than the literal text you entered.
How You Enter a Value
Not every value is typed as plain text, even when you use a text operator such as equals or contains text.
- Lookup and reference fields (for example a related organization, contact, or membership package) use a search-style picker. Type to find the record, then choose it. A few of these fields show options only after you start typing, so an empty-looking list does not mean there is nothing to find.
- After you choose a value, the criteria editor sometimes displays the condition using the field's underlying identifier. For example, it may show
Product IDinstead ofProduct, orPackage IDinstead ofPackage. This is only a display change; the condition still filters using the record you chose. - A handful of fields, such as a chapter identifier, do not offer a picker. Type the identifier directly. You can still filter on several identifiers at once with
is in list. - A small number of fields backed by a short, fixed list of existing values do not accept a value you type yourself, even with
equalsorcontains text. Fields such as who created or who last modified a record keep only a value already in the list once you move to another field. If the criteria control will not accept the value you need, add the field as an output column instead and narrow the returned results manually. A field backed by a defined list of picklist-style values can behave the same way withcontains textordoes not contain text: instead of matching any part of the text you type, it can act like an exact selection from the list, so a partial value such as a word inside a longer option may not match the records you expect. - In at least one case, filtering by a related record's name field missed matches that the identical condition using the record's ID field caught. If a name-based condition on a related record returns fewer results than expected, try the corresponding ID field for the same relationship instead.
If a specific criterion's input does not behave the way this page describes for its data type, run a small test to see what it matches before you rely on it in a saved or scheduled query.
To find contacts whose email address may have a mistyped domain, such as a misspelled common provider, build the condition with does not contain text and the correct domain fragment instead of contains text. Excluding the domain you expect surfaces records that do not match it, including likely typos, for you to review.
Blank Values
is blankkeeps records with no value at all. When a text field is saved as an empty value, it is not blank for this condition, so "email is blank" misses contacts whose email appears empty.does not contain textanddoes not containdo not keep records where the field is blank.- In practice,
does not equalon a text field usually behaves the same way. It keeps only records that have some other value, so it excludes records where the field is blank. Pair it withis blankin anAnygroup if blank records should count too. - A field can display as
Noin your query results even when nothing was ever stored for it, because the display fills inNofor a blank value. Ifequals Nounexpectedly returns nothing for a field like this, usedoes not equal Yesoris blankinstead to capture those records. - For at least one yes/no-style field — a communication preference's enabled flag —
equals Yesorequals Nocan return no matches even when qualifying records exist.is not blank, orcontains textwith the value, can find them instead. - Adding
Contact - ID is not blankto contact-based criteria can exclude leftover blank rows left behind by a deleted contact, since only a current, real contact record has an ID.
A checkbox-style field is typically saved as Yes when it is checked. When it is unchecked, it is often stored as blank instead of an explicit No. That is why equals No alone can miss unchecked records, and why the pattern below pairs equals No with is blank.
When blank records should count, include them explicitly. For an opt-out field that can be Yes, No, or blank, use an Any group with equals No and is blank to keep everyone who has not opted out. With two opt-out fields, use one such Any group for each field inside a top-level All group. A single does not equal Yes per field under All looks equivalent, but it is not. It would incorrectly exclude a record where one field is blank and the other is Yes, so each field needs its own blank-inclusive group first.
Tip
When you are not sure whether you want "exclude if both fields are Yes" or "exclude if either field is Yes," write out a few example records and mark which ones should be excluded. The answer determines whether you combine your conditions with All or Any.
To find records that have no related membership, such as non-members, use is blank on the membership field. For example, a query of type Registrations in the events area with the membership field set to blank identifies event participation by people who are not members.
Ranges on Numbers and Dates
The four range operators compare numbers and dates only. If you use one on a text field, even a text field that holds digits, the run fails. They also cannot split text alphabetically, so "last name is greater than F" does not work. Sort by the text field instead.
Pay close attention to the boundary you choose. is greater than excludes the value itself, so a membership starting exactly on the boundary date is left out. Use is greater than or equal to to include it.
Dates
- Specific dates. The date picker saves a day, not a time. You cannot filter on a time of day, even for fields that show a time in the results. For criteria built directly, such as through the API or a custom query definition, some timestamp fields — for example when a record was last modified — accept a full ISO 8601 value with an explicit time zone (for example
2025-02-25T23:40:53Z). That lets you filter more precisely than the console's day-only date picker allows. - Date fields (a day with no time) are compared as days, with no time zone. A login-date field, such as a portal last-login date, behaves like other date fields and uses the same date-style controls and operators described here.
- Date-and-time fields, such as when a record was created or last changed, compare the day you pick using these rules:
| Operator | Treatment of the day you pick |
|---|---|
equals, does not equal | The whole calendar day, at any time |
is greater than | From the start of the following day, US Eastern time |
is greater than or equal to, is less than, is less than or equal to | Midnight UTC at the start of that day, which is the evening of the day before in US time zones |
For example, "created on or before 31 January" on a date-and-time field misses most of 31 January in US time zones. Check records near your boundaries when precision matters.
An exact equals match on a date can be too narrow when you are not certain of the precise stored value, such as when you are troubleshooting a missing record or the year or day was typed incorrectly. Instead of failing outright, an incorrect exact date can leave Query Results stalled on Running query... without showing a clear error. Switch to a broader operator, or a small range around the date you expect, to find records that an exact match misses.
Relative Dates
A relative date moves with each run, so a saved or scheduled query keeps checking the same window.
- On a date condition, select the alarm-clock icon (
Toggle relative date). - Build the value from the pickers: a number, a unit such as days, and whether it falls before, on, or after the
query execution date. For example, use "30 days before the query execution date", or "on the query execution date" for today.
If you need several relative-date conditions in one query, the editor's dialog scrolls so you can keep adding them without losing access to the ones already there.
Rhythm works out the date when each run starts, using the current time in UTC, so windows near midnight can shift by some hours. Examples:
| To keep | Condition |
|---|---|
| Records created in the last 7 days | Created date is greater than or equal to 7 days before the query execution date |
| Memberships expiring in exactly 90 days | Expiration date equals 90 days after the query execution date |
| End date today or later, or no end date | An Any group: end date is greater than or equal to on the query execution date, and end date is blank |
There is no dynamic "last month" option. Relative dates count days before or after the query execution date, not a rolling previous calendar month. For a report meant to run on the first of each month and cover the prior month, edit the query's fixed date range each time instead of relying on a relative-date condition to roll over automatically.
For the relative-date rules used elsewhere in Rhythm, see Expression Functions and Relative Dates.
Narrowing to One Record
Some query types are about one parent record, such as one event's registrations. You choose the record in Select Query Type, and the designer shows it above the criteria with (change) to pick another. A query type that requires a record cannot run without one. You can choose only one record per query. If you clear the record in the designer, the line disappears; start a new query to choose one again.
What Criteria Cannot Do
- Compare two fields. There is no condition such as "paid date is after due date". Filter on fixed or relative dates instead, or use an external data process for more complex comparisons.
- Count or total. Criteria choose records; they cannot keep "chapters with more than 10 members". See Query Limits and Execution Rules.
- Use fields the query type does not offer. A condition on a field that has since been removed makes the run fail. See Save a Query and Organize Folders to repair it.
Fields used in criteria do not count toward the limit on output and sort fields.
When Criteria Are Refused
If Rhythm cannot use the criteria, the designer shows Unable to preview query, or Query Results shows Unable to execute query, with the reason. Some problems, such as a range condition on a text field, can instead leave Query Results on Running query... this will take a few seconds.... In either case, reload, reopen the query in the designer, and check each condition's field, operator, and value.
A saved query can also start returning unexpected results with no error if a field used in a condition changes internally on Rhythm's side. A condition's saved value can stop displaying in the criteria editor while it continues to filter with the value you originally chose, or the narrowing from a condition can quietly change. If a saved query's results shift with no changes on your part, reopen it in the designer, check each condition's field and value, and resave it. Choose the value again if it is not shown.
If a saved query's results look wrong after you open it from a dashboard or KPI link, check the actual criteria in the query designer instead of trusting only the query's name. The name shown can be misleading while the criteria still differ from what you expect.