On this page

The Audience step of a broadcast lets you target all contacts, a tag, or a saved segment, then narrow that selection with exclusions, all while a live count shows exactly how many people will actually receive the campaign. This article covers how each audience source works, why the count you see is the real number, and how to exclude people correctly instead of guessing.
Audience and segments: first 5 of 6 steps
- 1Open the Audience step of a new
- 2Choose an audience source
- 3Read the live recipient count
- 4Add exclusions to avoid over-messaging
- 5Bring in a CSV audience if you
Before you start
- You need contacts already in VGraple CRM. See importing contacts from CSV if you have not brought your list in yet.
- If you plan to target by tag, tag your contacts first, either manually or during a CSV import.
- If you plan to target by saved segment, build the segment under Contacts first; a segment is a saved filter (by custom field, tag, activity, or a combination) that a broadcast can reuse.
- You need the "Create broadcasts" permission to open the composer and see audience counts.
Steps
- Open the Audience step of a new broadcast. From Broadcasts, click New Broadcast; the composer opens directly on this step.

Choose an audience source. Click All contacts to target everyone eligible, By tag to pick one or more tags, or Saved segment to pick one or more segments you built under Contacts. Selecting multiple tags or segments targets anyone matching any of them.
Read the live recipient count. Under the picker, VGraple CRM shows "N contacts will receive this," recalculated every time you change the selection. This is the same resolver used for the cost estimate and the actual send, so the number on this screen, the estimate on the review step, and the count the campaign actually queues never disagree.
Add exclusions to avoid over-messaging. Under Leave people out, you can exclude by:
- Tags: anyone carrying one of the chosen tags is removed from the audience, whatever the base selection was.
- Recipients of: pick from your recent broadcasts; anyone who received that campaign is removed from this one.
- Messaged in: choose no limit, the last 24 hours, 3 days, 7 days, or 30 days; anyone your organization sent a template to inside that window is removed.
Bring in a CSV audience if you need one. The composer does not accept a raw file upload directly. Go to Contacts, import your CSV there, and tag the imported rows during that import (or afterwards). Come back to the broadcast and choose that tag as your audience. Every broadcast audience going through the same tag-or-segment path means every send, whatever its original source, passes through the identical safety checks.
Confirm the final count before you send. The Review & Send step recomputes the audience one more time, applying the same guards and exclusions again, since time may have passed since you built it. This is the number that is actually billed and queued.
What you will see
The recipient count updates within a second or two of any change to the audience selection, showing either "Choose an audience to see the count," "Counting...," or the final "N contacts will receive this." If your selection would exclude a large share of contacts (opted out, blocked, or on a channel other than WhatsApp), that reduction happens silently in the count itself rather than as a separate warning at this step; the review step's exclusions note is where a size breakdown becomes visible.
Why does the count never disagree between the audience step, the estimate and the actual send?
Every place a recipient count is shown, the live count while building the audience, the per-country cost estimate, and the number of rows the send actually queues, goes through one resolver rather than three separate implementations of "who matches." Earlier versions of this kind of feature commonly compute the audience differently in each place: one screen omits the channel guard, another spreads a segment filter on top of the safety checks instead of intersecting it, and a picker that sums per-segment counts double-counts anyone who belongs to two selected segments at once. When those three numbers disagree, a business loses trust in all of them, not just the wrong one. VGraple CRM resolves the audience once, in broadcast-audience.ts, and every screen calls that same function, so the number you see while building the audience is the number that gets billed.
A saved segment's own filter can combine multiple conditions (a tag, a custom field, an activity date, or several of these together) into one reusable rule, built once under Contacts and reused across broadcasts, sequences and exports. Whatever that filter matches is still intersected with the base safety guards before it becomes a broadcast audience, so a segment built to find "everyone tagged VIP" never accidentally includes a VIP contact who has since opted out.
Settings and options
| Option | What it does | Default |
|---|---|---|
| All contacts | Every WhatsApp contact that passes the safety guards | Not selected until you choose |
| By tag | Anyone carrying any of the selected tags, ANDed with safety guards | No tags selected |
| Saved segment | Anyone matching any of the selected segments' filters, ANDed with safety guards | No segments selected |
| Exclude by tag | Removes anyone carrying the selected tag(s) from the audience above | No exclusions |
| Exclude "recipients of" | Removes anyone who received the selected past campaign(s) | No exclusions |
| Exclude "messaged in" | Removes anyone messaged by any broadcast in the chosen window | No limit |
Why does an audience built from a segment sometimes look different a day later?
A saved segment is a live filter, not a frozen snapshot. If a segment matches "tagged VIP and last active in the past 30 days," a contact who was active 31 days ago at the time you built a campaign but falls further out of the window by the time it actually fires is correctly excluded when the audience is materialized, and a contact who was just tagged VIP yesterday is correctly included. This is deliberate: a broadcast audience should reflect who genuinely matches the segment right now, at send time, not whoever matched it when you happened to open the composer.
This matters most for scheduled and recurring campaigns, where real time passes between building the audience and the campaign actually firing. See scheduling and recurring campaigns for how fire-time audience resolution works for those cases specifically.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Recipient count shows 0 with tags selected | The tag has no contacts, or every tagged contact is opted out, blocked, or on a non-WhatsApp channel | Check the tag under Contacts; confirm contacts are opted in with source_channel: whatsapp |
| A saved segment's broadcast count is much lower than its Contacts-page count | The segment's own filter includes contacts who are opted out or blocked, which the broadcast audience always excludes | Expected behavior; the safety guards apply on top of every segment |
| Excluding "recipients of" a campaign did not remove anyone | The chosen campaign has not actually sent yet, or has zero completed sends | Only campaigns with recipients already attempted can be excluded meaningfully; check the campaign's own recipient count first |
| A contact I expect to see is missing from every audience option | The contact's source channel is not WhatsApp (for example, an Instagram or Messenger-only contact), or the contact is blocked or opted out | Broadcasts only ever target source_channel: whatsapp contacts; check the contact's own profile for opt-in and blocked status |
| CSV-imported contacts do not appear in the audience right away | The import tagged them, but the tag was not selected, or the import is still processing | Confirm the import finished under Contacts, then select the correct tag on the Audience step |
Related reading
Once your audience is built correctly, move on to mapping template variables and fallbacks, or read about retry failed vs retarget for how to build a follow-up audience from a completed campaign's results.