DEV Community

우병수
우병수

Posted on • Originally published at techdigestor.com

HubSpot's Free Tier Kept Biting Me — Here's the Stack I Actually Use Instead

TL;DR: The 1,000 contact wall hit me on a Tuesday afternoon, three days into a drip campaign I'd been building for two weeks. HubSpot's free tier didn't warn me with a grace period or a soft degradation — it just stopped enrolling new contacts into the sequence.

📖 Reading time: ~30 min

What's in this article

  1. The HubSpot Free Trap (And Why I Walked Away)
  2. The Stack I Settled On (and What I Tested First)
  3. Brevo (Formerly Sendinblue) — My Email Workhorse
  4. MailerLite — When You Need Landing Pages Without Paying
  5. The Automation Editor Is the Real Story Here
  6. Notion as a Lightweight CRM — Unorthodox but It Works
  7. Why I Stopped Looking for a "Real" Free CRM
  8. Comparison Table: HubSpot Free vs These Alternatives

The HubSpot Free Trap (And Why I Walked Away)

The 1,000 contact wall hit me on a Tuesday afternoon, three days into a drip campaign I'd been building for two weeks. HubSpot's free tier didn't warn me with a grace period or a soft degradation — it just stopped enrolling new contacts into the sequence. Emails queued. Nothing sent. I found out when a client asked why they hadn't heard from us. That's the specific moment I started looking for the exit.

The branding issue compounded it. The forms I'd embedded on our landing pages started appending "Powered by HubSpot" badges that I couldn't suppress without jumping to the Starter plan at $20/month per seat (as of 2024 pricing). That sounds cheap until you realize "per seat" means the cost scales with your team, and the Starter plan still locks pipeline automation behind the Professional tier at $890/month. The free product isn't a stripped-down version of the real thing — it's a funnel into a pricing model designed for companies with actual marketing departments.

Here's what I actually needed, and it wasn't complicated:

  • Email sequences with basic conditional logic (send follow-up if no open after 3 days)
  • A lightweight CRM that tracks contact history without requiring a 6-hour onboarding
  • Landing pages with a form that submits to something I control
  • Webhook or API access so I can pipe data into my own stack

None of that requires an enterprise suite. HubSpot's free tier gives you a taste of all of it, then gates the useful parts behind upgrade thresholds that kick in right when you're getting traction. The 1,000 contact limit isn't a technical constraint — it's a conversion trigger. Their whole free tier is instrumented around the moment you're mid-campaign and emotionally invested enough to swipe a card. I'd watched the same pattern play out with free Salesforce alternatives before (wrote about that separately), and the mechanic is identical: give you enough to build a workflow dependency, then charge for the exit ramp.

The hidden cost of "free" CRMs isn't the upgrade price — it's the migration tax you pay when you leave. I had contacts, deal stages, email templates, and form embed codes scattered across three client sites. Exporting from HubSpot gives you a CSV that preserves contacts but loses custom properties mapping, sequence enrollment history, and any automation logic. Rebuilding that in a new tool took me roughly a day and a half of actual work. Factor that into your "free" calculation. If you're evaluating tools now and want to fit this into a broader systems thinking approach, the Productivity Workflows guide covers how to audit tool dependencies before you're locked in — worth reading before you commit to any platform that touches your contact list.

The thing that caught me off guard wasn't the limits themselves — those are documented if you read carefully. It was how invisible the upgrade pressure becomes when you're inside the product daily. Every time I hit a locked feature, there's a modal with a very reasonable-sounding price. $20/month feels trivial. Then you're on Starter. Then you need automation. Then you're looking at Professional pricing and wondering how you got there. The ratchet only turns one direction. Small business owners with lean operations don't need HubSpot's feature surface area — they need three tools that do one thing well each, with clean data portability and no hostage-taking at 1,000 contacts.

The Stack I Settled On (and What I Tested First)

My current setup didn't come from a blog post — it came from breaking three different free tiers in one quarter and having to migrate contacts twice. Here's where I landed: Brevo for email campaigns and transactional sends, a structured Notion database as my CRM, and MailerLite for landing pages. Each tool earns its spot for a specific reason, and none of them asked for a credit card before I could touch the API.

