DEV Community

Cover image for Cách sử dụng Brevo API cho SMS Marketing hiệu quả
Sebastian Petrus
Sebastian Petrus

Posted on • Originally published at apidog.com

Cách sử dụng Brevo API cho SMS Marketing hiệu quả

Tóm tắt

Các API của Brevo cho phép bạn gửi email tiếp thị, email giao dịch và tin nhắn SMS theo chương trình. Bạn xác thực bằng khóa API, gửi yêu cầu đến api.brevo.com và sử dụng webhook để theo dõi việc gửi và tương tác. Để kiểm thử, hãy sử dụng Apidog để xác thực payload, kiểm tra trình xử lý webhook và đảm bảo tích hợp của bạn xử lý các email bị trả lại và hủy đăng ký chính xác.

Hãy thử Apidog ngay hôm nay

Giới thiệu

Brevo (trước đây là Sendinblue) xử lý hàng triệu email mỗi ngày cho hơn 500.000 doanh nghiệp. Nó hỗ trợ các chiến dịch tiếp thị, email giao dịch, SMS marketing và quy trình tự động hóa.

API email không chỉ đơn giản là gửi tin nhắn – hệ thống sản xuất cần quản lý email bị trả lại, khiếu nại spam, hủy đăng ký và thời gian gửi. Brevo giúp bạn đơn giản hóa những vấn đề này.

Các trường hợp sử dụng chính:

  • Chiến dịch tiếp thị: Gửi email hàng loạt tới danh sách liên hệ.
  • Email giao dịch: Đặt lại mật khẩu, xác nhận đơn hàng, thông báo hệ thống.
  • Tin nhắn SMS: Gửi mã xác minh, cảnh báo, SMS marketing.

💡 Nếu bạn tích hợp email vào ứng dụng, Apidog giúp kiểm thử mẫu, xác thực payload webhook, mô phỏng phản hồi Brevo và kiểm tra xử lý lỗi mà không cần gửi email thực.

Xác thực và thiết lập

Lấy khóa API

  1. Đăng nhập vào Brevo
  2. Chọn SMTP & API → API Keys
  3. Tạo khóa mới với quyền phù hợp
  4. Lưu trữ khóa an toàn

Khóa API dùng trong header api-key:

curl -X GET "https://api.brevo.com/v3/account" \
  -H "accept: application/json" \
  -H "api-key: your-api-key-here"
Enter fullscreen mode Exit fullscreen mode

API Base URL

Tất cả request gửi về:

https://api.brevo.com/v3/
Enter fullscreen mode Exit fullscreen mode

Giới hạn tỷ lệ

  • Miễn phí: 300 requests/phút
  • Khởi đầu: 600 requests/phút
  • Doanh nghiệp: 1200 requests/phút

Kiểm tra header X-RateLimit-Remaining để theo dõi usage.

Gửi email giao dịch

Email giao dịch là những email được kích hoạt bởi hành động người dùng (đặt lại mật khẩu, xác nhận đơn hàng…).

Gửi một email đơn giản

curl -X POST "https://api.brevo.com/v3/smtp/email" \
  -H "accept: application/json" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "sender": {
      "name": "Your App",
      "email": "noreply@yourapp.com"
    },
    "to": [
      {
        "email": "user@example.com",
        "name": "John Doe"
      }
    ],
    "subject": "Welcome to Our Platform",
    "htmlContent": "<html><body><h1>Welcome!</h1><p>Thanks for signing up.</p></body></html>",
    "textContent": "Welcome! Thanks for signing up."
  }'
Enter fullscreen mode Exit fullscreen mode

Phản hồi:

{
  "messageId": "<20260324123456.123456@relay.brevo.com>"
}
Enter fullscreen mode Exit fullscreen mode

Gửi email sử dụng mẫu

Tạo mẫu trong Brevo, sau đó gửi theo ID:

curl -X POST "https://api.brevo.com/v3/smtp/email" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "templateId": 15,
    "to": [
      {
        "email": "user@example.com",
        "name": "John Doe"
      }
    ],
    "params": {
      "name": "John",
      "order_number": "ORD-12345",
      "tracking_url": "https://tracking.example.com/ORD-12345"
    }
  }'
Enter fullscreen mode Exit fullscreen mode

Biến mẫu trong nội dung:

<p>Chào {{params.name}},</p>
<p>Đơn hàng của bạn {{params.order_number}} đã được vận chuyển.</p>
<p><a href="{{params.tracking_url}}">Theo dõi gói hàng của bạn</a></p>
Enter fullscreen mode Exit fullscreen mode

Gửi email với tệp đính kèm

