TL;DR — Executive Summary
Learn how to build smart sales recovery workflows for e-commerce in Brazil, combining the high engagement of WhatsApp with the redundancy of SMS.
The average shopping cart abandonment rate in Brazilian e-commerce sits around 70% to 80%. For retail brands, this represents a huge drop in potential revenue that had already made it past the initial stages of the sales funnel. Implementing an automated, multi-channel messaging workflow combining WhatsApp and SMS is the most effective strategy to win back customers and boost conversions.
In this guide, we will analyze why cart abandonment is so high in Brazil, outline an optimized multi-channel recovery flow, explore technical integration examples, and address legal compliance under LGPD.
---
1. Understanding Cart Abandonment in the Brazilian Market
Brazilian consumers have specific habits and payment patterns that directly influence e-commerce abandonment:
- High Shipping Costs and Long Delivery Estimations: High shipping fees are the number one cause of cart abandonment. Especially for customers outside major metropolitan areas (Southeastern Brazil), shipping fees can sometimes exceed the item cost.
- Pix and Boleto Expirations: Pix is now the most popular payment method in Brazil. However, many customers choose the Pix option, copy the payment key, and get distracted before opening their bank app. Without a fast automated reminder about Pix expiration, that conversion is lost forever. A similar dynamic applies to unpaid bank slips (Boletos).
- Mobile Checkout Friction: Long checkout forms asking for redundant data (like secondary phone numbers or duplicate address fields) cause mobile users to abandon purchase attempts.
---
2. Designing a Multi-channel Recovery Workflow
A single channel is no longer enough to recover sales. A robust architecture uses WhatsApp as the primary high-engagement touchpoint, and SMS as a reliable carrier-grade fallback channel.
Recommended Timing Sequence
- Minute 15 (WhatsApp): Trigger a personalized, friendly reminder showing the items left behind. Include a direct, single-click link to the pre-filled checkout. Dispatching this within 15 minutes captures the buyer's attention while the intent is still fresh.
- Hour 2 (WhatsApp / SMS Fallback): If the customer does not have an active mobile data plan, they will not receive a WhatsApp notification. To cover this gap, the backend should verify delivery status and fall back to SMS. The SMS message should feature an urgency trigger (e.g., "Free shipping valid for the next 2 hours only!"). SMS utilizes signaling channels in the carrier network and works without internet access.
- Day 1 (WhatsApp): Send a final nudge featuring customer reviews (social proof) or offer customer service help if they encountered card declines at the payment gateway.
---
3. Technical Integration: API & Webhooks
To automate this workflow, you can listen to checkout events from your e-commerce platform (e.g., Shopify, VTEX, WooCommerce) via webhooks. Below is a Node.js implementation showing how to listen for events, dispatch a WhatsApp message, check delivery status, and handle SMS fallback:
javascript const express = require('express'); const axios = require('axios'); const app = express(); app.use(express.json());
const BULK_SMS_API_URL = 'https://api.bulksmsbrazil.com/v1'; const API_TOKEN = 'your_token_here';
// E-commerce webhook endpoint for cart abandonment app.post('/webhooks/cart-abandonment', async (req, res) => { const { customerPhone, customerName, cartUrl, totalValue, cartId } = req.body;
console.log(Cart abandonment detected: ${customerName} (${customerPhone}) - R$ ${totalValue});
try { // Step 1: Send primary message via WhatsApp Business API const waMessageId = await sendWhatsAppMessage(customerPhone, customerName, cartUrl);
// Step 2: Schedule delivery verification for SMS Fallback scheduleFallbackCheck(cartId, customerPhone, customerName, cartUrl, waMessageId);
return res.status(200).json({ status: 'success', message: 'Recovery workflow initiated' }); } catch (error) { console.error('Error processing abandonment:', error.message); return res.status(500).json({ error: 'Internal server error' }); } });
async function sendWhatsAppMessage(phone, name, url) { try { const response = await axios.post(${BULK_SMS_API_URL}/whatsapp/send, { to: phone, template: 'cart_recovery_15m', parameters: { name, checkout_url: url } }, { headers: { 'Authorization': Bearer ${API_TOKEN} } }); return response.data.messageId; } catch (error) { console.error('Failed to send WhatsApp message:', error.message); return null; // Return null to trigger fallback directly } }
function scheduleFallbackCheck(cartId, phone, name, url, waMessageId) { // Set a 30-minute timeout before checking delivery const TIMEOUT_MS = 30 * 60 * 1000;
setTimeout(async () => { let needsSms = false;
if (!waMessageId) { needsSms = true; } else { try { // Query the delivery status of the WhatsApp message const statusResponse = await axios.get(${BULK_SMS_API_URL}/whatsapp/status/${waMessageId}, { headers: { 'Authorization': Bearer ${API_TOKEN} } }); const { status } = statusResponse.data;
// If the WhatsApp message was not delivered, route an SMS instead if (status !== 'delivered' && status !== 'read') { needsSms = true; } } catch (err) { console.error('Failed to query WhatsApp status, defaulting to SMS:', err.message); needsSms = true; } }
if (needsSms) { console.log(WhatsApp not delivered to ${phone}. Dispatching SMS fallback...); await sendSmsFallback(phone, name, url); } }, TIMEOUT_MS); }
async function sendSmsFallback(phone, name, url) { try { await axios.post(${BULK_SMS_API_URL}/sms/send, { to: phone, message: Hi ${name}, your items are still reserved! Complete your order now with free shipping: ${url} }, { headers: { 'Authorization': Bearer ${API_TOKEN} } }); console.log(SMS fallback successfully sent to ${phone}); } catch (error) { console.error('Critical SMS fallback failure:', error.message); } }
app.listen(3000, () => console.log('Server running on port 3000'));
---
4. Best Practices and LGPD Compliance
Under the Brazilian General Data Protection Law (LGPD), e-commerce brands must ensure the legal validity of customer data processing for marketing and recovery purposes:
- Explicit Opt-in Consent: Display a clear, unchecked-by-default tickbox during the initial step of the checkout form, asking users for permission to send cart recovery notifications and promo offers.
- Simple Opt-out Flows: Make it simple for consumers to opt out of messaging queues. On WhatsApp, implement quick reply buttons such as "Stop" or "Cancel". For SMS, include opt-out prompts (e.g., "Reply STOP to 28000").
- Frequency Capping: Avoid message spamming. Limit communication to a maximum of 2 to 3 touchpoints per abandoned cart. Too many pushy messages lead to spam reports, decreasing your Meta quality rating and threatening phone number blocks.
To get started with official WhatsApp integration and Tier-1 carrier routes, explore our WhatsApp Business API page or contact our integration team.
Rafael Costa
CEO, Bulk SMS
Senior specialist in mobile telecommunications infrastructure, high-performance enterprise messaging, and LGPD compliance for smart communication platforms and APIs in Brazil.