Brevo's free tier gives you 300 emails/day and unlimited contacts. That ceiling sounds low until you realize most small business marketing is batch-and-blast to a few hundred people, not thousands. The thing that caught me off guard was how good their transactional API actually is — same account, same API key, handles both marketing and triggered emails. Here's a basic send via their REST API without needing a paid plan:

curl -X POST https://api.brevo.com/v3/smtp/email \
  -H "api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "sender": {"name": "Your Name", "email": "you@yourdomain.com"},
    "to": [{"email": "contact@example.com"}],
    "subject": "Hello",
    "htmlContent": "<p>Your message here</p>"
  }'
Enter fullscreen mode Exit fullscreen mode

No credit card required to get that API key. That was a hard requirement for me — too many "free" tools gate API access behind payment info and then charge you the moment you exceed a soft limit you didn't know existed.

Notion as a CRM sounds like a hack until you actually set it up properly. I have a database with fields for Last Contacted, Deal Stage, Company, and Notes — filtered views per stage, and a Notion API integration that lets me push new leads in from a form handler. It's not Salesforce. It won't do automated sequences or lead scoring. But for a solo operator managing under 200 active contacts, the overhead of a real CRM creates more friction than it solves. The Notion API is genuinely free with no rate-limit surprises at small scale — 3 requests/second on the free plan, which is plenty for a webhook-triggered contact push.

What I Tested and Dropped

Zoho CRM was the first thing I tried. On paper, the free tier (up to 3 users, core CRM features) looked solid. In practice, the UI punishes you for every action — finding the import settings takes four clicks through menus that don't follow any logical hierarchy. I spent 40 minutes trying to set up a simple web-to-lead form and gave up when I realized the free tier forces Zoho branding on the form embed. That's a dealbreaker when the form is going on a client-facing page. Customer sees "Powered by Zoho" and immediately your positioning takes a hit.

Freshsales I dropped faster. The free tier is genuinely just a demo with a contact limit so low (up to 3 users but with severely restricted pipeline views and no workflow automation) that you hit the ceiling before you've finished importing your existing contacts. Their sales team emails you within 48 hours of signup. That's not a complaint — it's just a data point that their free tier is a funnel, not a product.

The Criteria That Actually Filtered the List

  • Real free tier limits posted publicly — if I have to sign up to find out the limits, I assume the limits are embarrassing
  • No forced branding on customer-facing output — forms, emails, landing pages — anything a client or subscriber sees shouldn't advertise the tool
  • API access without a credit card on file — Brevo and Notion both pass this; most others don't
  • Doesn't nag me to upgrade inside the product — this sounds petty but modal upsell prompts destroy flow when you're trying to do actual work

MailerLite rounds out the stack specifically for landing pages. Their free plan (up to 1,000 subscribers, 12,000 emails/month) includes the landing page builder with a custom domain — no MailerLite branding on the published page. That's genuinely rare. The builder itself is drag-and-drop with no code option, which matters when I'm handing page editing off to a non-technical business owner. The gotcha: A/B testing on landing pages is locked to paid plans. If you're iterating on conversion rate, that's a real limitation. I work around it by running separate pages on separate URLs and tracking clicks manually in a Google Sheet — not elegant, but it works.

Brevo (Formerly Sendinblue) — My Email Workhorse

The reason I landed on Brevo over Mailchimp for my own newsletter setup was simple: Mailchimp's free tier caps you at 500 contacts. Brevo lets you store unlimited contacts and just throttles your daily sends to 300 emails. For a small business owner with a 600-person list who sends a weekly digest, that math works out fine — you batch your sends over two days and move on. That single architectural difference made every other comparison irrelevant.

Getting your first automation sequence live takes about 20 minutes if you know what to avoid. Go to Automations → Create a workflow, pick "Welcome message" as your starting template, and you'll see the visual drag-and-drop builder. The trigger setup (contact added to a list, form submitted, etc.) works reliably. Where things get wobbly is the delay nodes — I set a 3-day delay before a follow-up email, and it fired after 2 days for roughly a third of my contacts on the first run. Brevo acknowledged it was a known edge case when the workflow had been dormant and then received a flood of new entries at once. My fix: don't use delay nodes for anything time-sensitive. Use them for "day 3 onboarding nudge" sequences, not anything where timing matters to the recipient.

The Deliverability Trap Nobody Warns You About

This one cost me about two weeks of head-scratching. By default, Brevo routes both your marketing campaigns and your transactional emails (password resets, order confirmations, anything sent via their SMTP or API) through the same sending domain. If your marketing campaigns generate unsubscribes or complaints — which they always do eventually — that reputation hit bleeds into your transactional sending. I noticed my password reset emails starting to land in Gmail's Promotions tab, which is a bad sign.

The fix is to split them. In Brevo, go to Senders & IP → Dedicated IP (paid) or, on free tier, create a subdomain specifically for transactional sends. Your marketing goes out from mail.yourdomain.com and transactional from tx.yourdomain.com. Then update your DNS records accordingly — you need separate SPF, DKIM, and ideally DMARC records for each subdomain. Here's the minimum DNS setup for the transactional subdomain:

; SPF record for tx.yourdomain.com
tx.yourdomain.com. TXT "v=spf1 include:sendinblue.com ~all"

; DKIM — Brevo generates this key for you in Settings > Senders & Domains
brevo._domainkey.tx.yourdomain.com. TXT "v=DKIM1; k=rsa; p=YOUR_PUBLIC_KEY"

; DMARC
_dmarc.tx.yourdomain.com. TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com"

Once I did this, transactional delivery went back to normal within 48 hours. If you're also using Brevo's API to send transactional emails in your app, make sure you specify the sender object in your API call with the address tied to the clean subdomain:

POST https://api.brevo.com/v3/smtp/email
Authorization: api-key YOUR_API_KEY
Content-Type: application/json

{
"sender": { "name": "YourApp", "email": "noreply@tx.yourdomain.com" },
"to": [{ "email": "user@example.com" }],
"subject": "Your password reset link",
"htmlContent": "

Click here to reset...

"
}

The Analytics Gap Is Real

Free tier gives you open rates, unsubscribes, and basic click counts per campaign. That's it. You do not get click maps — the visual overlay showing which links in your email got clicked and how many times. You also don't get per-contact click history, which matters when you're trying to figure out which subscribers are actually engaged versus just sitting on your list. For a small list under 500 people, you can cobble this together manually with UTM parameters in Google Analytics. Tag every link in your email with utm_source=brevo&utm_medium=email&utm_campaign=your-campaign-name and GA4 will give you the breakdown. It's not as convenient as a click map, but it gets you the data. Upgrading to Brevo's Starter plan at $25/month unlocks proper analytics if you need them, but for most small business owners starting out, the UTM workaround is sufficient.

MailerLite — When You Need Landing Pages Without Paying

The Automation Editor Is the Real Story Here

I expected MailerLite to be a lightweight email tool with some landing page features bolted on. What I didn't expect was an automation workflow builder that's genuinely more usable than HubSpot's free tier. HubSpot's free workflows feel like they're intentionally hobbled to push you toward the $800/month Marketing Hub. MailerLite's free automation lets you branch on email opens, clicks, custom fields, and time delays — all without a paywall. I built a 5-step onboarding sequence with conditional branches in about 20 minutes. The same logic in HubSpot Free would've required workarounds or a paid upgrade.

The landing page situation is where MailerLite clearly separates from Brevo. Brevo's free tier gives you email campaigns but basically nothing useful for capturing leads on a standalone page. MailerLite gives you drag-and-drop landing pages, pop-ups with targeting rules (exit intent, scroll depth, time on page), and embeddable signup forms — all with zero MailerLite branding on the free plan. That's the kind of thing you usually pay $30–50/month to unlock elsewhere. For a small business owner trying to validate a product or run a lead magnet campaign, this is genuinely useful out of the box.

Free tier specifics, because vague promises don't help: 1,000 subscribers and 12,000 emails/month. That 12:1 send ratio is enough to run weekly newsletters plus a 3-email welcome sequence to your whole list with headroom left over. For context — if you're below 1K subscribers, you haven't validated enough to justify paying for anything yet. MailerLite's limits are designed exactly for the "I need real data before I commit" phase. Hit those limits, and you're looking at $9/month for 500 subscribers or $15/month for up to 2,500. Pricing is on their site and hasn't crept up the way similar tools tend to after funding rounds.

