Skip to main content
Groups let multiple participants share a balance. A group is its own ledger entity, with balances separate from any individual participant. Useful for families, teams, or organizational pools. Groups exist at the organization level and are not scoped to a single program. Balance operations are program-scoped (you specify program_id when adjusting), but the group itself can participate across programs.

Creating a Group

Membership

Adding members

Removing members

Members are soft-deleted with a LEFT status. Use include_former=true when listing to see former members. Removing a member does not affect the group’s balance.

Roles

The last ADMIN in a group cannot be demoted or removed.

Group Balances

Adjust a group’s balance directly via the API:
Group balances use the same three-bucket model as participants. Each asset returned by GET /v1/groups/{id}/balances includes available, held, and deferred amounts. The balance field remains as a deprecated compatibility total equal to the sum of those buckets. Use the bucket fields for reconciliation. Hold, release, and forfeit each have a group endpoint for moving or removing value.

Crediting Groups from Rules

Rules can credit a group’s balance instead of the participant’s by adding a target to the action. This rule pools purchase points into a family group:
The participant who triggers the event must be a member of the target group, or the action fails. The same targeting works for state actions. For example, tracking how many purchases the group has made:

Groups in CEL Conditions

When a rule evaluates, the groups variable contains a list of groups the participant belongs to. Each entry has:
groups is a list because a participant can belong to multiple groups. Prefer groups.exists(g, ...) over assuming a specific list position.

Group State

Groups support the same state types as participants: tags, counters, and attributes.
PUT on a counter sets an absolute value and is last-write-wins; increment adds delta atomically, so concurrent writers never lose updates, and negative deltas decrement. See Increment a group counter. Group state is available in CEL via the groups variable and can be updated from rule actions using "target": {"type": "GROUP", "id": "{group_id}"}.

Archiving Groups

Archived groups are excluded from listings unless include_archived=true is set. Archived groups cannot be modified.