const response = await fetch('https://api.brevo.com/v3/smtp/email', {
  method: 'POST',
  headers: {
    'api-key': process.env.BREVO_API_KEY,
    'content-type': 'application/json'
  },
  body: JSON.stringify({
    sender: { name: 'Your App', email: 'noreply@yourapp.com' },
    to: [{ email: 'user@example.com' }],
    subject: 'Your Invoice',
    htmlContent: '<p>Vui lòng tìm hóa đơn của bạn đính kèm.</p>',
    attachment: [
      {
        name: 'invoice.pdf',
        content: base64EncodedPdfContent
      }
    ]
  })
})
Enter fullscreen mode Exit fullscreen mode

Chiến dịch tiếp thị

Email tiếp thị gửi đến danh sách liên hệ. Brevo xử lý hủy đăng ký, lên lịch, phân tích.

Tạo chiến dịch

curl -X POST "https://api.brevo.com/v3/emailCampaigns" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "name": "March Newsletter",
    "subject": "What'\''s New in March",
    "sender": {
      "name": "Your Brand",
      "email": "newsletter@yourbrand.com"
    },
    "type": "classic",
    "htmlContent": "<html><body>Nội dung bản tin tại đây...</body></html>",
    "recipients": {
      "listIds": [12, 15]
    },
    "scheduledAt": "2026-03-25T09:00:00+00:00"
  }'
Enter fullscreen mode Exit fullscreen mode

Gửi ngay lập tức

curl -X POST "https://api.brevo.com/v3/emailCampaigns/{campaignId}/sendNow" \
  -H "api-key: your-api-key"
Enter fullscreen mode Exit fullscreen mode

Lấy số liệu chiến dịch

curl -X GET "https://api.brevo.com/v3/emailCampaigns/{campaignId}" \
  -H "api-key: your-api-key"
Enter fullscreen mode Exit fullscreen mode

Phản hồi mẫu:

{
  "statistics": {
    "delivered": 4850,
    "opened": 1455,
    "clicked": 291,
    "unsubscribed": 12,
    "bounces": 150
  }
}
Enter fullscreen mode Exit fullscreen mode

Quản lý liên hệ

Liên hệ là những người bạn gửi email. Tổ chức họ vào danh sách, thêm thuộc tính tuỳ chỉnh.

Tạo liên hệ

curl -X POST "https://api.brevo.com/v3/contacts" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "email": "new.user@example.com",
    "attributes": {
      "FIRSTNAME": "Jane",
      "LASTNAME": "Smith",
      "PLAN": "premium"
    },
    "listIds": [12, 15],
    "updateEnabled": true
  }'
Enter fullscreen mode Exit fullscreen mode

Cờ updateEnabled: true sẽ update liên hệ nếu đã tồn tại.

Lấy chi tiết liên hệ

curl -X GET "https://api.brevo.com/v3/contacts/user@example.com" \
  -H "api-key: your-api-key"
Enter fullscreen mode Exit fullscreen mode

Thêm vào danh sách

curl -X POST "https://api.brevo.com/v3/contacts/lists/12/contacts/add" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "emails": ["user1@example.com", "user2@example.com"]
  }'
Enter fullscreen mode Exit fullscreen mode

Xóa khỏi danh sách

curl -X DELETE "https://api.brevo.com/v3/contacts/lists/12/contacts/remove" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "emails": ["user@example.com"]
  }'
Enter fullscreen mode Exit fullscreen mode

Hủy đăng ký liên hệ

curl -X PUT "https://api.brevo.com/v3/contacts/user@example.com" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "emailBlacklisted": true
  }'
Enter fullscreen mode Exit fullscreen mode

Tiếp thị SMS

Brevo gửi SMS toàn cầu qua API SMS.

Gửi tin nhắn SMS giao dịch

curl -X POST "https://api.brevo.com/v3/transactionalSMS/sms" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "sender": "YourApp",
    "recipient": "+15551234567",
    "content": "Mã xác minh của bạn là: 123456",
    "type": "transactional"
  }'
Enter fullscreen mode Exit fullscreen mode

Gửi SMS tiếp thị

curl -X POST "https://api.brevo.com/v3/transactionalSMS/sms" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "sender": "YourBrand",
    "recipient": "+15551234567",
    "content": "Giảm giá chớp nhoáng! Giảm 50% chỉ hôm nay. Trả lời STOP để hủy đăng ký.",
    "type": "marketing"
  }'
Enter fullscreen mode Exit fullscreen mode

Lấy thống kê SMS

curl -X GET "https://api.brevo.com/v3/transactionalSMS/statistics?startDate=2026-03-01&endDate=2026-03-31" \
  -H "api-key: your-api-key"