Here's the gotcha that will bite you if you're in a hurry: MailerLite manually reviews new accounts. I signed up expecting to start building immediately and hit a "your account is under review" screen. It took just over 48 hours to get approved. No weekend support to escalate it. If you're planning a campaign launch and you sign up the day before, you're going to have a bad time. Create your account at least a week before you need it. The review exists because they're serious about spam rates (their deliverability is genuinely good as a result), but they don't warn you prominently enough during signup.

Use MailerLite specifically when your marketing strategy depends on lead capture pages — a free guide download, a waitlist, a webinar signup. If you're just blasting a newsletter to an existing list with no landing page needs, Brevo's free tier is simpler to get running fast. But if you need the full funnel — traffic hits a page, person subscribes, automation fires — MailerLite handles that end-to-end without charging you until you're past the "is this working at all?" stage.

Notion as a Lightweight CRM — Unorthodox but It Works

Why I Stopped Looking for a "Real" Free CRM

Every free CRM I tried had the same failure mode: I'd spend two hours setting it up, import my contacts, then hit a wall — either a record limit, a feature locked behind a paid tier, or a UI so cluttered it felt like a chore to log a simple call. HubSpot Free is actually decent until you realize email sequences and even some basic reporting require a paid seat. Zoho CRM Free caps you at 3 users and the interface feels like it was designed by a committee in 2009. I kept shopping for the "right" tool until I realized I was wasting time that could've gone into actually talking to prospects. So I built a Notion database instead, and I've been using it for over a year without wanting to switch.

The Exact Database Schema I Use

My main table is called Deals and it has these properties — no more, no less:

  • Company — Text. Just the company name. I don't link to a separate Companies table because that adds friction.
  • Contact Name — Text. First name + last name in one field. Yes, I know that's not "proper" normalization. It doesn't matter for a solo operator.
  • Email — Email property type. Notion makes it clickable, which saves two seconds per lookup.
  • Last Touchpoint — Date. I update this manually every time I send an email or take a call. It's the most important field — stale deals rot fast and this surfaces them.
  • Deal Stage — Select with options: Lead, Qualified, Proposal Sent, Negotiating, Closed Won, Closed Lost, Dormant.
  • Next Action — Text. A one-liner: "Send revised proposal by Thursday" or "Follow up if no reply by Monday."
  • Deal Value — Number, formatted as currency.
  • Source — Select: Referral, Inbound Form, Cold Outreach, Event.

That Deals database has a relation property pointing to a second table called Meetings. Each meeting row has a Date, a linked Deal, and a Notes field where I paste bullet points from the call. When I open a Deal, I can see every meeting chronologically in a linked view. This replaces HubSpot's activity timeline — not as pretty, but it works and it's free forever.

Wiring Brevo Form Submissions Into Notion via Make.com

The automation that actually makes this useful: when someone fills out a lead form on my site (hosted through Brevo, formerly Sendinblue), that contact lands automatically in my Notion Deals table. Here's the Make.com scenario structure — it's three modules:

  1. Brevo — Watch Contacts: triggers when a new contact is added to a specific Brevo list (I use list ID for my "Website Leads" segment). Set polling interval to 15 minutes on the free Make tier.
  2. Notion — Search Database Items: searches the Deals table by email to check for duplicates before inserting. Filter: Email contains [Brevo contact email]. If this returns a result, the scenario stops — no duplicate rows.
  3. Notion — Create Database Item: maps Brevo fields to Notion properties. First Name + Last Name concat into Contact Name, email maps to Email, the current date maps to Last Touchpoint, Deal Stage hardcodes to Lead, Source hardcodes to Inbound Form.

