Integrate Bolt.new with Brevo (formerly Sendinblue) by generating an API key in Brevo's Settings → API Keys, storing it in your .env file, and calling the Brevo REST API v3 through a Next.js API route. Send transactional emails, SMS messages, and manage contacts from a single API. Brevo's free plan allows 300 emails per day — ideal for Bolt prototypes. Outbound API calls work in Bolt's WebContainer preview; inbound webhooks require a deployed URL.
Multi-Channel Messaging in Bolt.new Apps with Brevo
Brevo rebranded from Sendinblue in 2023 but kept its API endpoints — all Brevo API URLs still use api.brevo.com and the underlying REST API v3 is unchanged. This is important for Bolt integrations: if you find Sendinblue code examples online, they work with Brevo with only a URL change. The API key structure and endpoint paths are identical.
What makes Brevo stand out for Bolt prototypes is the combination of a genuinely useful free tier (300 emails per day, unlimited contacts, free SMS credits in many countries for testing) and a single API that covers email, SMS, WhatsApp Business, and basic CRM. Compared to SendGrid, which focuses exclusively on email, Brevo lets you send a transactional SMS at the same time as an email confirmation — for example, an order confirmation email plus an SMS with the tracking number — using the same API key and the same server-side route pattern. This multi-channel capability is meaningful for e-commerce, booking, and notification-heavy applications.
All Brevo API calls are outbound HTTPS requests with simple API key authentication using the api-key header. There is no OAuth flow, no token expiry to manage, and no separate client ID/secret pair. From Bolt's WebContainer, every outbound call to the Brevo API works without restriction — you can send real emails and SMS messages in development without deploying. The only operations requiring a deployed URL are Brevo webhook event notifications, which Brevo uses to tell your app about email opens, clicks, bounces, and delivery failures in real time.
Integration method
Bolt generates the Brevo integration through conversation — describe what email, SMS, or contact management features you need and Bolt writes the API routes and React components. Brevo uses simple API key authentication with a single header, making it one of the easiest transactional email APIs to integrate from a server-side proxy pattern. All Brevo API calls run through server-side Next.js routes to keep your API key out of the client bundle. Brevo webhook notifications for email events require a deployed public URL since Bolt's WebContainer cannot receive incoming connections.
Prerequisites
- A Brevo account — the free plan (300 emails/day, unlimited contacts) is sufficient for development
- A Brevo API key generated from Settings (top-right profile icon) → API Keys → Generate a new API key
- Your Brevo sender email verified in Settings → Senders, Domains & Dedicated IPs → Senders (required to send emails)
- A Next.js project in Bolt.new — prompt 'Create a Next.js app' if you don't have one yet
- For SMS: a Brevo account with SMS credits (free test credits available in most accounts)
Step-by-step guide
Get your Brevo API key and set up the environment
Get your Brevo API key and set up the environment
Log in to your Brevo account at app.brevo.com. Click on your profile name or avatar in the top-right corner to open the dropdown menu, then click Settings. In the left sidebar, navigate to API Keys under the Developer section. If you don't see a Developer section, look for Integrations → API Keys. Click Generate a new API key, give it a descriptive name like 'Bolt Integration', and click Generate. Copy the key immediately — Brevo shows the full key only once at generation time. After navigating away, you can only see the key's name and last four characters. In your Bolt.new project, open the .env.local file in the file tree (or create it in the project root). Add your API key as the BREVO_API_KEY environment variable. This is server-side only — never prefix it with NEXT_PUBLIC_, which would expose it in the browser's JavaScript bundle where anyone could read it in DevTools. Before sending emails, you must verify a sender email address in Brevo. Go to Settings → Senders, Domains & Dedicated IPs → Senders and add the email address you want emails to come from. Brevo will send a verification link to that address — click it to confirm. Without a verified sender, your email API calls will return a 400 error. Using your own domain as the sender email (e.g., hello@yourcompany.com) requires domain verification, which adds DNS records to your domain. For quick development, verifying a personal Gmail or work email as the sender is faster and works fine for testing.
Set up Brevo (formerly Sendinblue) email integration in my Next.js app. Add BREVO_API_KEY and BREVO_SENDER_EMAIL (the verified sender address) to .env.local as placeholders. Create lib/brevo.ts with a brevoFetch helper that adds the api-key header and sets the Content-Type to application/json for all requests. Base URL: https://api.brevo.com.
Paste this in Bolt.new chat
1// .env.local2BREVO_API_KEY=your_api_key_here3BREVO_SENDER_EMAIL=hello@yourcompany.com4BREVO_SENDER_NAME=Your App56// lib/brevo.ts7export async function brevoFetch(8 endpoint: string,9 method: 'GET' | 'POST' | 'PUT' | 'DELETE' = 'GET',10 body?: Record<string, unknown>11): Promise<Response> {12 const apiKey = process.env.BREVO_API_KEY!;13 const url = `https://api.brevo.com/v3${endpoint}`;1415 return fetch(url, {16 method,17 headers: {18 'api-key': apiKey,19 'Content-Type': 'application/json',20 Accept: 'application/json',21 },22 ...(body ? { body: JSON.stringify(body) } : {}),23 });24}Pro tip: Brevo API keys do not expire, but you can deactivate and regenerate them at any time from the API Keys page. If you share your Bolt project with others, make sure .env.local is in your .gitignore file so the API key is never committed to version control.
Expected result: Your Brevo API key is stored in .env.local, the brevoFetch utility is created, and your sender email is verified in the Brevo dashboard.
Send transactional emails via the Brevo API
Send transactional emails via the Brevo API
Brevo's transactional email endpoint is POST /v3/smtp/email. This is the core endpoint for sending individual, personalized emails triggered by user actions in your app — welcome emails, password resets, order confirmations, and notifications. The request body requires a sender object with name and email (matching your verified sender), a to array with recipient objects containing email and optional name, and either htmlContent (an HTML string you construct) or templateId (a Brevo template ID created in the dashboard). For inline HTML emails, construct the HTML string in your API route and pass it as the htmlContent field. This gives you complete control over the email design without needing to create templates in Brevo's dashboard — useful for rapid prototyping. For production apps with multiple email types, Brevo's template system (created in the Brevo dashboard under Email → Templates) is cleaner: store the template ID in an environment variable and pass dynamic values as a params object. Brevo supports email personalization through double-curly handlebars syntax in templates: {{ params.firstName }} inserts the firstName from the params object. In inline HTML, you construct the personalization yourself using template literals in JavaScript. The API also supports attachments (base64-encoded files), CC/BCC recipients, reply-to addresses, and custom headers for email client compatibility. Since this is an outbound POST request from your server-side Next.js route to Brevo's API, it works without any issues in Bolt's WebContainer development preview. You can send real emails to real recipients while developing — just be careful not to send test emails to real customer addresses. Use your own email addresses for development testing.
Create a transactional email API route. Build app/api/email/send/route.ts that accepts a POST with recipient email, recipient name, subject, and message body. Send a formatted HTML email via Brevo with the BREVO_SENDER_EMAIL sender. Include proper error handling and return the Brevo messageId on success. Test it with a form on the page.
Paste this in Bolt.new chat
1// app/api/email/send/route.ts2import { NextRequest, NextResponse } from 'next/server';3import { brevoFetch } from '@/lib/brevo';45export async function POST(request: NextRequest) {6 const { to, toName, subject, htmlContent, textContent } = await request.json();78 if (!to || !subject) {9 return NextResponse.json(10 { error: 'to and subject are required' },11 { status: 400 }12 );13 }1415 const body = {16 sender: {17 name: process.env.BREVO_SENDER_NAME ?? 'My App',18 email: process.env.BREVO_SENDER_EMAIL!,19 },20 to: [{ email: to, name: toName ?? '' }],21 subject,22 htmlContent: htmlContent ?? `<p>${textContent}</p>`,23 ...(textContent ? { textContent } : {}),24 };2526 const response = await brevoFetch('/smtp/email', 'POST', body);2728 if (!response.ok) {29 const error = await response.json();30 return NextResponse.json({ error }, { status: response.status });31 }3233 const data = await response.json();34 return NextResponse.json({ messageId: data.messageId, success: true });35}Pro tip: For welcome emails and onboarding sequences, create the HTML template once in Brevo's Template Editor (it's drag-and-drop), then reference it by ID using the templateId field instead of htmlContent. This makes updating the design easier — change the template in Brevo without touching your code.
Expected result: POST /api/email/send with a valid recipient and subject sends a real email through Brevo and returns a messageId. Check your inbox to confirm the email arrived with correct formatting.
Send SMS messages with Brevo Transactional SMS
Send SMS messages with Brevo Transactional SMS
Brevo's Transactional SMS API endpoint is POST /v3/transactionalSMS/sms. It sends a single SMS message to a phone number and supports delivery tracking. The request body requires sender (the SMS sender name or number — max 11 characters for alphanumeric sender IDs, or a phone number), recipient (the destination phone number in E.164 format: +1XXXXXXXXXX for US numbers), content (the SMS text, max 160 characters for a single message or 918 for multi-part), and type ('transactional' or 'marketing' — use transactional for triggered notifications, marketing requires opt-in consent). SMS sending is available in most countries, but the pricing, available sender types, and compliance requirements vary by country. In the US, you must use a phone number as the sender ID (not an alphanumeric name). In the UK and many European countries, alphanumeric sender IDs are supported. Check Brevo's documentation for your target country before implementing. Brevo provides test SMS credits in most new accounts so you can test without paying. Check your account's SMS credits balance in the Brevo dashboard. For development and testing, sending to your own phone number is the safest approach — it confirms delivery without consuming large numbers of credits. Like email sending, outbound SMS API calls work perfectly in Bolt's WebContainer preview. There are no CORS issues or deployment requirements for sending SMS — it's a standard outbound HTTPS POST. Test the full SMS flow (enter phone number → send → receive SMS on your phone) entirely within the Bolt development environment.
Add Brevo SMS sending to my app. Create app/api/sms/send/route.ts that accepts a POST with phoneNumber (E.164 format with country code) and message text, then sends a transactional SMS via the Brevo API. Use BREVO_SMS_SENDER env variable for the sender name/number. Return success status and Brevo message ID. Add a simple SMS test form to the page.
Paste this in Bolt.new chat
1// app/api/sms/send/route.ts2import { NextRequest, NextResponse } from 'next/server';3import { brevoFetch } from '@/lib/brevo';45export async function POST(request: NextRequest) {6 const { phoneNumber, message } = await request.json();78 if (!phoneNumber || !message) {9 return NextResponse.json(10 { error: 'phoneNumber and message are required' },11 { status: 400 }12 );13 }1415 // Truncate to 160 chars for single SMS (160 = 1 part, 306 = 2 parts, etc.)16 const content = message.length > 160 ? message.substring(0, 157) + '...' : message;1718 const body = {19 sender: process.env.BREVO_SMS_SENDER ?? 'MyApp',20 recipient: phoneNumber,21 content,22 type: 'transactional',23 };2425 const response = await brevoFetch('/transactionalSMS/sms', 'POST', body);2627 if (!response.ok) {28 const error = await response.json();29 return NextResponse.json({ error }, { status: response.status });30 }3132 const data = await response.json();33 return NextResponse.json({34 messageId: data.messageId,35 remainingCredits: data.remainingCredits,36 success: true,37 });38}Pro tip: Always validate phone number format before calling the SMS API. Use a regex like /^\+[1-9]\d{7,14}$/ to check that the number is in E.164 format. Invalid phone numbers return a 400 error from Brevo with a non-obvious error message.
Expected result: POST /api/sms/send with a valid E.164 phone number and message text sends a real SMS. The response includes remainingCredits so you can track your balance.
Manage contacts and lists for email campaigns
Manage contacts and lists for email campaigns
Brevo's Contacts API allows you to create, update, and organize contacts for email marketing campaigns. The key endpoint is POST /v3/contacts for creating a new contact. The request body takes email (required), attributes (an object with any contact attributes like FIRSTNAME, LASTNAME, PHONE — note Brevo attribute names are always uppercase), listIds (array of numeric list IDs to add the contact to), and updateEnabled (boolean — if true, Brevo will update an existing contact with the same email instead of returning an error). Setting updateEnabled: true is equivalent to an upsert operation. To find your list IDs, call GET /v3/contacts/lists which returns all your mailing lists with their numeric IDs. Store the IDs you use most often as environment variables (e.g., BREVO_NEWSLETTER_LIST_ID=3) to avoid hardcoding them in your routes. For bulk contact management, Brevo provides a POST /v3/contacts/import endpoint that accepts an array of contacts and processes them asynchronously. For subscriber management (GDPR compliance), use POST /v3/contacts/doubleOptin/email to trigger a double opt-in confirmation email before adding someone to a marketing list. One important distinction: the Brevo Contacts API serves as a lightweight CRM in addition to being a mailing list manager. Each contact can have custom attributes, notes, and activity history. For Bolt apps that need a simple contact database without a full CRM like HubSpot or Salesforce, using Brevo as both the email platform and contact store is a practical approach — especially given the generous free tier.
Create a contact subscription API. Build app/api/contacts/subscribe/route.ts that accepts a POST with email, firstName, lastName, and an optional tag. Create or update the contact in Brevo using updateEnabled: true, set FIRSTNAME and LASTNAME attributes, and add them to the list with ID from BREVO_NEWSLETTER_LIST_ID env var. Return the created/updated contact id and whether they were new.
Paste this in Bolt.new chat
1// app/api/contacts/subscribe/route.ts2import { NextRequest, NextResponse } from 'next/server';3import { brevoFetch } from '@/lib/brevo';45export async function POST(request: NextRequest) {6 const { email, firstName, lastName, tag } = await request.json();78 if (!email) {9 return NextResponse.json({ error: 'email is required' }, { status: 400 });10 }1112 const listId = parseInt(process.env.BREVO_NEWSLETTER_LIST_ID ?? '0', 10);1314 const body: Record<string, unknown> = {15 email,16 attributes: {17 ...(firstName ? { FIRSTNAME: firstName } : {}),18 ...(lastName ? { LASTNAME: lastName } : {}),19 },20 updateEnabled: true, // upsert: update if email exists21 ...(listId ? { listIds: [listId] } : {}),22 };2324 const response = await brevoFetch('/contacts', 'POST', body);2526 if (!response.ok) {27 const error = await response.json();28 return NextResponse.json({ error }, { status: response.status });29 }3031 const data = await response.json();32 const wasCreated = response.status === 201;3334 return NextResponse.json({35 contactId: data.id,36 wasCreated,37 message: wasCreated ? 'Contact created' : 'Contact updated',38 });39}Pro tip: Brevo attribute names must be uppercase (FIRSTNAME, LASTNAME, PHONE) — this is different from most CRMs that use camelCase. If you pass first_name or firstName, Brevo will create a new attribute with that exact casing rather than updating the standard FIRSTNAME field.
Expected result: POST /api/contacts/subscribe creates a new Brevo contact with the correct attributes and adds them to your newsletter list, or updates an existing contact if the email already exists.
Set up Brevo webhooks after deployment for email event tracking
Set up Brevo webhooks after deployment for email event tracking
Brevo can send real-time notifications to your app when email events occur: delivered, opened, clicked, bounced, marked as spam, or unsubscribed. These webhook events let you update your database in real time — for example, marking a contact as 'unsubscribed' when Brevo tells you they clicked the unsubscribe link, or tracking email engagement in your app's analytics. Like all incoming HTTP connections, Brevo webhooks cannot reach Bolt's WebContainer — the WebContainer runs inside a browser tab with no publicly accessible URL. You must deploy your app to Netlify or Vercel before registering webhooks. Follow Bolt's export workflow to push your code to GitHub, then connect the repo to Netlify or Vercel for automatic deployment. Once your app is deployed and you have a stable public URL, create a webhook in Brevo. Navigate to your Brevo account → Settings → Webhooks (under Developers). Click Create a new webhook, enter your endpoint URL (https://your-app.netlify.app/api/brevo/webhook), select the events you want to receive (Delivered, Opened, Clicked, Bounced are the most commonly needed), and click Save. Brevo does not include a built-in signature verification mechanism for webhooks on all plans. As a minimum security practice, add a secret query parameter to your webhook URL (e.g., /api/brevo/webhook?secret=random_secret) and check it on every incoming request. Store the expected secret in an environment variable on your hosting platform — set it in Netlify's Site settings → Environment variables or Vercel's Project settings → Environment variables before enabling the webhook.
Create a Brevo webhook handler at /api/brevo/webhook. It should accept POST requests, validate a secret query parameter against BREVO_WEBHOOK_SECRET env variable, and parse Brevo email event payloads. Log the event type, recipient email, and message ID for each event. Handle 'unsubscribe' events by logging the email. Return 200 OK for all valid events.
Paste this in Bolt.new chat
1// app/api/brevo/webhook/route.ts2import { NextRequest, NextResponse } from 'next/server';34export async function POST(request: NextRequest) {5 // Basic security: validate secret query parameter6 const secret = request.nextUrl.searchParams.get('secret');7 if (secret !== process.env.BREVO_WEBHOOK_SECRET) {8 return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });9 }1011 let events: Array<Record<string, unknown>>;12 try {13 const body = await request.json();14 // Brevo sends an array of events15 events = Array.isArray(body) ? body : [body];16 } catch {17 return NextResponse.json({ error: 'Invalid JSON' }, { status: 400 });18 }1920 for (const event of events) {21 const eventType = event.event as string;22 const email = event.email as string;23 const messageId = event['message-id'] as string;2425 console.log(`Brevo event: ${eventType} | email: ${email} | id: ${messageId}`);2627 if (eventType === 'unsubscribe') {28 // Update your database to mark this contact as unsubscribed29 console.log(`Contact unsubscribed: ${email}`);30 }3132 if (eventType === 'hard_bounce') {33 // Invalid email address — consider removing from your list34 console.log(`Hard bounce for: ${email}`);35 }36 }3738 return NextResponse.json({ received: true, processed: events.length });39}Pro tip: Register your webhook URL as https://your-deployed-app.com/api/brevo/webhook?secret=your_random_secret in Brevo's settings. Store the same secret value as BREVO_WEBHOOK_SECRET in your hosting platform's environment variables (not in your .env.local, which is local only).
Expected result: After deploying and registering the webhook in Brevo's settings, email delivery events (opens, clicks, bounces) trigger POST requests to your /api/brevo/webhook endpoint. Events are logged in your deployed app's server console.
Common use cases
Transactional email for user signups and confirmations
Send branded welcome emails, order confirmations, and password reset emails through Brevo when users take actions in your Bolt app. Each email uses a Brevo template or inline HTML, with personalization variables like the user's first name and order details inserted dynamically from your app's data.
Create a /api/email/send route that accepts a recipient email, first name, and subject, then sends a transactional email via the Brevo API using inline HTML. The email should have a branded header, a greeting with the first name, and a footer. Show a success toast in the UI after the email is sent.
Copy this prompt to try it in Bolt.new
SMS notification for appointment and order updates
Send automated SMS notifications when appointments are confirmed, orders ship, or important status changes occur in your app. Brevo's Transactional SMS API sends messages to phone numbers worldwide. Users receive the SMS on their mobile phone within seconds of the event occurring in your app.
Add a /api/sms/send route that accepts a phone number (with country code) and message text, then sends an SMS via the Brevo Transactional SMS API. Create a test form in the UI where I can enter a phone number and message to test the SMS sending.
Copy this prompt to try it in Bolt.new
Contact list sync for newsletter signups
When users sign up for a newsletter or waitlist in your Bolt app, automatically add them to a Brevo contact list for future email campaigns. Tag contacts with their signup source and any preferences they indicated. The contacts are immediately available in Brevo for sending marketing emails.
Create a newsletter signup form and /api/contacts/subscribe route. When a user submits their email and name, call the Brevo API to create or update the contact and add them to a contact list with ID from an env variable. Tag the contact with 'newsletter-signup'. Show a success message after subscribing.
Copy this prompt to try it in Bolt.new
Troubleshooting
Email sending returns 400 with 'Sender not allowed' or 'Unauthorized sender'
Cause: The sender email address in your API request does not match a verified sender address in your Brevo account. Brevo requires all sender emails to be verified before use.
Solution: Go to your Brevo account → Settings → Senders, Domains & Dedicated IPs → Senders and verify the email address you are using as the sender. Brevo sends a verification link to that email — click it to confirm. Then ensure your BREVO_SENDER_EMAIL environment variable matches the verified address exactly (including case sensitivity).
SMS sending returns 400 with 'Invalid parameter recipient' even with a correctly formatted number
Cause: The phone number is not in E.164 format (+ followed by country code and number, no spaces or dashes), or the destination country does not support alphanumeric sender IDs and you are using a text string instead of a phone number as the sender.
Solution: Ensure the phone number uses E.164 format: +14155552671 for a US number, +447911123456 for a UK number. Remove any spaces, dashes, or parentheses. For US numbers, use a phone number as the sender (not an alphanumeric name like 'MyApp') — the US requires numeric sender IDs. Set BREVO_SMS_SENDER to a valid registered phone number for US SMS.
1// Correct E.164 phone number format validation2const e164Regex = /^\+[1-9]\d{7,14}$/;3if (!e164Regex.test(phoneNumber)) {4 return NextResponse.json(5 { error: 'Phone number must be in E.164 format (e.g., +14155552671)' },6 { status: 400 }7 );8}Contact creation returns 400 with 'Contact already exists' even though updateEnabled is set to true
Cause: The updateEnabled field is being sent as the string 'true' rather than the boolean true, so Brevo treats it as a missing/false value.
Solution: Ensure updateEnabled is a boolean true in your request body, not the string 'true'. In TypeScript, this means using updateEnabled: true (boolean literal) in your object, not updateEnabled: 'true' (string).
1// Correct: boolean2const body = { email, updateEnabled: true };34// Wrong: string5const body = { email, updateEnabled: 'true' };Webhook events are not arriving even after registering the URL in Brevo settings
Cause: The webhook URL points to a Bolt WebContainer preview URL (e.g., a *.webcontainer-api.io address) that is only accessible from your local browser, not from Brevo's servers on the public internet.
Solution: Deploy your app to Netlify or Vercel first, then register the deployed URL in Brevo's webhook settings. Preview URLs in Bolt's WebContainer are browser-local — Brevo's servers cannot reach them. Use your deployed domain (e.g., https://your-app.netlify.app/api/brevo/webhook) as the webhook endpoint.
Best practices
- Store BREVO_API_KEY as a server-side environment variable — never prefix it with NEXT_PUBLIC_ or use it in client components, as it would be exposed in the browser bundle and allow anyone to send emails on your behalf.
- Use updateEnabled: true when creating contacts to implement upsert behavior — this prevents duplicate contact errors when the same person submits a form multiple times and keeps contact data up to date.
- Brevo attribute names are always uppercase (FIRSTNAME, LASTNAME, PHONE) — follow this convention when creating or updating contacts to ensure values map to the correct standard attributes in Brevo's dashboard.
- Keep SMS content under 160 characters for a single SMS credit — messages longer than 160 characters are sent as multi-part SMS and consume multiple credits. Truncate or summarize in your route before sending.
- Test email sending and SMS sending fully in Bolt's WebContainer preview before deploying — both are outbound API calls that work without a public URL. Only register Brevo webhooks after deployment to a public URL.
- Implement unsubscribe handling in your webhook route — when Brevo sends an unsubscribe event, update your own database to reflect the opt-out status. Continuing to send emails to opted-out addresses violates anti-spam laws and degrades your sender reputation.
- Add email validation before calling the Brevo API — use a regex or library like validator.js to reject obviously invalid emails before making the API call, which reduces unnecessary API usage and gives users clearer error messages.
Alternatives
SendGrid focuses exclusively on email and handles higher sending volumes with more advanced deliverability controls, making it the better choice when email reliability at scale is the primary requirement.
Mailchimp has a better email template builder and audience segmentation tools, making it the stronger choice for marketing-focused email campaigns rather than transactional messaging.
Twilio's SMS API provides more sophisticated programmatic messaging features including two-way SMS, MMS, and WhatsApp Business — better for complex messaging workflows beyond one-directional notifications.
ConvertKit is purpose-built for creator email marketing with subscriber tagging and automation sequences, making it a stronger choice for content creators and course sellers than for transactional emails.
Frequently asked questions
Does Bolt.new have a native Brevo or Sendinblue integration?
No. Brevo (Sendinblue) is not one of Bolt's native connectors. You build the integration manually using Next.js API routes and the Brevo REST API v3. Bolt's AI can generate the routes and components when you describe what email or SMS features you need, but you manage credentials and API calls yourself.
Can I send real emails and SMS messages while developing in Bolt's preview?
Yes. Brevo email and SMS sending are outbound API calls from your server-side Next.js routes to Brevo's servers. These calls work perfectly in Bolt's WebContainer since they use standard outbound HTTPS. You can send actual emails and SMS messages to real phone numbers and email addresses directly from the development preview without deploying. The only Brevo feature that requires deployment is webhook event receiving.
What is the difference between Brevo and Sendinblue? Do old Sendinblue API examples still work?
Sendinblue rebranded to Brevo in May 2023. The REST API is unchanged — it's still called API v3, and the endpoint structure is identical. The base URL changed from api.sendinblue.com to api.brevo.com. Code examples that use the old Sendinblue SDK (@getbrevo/brevo or sib-api-v3-sdk) still work since the package was renamed but the API calls remain the same. Update the base URL in any existing Sendinblue code to api.brevo.com.
How many emails can I send for free with Brevo?
Brevo's free plan allows 300 emails per day with unlimited contacts. The daily limit resets at midnight UTC. There is no monthly cap on free accounts beyond the 300/day limit. Paid plans start at $25/month for 20,000 emails per month with no daily limit. For most Bolt development prototypes and small production apps, the free tier is sufficient.
Does Brevo support email template design?
Yes. Brevo has a drag-and-drop template editor accessible from the Email → Templates section of the dashboard. Templates support dynamic variables using Handlebars syntax ({{ params.firstName }}) for personalization. In your API route, pass the template ID as templateId and dynamic values as a params object instead of htmlContent. This approach is cleaner for production apps with multiple email types since you can update the design in Brevo without changing your code.
Can I use Brevo to send WhatsApp messages from my Bolt app?
Yes, Brevo supports WhatsApp Business messaging through its API. The endpoint is POST /v3/whatsapp/sendMessage. This requires registering a WhatsApp Business Account with Meta and connecting it to your Brevo account. The setup is more involved than email or SMS — you need an approved WhatsApp Business profile and pre-approved message templates for outbound messaging. For simpler use cases, Brevo email or SMS is much faster to set up.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation