User guide › Apps › Audiences
An audience is not a list of contacts and not an entity of its own. Nothing is copied, imported or materialised. An audience stores three things:
- a channel — Email, WhatsApp or SMS;
- one or more sources, each pointing at an entity you already have (Leads, Customers, Contacts…);
- a set of filters per source.
When a campaign fires, the audience is resolved: every source's records are read live, filtered, and the channel's identifier — the email address or the phone number — is pulled off each matching record. Those identifiers are deduped across sources and that is the send list.
Because resolution happens at send time, a contact who started matching your filter yesterday is included today without you touching the audience. Edit the filter once and every campaign that targets it stays current.
The channel decides the identifier
The channel you pick at the top of the builder is not cosmetic — it decides what is extracted from each record and how it's validated.
| Channel | Identifier pulled | Accepted if |
|---|---|---|
| An email field on the record | It looks like an address (something@something.tld). It is lower-cased before deduping. | |
| A phone field on the record | It contains at least 6 digits. Everything that isn't a digit is stripped. | |
| SMS | A phone field on the record | Same rule as WhatsApp. |
A record whose identifier is blank or fails that check is simply not in the audience. It isn't an error and nothing warns you — it just doesn't appear in the count. That's the single most common reason a count is lower than the number of records you expected.
An email audience can only be targeted by email campaigns; a WhatsApp audience only by WhatsApp. If you want to reach the same people on two channels, build the audience twice — same entities, same filters, different channel — and each one resolves its own identifier.
Building one
Marketing → Audiences, or /audiences. The list shows
Name, Channel and Sources for each
saved audience; New audience opens the builder.
- Name it and pick the channel Name is required. Channel is Email, WhatsApp or SMS. Description is free text for your own benefit. Change the channel later and any source that hasn't had its identifier field set manually gets re-suggested for the new channel.
- Add an entity as a source Add entity. Until you do, the panel reads Add one or more entities (Leads, Customers…) to pull contacts from, then filter. Pick the entity from the Entity dropdown.
- Check the field mapping Picking an entity pre-fills two dropdowns by guessing from your field names and types. The Email field / Phone field is the one that gets extracted — the label changes with the channel. Name field is optional and only used for personalisation and for showing a human name next to the address. The pickers mark a field of the right type with ✉ or ☎ and show every other field's type after a dot, so you can see at a glance whether the guess is right.
- Filter the source Add filter gives you a row: field, operator, value. Add as many as you need — they are joined with AND, as the builder says: records matching ALL of these.
- Repeat for other entities Add a second source for a different entity with its own mapping and its own filters. The audience is the union of all of them, deduped.
- Watch the preview, then save The Live preview panel on the right updates about half a second after you stop typing: a big number of deliverable emails (or phones) and a sample of the actual identifiers. Create audience — or Save on an existing one.
The preview runs exactly the same resolution a campaign runs — same filters, same validation, same dedupe. If the preview says 412, a campaign launched right now targets those 412. It is not an estimate.
Filter operators
One row per condition. Two of them — is empty and is not empty — take no value, and the value box disappears when you pick them.
| Operator | Matches when the field… |
|---|---|
| is / is not | Exactly equals, or doesn't equal, the value. Compared as text. |
| contains / doesn't contain | Contains the value anywhere. Case-insensitive. |
| > ≥ < ≤ | Compares numerically. Use these on numbers, not on text. |
| is any of / is none of | The value is a comma-separated list; the field must be one of them (or none of them). The box hints Comma-separated. |
| is empty / is not empty | Blank, whitespace-only, missing, or an empty list counts as empty. |
is compares the stored value as text, character for character. Hot does not match hot and does not match Hot lead. When you're not certain how a value is stored, use contains first, look at the preview, then tighten it.
Multiple sources and dedupe
Sources are unioned in order, and each identifier is only ever included once. If sarah@acme.example exists on both a Leads record and a Customers record, she is one recipient — and the name and source record attached to her are the ones from whichever source is listed first. Ordering your sources therefore decides which record's data personalises her message.
The same dedupe is what makes "everyone in Leads plus everyone in Customers" safe to build without worrying about overlap.
Where audiences get used
Audiences are shared. Nothing about an audience is specific to the app that sends to it.
| App | How it uses the audience |
|---|---|
| Email marketing | A campaign target of kind Audience, alongside its own lists and segments. Audience recipients are sent to without becoming subscribers. |
| WhatsApp & SMS | The campaign's audience picker lists audiences on that channel. The resolved recipients are then filtered against the channel's own opt-out list. |
| Omni marketing | A journey enrols an audience — one enrollment per resolved recipient — and a campaign-flow step launches a channel campaign against one. |
Omni requires Audiences: installing Omni installs Audiences too, because a journey with nobody to enrol does nothing.
Opt-outs are not part of the audience
This distinction matters when you're reconciling numbers. An audience resolves purely from your records. Each channel then applies its own suppression list to the result before sending:
- SMS — a contact who replies STOP, STOPALL, UNSUBSCRIBE, CANCEL, END or QUIT is suppressed; START, YES or UNSTOP re-opts them in.
- WhatsApp — a tenant-wide suppression list of phone numbers.
- Email — an unsubscribe from an audience-sourced send suppresses that email address.
So an audience of 500 can legitimately send to 480. The audience count is the number of deliverable identifiers in your data; the campaign's own report is the number actually sent.
Who can do what
Opening /audiences needs access to the Audiences app. Creating or
editing one needs the Manage audiences capability on top, granted
per role under Settings → Module Access. Admins pass everything.
| Permission | Unlocks |
|---|---|
| App access | Viewing the list, opening an audience, and running the live preview. |
| Manage audiences | Saving. Without it the save button is disabled with the tooltip You don't have the 'Manage audiences' permission (Settings → Module Access), and the server refuses the write as well. |
The builder lists every entity in the workspace and its fields, so that anyone able to build an audience can also see the shape of your data and, through the preview, a sample of real addresses. Grant the Audiences app deliberately. Background on the two permission systems is in Permissions & access.
When the number looks wrong
| What you see | What it means |
|---|---|
| Preview shows 0 with sources added | Either no record survives the filters, or the identifier field is wrong or empty. Delete the filters one at a time and watch the number come back — that isolates which one is doing it. |
| Count is lower than the record count | Expected. Records with a blank or malformed address or phone are dropped, and duplicates across sources collapse to one. |
| A specific person is missing | Check their record in order: does it match every filter (AND, exact text)? Is the identifier field the one you mapped? Does the value pass validation — a real @ address, or six or more digits? |
| The preview stays on … | It's still resolving. Resolution reads the source entities' records, so a very large entity takes a moment. |
| A source contributes nothing after an entity was deleted | Sources reference entities loosely. If the entity is gone, that source silently contributes zero rather than breaking the audience. Remove the dead source. |
| Numeric filters behave oddly | The comparison operators convert both sides to numbers. On a text field that isn't numeric the comparison is meaningless — filter that field with is or contains instead. |
Where to go next
Omni marketing
The hub and the journey builder: enrol an audience, then sequence channel steps.
🎯Campaign lifecycle
One campaign traced end to end — audience, launch, send, results, troubleshooting.
✉️Email marketing
Lists, segments and campaigns — and how an audience target differs from a list.
🔐Permissions & access
App access, capabilities, and how they combine with record-level rules.