Intermediate 25 min Updated Jan 22, 2025

Build an Abandoned Cart Recovery Flow

Create multi-channel cart abandonment with Email, SMS, and WhatsApp

Build an Abandoned Cart Recovery Flow

Recover up to 30% of abandoned carts with a strategic multi-channel flow combining Email, SMS, and WhatsApp.

What You’ll Build

By the end of this guide, you’ll have a complete abandoned cart recovery system that:

  • ✅ Detects when customers abandon their cart
  • ✅ Sends personalized recovery messages across 3 channels
  • ✅ Includes dynamic product images and cart rebuild links
  • ✅ Offers strategic incentives to drive conversion
  • ✅ Tracks performance and revenue attribution

Expected Results: Industry average is 8-15% cart recovery rate. With Tajo’s multi-channel approach, many merchants see 20-30% recovery rates.


Prerequisites

Before building your flow, ensure you have:

  • ✅ Tajo connected to Shopify (Setup guide)
  • ✅ Brevo account with automation access
  • ✅ SMS/WhatsApp consent collection enabled (optional but recommended)
  • ✅ At least 50 historical checkouts for testing
  • ✅ 30-45 minutes to complete setup

Understanding Cart Abandonment

Why Do Customers Abandon Carts?

Reason% of AbandonersSolution
High shipping costs48%Free shipping threshold
Just browsing/not ready37%Multi-message nurture sequence
Comparison shopping27%Urgency (limited stock, time-limited discount)
Complicated checkout24%Cart rebuild link (one-click return)
Concerns about security18%Trust badges, testimonials in email
Sticker shock16%Payment plan options, discount offer

Source: Baymard Institute, 2024

The Multi-Channel Advantage

Single channel (Email only): 8-12% recovery rate

Multi-channel (Email + SMS): 15-20% recovery rate

Tri-channel (Email + SMS + WhatsApp): 25-35% recovery rate ⬅️ Tajo exclusive

Why WhatsApp works: 98% open rate vs. 20% for email. Many international customers prefer WhatsApp for shopping conversations.


Step 1: Choose Your Trigger Event

Tajo offers two cart abandonment triggers:

When it fires: Customer enters email/phone at checkout but doesn’t complete purchase

Pros:

  • ✅ Have verified contact info (email + phone)
  • ✅ Higher purchase intent
  • ✅ Standard industry practice
  • ✅ Can include cart rebuild link

Cons:

  • ❌ Misses early abandoners (add to cart but don’t start checkout)

Best for: Most stores, especially with multi-step checkout

Option B: Cart Created

When it fires: Customer adds first item to cart

Pros:

  • ✅ Catches more abandoners
  • ✅ Earlier intervention
  • ✅ Can nurture browsers into buyers

Cons:

  • ❌ May not have contact info yet
  • ❌ Lower purchase intent
  • ❌ Higher unsubscribe risk if too aggressive

Best for: High-ticket items, long consideration cycles (jewelry, furniture, etc.)

Our Recommendation: Start with Checkout Started. Once optimized, add a separate “Cart Created” browse abandonment flow.


Step 2: Create Your Flow in Brevo

2.1 Access Brevo Automation

  1. Log in to Brevo
  2. Navigate to Automation > Workflows
  3. Click Create a Workflow
  4. Select Start from scratch (we’ll build custom)

2.2 Set Up the Trigger

  1. Click Add trigger
  2. Select Event as trigger type
  3. Choose event: shopify_checkout_started
  4. Add filter conditions:
    • order_id does not exist (ensures they didn’t complete purchase)
    • cart_value is greater than 0 (has items in cart)
    • cart_value is less than 10000 (filter out test orders)

2.3 Add Entry Filters (Important!)

Prevent duplicate messages and respect customer preferences:

  1. Click Add condition under trigger
  2. Add these filters:
    • Has not placed order since starting this flow
    • Is subscribed to email (if using email channel)
    • Has not been in this flow in the last 30 days
    • Cart value > your minimum threshold (e.g., $20)

Step 3: Build Your Message Sequence

The 3-Message Strategy

Message 1 (Email) - Reminder + Soft Sell

  • Timing: 1 hour after abandonment
  • Goal: Gentle reminder, remove friction
  • Conversion Rate: 40-50% of total recoveries