If you're using Zapier instead of Make, the structure is identical — Trigger: "New or Updated Contact in Brevo," then a Formatter step to merge name fields, then a "Create Database Item in Notion" action. The Zapier free tier runs Zaps every 15 minutes too, so there's no real difference. One gotcha: Notion's API requires your database to be connected to the integration you create in notion.so/my-integrations. You do this by opening the database, clicking the three-dot menu, then "Add connections." I forgot this the first time and spent 20 minutes wondering why my API calls returned Could not find database with ID.

When This Setup Actually Falls Apart

Notion's permission model is not built for teams touching shared data. On the free plan, you get unlimited guests but they can only view — not edit — unless you add them as full workspace members, which eats into your 10-member limit on the Plus plan ($16/member/month as of early 2025). Even on paid, there's no field-level permissions. If you have a sales rep and a marketing person both updating the same Deals database, one of them will accidentally overwrite the other's Last Touchpoint or change a Deal Stage without context. There's no audit log on the free plan. You can't lock a field. You can't require a reason when a stage changes.

The thing that caught me off guard specifically: Notion has no concept of record ownership. In HubSpot, a deal is "owned" by a rep and you can filter by owner trivially. In Notion, you'd have to add a Person property and manually assign it — and then trust that everyone filters their views consistently. If you're a solo operator or two-person team where one person owns CRM duties, this schema works great. The moment you have three salespeople with overlapping territories, stop here and look at something like Twenty CRM (open source, self-hostable) or even the HubSpot Free tier which, despite its limits, actually handles multi-user deal ownership correctly out of the box.

Comparison Table: HubSpot Free vs These Alternatives

The Numbers That Actually Matter Side-by-Side

The thing that caught me off guard when I first compared these platforms wasn't the contact limits — it was how each platform picks a different constraint to throttle you on. HubSpot gives you a million contacts but chokes you at 2,000 emails per month. Brevo flips that entirely: unlimited contacts, but 300 emails per day (~9,000/month). MailerLite sits in the middle at 1,000 subscribers and 12,000 emails/month. None of these are directly comparable, which is exactly why the "which is more generous?" question is impossible to answer without knowing your specific list size and send frequency first.

Feature

HubSpot Free

Brevo Free

MailerLite Free

Contact limit

1,000,000

Unlimited

1,000 subscribers

Email send limit

2,000 / month

300 / day (~9,000/mo)

12,000 / month

Landing pages

Yes (limited)

No

Yes (10 pages)

Automation

Basic (single-action)

Basic workflows

1 automation workflow

Branding on free tier

HubSpot logo on forms + emails

Brevo logo in footer

None

A/B testing

No

No

No

API access

Yes (rate limited)

Yes (full REST API)

Yes (v3 API)

Biggest dealbreaker

2,000 email cap hits fast

300/day is painful for blasts

1,000 subscriber ceiling

A/B testing is locked behind a paywall on all three platforms — zero exceptions. I mention that specifically because I've seen small business owners build their entire email strategy around "we'll test subject lines" only to discover this the week of their first campaign. On HubSpot Free, you also don't get reporting beyond basic open/click rates. No attribution, no revenue tracking, no UTM stitching inside the platform. You're flying with basic instrumentation.

The branding situation is where MailerLite pulls ahead in a way that's hard to overstate. HubSpot slaps its logo on your forms and your outgoing emails on the free tier. If you're sending 2,000 emails with "Powered by HubSpot" in the footer to your prospects, that's a legitimacy problem for a business trying to look professional. Brevo puts their logo only in the email footer. MailerLite removes it entirely — no asterisk, no hidden settings. That alone is why I'd recommend MailerLite to any bootstrapped B2B founder with a list under 1,000.

On the API side, Brevo's free tier is surprisingly developer-friendly. You get full REST API access with no separate API pricing tier. Here's a basic contact creation call to give you a sense of the interface:

curl --request POST \
  --url https://api.brevo.com/v3/contacts \
  --header 'accept: application/json' \
  --header 'api-key: YOUR_API_KEY' \
  --header 'content-type: application/json' \
  --data '{
    "email": "someone@example.com",
    "attributes": {"FIRSTNAME": "Alex"},
    "listIds": [3]
  }'
Enter fullscreen mode Exit fullscreen mode

HubSpot's free API works, but you'll hit rate limits at 100 requests per 10 seconds on the free CRM, and their v3 API requires you to navigate their OAuth flow even for basic use cases — overkill for a solo marketer who just wants to sync a signup form. MailerLite's v3 API is clean and well-documented; it's the one I'd integrate first if I were building a custom signup flow on a Next.js site.

Here's how I'd match each platform to a situation: if your list is under 1,000 and you care about looking professional without paying anything, MailerLite free is the obvious pick. If you're importing a large list from a previous tool and need to store contacts without hitting a wall, Brevo's unlimited contact storage is a genuine advantage — just don't plan a 5,000-email blast in a single day. HubSpot Free makes the most sense if you actually need CRM features alongside email: deal tracking, contact timelines, and meeting scheduling are all available and reasonably capable on the free plan. Use it as a CRM with basic email, not as an email marketing platform.

When to Pick What — Matching Tools to Your Actual Situation

Solo Consultant? Stop There — You Don't Need a CRM Yet

If you have under 500 contacts and you're a solo operator, the honest answer is MailerLite + Notion and nothing else. I've watched consultants spend three weekends configuring HubSpot pipelines for a client roster that would fit in a Google Sheet. MailerLite's free tier covers 1,000 subscribers and 12,000 emails/month — that's enough headroom to run a real newsletter business. Pair it with a Notion CRM template (there are solid free ones on Notion's template gallery) for contact notes and deal tracking, and you've got 90% of what HubSpot sells you. The thing that caught me off guard was how much cognitive overhead a "full CRM" adds when you're the only one using it. You end up logging activity for the sake of the tool, not for your actual work.

Running E-Commerce or Need Transactional Email? Brevo Is the Only Real Answer

If you're sending order confirmations, password resets, or shipping updates alongside marketing campaigns, you need a platform that handles both SMTP transactional and broadcast email from one account. Brevo (formerly Sendinblue) is the only free-tier option that actually does this cleanly. Their free plan gives you 300 emails/day with no contact limit, plus a working SMTP relay you can drop straight into your app:

MAIL_HOST=smtp-relay.brevo.com
MAIL_PORT=587
MAIL_USERNAME=your_login@email.com
MAIL_PASSWORD=your_smtp_key_here
MAIL_ENCRYPTION=tls
Enter fullscreen mode Exit fullscreen mode

MailerLite doesn't do transactional at all. Mailchimp technically does through Mandrill, but Mandrill costs extra and the integration feels bolted on. Brevo's transactional dashboard is separate from the marketing dashboard, which is actually the right design — you can see delivery rates and open rates without them contaminating each other. The gotcha: their free tier throttles at 300/day hard. If you spike past that during a sale, emails queue silently and you won't know until a customer complains. Set up their webhook for delivery events early.

Team Sharing CRM Access Is Where Free Tiers Break Down Fast

The moment a second person needs to log into your CRM and see the same pipeline, you've crossed a line that most free tools handle badly. HubSpot's free CRM technically allows multiple users, but it restricts reporting and sequences in ways that will frustrate anyone trying to actually run a sales process. Zoho CRM's free tier supports 3 users with real pipeline views, contact history, and basic automation — it's genuinely functional, not a stripped demo. I'd go Zoho free first, and if you're hitting its limits, that's actually a signal your operation has grown enough that HubSpot's Starter plan at $20/month is now the right conversation, not another free-tier shuffle.

Cold Outreach Is a Completely Different Category — Don't Conflate It

None of the tools in this guide are for cold outreach. Not MailerLite, not Brevo, not Zoho. Sending unsolicited email through an ESP will get your account terminated and your domain reputation torched, usually within days. If you're doing cold outreach — prospecting, SDR sequences, LinkedIn + email combos — you want Instantly or Apollo, which are purpose-built for that workflow with domain warming, sending limits per mailbox, and deliverability infrastructure that assumes you're emailing people who don't know you. Apollo's free tier gives you 10,000 email credits/month and a decent prospecting database. These are fundamentally different tools solving a different problem, and conflating them is how people burn their sending domains.

Growing Fast? Start on MailerLite Paid, Not HubSpot Free

Here's the trap I've seen developers fall into repeatedly: they pick HubSpot free because the brand feels safe, grow into it, then discover the paid upgrade is $800/month (Marketing Hub Professional) with almost nothing useful in between. MailerLite's upgrade path is $9/month for up to 1,000 subscribers with unlimited emails, then scales linearly by list size. The jump from free to paid on MailerLite is painless — same interface, same automations, just removed limits. If you can see yourself hitting 1,000 subscribers in the next quarter, start on MailerLite paid now. The $9 is not the issue; avoiding a platform migration mid-growth is.

The Setup in Practice — Getting Brevo + MailerLite Running Without Duplicate Lists

The mistake I see constantly: someone sets up both Brevo and MailerLite, imports their 2,000-contact CSV into both, and three weeks later has no idea which tool has the canonical unsubscribe state. Contact unsubscribes from a MailerLite campaign — fine, that gets recorded. But Brevo still thinks they're active, so your next transactional drip sequence fires anyway. You've just violated CAN-SPAM, burned a contact's trust, and have zero clean way to reconcile without doing a manual diff. Don't do this.

My actual setup: MailerLite owns the list, full stop. Every subscriber lives there. Every unsubscribe is recorded there. Brevo never holds a persistent contact list — it only receives individual send instructions via its transactional API. The moment someone subscribes through my MailerLite form, a webhook fires and I upsert that contact into Brevo purely for transactional sends (order confirmations, password resets, that kind of thing). The moment they unsubscribe in MailerLite, a second webhook fires and I suppress them in Brevo immediately. One source of truth. The sync is one-directional and intentional.

Configuring the Brevo Webhook to Listen on Subscribe and Unsubscribe Events

In MailerLite, go to Integrations → Webhooks and create two webhooks pointing at your endpoint — one for the subscriber.created event and one for subscriber.unsubscribed. Your endpoint needs to handle both and branch on the event type. Here's what the minimal handler logic looks like:

// Express endpoint — dead simple, no abstraction
app.post('/ml-webhook', express.json(), async (req, res) => {
  const { type, data } = req.body;

  if (type === 'subscriber.created') {
    await brevoUpsertContact(data.subscriber.email, data.subscriber.fields);
  }

  if (type === 'subscriber.unsubscribed') {
    await brevoUnsubscribeContact(data.subscriber.email);
  }

  res.sendStatus(200); // MailerLite retries if you return non-2xx
});
Enter fullscreen mode Exit fullscreen mode

MailerLite expects a 200 back within a few seconds or it'll retry the webhook — I got caught by a slow Brevo API call blocking the response on first setup. Move the Brevo API call to async fire-and-forget if your endpoint is slow, but make sure you log failures somewhere. I use a simple Supabase table to record every incoming webhook payload so I can replay if something breaks.

Testing the Brevo API Before Wiring Up Any Automation

Before you connect anything to a real webhook flow, test the Brevo contacts API directly with curl. This is the exact command to upsert a contact into a Brevo list (list ID lives in your Brevo dashboard under Contacts → Lists):

curl --request POST \
  --url https://api.brevo.com/v3/contacts \
  --header 'accept: application/json' \
  --header 'api-key: YOUR_BREVO_API_KEY' \
  --header 'content-type: application/json' \
  --data '{
    "email": "test@yourdomain.com",
    "attributes": {
      "FIRSTNAME": "Test",
      "LASTNAME": "User"
    },
    "listIds": [YOUR_LIST_ID],
    "updateEnabled": true
  }'
