> ## Documentation Index
> Fetch the complete documentation index at: https://docs.voxworks.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# List Membership Rules

> Let a list fill itself: set the conditions a contact has to meet, check who matches, choose how often the rule re-checks, run or pause it, read its run history, and feed the list straight into an outbound batch.

## What is a membership rule?

A **membership rule** turns a list into a live segment. Instead of adding contacts by hand, you describe who belongs in the list (for example, *contacts added in the last 7 days who have never been called*) and Voxworks sorts your contacts into it for you. The rule keeps working after you save it: new contacts that arrive from an import, a connected CRM, the API or an automation are checked against it, and the list is re-checked on a schedule so conditions that depend on time (such as *not contacted in the last 30 days*) stay true.

A list with a rule is still an ordinary list. You can add contacts to it by hand, point a [batch](/batches/source-lists) at it, wash it, and export it. The rule only adds contacts, and optionally takes out the ones it added once they stop matching.

<Note>
  Membership rules are set up from the **Contacts** page (**Phone System > Contacts**).
</Note>

***

## Setting up a rule

There are two ways to open the rule editor, both in the **Lists** side panel on the Contacts page:

* **A new list:** click **+** at the top of the panel and choose **From Rules**. The **Create List From Rules** dialog asks for a **Name** (the same naming rules as any list apply: unique within your team, at most 255 characters). Click **Create List** and the rule editor opens for the new list.
* **An existing list:** hover the list, click the pencil and choose **Add a rule**. If the list already has a rule, the same menu item reads **Membership rule** and opens it for editing.

You can also select a list without a rule and click **Set up a rule** on the card above the contacts table. That card reads *"Contacts are added by hand. A rule can keep this list filled for you."*

Only the person who created the list, or the team owner, can add or change its rule.

***

## The rule editor

The editor opens as a side sheet headed **Who belongs in *(list name)*?**, with the hint *"Set the conditions a contact has to meet, then run it to fill the list."*

### What is this list for?

An optional description of the list's purpose, up to 500 characters (placeholder: *Buyers who have never been called*). It is shown to teammates and does not change which contacts match.

### A contact belongs here when

Choose how the conditions combine:

| Option                    | Meaning                                                               |
| ------------------------- | --------------------------------------------------------------------- |
| **every condition holds** | A contact must meet all of the conditions (AND). This is the default. |
| **any condition holds**   | A contact needs to meet only one of the conditions (OR).              |

Click **Add condition** to add a row. Each condition has three parts:

1. **A field.** Click **Choose a field** and pick from the searchable list (*Search fields...*).
2. **An operator**, such as *contains* or *in the last*.
3. **A value**, where the operator needs one.

Remove a condition with the **x** at the end of its row. Until you add a condition the editor reads *"No conditions yet — every contact would qualify."* A rule needs at least one complete condition before it can be saved, and every row must be finished: an incomplete row shows *"Finish every condition before saving."*

As you build the rule, an **In words:** line below the settings restates it in plain English, so you can confirm it says what you meant.

### Fields you can use

The field picker groups fields by where the data comes from:

| Group                                                         | Fields                                                                                                                                                    |
| ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Contact**                                                   | Name, First name, Last name, Phone number, Email, Address, Location, Title, Age, Status, Gender, **Added to Voxworks** (the date the contact was created) |
| **Call history**                                              | **Times called** (a number), **Last contacted** (a date)                                                                                                  |
| **Labels**                                                    | **Label**: the contact's [tags](/contacts/tags)                                                                                                           |
| One group per [custom variable type](/custom-variables/types) | The type's own fields, with the labels your team gave them. A condition on a custom variable field matches contacts linked to a record of that type.      |
| One **… data** group per connected CRM                        | Fields from the contact data a CRM integration such as [Agentbox](/integrations/agentbox) or [Rex](/integrations/rex) imported.                           |

### Operators

The operators offered depend on the kind of field:

| Field kind                                                                | Operators                                                                      |
| ------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| Text (for example Name, Email, Address)                                   | contains, not contains, starts with, ends with, is, is not, empty, not empty   |
| Number (Age, Times called)                                                | is, is not, less than, greater than, empty, not empty                          |
| Choice (Status, Gender, Label, yes/no fields)                             | contains, not contains, empty, not empty                                       |
| Date (Added to Voxworks, Last contacted, date fields on custom variables) | **in the last**, **not in the last**, between, before, after, empty, not empty |

**in the last** and **not in the last** take a number and a unit (**hours**, **days** or **weeks**). The window is measured back from the moment the rule runs, so *Last contacted not in the last 30 days* keeps meaning "not contacted for 30 days" every time the list is re-checked, rather than turning into a fixed date. There is no month unit: use days or weeks. A contact with no date in the field counts as outside any window.

### Who matches right now

Before saving, click **Check matches** in the **Who matches right now** panel to test the rule against your contacts. The panel shows how many contacts match (for a very large contact book, "of the first *N* checked"), how many of them have no phone number and will be skipped, and a short sample of matching names and numbers. After you change the rule, click the refresh icon (**Check again**) to update the count.

Checking matches never changes the list.

***

## Keeping the list up to date

The settings under the conditions decide when the rule runs on its own and what it does with contacts that no longer match.