Message 2 (SMS or WhatsApp) - Urgency + Incentive

  • Timing: 6 hours after abandonment (if no purchase from Message 1)
  • Goal: Create urgency, offer help
  • Conversion Rate: 30-35% of total recoveries

Message 3 (Email + Discount) - Last Chance

  • Timing: 24 hours after abandonment (if no purchase from Messages 1-2)
  • Goal: Final incentive, social proof
  • Conversion Rate: 15-20% of total recoveries

Step 4: Design Message 1 (Email - 1 Hour)

4.1 Add Time Delay

  1. After your trigger, click Add action
  2. Select Wait
  3. Set duration: 1 hour
  4. Why 1 hour? Gives customer time to return naturally, but not so long they forget

4.2 Add Conditional Check

Before sending, verify they haven’t purchased:

  1. After wait, click Add condition
  2. Select If/Else
  3. Condition: Has placed order since starting flow
  4. If yes: End flow (they purchased!)
  5. If no: Continue to email

4.3 Design the Email

Click Add action > Send email > Create new email

Subject Line Options (A/B test these):

  • “You left something behind 🛒”
  • “Still thinking about {{PRODUCT_NAME}}?”
  • “Your cart is waiting for you”
  • “Quick question about your order?”

Email Body Structure:

<!-- Hero -->
<h1>You left something in your cart!</h1>
<p>Hi `{{FIRSTNAME}}`, we saved your items. Ready to check out?</p>
<!-- Product Block (Dynamic) -->
{% for item in cart_items %}
<div class="product">
<img src="{{item.image}}" alt="{{item.name}}">
<h3>{{item.name}}</h3>
<p>{{item.variant}}</p>
<p class="price">${{item.price}}</p>
<p>Quantity: {{item.quantity}}</p>
</div>
{% endfor %}
<!-- Cart Summary -->
<div class="summary">
<p>Subtotal: ${{cart_subtotal}}</p>
<p>Shipping: ${{shipping_cost}}</p>
<p class="total">Total: ${{cart_total}}</p>
</div>
<!-- CTA Button -->
<a href="`{{checkout_url}}`" class="cta-button">
Complete Your Purchase
</a>
<!-- Trust Elements -->
<div class="trust">
<p>✓ Free shipping on orders over $50</p>
<p>✓ 30-day money-back guarantee</p>
<p>✓ Secure checkout with SSL encryption</p>
</div>
<!-- Help Offer -->
<p>Questions? Reply to this email or chat with us at <a href="https://tajo.io/chat">tajo.io/chat</a></p>

Design Tips:

  • Use large, clear product images (at least 300px wide)
  • Make CTA button high contrast and above the fold
  • Include cart rebuild link ({{checkout_url}}) in multiple places
  • Add trust badges if you have them
  • Mobile-first design (60% open on mobile)

Step 5: Design Message 2 (SMS/WhatsApp - 6 Hours)

5.1 Add Time Delay & Condition

  1. Add Wait action: 5 hours (total 6 hours from abandonment)
  2. Add If/Else condition: Has placed order?
    • If yes → End flow
    • If no → Continue

5.2 Choose Channel: SMS or WhatsApp?

Use SMS if:

  • Customer is in US/Canada
  • You have SMS consent
  • Short, direct message needed

Use WhatsApp if:

  • Customer is international
  • You have WhatsApp consent
  • You want to include rich media (images, carousel)

Use Both (recommended):

  • Add condition: If has WhatsApp consent → Send WhatsApp
  • Else if has SMS consent → Send SMS
  • Else → Skip this message

5.3 SMS Message Template

Hi `{{FIRSTNAME}}`! 👋
Your cart is waiting:
{{PRODUCT_NAME}} - $`{{CART_TOTAL}}`
Only `{{INVENTORY_COUNT}}` left in stock!
Complete checkout: `{{SHORT_LINK}}`
Questions? Reply to this message.
Reply STOP to opt-out

Character count: Aim for < 160 characters for single SMS. This example is ~150 chars.

5.4 WhatsApp Message Template (Tajo Exclusive!)

WhatsApp allows richer formatting and media:

Hi `{{FIRSTNAME}}`! 👋
I noticed you left some items in your cart:
🛍️ *{{PRODUCT_NAME}}*
💰 $`{{PRODUCT_PRICE}}` x `{{QUANTITY}}`
📦 *Cart Total: $`{{CART_TOTAL}}`*
⚡ *`{{INVENTORY_COUNT}}` left in stock* - Don't miss out!
[Image: `{{PRODUCT_IMAGE}}`]
Complete your order: `{{CHECKOUT_URL}}`
Need help? Just reply to this message!

