Brevo vs Stripe: Building Automated Transactional Receipts
Integrating Stripe payment webhooks with Brevo v3 transactional email API replaces default Stripe email receipts with customized, multi-channel transactional messaging. This pipeline triggers on Stripe checkout.session.completed, parses customer metadata, and dispatches dynamic HTML receipts via Brevo's /smtp/email endpoint at up to 1,000 requests per second.
Explore: Email Marketing · Payments
Comparison matrix
| Feature | Brevo | Stripe | Edge |
|---|---|---|---|
| Base Transactional Pricing | Starts at $9/mo for 5,000 emails; free tier allows 300 emails/day | 0% setup fee; standard payment processing is 2.9% + $0.30 per transaction | Brevo |
| API Rate Limits | Up to 1,000 req/s on transactional endpoints | 100 read and 100 write operations per second per live account | Brevo |
| Authentication Mechanism | Static header via 'api-key: xkeysib-...' | HTTP Bearer token via secret key 'Bearer sk_live_...' | Stripe |
| Webhook Security | Basic authentication or custom domain verification tokens | HMAC-SHA256 signature verification via 'Stripe-Signature' header | Stripe |
| Receipt Customization | Full responsive HTML/CSS templates with dynamic Jinja-style variables | Basic hosted receipts with limited logo, accent color, and text modifications | Brevo |
| Self-Hosting Capability | No, multi-tenant cloud SaaS only | No, PCI-DSS Level 1 compliant cloud SaaS only | Tie |
| Secondary Channels | Native SMS and WhatsApp transactional fallbacks | None; payment-only infrastructure | Brevo |
| Webhook Retries | Up to 3 retries within 24 hours for failed endpoints | Exponential backoff for up to 3 days (approx. 72 hours) | Stripe |
| Start free | Try Brevo → | Try Stripe → |
ROI metrics
Hours saved / mo
18
Brevo / mo
$15
Stripe / mo
$0
Break-even
2.5 wks
Annual savings
$11,520
Pairing Stripe's payment webhooks with Brevo's dynamic templates eliminates manual receipt handling and designer overhead, paying for itself within 3 weeks for a 10-person team processing 2,000+ orders monthly.
Step-by-step setup guide
1.Create Brevo Dynamic Receipt Template
Navigate to Brevo > Transactional > Templates and configure an active template with dynamic placeholders (e.g., {{ params.amount }}, {{ params.order_id }}). Note the integer Template ID from the interface.
{ "templateId": 14, "to": [{"email": "customer@example.com"}], "params": { "order_id": "cs_live_a1b2c3d4", "amount": "$49.00", "product": "Annual Plan" } }2.Provision Brevo API Key
Generate an API v3 key in Brevo under SMTP & API > API Keys. Store this value in your environment variables as BREVO_API_KEY.
export BREVO_API_KEY="xkeysib-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
3.Configure Stripe Webhook Endpoint
Register your server URL in the Stripe Dashboard under Developers > Webhooks. Subscribe exclusively to the checkout.session.completed event and copy the generated signing secret (whsec_...).
stripe webhooks listen --forward-to localhost:3000/api/webhooks/stripe
4.Verify Stripe Signature and Extract Payload
On incoming POST requests, compute the HMAC-SHA256 signature using the Stripe SDK and raw body to prevent replay attacks, then unpack customer email and purchase totals.
const event = stripe.webhooks.constructEvent(req.rawBody, req.headers['stripe-signature'], process.env.STRIPE_WEBHOOK_SECRET);
5.Dispatch Receipt via Brevo Transactional API
Forward the parsed payment parameters to Brevo's v3 transactional email endpoint using an authenticated HTTPS POST call.
curl -X POST https://api.brevo.com/v3/smtp/email \ -H "accept: application/json" \ -H "content-type: application/json" \ -H "api-key: $BREVO_API_KEY" \ -d '{"templateId": 14, "to": [{"email": "customer@example.com"}], "params": {"amount": "$49.00", "order_id": "ch_1Mxyz"}}'
Webhook payload example
POST https://api.yourdomain.com/webhooks/brevo · event: delivered
{
"event": "delivered",
"email": "customer@example.com",
"id": 984512,
"date": "2023-10-24T14:32:01.000Z",
"message-id": "<202310241432.984512@smtp-relay.brevo.com>",
"subject": "Receipt for Order #cs_live_a1b2c3d4",
"tag": "payment-receipt",
"template_id": 14
}Brevo: pros & cons
- ✅ High throughput limit of 1,000 transactional emails/second
- ✅ Includes SMS and WhatsApp failover routes for failed email deliveries
- ✅ Templates support complex loops, conditional formatting, and custom CSS
- ⚠️ Free tier enforces Brevo branding in the email footer
- ⚠️ No native HMAC webhook signing mechanism
Stripe: pros & cons
- ✅ Cryptographically signed webhooks prevent payload tampering
- ✅ Comprehensive 72-hour exponential backoff retry mechanism
- ✅ Handles multi-currency conversions and localized receipt tax lines automatically
- ⚠️ Built-in receipts offer negligible design flexibility
- ⚠️ Standard 2.9% + $0.30 transaction cost accumulates quickly at high volumes
FAQ
Can I disable Stripe's default receipts when using Brevo?
Yes. In the Stripe Dashboard under Settings > Emails, toggle off 'Successful payments' to prevent Stripe from sending default receipts alongside Brevo emails.
How do I handle Brevo rate limits during high-volume flash sales?
Brevo allows 1,000 requests per second for transactional endpoints. If volume exceeds this threshold, queue webhook events using Redis BullMQ or AWS SQS to buffer requests.
Does Brevo support sending PDF invoice attachments alongside transactional receipts?
Yes. Pass a base64-encoded string or a public HTTPS URL under the 'attachment' array in the Brevo /smtp/email request body.
What happens if a Stripe webhook event arrives out of order?
Rely on the Stripe event timestamp (created) and check your database for payment state before triggering Brevo to avoid sending receipts for canceled or refunded charges.