Enter fullscreen mode Exit fullscreen mode

Webhooks để theo dõi

Webhooks gửi realtime event về ứng dụng của bạn: đã gửi, mở, nhấp, trả lại, hủy đăng ký.

Cấu hình webhooks

Vào Brevo dashboard: Cài đặt → Webhooks → Thêm webhook. Chọn các sự kiện:

  • delivered: Đã gửi thành công
  • opened: Đã mở
  • clicked: Đã nhấp link
  • bounced: Trả lại (hard/soft)
  • spam: Báo cáo spam
  • unsubscribed: Hủy đăng ký

Xử lý payload webhook

app.post('/webhooks/brevo', (req, res) => {
  const event = req.body

  switch (event.event) {
    case 'delivered':
      console.log(`Email ${event.messageId} đã được gửi đến ${event.email}`)
      break
    case 'opened':
      console.log(`Email đã được mở bởi ${event.email} vào lúc ${event.date}`)
      break
    case 'bounced':
      console.log(`Bị trả lại: ${event.email} - ${event.reason}`)
      markContactBounced(event.email)
      break
    case 'spam':
      console.log(`Khiếu nại spam từ ${event.email}`)
      removeFromAllLists(event.email)
      break
    case 'unsubscribed':
      console.log(`Đã hủy đăng ký: ${event.email}`)
      break
  }

  res.status(200).send('OK')
})
Enter fullscreen mode Exit fullscreen mode

Kiểm thử với Apidog

API email có nhiều trạng thái lỗi phức tạp. Bạn nên kiểm thử mẫu, email bị trả lại, webhook. Apidog hỗ trợ các bước này.

Apidog kiểm thử mẫu email

1. Mô phỏng gửi email

Không gửi email thật trong dev, dùng payload mô phỏng:

pm.test('API Email chấp nhận payload hợp lệ', () => {
  const response = pm.response.json()
  pm.expect(response).to.have.property('messageId')
  pm.expect(response.messageId).to.match(/<.*@relay\.brevo\.com>/)
})
Enter fullscreen mode Exit fullscreen mode

Kiểm thử webhook với Apidog

2. Kiểm thử xử lý webhook

Tạo payload webhook giả lập trong Apidog:

{
  "event": "bounced",
  "email": "invalid@example.com",
  "messageId": "<12345@relay.brevo.com>",
  "reason": "hard_bounce",
  "date": "2026-03-24T12:00:00Z",
  "subject": "Chào mừng đến với nền tảng của chúng tôi"
}
Enter fullscreen mode Exit fullscreen mode

Gửi vào endpoint webhook và xác minh logic xử lý.

3. Xác thực mẫu

Lưu payload mẫu và kiểm thử biến:

pm.test('Các biến mẫu hợp lệ', () => {
  const payload = pm.request.body.toJSON()
  pm.expect(payload.params).to.have.property('name')
  pm.expect(payload.params).to.have.property('order_number')
})
Enter fullscreen mode Exit fullscreen mode

4. Tách biệt môi trường

# Môi trường phát triển
BREVO_API_KEY: xkeysib-dev-xxx
BREVO_SENDER: dev@yourapp.com

# Môi trường sản xuất
BREVO_API_KEY: xkeysib-prod-xxx
BREVO_SENDER: noreply@yourapp.com
Enter fullscreen mode Exit fullscreen mode

Kiểm thử API email Brevo với Apidog - miễn phí.

Các lỗi và cách khắc phục thường gặp

400 Bad Request - Thiếu trường bắt buộc

Nguyên nhân: Payload thiếu trường quan trọng.

Khắc phục: Đọc chi tiết trong message trả về:

{
  "code": "invalid_parameter",
  "message": "sender.email là bắt buộc"
}
Enter fullscreen mode Exit fullscreen mode

401 Unauthorized

Nguyên nhân: Sai hoặc thiếu API key.

Khắc phục: Kiểm tra header api-key và xác minh khóa chưa bị thu hồi.

402 Payment Required

Nguyên nhân: Hết quota hoặc thiếu credit.

Khắc phục:

  • Email: Kiểm tra plan quota
  • SMS: Mua thêm SMS credit

429 Too Many Requests

Nguyên nhân: Vượt giới hạn tỷ lệ.

Khắc phục: Áp dụng backoff lũy thừa:

async function sendWithRetry(email, retries = 3) {
  for (let i = 0; i < retries; i++) {
    const response = await sendEmail(email)
    if (response.status === 429) {
      await sleep(Math.pow(2, i) * 1000)
    } else {
      return response
    }
  }
  throw new Error('Đã vượt quá giới hạn tỷ lệ')
}
Enter fullscreen mode Exit fullscreen mode