WhatsApp Advantages:

  • ✅ Can include product image
  • ✅ Rich text formatting (bold, italic)
  • ✅ Two-way conversation (customer can reply with questions)
  • ✅ 98% open rate vs. 20% SMS open rate
  • ✅ No character limits (unlike SMS)

Step 6: Design Message 3 (Email - 24 Hours + Discount)

6.1 Add Delay & Condition

  1. Add Wait: 18 hours (total 24 hours from abandonment)
  2. Add If/Else: Has placed order?
    • If yes → End flow
    • If no → Continue to final email

6.2 Generate Dynamic Discount Code

Option A: Static Discount (Simple)

  • Use existing Shopify discount code (e.g., “SAVE10”)
  • Manually insert in email template

Option B: Unique Discount (Recommended - Prevents Sharing)

  1. In Brevo email editor, click Add dynamic content
  2. Select Discount code generator
  3. Configure:
    • Source: Shopify
    • Discount type: Percentage or fixed amount
    • Value: 10% or $10 (test what works for your AOV)
    • Expiration: 48 hours from send
    • Usage limit: 1 per customer
  4. Insert token: {{DISCOUNT_CODE}}

6.3 Final Email Design

Subject Line (test these):

  • {{FIRSTNAME}}, here’s 10% off your cart 🎁”
  • “Last chance: Your cart + a special discount”
  • “We miss you! Here’s 10% off to come back”
  • {{PRODUCT_NAME}} + 10% off = 😍”

Email Body:

<!-- Urgency Header -->
<div class="urgency-banner">
⏰ Your cart expires in 24 hours!
</div>
<h1>Come back and save 10%!</h1>
<p>Hi `{{FIRSTNAME}}`,</p>
<p>We noticed you haven't completed your purchase. As a thank you for considering us, here's a special 10% discount:</p>
<!-- Discount Code -->
<div class="discount-code">
<h2>`{{DISCOUNT_CODE}}`</h2>
<p>Use at checkout • Expires in 48 hours</p>
</div>
<!-- Product Reminder -->
<h3>Your Cart:</h3>
{% for item in cart_items %}
<div class="product">
<img src="{{item.image}}">
<div>
<h4>{{item.name}}</h4>
<p class="price">
<span class="original">${{item.price}}</span>
<span class="discounted">${{item.price_with_discount}}</span>
<span class="savings">Save ${{savings}}</span>
</p>
</div>
</div>
{% endfor %}
<!-- Enhanced CTA -->
<a href="`{{checkout_url_with_discount}}`" class="cta-button-large">
Claim Your 10% Discount Now
</a>
<!-- Social Proof -->
<div class="testimonials">
<h3>Join 10,000+ Happy Customers</h3>
<div class="review">
<div class="stars">⭐⭐⭐⭐⭐</div>
<p>"Fast shipping, great quality!"</p>
<p class="author">- Sarah M., Verified Buyer</p>
</div>
</div>
<!-- Urgency Reminder -->
<div class="urgency-footer">
<p>⏰ This discount expires in 48 hours</p>
<p>📦 Only `{{INVENTORY_COUNT}}` left in stock</p>
</div>
<!-- Help -->
<p>Questions? Our team is here to help: <a href="mailto:[email protected]">[email protected]</a></p>

Step 7: Add Advanced Optimizations

7.1 Exclude Purchased Customers

After each message, add a condition:

If contact has:
- Placed Order within last 24 hours
- With Order Total >= Cart Total
Then: Exit flow

This prevents sending emails to customers who already purchased.

7.2 Suppress Recent Purchasers

Add global filter at flow entry:

Exclude contacts where:
- Last Order Date > (now - 14 days)

Don’t spam recent buyers with abandonment emails.

7.3 Add Cart Value Segmentation

For high-value carts ($100+), adjust strategy:

  1. Add condition after trigger: If cart_value > 100
  2. True branch: Send all 3 messages with larger discount (15-20%)
  3. False branch: Send standard 3 messages with smaller discount (10%)

7.4 Test Different Discount Tiers

A/B test discount amounts by cart value:

