Anything but Brevo

It is very easy to be blinded to the essential uselessness of them by the sense of achievement you get from getting them to work at all. In other words—and this is the rock solid principle on which the whole of the Corporation’s Galaxy-wide success is founded—their fundamental design flaws are completely hidden by their superficial design flaws.

Douglas Adams, The Hitchhiker’s Guide to the Galaxy

When you set out to choose your your autoresponder, aka CRM, a lot of resources will point you to Brevo (formerly SendInBlue). I think this is because among mature email general-purpose email CRMs, they are comparatively cheap at the low end. And on paper they offer every possible feature you could think of (never mind whether any of those features actually work).

Either that or it is some sort of industry-wide novice marketer hazing ritual. Because no one who has actually used Brevo would choose them over the competition, unless they were under duress.

Here are some notes on my experiences with Brevo (directly, and on behalf of clients) over the years. As a caution for unwary entrepreneurs.


I was on track to switch to Brevo once, but I made the mistake of actually trying to use it for a month or so.

I started out by trying to import my contacts from Drip, a service they offer a built-in migrator for. It sat for a very long time doing nothing, and I thought it was broken.

It was at this point that I came in contact with one of Brevo’s more fundamental architecture flaws: it can only do one thing at once. There is no concept of “batch jobs”, plural. To prevent you from confusing their un-parallel-safe design they simply lock the whole interface. With no percentage-done indication. For however long the job takes. Which in this case was three and a half hours.

(3.5 hours for 16k contacts… imagine how long someone with a million contacts would have had to wait to use the interface again…)

Not content to let me know once, they sent me sixteen email notifications that the import was done. Which corresponded suspiciously to the roughly 16,000 contacts I had imported. Someone didn’t put the “job’s done” notification code at the right loop nesting level.

I let their support know about this little bug. They informed me “you receive a notification every time a contact is imported”. Fortunately this is not true. It is also generally indicative of how informed Brevo support tends to be about their own product.


I also tried to do import via CSV, but discovered their import tool is also broken. If you select, say, the “COUNTRY” column from the import, you get the contacts of some other, random column.


From time to time, Brevo sends out “integration error” emails under the attention-getting heading “Some problems need your attention“. “I don’t remember setting up any integrations” you’ll say to yourself. Then you’ll look more closely at the email and realize Brevo is letting you know that it ran into trouble integrating with… itself.

Clicking “View My Integrations” takes you to an empty page.

Brevo’s cost-cutting policy can be summed up as: “we pass the bugs on to the consumer, and save!”.


Brevo’s interface is peppered with unprintable or incorrectly-rendered characters from failures to correctly escape user-entered strings, such as names of automations or API keys. It’s a little disconcerting.


Like every CRM, Brevo has contact segments. Unlike more complete CRMs, segments cannot be composed from other segments.

What does this mean for you? Imagine you have a segment Inactive Contacts. And another one: Unsubscribed from All Newsletters. Now imagine you want to put these together into a Purgesegment so you can prune low-value contacts. Can you build this new segment based on the first two? No! You must reconstruct it from scratch. And if the rules for Inactive Contacts ever change, good luck remembering to update your Purge list to match.


You can’t negate conditions in the automation builder. And if you insert a new condition in a workflow, you don’t get to pick whether to put the existing path on the “true” or the “false” branch.

“OK” you might think. “I’ll just build a negated version of the segment the “if” branches on. Then you remember you can’t compose segments (see above). So you can’t make a Not Users segment by building a segment with a rule “Anyone not a member of Users“. You have to duplicate your Users segment, only in the inverse.


This barely scratches the surface of the problems I’ve encountered with Brevo. Drop a comment if you have experiences of your own to add.

Leave a Reply

Your email address will not be published. Required fields are marked *