Когорты
Множества людей, определенные тем, что они делают или что они есть: каждая когорта это имя и определение, а определение это условия, которые читаются как написаны: сделал это событие столько раз за столько дней, или несет этот атрибут с этим значением. Пустое определение не выбирает никого, намеренно.


The library
Each card is one cohort: its name, whether it is active, how many people it currently selects and how fresh that answer is. A cohort whose clauses count behaviour over history is swept on a schedule and says when it was last evaluated, or that it never has been; one defined purely by current attributes is live and carries no timestamp, because a timestamp would imply a staleness it does not have. The toolbar narrows by search, kind and state, and deleting asks first, warning that analyses filtered by the cohort stop being filtered by it.
Есть и третий вид, статический: не определение, а закрепленный список людей. Его сохраняют из результата на рабочем столе аналитики через Save или собирают из вставленного списка в окне New cohort, и он никогда не переоценивается, поэтому там, где выметаемая когорта несет отметку времени, его карточка читается как никогда, намеренно. При открытии разворачивается сам список, а не определение: сколько людей в нем, откуда список взялся, Add people и удаление рядом с каждой строкой.
The definition editor


Opening a card unfolds its definition in place: behavioural clauses (did an event at least so many times within so many days, with the project's own event names suggested) and state clauses (an attribute compared to a value). A cohort is named first and defined after, and an empty definition selects nobody rather than everybody, which the open row says in as many words. Opening a second card does not close the first, so two definitions can be compared side by side without losing edits.
Окно New cohort сначала спрашивает имя, а затем Membership, потому что два вида делаются по-разному, и окно, дающее когорте имя, и есть место, где решается ее вид. Defined by rules дает определение, описанное выше. A fixed list of people открывает поле для различающих идентификаторов, по одному в строке, до 10 000 за раз, и позже можно добавить еще; сделанная так когорта рождается вместе со своими людьми и сразу активна.
Where cohorts are used
A cohort scopes a question in the Analytics workbench, targets a campaign in the Inbox, and gates workflow triggers on the Workflows screen. The same set of people, wherever the set is needed.
Пункт Копировать в… в строке открывает копирование конфигурации с уже отмеченным объектом; см. «Проекты», «Копирование конфигурации».
Where this meets the API
The concept behind the screen is the People and cohorts pillar; the people being selected are the People directory. On the wire: the library is the cohorts query, cohort reads one and cohortMemberCount counts its people; editing is createCohort, updateCohort, setCohortActive and deleteCohort; a static cohort is born by createStaticCohort from a pasted list or by createCohortFromResult from a result, its list moves by addCohortMembers and removeCohortMembers, and cohortMembers reads it back a page at a time (GraphQL reference).
The definition as JSON
A rules cohort's definition is one JSON object, the definition argument of createCohort and updateCohort and the definition field of the MCP tools prodantix.cohorts.create and prodantix.cohorts.update. It holds clauses, a list of at most 32, and a person is a member when every clause matches. An empty list selects nobody. A field the shape does not name is refused, so read an existing cohort with cohort or prodantix.cohorts.get before changing one.
{
"clauses": [
{ "kind": "state", "condition": { "attribute": "plan", "op": "eq", "value": "pro" } },
{ "kind": "state", "condition": { "attribute": "country", "op": "in", "value": ["DE", "AT", "CH"] } },
{ "kind": "behavioural", "event": "purchase", "atLeast": 3, "withinDays": 30 }
]
}State clauses
{ "kind": "state", "condition": { ... } }. The condition names an attribute, one of the person's properties or distinct_id, an op and, for most operators, a value. The operators are eq, neq, in, not_in, contains, gt, gte, lt, lte, is_set, is_not_set. eq, neq and contains compare as text; gt, gte, lt and lte compare as numbers; in and not_in take a list of values; is_set and is_not_set take none, and a property that is empty text counts as not set. A cohort made only of state clauses is live: a person joins or leaves the moment an event changes the property. The two cohort operators of flag targeting, in_cohort and not_in_cohort, are refused here: a cohort cannot be defined by another cohort.
Behavioural clauses
{ "kind": "behavioural", "event": "purchase", "atLeast": 3, "withinDays": 30 }: the person did the event at least atLeast times in the last withinDays days. Both are whole numbers, and a person counts only once they did the event at all, so an atLeast of 0 reads as 1. One behavioural clause makes the cohort swept: its members are worked out on a schedule rather than as events land, and the cohort says when it last was.
Static cohorts
A static cohort's definition is { "kind": "static", "clauses": [] }: its members are a list somebody wrote, not rules. Given to createCohort it makes an empty list; createStaticCohort or prodantix.cohorts.create_static makes one holding its people, and createCohortFromResult makes one from a result. An update cannot turn a rules cohort into a static one or back; make a new cohort of the kind you want.