Cart ValueDiscount OfferWhy
$0-$4910% offLow AOV, higher discount % acceptable
$50-$99$10 offMedium AOV, fixed $ discount feels more valuable
$100-$19915% offHigh AOV, percentage discount shows bigger savings
$200+Free shipping + 10%Very high AOV, multiple incentives

Step 8: Activate Your Flow

8.1 Final Pre-Launch Checklist

Before going live, verify:

  • ✅ All 3 messages have been designed and tested
  • ✅ Dynamic product blocks display correctly
  • ✅ Checkout URLs include discount codes (if applicable)
  • ✅ Mobile preview looks good (60% open on mobile)
  • ✅ Unsubscribe link is present in all emails
  • ✅ SMS compliance text included (Reply STOP to opt-out)
  • ✅ Entry filters prevent spam (not in flow last 30 days, etc.)
  • ✅ Exit conditions prevent sending to customers who purchased

8.2 Test the Flow

  1. Create test cart on your Shopify store

    • Use a different email (e.g., [email protected])
    • Add products to cart
    • Start checkout (enter email)
    • Abandon without purchasing
  2. Wait 1 hour - Check that Email #1 arrives

  3. Wait 6 hours total - Check that SMS/WhatsApp arrives

  4. Wait 24 hours total - Check that Email #2 with discount arrives

  5. Verify:

    • Product images display correctly
    • Checkout link works (returns to cart with items)
    • Discount code applies correctly
    • All personalization tokens populate

8.3 Activate!

  1. In Brevo, review your flow one more time
  2. Click Activate Workflow
  3. Confirm activation

Congratulations! Your abandoned cart recovery flow is now live 🎉


Step 9: Monitor Performance

Key Metrics to Track

MetricWhere to FindTarget
Flow Entry RateBrevo > Workflows > Analytics100-200 entries/day (varies by traffic)
Email 1 Open RateMessage 1 analytics40-50%
Email 1 Click RateMessage 1 analytics15-25%
SMS/WhatsApp Open RateMessage 2 analytics80-98%
Email 2 Open RateMessage 3 analytics30-40%
Overall Recovery RateTajo dashboard20-30%
Revenue Per RecipientTajo dashboard$5-$15 (varies by AOV)

Calculate ROI

Monthly abandoned carts: 1,000 Recovery rate: 25% = 250 recovered orders Average order value: $75 Monthly recovered revenue: $18,750

Flow costs:

  • SMS ($0.01 x 1,000): $10
  • WhatsApp ($0.005 x 500): $2.50
  • Discount cost (10% x $18,750): $1,875
  • Total cost: $1,887.50

Net profit: $18,750 - $1,887.50 = $16,862.50/month

ROI: 893% 🚀

Optimization Over Time

Week 1-2: Establish baseline metrics

Week 3-4: A/B test subject lines

  • Test 2-3 subject lines per message
  • Send each to 50% of audience
  • Winner = highest click-through rate

Month 2: A/B test send timing

  • Test sending Message 1 at 30 min vs. 1 hour vs. 2 hours
  • Test Message 2 at 4 hours vs. 6 hours vs. 8 hours
  • Optimal timing varies by industry

Month 3: A/B test discount amounts

  • Test 10% vs. 15% vs. $10 vs. free shipping
  • Measure conversion rate AND profit margin
  • Sometimes lower discount = higher profit

Ongoing: Refresh creative quarterly

  • Update product images
  • Refresh copy
  • Test new testimonials/social proof

Advanced Strategies

Strategy #1: Browse Abandonment (Earlier Trigger)

For stores with high consideration cycles (jewelry, furniture):

  1. Create second flow triggered by cart_created (not checkout started)
  2. Shorter sequence (2 emails only, 2 hours + 24 hours)
  3. Focus on education, not discounts
  4. Goal: Get them to checkout, then main abandonment flow takes over

Strategy #2: Progressive Discounting

Start small, increase if they don’t convert:

  • Message 1: No discount, just reminder
  • Message 2: 5% discount
  • Message 3: 10% discount
  • Bonus Message 4 (48 hours): 15% + free shipping

Pro: Maximizes profit by not discounting everyone Con: Longer flow, more messages

Strategy #3: Personalized Recommendations

In your abandonment emails, include:

<h3>You might also like:</h3>
<!-- Use Tajo AI recommendations -->
{% for product in recommended_products %}
<div class="recommendation">
<img src="{{product.image}}">
<h4>{{product.name}}</h4>
<p>${{product.price}}</p>
<a href="{{product.url}}">View Product</a>
</div>
{% endfor %}

