Building WhatsApp Broadcast Audiences with Segments
Stop blasting everyone. Segments are live filters on tags, contact fields and dates, so each campaign lands with the people it's actually for.
A segment is a saved, live filter over your contact list — a set of conditions like "city is Lahore" or "last order was more than 60 days ago" that ConvoFly re-checks every single time a campaign sends. It is not a frozen list. Nobody has to add or remove people by hand.
That distinction is the whole point. A CSV you exported on Monday is already wrong by Friday. A segment named VIP customers in Lahore is correct on Friday, and correct again next month, because the audience is recalculated at the moment of sending rather than at the moment of building.
Getting this right is not only a marketing nicety. WhatsApp's messaging limits count unique customers you message per 24 hours — new numbers start at 250 (Meta, WhatsApp messaging limits) — and marketing templates are charged on delivery (Meta, WhatsApp pricing). Every irrelevant recipient burns both a paid message and a slot in your daily cap, and risks a block that drags down your quality rating. Sending to fewer, better-chosen people is cheaper and safer at the same time.
Where segments sit among the five audience types
When you build a broadcast, the Audience section gives you five tabs. Segments are one of them, and knowing when not to use them saves time:
| Audience tab | What it does | Live or frozen? | Best for |
|---|---|---|---|
| By tag | Everyone carrying one or more labels you've applied | Live | Simple one-label sends, e.g. everyone tagged vip |
| By segment | Multiple conditions on tags and contact fields, combined with all/any logic | Live | Anything with more than one rule, or any date rule |
| CSV list | Numbers you upload in a file | Frozen snapshot | A one-off list from outside the system |
| Google Sheet | Reads a spreadsheet you connect | Live — re-read each send | Lists your team maintains in a sheet |
| Re-target | People from a previous broadcast, picked by what happened to that message | Live | Following up non-responders |
The rule of thumb: if your audience is defined by who someone is or what they did, use a segment. If it's defined by what happened to a message you already sent, use re-targeting by delivery outcome. If the list lives outside ConvoFly, use a Google Sheet so it stays live rather than uploading a CSV that goes stale.
What you can filter on
The field dropdown in the condition row contains exactly two kinds of thing:
- Tag — always the first entry. Tags are labels you or your automations apply, like vip, cod, abandoned-cart or city-karachi.
- Your contact fields — every attribute you've enabled under Settings → Contact Attributes (the sidebar calls it "Contact fields"). These are structured values stored on each contact.
There is deliberately no hidden set of built-in filters beyond that. Connecting Shopify auto-creates fields such as Order Number, Order Total, Payment Status, Tracking Link and Customer Name. Connecting WhatsApp auto-creates the Click-to-WhatsApp ad fields — Facebook Ad ID, Facebook Ad Headline and a Facebook Ad Date. Everything else is a field you create, which means your segment vocabulary is exactly as rich as the data you actually keep.
The operators, field type by field type
A condition is always three parts: field → operator → value. Which operators you get depends entirely on the field's type, chosen when you created it. This table is the complete list:
| Field type | Operators available | Worked example |
|---|---|---|
| Tag | has tag, doesn't have tag | Tag has vip |
| Text | is, is not, contains, doesn't contain, is set, is not set | City contains Lahore |
| Number | is, is not, greater than, less than, is set, is not set | Loyalty points greater than 100 |
| Date | 11 operators — see the dates section below | last_order_date is more than 60 days ago |
| Yes / No and Dropdown | Falls back to the text operators (is, is not, contains…) | Newsletter is Yes |
That last row is worth knowing before it surprises you: a Yes/No field is filtered with text operators rather than a true/false toggle, so write the condition as is Yes and keep your stored values spelled consistently. The is set and is not set operators are the quiet workhorses here — is not set is how you find the contacts whose data you still need to collect.
How to build a segment (about a minute)
- Start a new broadcast and, under Audience, click the By segment tab.
- Click + Add condition. Pick a field, pick an operator, and type or choose the value. Some operators — is set, is not set, is today, day & month is today — take no value at all and the value box disappears.
- Add more conditions if you want, then set the sentence at the top: Match all of these conditions or Match any of these conditions.
- Click Preview recipients under 5. Review & test to see the exact count before you commit.
- Type a name in Name this segment to reuse it later and click Save segment — or skip that and use it once, inline, for this campaign only.
One safety behaviour to know: a segment with zero conditions matches nobody, not everybody. That is deliberate. An empty filter that quietly resolved to your entire list would be the single most expensive bug a broadcast tool could have.
Match ALL vs. match ANY
Each segment combines its conditions with one match type, and picking the wrong one is the most common reason a preview count looks nothing like you expected:
- Match all (AND) — a contact must satisfy every condition. Narrows as you add rules. Tag has vip AND City is Lahore reaches only VIPs in Lahore.
- Match any (OR) — a contact qualifies on one condition alone. Widens as you add rules. Tag has vip OR Order Total greater than 5000 reaches both groups combined.
Match all is the default, and it is the right default: it fails toward sending to too few people rather than too many. If your preview shows 4 recipients when you expected 400, you almost certainly have match-all with a condition that contradicts another — for instance a text field where half your contacts store "Lahore" and half store "lahore, PK", where contains would have worked and is did not.
Filter by dates: the eleven date operators
Date fields — a last_order_date, a birthday, a renewal_date — get a far richer operator set, because most useful audiences are defined by when something happened rather than whether it did:
- is on / is before / is after a specific date you pick from a calendar.
- is within the last … days and is more than … days ago — looking backwards. "Last order is more than 60 days ago" is your lapsed-customer audience.
- is within the next … days and is in exactly … days — looking forwards. "Renewal is in exactly 7 days" is a reminder that fires once, a week ahead, rather than every day for a week.
- is today — matches the full date, year included.
- day & month is today — ignores the year entirely, which is precisely what birthdays and anniversaries need.
- is set / is not set — has this contact given you the date at all?
Dates are evaluated in your own organisation's timezone, so "today" means today where you are, not UTC. Contacts with a missing or unreadable date value never match a date condition — they are excluded rather than swept in, so a half-populated field can shrink an audience without any error appearing.
The pairing that makes these powerful: because a segment refreshes on every send, putting a date segment behind a daily recurring broadcast turns one campaign into a permanent automation. You build it once; each day it reaches whoever matches that day. That single pattern is how birthday campaigns, renewal reminders and win-back flows are all built.
Worked example: an evergreen win-back audience
- Create a Date field called last_order_date under Settings → Contact Attributes.
- Fill it automatically: in the automation builder, add an Update Customer Attribute step to your "order placed" rule and set last_order_date to
{{date.today}}. Every order now stamps the date, with no coding. - Build a segment: last_order_date is more than 60 days ago, match all.
- Add a second condition to keep it clean: Tag doesn't have vip, if your VIPs get a different message.
- Save it as "Lapsed 60+ days" and attach it to a weekly recurring broadcast.
The full version, including what to actually say in the message, is in how to win back lapsed customers.
Bring your own fields
You are not limited to tags and Shopify's fields. Want to reach people by plan, loyalty points or favourite category? Three steps:
- Create the field. Go to Settings → Contact Attributes, type a field name (e.g. "Loyalty points"), choose one of the five types — Text, Number, Date, Yes / No or Dropdown — and click Add Field. Only enabled fields appear on the contact profile and in the segment builder.
- Fill it in. Two no-fuss routes:
- From your store, automatically — drop an Update Customer Attribute step into an automation rule. "When an order is placed, save the order total into last_order_value." The value comes straight from the order.
- From another tool — if the data lives in your own app, CRM or spreadsheet, it can be pushed in with a single API call using the account key in your Settings. Each push updates that one customer's field.
- Target it. The field appears in the segment dropdown immediately, and doubles as a personalization value in your message.
Choose the type carefully, because it is what unlocks the operators. Storing a date as Text gives you "contains", not "more than 60 days ago" — and it is the difference between a segment you can automate and one you can't.
Save once, reuse everywhere
Name a segment and it becomes available in the Reuse a saved segment dropdown on every future broadcast and drip campaign, with a Delete button beside it when it has outlived its use. Saved segments are managed inside the audience picker itself — there is no separate segments page in Settings.
Crucially, saving stores the rules, not the people. A saved segment used by a drip campaign six weeks from now resolves against your contact list as it is then. That is what makes segments compound in value while exported lists decay.
Ready-made: Facebook ad leads
If you run Click-to-WhatsApp ads, connecting your number auto-creates a saved segment called "Facebook ad leads — not converted". It is an ordinary segment with three visible conditions, match-all: the contact has a Facebook Ad ID set, their Facebook Ad Date is within the last 3 days, and they don't carry the Ad Converted tag. Pick it under By segment → Reuse a saved segment.
Because it is a normal segment, you can open it and change it — widen 3 days to 14, or add a city condition. Every ad lead is also tagged Facebook Ad Lead, so you can build your own ad audiences from scratch. One honest caveat: the "not converted" half only excludes buyers if something in your setup actually applies the Ad Converted tag; without that, it is simply "recent ad leads".
Who gets removed automatically
Two groups are stripped from every audience, in every mode, whether or not you remember them:
- Opted-out contacts. Anyone who replied STOP, UNSUBSCRIBE or a similar keyword carries the opted_out tag and is filtered out of every send. The WhatsApp Business Messaging Policy requires you to honour opt-outs, so this is a compliance floor, not a convenience. You can also manage the list by hand at Broadcasts → Opt-outs.
- Numbers proven undeliverable. If a past broadcast failed on a number because it isn't on WhatsApp or the number is invalid, it is suppressed from all future audiences. There is no point paying to re-attempt a number that has already told you it doesn't exist.
The Preview recipients readout shows both exclusions as a skipped count, so the gap between "my segment matches 500" and "480 will receive this" is always explained rather than mysterious.
Reading the preview count before you commit
Preview is the last honest checkpoint before spending money, and it tells you three things at once: how many people match, how many were removed as opted-out or undeliverable, and — for larger lists — an estimated sending time based on a pace of roughly 120 messages a minute. A 6,000-person send is therefore about 50 minutes of sending, which is normal progress rather than a stall.
Preview lives in the broadcast composer. The drip builder does not have its own preview button, so if you are enrolling a segment into a multi-step sequence, build and check the segment on a draft broadcast first, save it, then select it by name in the drip.
Common mistakes, and what they look like
| Symptom | Usual cause | Fix |
|---|---|---|
| Preview shows 0 recipients | No conditions added, or match-all with contradictory rules | An empty segment matches nobody by design — add at least one condition |
| Far fewer people than expected | Text field with inconsistent values, or "is" where "contains" was needed | Switch the operator to contains, or tidy the stored values |
| Date condition matches nobody | Field was created as Text, or most contacts have no value | Recreate as a Date field; check with is set how many have data |
| Birthday campaign fires only once | Used is today, which compares the year too | Use day & month is today |
| Reminder sends every day for a week | Used is within the next 7 days | Use is in exactly 7 days so each contact matches on one day only |
How segmenting protects your number
Meta raises your messaging limit only when two conditions hold together: you send high-quality messages, and you use at least half your current limit within the last 7 days (Meta, WhatsApp messaging limits). Segmenting serves both halves. Relevant messages attract fewer blocks, which protects quality; and because you are not wasting your 250-a-day allowance on people who were never going to care, the volume you do send goes to customers likely to reply — which opens free 24-hour reply windows and builds the engagement history that carries you to the 2,000 tier.
Pair segments with personalization so each slice also gets copy written for it, and with frequency caps so no one contact ends up in three segments and receives three messages the same week.
Frequently asked questions
Is a segment a fixed list or a live filter?
It's live. A segment stores rules, not people, and is re-evaluated every time a broadcast resolves its audience — so contacts who newly match are included automatically and those who no longer match drop out. A saved segment used by a recurring broadcast six weeks from now resolves against your contact list as it is then.
Can I combine tags and contact fields in one segment?
Yes. A segment mixes tag conditions and field conditions freely, combined with either match-all (AND) or match-any (OR). Match all is the default. A segment with zero conditions deliberately matches nobody rather than everybody.
How do I build a birthday segment in WhatsApp?
Create a Date field for the birthday, then use the 'day & month is today' operator, which ignores the year. Pair it with a daily recurring broadcast and it reaches whoever has a birthday that day, permanently. Using 'is today' instead would compare the full date including year and match almost nobody.
Do segments exclude people who opted out?
Always. Contacts carrying the opted_out tag are stripped from every audience in every mode, as required by the WhatsApp Business Messaging Policy. Numbers that previously failed as invalid or not-on-WhatsApp are suppressed too, and the Preview recipients readout shows both as a skipped count.
How many people can a segment send to at once?
The segment itself has no cap, but WhatsApp does: new business numbers can message 250 unique customers per rolling 24 hours, rising to 2,000, 10,000, 100,000 and unlimited. ConvoFly sends at roughly 120 messages a minute, so a 6,000-person audience takes about 50 minutes.