Enter fullscreen mode Exit fullscreen mode

The updateEnabled: true flag is the one that trips people up — without it, Brevo throws a 400 if the contact already exists instead of silently updating. Brevo's free tier lets you store up to 100,000 contacts and send 300 transactional emails per day, which is genuinely enough for a small business running order confirmations and welcome sequences. The thing that caught me off guard was that Brevo's API rate limit sits at 400 calls per minute on free — fine for low-volume sends, but if you ever try to batch-import 3,000 contacts via individual API calls you'll start seeing 429s fast. Use their bulk import endpoint instead.

To suppress an unsubscribed contact in Brevo (so they can't receive transactional emails either), you update their emailBlacklisted attribute rather than deleting them — deleting would lose the suppression record and they could get re-added later:

curl --request PUT \
  --url https://api.brevo.com/v3/contacts/test@yourdomain.com \
  --header 'accept: application/json' \
  --header 'api-key: YOUR_BREVO_API_KEY' \
  --header 'content-type: application/json' \
  --data '{"emailBlacklisted": true}'
Enter fullscreen mode Exit fullscreen mode

This two-tool setup takes maybe two hours to wire up properly and after that it's maintenance-free. MailerLite handles your newsletter, automations, and list hygiene. Brevo handles transactional sends with better deliverability than shoving those through MailerLite's SMTP. The split also means if you eventually outgrow one tool, you're not migrating everything at once — you swap the relevant piece and the other keeps running.

Honest Verdict After 6 Months

Six months in, here's what I actually think

The thing I genuinely miss is HubSpot's contact timeline view. You open a contact and you can see every email sent, every form filled, every page visited, every deal note — all in chronological order, all in one place. Nothing in the free stack I've assembled comes close to replicating that. Brevo shows email activity. Your CRM shows deal history. But getting a unified picture of a contact across channels requires either paying for something or building a Zap/Make chain that still doesn't render as cleanly. If your sales process depends on reps reading context before a call, this gap will cost you time every single day.

What I don't miss at all: the 2,000 emails/month ceiling on HubSpot Free. That's not a limit — that's a trap. You build a workflow, your list grows past a few hundred contacts, and suddenly you're rationing sends or staring at an upgrade page that starts at $800/month. I also don't miss HubSpot branding on embedded forms. Every form you publish on the free tier has "Powered by HubSpot" stamped on it. That's fine for a side project, embarrassing for a client-facing business. The upgrade nudges inside the dashboard were also relentless — gray locked features everywhere, tooltips that open pricing pages. After switching to a stack where I only see features that actually work, the mental overhead dropped noticeably.

Would I recommend this approach to another small business owner? Yes, with one honest caveat: you are signing up for duct tape work. You'll spend a Saturday getting Brevo talking to your CRM via Make. You'll debug a webhook that stopped firing because a field name changed. You'll manually check that your unsubscribe list synced across tools. HubSpot handles all of that silently in the background. The free alternatives make you the integration layer. If you're comfortable in a browser-based automation tool and you don't panic when an API call fails, the stack pays off. If you want something that works out of the box and you bill your time at a rate where a Saturday of setup costs more than a month of HubSpot, do the math first.

Here's the one scenario where I'd send someone back to HubSpot Free without hesitation: you need sales pipeline and email marketing in a single UI, you have zero tolerance for setup, and your list is under 2,000 contacts. That combination is exactly what HubSpot Free was designed for. The pipeline view, the deal stages, the email sequences tied to contact records — it's a genuinely well-designed product for that specific use case. The moment you need more sends, more contacts, or you want to remove their branding, the free tier stops being viable. But for a tiny operation that just needs to track five deals and send a newsletter once a month, HubSpot Free is still the least-friction option on the market.

The honest summary looks like this:

  • Brevo (free tier: 300 emails/day, unlimited contacts) handles transactional and marketing email without the ceiling problem
  • HubSpot CRM free is actually still in my stack — just for contact storage and pipeline, not email
  • Make (free tier: 1,000 operations/month) handles the sync between them
  • Tally replaces HubSpot forms with no branding and a cleaner embed
  • Total cash cost: $0. Total setup time: one full weekend. Ongoing maintenance: about 30 minutes a month watching for broken automations

The contact timeline is the real loss. Everything else I traded away was either a limitation dressed up as a feature or a nudge toward a pricing tier that makes no sense for a small business. If someone builds a free tool that aggregates contact activity across email, forms, and your CRM into a single timeline view, I'll switch to it immediately. Until then, I check three tabs instead of one, and I've made my peace with that.


Disclaimer: This article is for informational purposes only. The views and opinions expressed are those of the author(s) and do not necessarily reflect the official policy or position of Sonic Rocket or its affiliates. Always consult with a certified professional before making any financial or technical decisions based on this content.


Originally published on techdigestor.com. Follow for more developer-focused tooling reviews and productivity guides.

Top comments (0)