| Setting                                     | What it does                                                                                                                                                                       | Default                    |
| ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- |
| **Keep this list up to date automatically** | *"Contacts are sorted in whenever new ones arrive, without anyone pressing a button."* Turn it off to run the rule only by hand.                                                   | On                         |
| **Check again**                             | *"How often to re-check, for rules that change with time on their own."* Choose **Every hour**, **Every 6 hours**, **Every day**, **Every week** or **Only when contacts arrive**. | **Every day**              |
| **Sort new contacts straight away**         | *"Re-check as soon as an import or a connected system adds contacts, instead of waiting for the next check."*                                                                      | On                         |
| **When a contact stops matching**           | **Leave them in the list** or **Take them out**. *"Contacts you added by hand are never removed either way."*                                                                      | **Leave them in the list** |
| **Stop at**                                 | The most contacts the rule will add. Leave it empty (**No limit**) for no cap.                                                                                                     | No limit                   |

**Check again** and **Sort new contacts straight away** only apply while **Keep this list up to date automatically** is on.

How the automatic runs work:

* **On a schedule.** The list is re-checked at the interval you chose. Pick a schedule when your conditions depend on time, such as *in the last* windows or *Times called*.
* **When contacts arrive.** With **Sort new contacts straight away** on, the list is also re-checked when your team gains contacts from any source: a CSV import, a CRM sync, the API, an automation or someone adding a contact by hand. To keep large contact books responsive, arrival-triggered runs of the same list are at least 15 minutes apart, so a new contact can take up to 15 minutes to be sorted in.
* **Only when contacts arrive** turns off the clock schedule, so the list is sorted only when new contacts arrive or when you run it by hand.
* **Contacts without a phone number** are skipped and counted, because they can't be called.
* **Large lists** are processed in slices. A run over a very large contact book can take several passes; it carries on from where it stopped.

Click **Save rule** to save. The toast reads *"Rule saved — run it to fill the list"*: saving does not fill the list straight away, so use **Run now** (below) if you want it filled immediately rather than at the next scheduled or arrival-triggered run.

To take the rule off a list, open the editor and click **Remove rule**. The list keeps the contacts it already has and goes back to being filled by hand.

***

## The rule card

When you select a list that has a rule, a card above the contacts table summarises it:

* The list name, with an info icon whose tooltip explains how the list stays up to date (for example *"Sorted as soon as new contacts arrive, and re-checked every day."*).
* The conditions as tokens joined by *and* or *or*.
* **Edit**, to reopen the rule editor.
* **Pause** / **Resume**. Pause (*"Stop filling this list on its own"*) stops the automatic runs without removing the rule; the tooltip then reads *"Automatic updates are paused — run it by hand when you need it."* Resume (*"Let this list fill itself again"*) turns them back on.
* **Run now**, to run the rule immediately. While it runs the button becomes **Stop**; a stopped run shows **Continue**, which carries on from where it stopped.

In the side panel, a funnel icon beside a list's name marks it as rule-driven (**Filled by a rule**); the icon is greyed out when the rule is paused (**Rule paused**).

### Run status and history

Below the conditions the card shows the latest run:

| Item               | Meaning                                                                                         |
| ------------------ | ----------------------------------------------------------------------------------------------- |
| **Running now**    | A run is in progress, with the number of contacts checked so far.                               |
| **Last run**       | When the last run finished (green dot) or failed (red dot), or *Not run yet*.                   |
| **Paused at**      | A run was stopped part-way, with the number of contacts checked.                                |
| **Added last run** | How many contacts the last run added.                                                           |
| **Removed**        | How many contacts the last run took out (shown only when some were removed).                    |
| **Skipped**        | Matching contacts that could not be added: no phone number, or the **Stop at** cap was reached. |
| **Next run**       | When the next scheduled run is due, or **Due now**.                                             |
| **Recent runs**    | A small bar chart of recent runs. Click it (**Show run history**) for the list.                 |

Each entry in the run history shows when it started and what started it:

| Label                    | Started by                      |
| ------------------------ | ------------------------------- |
| **Run by hand**          | Someone clicked **Run now**.    |
| **Scheduled**            | The **Check again** schedule.   |
| **New contacts arrived** | New contacts reached your team. |
| **External request**     | A request from outside the app. |

If you edit the rule after its last run, the card shows *"The rule changed since it last ran."* with a **Run now** button. If a run fails, the error is shown on the card. For example, a rule that uses a field that has since been deleted (such as a removed custom variable field) stops with *"This rule refers to fields that no longer exist: …"*. Edit the rule to replace the missing field.

***

## Rule-driven lists and batches

A rule-driven list works as a batch source like any other list. Add it under **List allocation** in the batch's settings (see [Source Lists, Allocation & A/B Testing](/batches/source-lists)). Contacts the rule adds are picked up by any active batch that uses the list, and are called under that batch's calling rules and limits. This lets you run an always-on campaign: for example, a list of *contacts added in the last 2 days who have never been called*, feeding an ongoing batch.

A contact the rule takes out of the list is not called for that list after that, but calls already made are unaffected. The batch's own [screening gates](/batches/screening-gates) (DNCR, opt-outs and so on) still apply to every contact the rule adds.

***

## Next Steps

* [Lists](/lists/overview) — list basics, the other ways to fill a list, washing and batches
* [Contacts Overview](/contacts/overview) — the Lists side panel and the contacts table
* [Custom Variable Types](/custom-variables/types) — the fields you can use in conditions
* [Source Lists, Allocation & A/B Testing](/batches/source-lists) — feed a list into an outbound batch
