How to segment your CRM and lists for better outreach
A segment lives in one of five places and they behave differently. Static lists vs live views, the two status columns, overlap, staleness and precedence.
Segmentation is a data-architecture decision before it is a messaging decision. A segment can live in five different places in a CRM — a static list, a saved live filter, a tag, a custom field, or a status column — and those five behave differently under change, under concurrency and under audit. Choosing the wrong container is why teams end up with forty overlapping lists nobody trusts. This is how to decide which container a given segment belongs in, how to stop segments double-contacting the same person, and how to notice when one has quietly gone stale.
Five places a segment can live, and they are not interchangeable
Each of these is a legitimate container. The mistake is using one where another belongs.
A static list. Explicit membership: a row exists joining this lead to this list. In Autocloz a lead list is unique by name per workspace, membership is a junction row with a composite key so adding the same lead twice is idempotent, and the member count is a denormalised counter that is cheap to read and only eventually accurate. Membership does not change unless somebody changes it. That is the whole value.
A saved live filter. A stored filter and sort that is evaluated whenever it is opened. Autocloz's saved views carry a kind of either view — a passive bookmark you click to apply — or segment, which is the same stored filter with a live matching count refreshed on a cadence so the sidebar reads like a smart list. The filter itself is stored as opaque JSON owned by the interface, and a view can be private to its author or shared with the workspace.
A tag. A label applied to a row, usable across object types. Autocloz's managed tag registry is workspace-scoped with case-insensitive uniqueness, so "Customer" and "customer" collapse to one tag, and the join is polymorphic across leads, companies, persons, deals and cold leads.
A custom field. A typed attribute defined once per workspace and stored per row. Field types include text, number, date, url, email, select, multi-select, checkbox, currency, percentage and formula, and the key is unique per workspace.
A status column. A constrained state that the system itself writes.
The decision rule: if membership is a decision, it is a list; if membership is a fact about the row, it is a filter; if it is a small controlled vocabulary you attach by hand, it is a tag; if it is an attribute with a type, it is a custom field; and if the software writes it, it is a status. Most CRM sprawl is a filter that was built as a list, or a custom field that should have been a tag.
Static or live: the decision rule that actually matters
The tempting answer is "live filters, always, because they stay current". That is wrong for a specific and important class of segment.
Use a static list when you need the cohort frozen. An enrolment cohort is the clearest case. If you send a campaign to "everyone matching the filter" and the filter is live, the population drifts while the campaign runs — rows enter, rows leave, and the denominator you eventually divide by is not the population that received the message. Comparing two campaigns run against live filters is comparing two things you cannot describe. Freeze the cohort, record the filter and the date that produced it, and the result means something.
Use a live filter when the segment is an operational queue. "Leads with a follow-up date before today", "replied in the last 7 days", "verification came back risky". These should be current by definition, and freezing them creates work.
The practical hybrid, which is what most mature setups converge on: live filters for working queues, static lists for anything you will measure. Autocloz's list-based enrolment path exists for exactly this reason — you enrol a list, not a query.
One operational detail on shared views that bites teams eventually. A saved view records its author, and when a user is deleted the author reference is set to null rather than cascading, so a departed colleague's shared views stay in the sidebar for everybody else. That is the right behaviour and it means shared views accumulate. Assign an owner to the sidebar and prune it quarterly, or it becomes a museum.
Two status columns, and why merging them destroys both
A lead in Autocloz carries two status fields, and understanding the split is the single highest-leverage segmentation idea in the product.
status is the engagement state, written by the outbound machinery and constrained at the database level to exactly nine values: new, queued, active, paused, replied, bounced, unsubscribed, converted, dnc. A person should almost never set this by hand. It is the sender's account of what has happened.
crm_status is your label, free-form and configured per workspace — hot, warm, cold, customer, whatever your team argues about. It is written by humans and it encodes judgement.
Teams that collapse these into one field lose both. Set a lead to "hot" in a merged field and you have overwritten the fact that the sequence bounced. Set it to "bounced" and you have overwritten a rep's read on the account. Keeping them separate lets you ask the question that actually matters — *which leads are marked hot and have a bounced engagement status* — which is usually a list of records somebody is chasing that cannot receive email.
Segment on both axes deliberately. The engagement axis tells you what the machine can still do with a row. The CRM axis tells you what a human thinks of it. The lead management process end to end is the wider frame, and the scoring layer that orders rows within a segment rather than deciding membership is covered in what lead scoring is.
The filter surface is the real limit on what you can segment
You can only segment on fields your list endpoint can filter on, so know the surface before you design a taxonomy. Autocloz's leads list accepts, among others:
- Identity and ownership — free-text search, owner, who created the record, a "mine" flag, and membership of a specific list.
- State — engagement status, CRM status, score range, source.
- Reachability — has an email, has a phone, has a LinkedIn URL, has an upcoming meeting, has a follow-up, follow-up date before or after a date.
- Verification —
email_verified_statusas one ofdeliverable,undeliverable,risky,unverified,unknownorpending, wherependingmeans the background worker has not looked yet andunverifiedcarves the soft, unconfirmable rows out ofriskyso the risky bucket holds genuine risk. - Outcome —
email_sent_statusasdelivery_accepted,bouncedornot_sent; whether a call connected; whether an email was delivered. - Phone quality —
phone_typeasmobile,landlineorunknown, and a tri-statephone_invalid. - Time — created and last-activity windows.
- Channel — leads contacted on a given channel at least once.
Two of these carry semantics you should not guess at. phone_type is unknown for every North American number, because the numbering plan does not separate mobile from landline ranges — so a "mobile only" segment silently excludes the United States and Canada. And phone_invalid set to null means *not known to be invalid*, never *verified valid*; most leads have simply never been dialled. A segment built on "valid phone" does not exist; a segment built on "not known to be bad" does.
Tags: one vocabulary, one case, one owner
Tags are the most abused container in every CRM, and the abuse is always the same: two people invent overlapping vocabularies and nobody reconciles them.
Three rules keep tags useful.
Keep the vocabulary small and enumerated. A managed registry exists so tags are a controlled list rather than free text. Twenty tags is a taxonomy; two hundred is a search box with extra steps.
Fix the case and never vary it. Write tags lowercase and keep them lowercase. In Autocloz the leads list tag filter matches against the lead's own custom_fields.tags array and lowercases the value you search for before matching, so a tag stored with capitals will not be found by that filter. Lowercase everywhere is the habit that avoids the whole class of problem.
Give the vocabulary an owner. One person adds tags; everyone else applies them. Without that, the list grows by one every time someone cannot find the tag they wanted.
The related question is when a tag should be a custom field instead. If the thing you are recording has more than two states, or has a type — a date, a number, a currency amount, a choice from a fixed set — it is a field, not a tag. A tag is a binary fact about a row. enterprise is a tag. contract_renewal_date is a field. Encoding a date as a tag called renews-q3 is how a database becomes unqueryable.
The overlap problem: one person, four segments, four messages
Two segments defined independently will overlap, and each enrolment is unaware of the others. The recipient experiences the sum.
Three controls, in order of how much they help.
Deduplicate across segments before enrolment, not within. The check that matters is "is this person already enrolled in anything active", and it has to run across campaigns.
Define precedence explicitly. When a lead qualifies for three segments, one of them wins. Write the order down — usually most-specific-wins — and encode it as an exclusion in the lower-priority filters rather than as a convention.
Enforce a minimum gap at dispatch. A workspace-level minimum interval between any two touches to the same person on any channel is the only control that survives a team. A rule in a document is followed by the person who wrote it.
Precedence has one absolute case that overrides everything: suppression outranks every other segment. An unsubscribe, a hard bounce or a do-not-contact entry has to be evaluated at the highest scope that is legally and commercially correct — the workspace at minimum — and it must be checked at dispatch as well as at enrolment, because a lead can unsubscribe between the two. A segment that beats suppression is not a segment, it is an incident. How suppression and hygiene interact with list quality over time is covered in cleaning your email list.
Autocloz's free plan covers 5 users and 10 mailboxes, with lists, saved segments, tags and custom fields all in the free CRM — start free and build the precedence rules before you build the second campaign, not after somebody gets double-messaged.
Segments go stale, and the staleness is silent
A static list is a photograph. It keeps returning the same rows whether or not those rows still match the rule that produced them, and nothing in the interface tells you the photograph is old.
Three decay mechanisms, each with a different clock.
People change jobs. Every departure turns a targeted row into a bounce and a wasted touch, and the rate is high enough over a year to matter on any list built more than two quarters ago.
Companies change shape. Headcount bands, funding stage and industry classification all move. A segment built on "50 to 250 employees" eighteen months ago contains companies that are now outside it in both directions.
Verification verdicts expire. A stored verification result is treated as fresh for 30 days in Autocloz and re-verified past that, because an address goes stale at the rate people change jobs rather than at the rate of your calendar.
The GDPR names this obligation rather than leaving it as hygiene. Article 5(1)(d) requires personal data to be "accurate and, where necessary, kept up to date", with every reasonable step taken so that inaccurate data is erased or rectified without delay, and Article 5(1)(e) limits storage to no longer than is necessary for the purpose. In Europe, a segment nobody has refreshed is a compliance question as well as a performance one.
The practical routine: stamp every static list with the filter and the date that produced it, re-derive on a schedule that matches your decay rate, and treat any list older than a quarter as a hypothesis. The list-hygiene definition is the one-screen version.
Sizing a segment so a test can actually resolve
Segmentation is often sold as a way to run experiments. Most segments are far too small for that, and knowing which is which saves months.
The rule of thumb: the smaller the effect you are looking for, the more sends each variant needs, and reply-rate differences in outbound are usually small. A segment of 200 rows produces a reply count in single digits, and single-digit counts have error bars wide enough to contain almost any hypothesis. Two variants at 200 each will regularly show a "winner" that reverses next month.
So split segments by purpose:
- Segments large enough to measure — thousands of rows. Use them to test message variants, and hold everything else constant while you do.
- Segments too small to measure — hundreds or fewer. Use them to send a better message, not to learn which message is better. Write these by hand and judge them on whether the conversations were good.
Both are legitimate. Pretending the second kind is the first is what produces a strategy built on noise, and per-step reply reporting will happily give you a decimal place on a sample that cannot support one. If a segment is small and valuable, the right investment is research per row rather than a test, which is where personalisation at scale stops being a merge-tag question and becomes a targeting one.
Segmentation is profiling, in the legal sense of the word
Worth stating plainly because most segmentation advice never mentions it. The GDPR defines profiling at Article 4(4) as "any form of automated processing of personal data consisting of the use of personal data to evaluate certain personal aspects relating to a natural person". A rule that sorts people by seniority, scores them by fit, or routes them by inferred budget is that description.
Two consequences that change how you design a taxonomy.
Minimise the fields you hold. Article 5(1)(c) requires personal data to be "adequate, relevant and limited to what is necessary in relation to the purposes for which they are processed". Collecting a field because it might one day be useful for segmentation is the exact pattern the principle is about, and every extra field is also a field that goes stale and a field that appears in a subject access request.
Purpose-limit your segments. Article 5(1)(b) requires data to be collected for specified, explicit and legitimate purposes and not further processed incompatibly. A segment built from data gathered for a different purpose is the case to think about before building it, not after.
None of this is legal advice, and the analysis differs by jurisdiction. It is here because the segmentation design and the compliance posture are the same decision, and treating them separately is how teams build a taxonomy they later have to dismantle.
What segmentation in Autocloz will not do for you
Four limits.
It will not reconcile two tag systems for you. A lead can carry both managed workspace tags and its own custom_fields.tags array, and the leads list tag filter reads the second of those. If you use both, decide which one your filters and campaigns actually consult and standardise on it, or you will build segments that quietly miss rows.
It will not tell you a static list has gone stale. The member count is a stored counter, cheap to read and eventually accurate, and it says nothing about whether the members still match the rule. Nothing in the interface flags an old list, so the schedule has to come from you.
It will not enforce precedence between overlapping segments. Membership rules are independent by design. Which one wins is a decision you encode in the filters, and if you do not encode it, arrival order decides.
It will not segment on a field you do not hold. This is the constraint underneath every other one: you can only split a population on attributes that exist in your data, so the coverage of each field decides the taxonomy you can actually build. The upstream half of that problem — writing a profile in fields rather than adjectives, and knowing what a filter does with a missing value — is covered in building a targeted B2B lead list, and if you are weighing an all-in-one workspace against a dedicated data layer, the Autocloz and HubSpot comparison covers the object-model differences directly.
Frequently asked
Should a segment be a static list or a saved filter?
Use a static list when membership is a decision you made and want frozen, such as an enrolment cohort or an event attendee set, because a frozen cohort is the only way to compare results across time honestly. Use a saved live filter when membership is a fact about the row that should update itself, such as everyone in a stage or everyone who replied this quarter. Autocloz supports both: lead lists hold explicit membership rows, and a saved view can be marked as a live segment whose matching count refreshes on a cadence.
What is the difference between engagement status and CRM status on a lead?
They are two separate columns answering two separate questions and merging them is a common and damaging mistake. Engagement status is the outbound machine's state and is constrained at database level to new, queued, active, paused, replied, bounced, unsubscribed, converted and dnc. CRM status is a free-form label your workspace defines, such as hot, warm, cold or customer. The first is written by the sender; the second is written by a human, and only the second should ever be edited by hand.
How do you stop the same person being contacted by three campaigns at once?
Deduplicate across segments before enrolment rather than within each one, because two segments defined independently will overlap and each enrolment is unaware of the others. The durable controls are a workspace-level minimum gap between any two touches to the same person on any channel, enforced at dispatch, and an explicit rule for which segment wins when a lead qualifies for several. Membership rules that overlap are not a bug, but silently double-contacting is.
Is segmenting a contact database regulated?
In Europe it is named. The GDPR defines profiling at Article 4(4) as any form of automated processing of personal data consisting of the use of personal data to evaluate certain personal aspects relating to a natural person, which is a description of what a scoring or segmentation rule does. Article 5(1)(c) separately requires personal data to be adequate, relevant and limited to what is necessary for the purpose. Collecting fields because they might be useful for future segmentation is the pattern that principle addresses.
How large does a segment need to be to test anything?
Large enough that the difference you are looking for is bigger than the noise, which for reply-rate differences in the low single digits usually means thousands of sends per variant rather than hundreds. A segment of 200 rows will produce a reply rate with error bars wide enough to swallow any realistic effect, so treat small segments as places to send better messages rather than as places to run experiments.
Do segments go stale?
Yes, and the staleness is invisible because a static list keeps returning rows regardless of whether they still match the rule that created it. People change jobs, companies change size, and a verification verdict has a shelf life measured in weeks. Re-derive static lists on a schedule, record the date and the filter that produced each one, and treat any list older than a quarter as a hypothesis rather than a target.