This can increase AOV by 15-30% when customers do convert.

Strategy #4: Exit Intent Popup (Prevention)

Before carts are abandoned, show exit-intent popup:

  1. In Tajo, go to Forms > Create Popup
  2. Trigger: Exit intent (mouse moves to close tab)
  3. Offer: “Wait! Here’s 10% off if you complete checkout now”
  4. Display on: Checkout page only

Prevents 15-20% of abandonments before they happen.


Troubleshooting

Flow Not Triggering?

Check #1: Verify Shopify connection

  • Tajo dashboard > Integrations > Shopify should be ✅ Connected
  • Test by creating a cart and checking Tajo > Events

Check #2: Review entry filters

  • Make sure filters aren’t too restrictive
  • Test with filter: cart_value > 1 (allows all carts)

Check #3: Verify event tracking

  • In Shopify, install Tajo app embed (Online Store > Themes > App embeds)
  • Without app embed, checkout events may not fire

Customers Not Receiving Emails?

Check #1: Verify email subscription status

  • Customer must be subscribed to email marketing
  • Check in Brevo: Contacts > Search customer > Subscription status

Check #2: Check spam folder

  • Ask test recipient to check spam/junk
  • Add your sending domain to allowlist

Check #3: Review send logs

  • Brevo > Workflows > Your flow > Logs
  • Look for send errors or bounces

Discount Codes Not Working?

Check #1: Verify Shopify discount settings

  • Shopify > Discounts > [Your discount]
  • Ensure “Active” and not expired
  • Check usage limits

Check #2: Test manual application

  • Copy discount code from email
  • Try applying at Shopify checkout manually
  • If works manually, issue is with dynamic insertion

Check #3: Check Tajo discount sync

  • Tajo > Shopify Settings > Discount sync
  • Should be enabled and error-free

FAQ

Should I offer a discount in the first email?

No (unless very high abandonment rate). Best practice:

  • Email 1: Reminder only
  • Email 2: Urgency + help offer
  • Email 3: Discount as last resort

This maximizes profit by not training customers to wait for discounts.

How often can I send cart abandonment emails?

Industry standard: 3 emails over 24-48 hours

Aggressive: 4-5 emails over 3-7 days

Conservative: 2 emails over 24 hours

Tajo recommendation: Start with 3 (1hr, 6hr, 24hr). Add more only if metrics support it.

Should I use SMS or WhatsApp for Message 2?

SMS if:

  • Primarily US/Canada customers
  • High SMS consent rate
  • Need guaranteed delivery

WhatsApp if:

  • International customer base
  • Higher engagement rates desired (98% vs. 80% for SMS)
  • Want two-way conversation capability

Both:

  • Best approach: Send WhatsApp to those with WhatsApp consent, SMS to others

Email: In most countries, cart abandonment is considered transactional (not marketing) if customer entered email at checkout. However, best practice is to only send to subscribed customers.

SMS: In US, requires express written consent (TCPA). Checkout entry alone is NOT sufficient.

WhatsApp: Requires opt-in consent in all regions.

Tajo’s approach: We automatically filter to subscribed customers to ensure compliance.

What if customer abandoned but has “Accepts Marketing” unchecked?

You have three options:

  1. Don’t send (safest, but loses revenue)
  2. Send first email only as transactional receipt (gray area)
  3. Use popup at abandonment to collect consent before sending

Recommendation: Option 3 - show exit-intent popup asking “Want us to save your cart and email you?” with checkbox.


Conclusion

You’ve now built a complete, multi-channel abandoned cart recovery flow that:

✅ Reaches customers via Email, SMS, and WhatsApp ✅ Uses strategic timing (1hr, 6hr, 24hr) ✅ Offers progressive incentives (ending with discount) ✅ Includes dynamic cart rebuild links ✅ Respects customer preferences and compliance

Expected results: 20-30% cart recovery rate, translating to thousands in recovered revenue per month.


Next Steps

  1. Monitor performance for 2 weeks to establish baseline
  2. A/B test subject lines to improve open rates
  3. Add browse abandonment flow for early-stage abandoners
  4. Enable exit-intent popup to prevent abandonment
  5. Set up post-purchase flow to drive repeat purchases


Questions? Reach out to [email protected] or chat with us in the Tajo dashboard!

Last updated: January 22, 2025