Loading tutorials…
Loading tutorials…
Brevo gives you unlimited lists for free, which is a trap. New users create 10+ lists in week one, then spend month 6 untangling overlaps and counting subscribers twice. This is the structure that scales from 500 to 500K contacts without a rebuild.
Who this is forOwners who just created a Brevo account, or owners 3-6 months in who realize their list/segment setup is a mess. If you have 5+ lists and contacts spread across them, this tutorial is your fix.
What you'll need
Step 1
99% of accounts need ONE master list. Multiple lists are only for genuinely separate brands or audiences with totally different consent.
Ask: do my different groups of subscribers have DIFFERENT consent terms? If yes (e.g., one brand vs another), separate lists. If no, ONE list.
Multiple lists count contacts MULTIPLE times if a contact is in two. A subscriber in 'Newsletter' + 'VIP' is two contacts toward your plan limit.
Use Segments inside the master list for VIP, engaged-30d, cart-abandoners, by-product-purchased, by-geography. Segments don't multi-count.
Use multiple lists only when consent and brand are genuinely separate: e.g., yourbrand.com newsletter AND your-sister-brand.com newsletter, with separate signup flows and footers.
Step 2
Contacts → Settings → Contact attributes. Decide what data you'll store + segment on, and pick the right type for each.
Contacts → Settings → Contact attributes. You'll see Brevo defaults: EMAIL, FIRSTNAME, LASTNAME, SMS, etc.
Add CUSTOM attributes for what you'll segment on. Common ones: SIGNUP_SOURCE (TEXT), LAST_PURCHASE_DATE (DATE), TOTAL_ORDERS (NUMBER), IS_VIP (BOOLEAN), LIFECYCLE_STAGE (CATEGORY).
Pick the TYPE carefully — changing it later requires deleting and recreating the attribute, which loses data. TEXT for free-form, NUMBER for math/comparisons, DATE for time-based segments, BOOLEAN for yes/no, CATEGORY for fixed options (lifecycle stages).
For CATEGORY attributes, define the options upfront: e.g., LIFECYCLE_STAGE = ['Lead', 'Customer', 'Repeat Customer', 'Churned'].
Save attributes. Now your import can map cleanly to them.
Step 3
Contacts → Segments → Add a new segment. Build the 5 segments every account needs.
SEGMENT 1 — Engaged 30d: opened or clicked any email in last 30 days. This is your healthiest audience.
SEGMENT 2 — Engaged 90d: opened or clicked in last 90 days. Use this for high-frequency campaigns to avoid wearing out engaged 30d.
SEGMENT 3 — Unengaged 90d: subscribed, but no open/click in 90+ days. Use for sunset/re-engagement flows.
SEGMENT 4 — New subscribers (last 30 days): created in last 30 days. Use to exclude from non-welcome campaigns.
SEGMENT 5 — VIP / High-value: TOTAL_ORDERS >= 3 OR LIFETIME_VALUE > $500 (adjust threshold to your business). Use for early-access and loyalty campaigns.
Save each. Segments auto-refresh every 5-30 minutes — large lists take longer.
Step 4
If you have an e-com integration (Shopify, WooCommerce), build segments on purchase behavior.
Contacts → Segments → Add a new segment.
Segment: "Cart abandoners last 7 days." Filter: event "abandoned_cart" in last 7 days, AND not event "purchase" in last 7 days.
Segment: "First-time buyers" — TOTAL_ORDERS = 1 AND LAST_PURCHASE_DATE in last 30 days.
Segment: "Repeat buyers" — TOTAL_ORDERS >= 2.
Segment: "Lapsed customers" — LAST_PURCHASE_DATE is older than 180 days AND TOTAL_ORDERS >= 1.
These power your highest-revenue automations (abandoned cart, post-purchase, win-back).
Step 5
Open each segment after creation. Verify the count is non-zero and matches your expectation.
Contacts → Segments → click each segment.
Verify: total contacts in segment is non-zero. If a segment shows 0, the filter logic likely has an AND that excludes everyone — fix it.
Click 'View contacts.' Spot-check 3-5 random contacts: do they actually match the criteria you intended? Common error: filter on attribute that's blank for 80% of contacts → segment is artificially small.
If a segment shows wildly different count than you expected (e.g., expected 5K, got 200), the filter logic is wrong. Re-read it and fix.
Wait 5-30 min for segment refresh to complete before sending to it. Brevo segments refresh on send anyway, but verify the count first.
Step 6
Automations → Workflows. Create a sunset flow that removes contacts unengaged 180+ days.
Automations → Workflows → Create a workflow → Custom.
Trigger: "When a contact is added to segment Unengaged 180d." (Create this segment first — same as Engaged 90d logic but inverted to 180+ days.)
Action: Send a re-engagement email — "We'd love to keep in touch. Click here to stay subscribed."
Wait: 14 days.
IF condition: opened OR clicked the re-engagement email → keep on list.
ELSE: unsubscribe automatically (Action → Unsubscribe contact). This removes them from sends but keeps the record for reporting.
Activate. Brevo will run this for every contact who enters the unengaged segment going forward.
Step 7
Write a 1-page doc: lists, attributes, segments, and the logic behind each.
Create a Google Doc or Notion page titled "Brevo Structure — [Brand]."
List each list, with purpose and consent source.
List each custom attribute, with type and what it tracks.
List each segment, with filter logic and what flows depend on it.
Note any quirks: segments that depend on integrations, attributes populated by API, custom workflows.
This doc saves 4-8 hours when you onboard a new team member or hire a specialist — they walk in with context instead of reverse-engineering.
Common mistakes
Creating one list per segment (10+ lists in week one)
What goes wrong: A contact in 5 lists counts 5 times toward your billing tier. A 10K-contact business effectively becomes 30K-50K for billing, jumping from Starter $25/mo to Business $65/mo unnecessarily. Compound that over 2 years and it's $1K+ in overpaid subscription.
How to avoid: Consolidate to ONE master list. Convert every old list into a segment with the equivalent filter. Move contacts to the master list, then delete the old lists.
Wrong attribute type (TEXT instead of NUMBER or DATE)
What goes wrong: A TOTAL_ORDERS attribute stored as TEXT can't be filtered as '>= 3' — Brevo treats it as a string. Segments based on it return wrong results. Discovered weeks later when 'repeat buyers' segment is empty or wrong.
How to avoid: Plan attribute types BEFORE importing. NUMBER for math, DATE for time-based, BOOLEAN for yes/no, CATEGORY for fixed options. To fix a wrong type, you must delete the attribute (loses data) and recreate it — back up first.
No sunset flow — list quality silently rots
What goes wrong: Unengaged contacts accumulate. After 12-18 months, 40-60% of the list never opens but still costs against your plan. Overall engagement rate drops, mailbox providers downrank the domain, and even engaged sends underperform. Lost revenue: $200-2,000/month.
How to avoid: Build the sunset workflow in Step 6. Run it monthly. Healthy lists shed 2-5% of inactive contacts/month, keeping the engagement rate high and deliverability strong.
Trying to segment on data Brevo doesn't have
What goes wrong: Owner builds a 'high-LTV' segment expecting Brevo to know each contact's lifetime value. Brevo has no such field unless it's pushed via API or integration. Segment returns empty or random data, breaking downstream campaigns.
How to avoid: Sync purchase data from your store via Brevo's e-com integration (Shopify, WooCommerce, BigCommerce) OR push events via the Brevo API. Without one of these, behavior segmentation is impossible.
Forgetting that segments refresh asynchronously
What goes wrong: Owner adds a tag/attribute and immediately tries to send to a segment that filters on it. Segment hasn't refreshed yet — send goes to the OLD segment definition, missing the intended recipients.
How to avoid: Wait 5-30 minutes after attribute or list changes before sending to a segment. For large lists (50K+), wait an hour. Verify segment count before sending.
Importing without mapping consent attribute
What goes wrong: Imported contacts have no consent record in Brevo. If audited under GDPR or a complaint review, you can't prove opt-in. EU regulators have fined senders up to 4% of revenue for this.
How to avoid: Add a CONSENT_SOURCE attribute (TEXT) and a CONSENT_DATE attribute (DATE). Populate on import. For ongoing signups, Brevo forms populate these automatically when GDPR fields are enabled.
Recap
Done — what's next
How to set up a Brevo account from scratch (sender, DKIM/SPF/DMARC, GDPR)
Read the next tutorial
Hand it off
List + segment architecture compounds. Every flow, campaign, and report depends on it. A specialist who's built this for 50+ accounts will design a structure that scales 100x in 1-2 hours. Typical engagement is $200-400 of one-time work at $14-16/hr.
See specialist rates
Lists are static groups you put contacts in manually or via signup. Segments are dynamic filters that update automatically based on contact attributes and behavior. Use ONE master list + many segments — segments don't multi-count contacts toward billing.
No — Brevo uses Contact Attributes instead. Functionally similar (you set arbitrary metadata on a contact), but stored as typed fields. A TEXT attribute like 'INTEREST' with values 'menswear', 'womenswear', etc. plays the role of tags. Plan the field type upfront.
No hard limit. Segments scale to millions of contacts. Refresh time scales with list size: 5K contacts refresh in seconds, 500K in 5-30 minutes. Plan for the lag when building automations that depend on segment membership.
Yes — when creating a campaign, you can select multiple segments. Brevo automatically deduplicates so a contact in two selected segments only receives one copy. This is the right way to combine segments instead of creating a 'union' segment.
Contacts → Lists → select source list → Actions → Move to another list. Or via CSV: export from source list, import to destination list with 'Move' option. For ongoing automation, use a workflow (Automations → Workflows) with the action 'Add to list' / 'Remove from list.'
Three usual causes: (1) filter has an impossible AND combination (e.g., must be VIP AND must be new in last 30 days = excludes everyone unless a new contact reaches VIP status that fast), (2) the attribute the filter uses is blank for most contacts, (3) segment is still refreshing — wait 30 minutes for large lists.
Brevo
Brevo's onboarding is friendly enough to lull you into skipping the decisions that actually matter — plan choice, sender-domain auth, transactional vs marketing separation, GDPR fields. Skip them and deliverability quietly tops out at 60-70%. This is the setup that doesn't rot.
Brevo
Brevo's drag-drop editor is one of the friendliest in the market — which is why most accounts ship visually-good emails that under-convert. The decisions that move the needle aren't in the editor; they're in the segment, the subject, and the send window.
Brevo
Brevo's automation builder is genuinely capable — split conditions, multi-channel (email + SMS), and event triggers. But the difference between an automation that runs and one that drives 25-40% of revenue is in the trigger logic, exits, and split branches. Here's the build that converts.
Brevo
If your Brevo open rate just dropped 5-15 points or your campaigns are landing in Promotions/Spam, you're seeing a deliverability problem — not a content problem. The diagnosis is methodical; the recovery takes 30-60 days. Here's the playbook.
Brevo
DIY Brevo is a great call — until it isn't. Email + SMS + transactional + CRM should drive 25-40% of revenue for online businesses on an all-in-one platform. If yours is at 10-15%, the gap is the platform isn't being worked. Here's the framework for when to hire.