404 Contact not found

Nguyên nhân: Cập nhật liên hệ không tồn tại.

Khắc phục: Dùng updateEnabled: true khi tạo:

{
  "email": "new@example.com",
  "updateEnabled": true
}
Enter fullscreen mode Exit fullscreen mode

Thao tác này sẽ tạo mới nếu chưa có.

Các lựa chọn thay thế và so sánh

Tính năng Brevo SendGrid Mailchimp Postmark
Giá 300 email/ngày miễn phí 100 email/ngày miễn phí 500 email/tháng miễn phí 100 email/tháng miễn phí
Email tiếp thị Không
Email giao dịch Hạn chế Có (chuyên biệt)
SMS Không Không Không
Tự động hóa Hạn chế
Trình chỉnh sửa mẫu Trực quan + mã Trực quan

Brevo nổi bật nhờ hỗ trợ cả email và SMS với giá cạnh tranh.

Các trường hợp sử dụng thực tế

Quy trình đặt hàng thương mại điện tử: Dùng Brevo cho xác nhận đơn hàng, thông báo vận chuyển, phục hồi giỏ hàng bị bỏ quên (tự động hóa), khuyến mãi hàng tuần – tất cả qua một tích hợp duy nhất.

Onboarding SaaS: Gửi email chào mừng, đặt lại mật khẩu, mời nhóm qua API giao dịch; các chiến dịch tiếp thị thông báo tính năng mới.

Xác minh SMS: Ứng dụng fintech sử dụng API SMS Brevo cho mã 2FA, webhook để kiểm soát lỗi gửi.

Kết luận

Bạn đã nắm được:

  • API Brevo cho email tiếp thị, giao dịch và SMS
  • Xác thực bằng header api-key
  • Sử dụng mẫu để đảm bảo email đồng nhất, dễ bảo trì
  • Quản lý liên hệ/danh sách cho các chiến dịch mục tiêu
  • Webhooks để theo dõi gửi/mở/nhấp/trả lại
  • Kiểm thử toàn diện với Apidog trước khi gửi thực tế

Các bước tiếp theo:

  1. Tạo tài khoản Brevo và lấy API key
  2. Gửi email giao dịch đầu tiên
  3. Tạo mẫu với trình chỉnh sửa Brevo
  4. Thiết lập xử lý webhook cho trả lại/hủy đăng ký
  5. Kiểm thử với Apidog trong quá trình phát triển

Kiểm thử API email Brevo với Apidog - miễn phí

Câu hỏi thường gặp

Brevo và Sendinblue khác nhau như thế nào?

Cùng sản phẩm, chỉ đổi tên. Sendinblue thành Brevo từ 2023. API vẫn là api.brevo.com.

Có thể gửi bao nhiêu email miễn phí?

300 email/ngày (9.000/tháng) cho gói Free. Gửi nhiều hơn cần nâng cấp gói trả phí.

Có thể dùng Brevo cho email lạnh (cold email) không?

Có nhưng rủi ro cao. Cold email dễ bị trả lại, spam. Tỷ lệ khiếu nại cao có thể tạm ngưng tài khoản.

Làm thế nào xử lý email bị trả lại?

Lắng nghe webhook bounced. Hard bounce (email không hợp lệ) cần xóa liên hệ, soft bounce có thể thử lại. Nếu bounce >5%, danh tiếng gửi giảm.

Khác biệt giữa email tiếp thị và giao dịch?

Giao dịch: Kích hoạt theo hành động user, gửi 1 người.

Tiếp thị: Chiến dịch gửi nhiều người. Brevo tách biệt vì lý do khả năng gửi và compliance.

Thêm link hủy đăng ký như thế nào?

Brevo tự động chèn cho email tiếp thị. Email giao dịch tự thêm:

<a href="{{ unsubscribe_url }}">Hủy đăng ký</a>
Enter fullscreen mode Exit fullscreen mode

Có thể gửi email từ domain riêng không?

Có. Thiết lập SPF, DKIM, DMARC trong phần Người gửi & IP. Nếu thiếu xác thực, email dễ vào spam.

Lên lịch gửi email múi giờ cụ thể?

Dùng scheduledAt dạng ISO 8601:

{
  "scheduledAt": "2026-03-25T09:00:00-05:00"
}
Enter fullscreen mode Exit fullscreen mode

Nếu bị giới hạn tỷ lệ?

Nhận lỗi 429, header X-RateLimit-Reset trả về số giây đến khi reset. Nên dùng backoff hoặc queue email.

Top comments (0)