Before you start: your site needs a
carts (or orders) table with a status column and a user email, plus a configured email service.The Flow at a Glance
1 hour
Gentle reminder
24 hours
Add a small discount
3 days
Final last-chance
Step 1: Create the Workflow
Step 2: Find Abandoned Carts
Add a Database query action
Click + Add Action > Database Query. Paste this SQL:This returns carts that were abandoned between 1 and 24 hours ago and haven’t received an email yet.
Step 3: Send the First Email
Add a Send Email action inside the loop
- To:
{{item.user_email}} - Subject:
You left something behind! - Body: Show the cart contents, total, and a big button back to checkout. Keep it short and warm.
Step 4: Day 2 Follow-up with Discount
Clone the first action set, but change the query to target carts that were reminded 24 hours ago and still haven’t converted:COMEBACK10) and update discount_sent_at.
Step 5: Day 3 Last-Chance
A final message 3 days after abandon, with last-chance language. Skip anyone who already converted by filteringstatus != 'completed'.
Stop Sending When They Purchase
Every email action should check the current cart status first. Add a Condition step before each Send Email:Personalization Ideas
- Include product images pulled from
{{item.items[0].image_url}} - Reference the customer’s location or last purchase if you have the data
- Tailor subject line to cart value — “Your $200 cart is waiting” converts better than generic copy
- Use the customer’s first name, not “Dear Customer”
Tracking Effectiveness
Email opens and clicks tell you what’s working.- Open rate on Email 1 — subject line quality
- Click-through on Email 2 — did the discount move them?
- Conversion rate from email → checkout — the only metric that really matters
Verify It Worked
- Add a test item to a cart while signed in as a test user
- Leave the session idle for just over an hour
- Wait for the next workflow run (or trigger manually from the Workflows > Runs tab)
- Confirm the email arrives at the test address
- Click the checkout link — it should return you to the exact cart
Troubleshooting
No emails are sending
No emails are sending
Check your cart status filter. Many sites store abandoned carts as
active or pending rather than abandoned — run the SELECT manually in the database explorer and confirm it returns rows. Also check the time range: if nothing is between 1 and 24 hours old, the query is correct but there’s nothing to send.Customers are getting the same email multiple times
Customers are getting the same email multiple times
The
reminder_sent_at update isn’t being written. Open Workflows > Runs, click a recent run, and check the UPDATE action output. Common cause: a syntax error in the UPDATE that silently fails. Wrap it in a try/catch step and log errors.Customers reporting emails as spam
Customers reporting emails as spam
Your messaging is too pushy, or frequency is too high. Reduce to two emails max, soften the language (“Your cart is still here” instead of “Don’t miss out!”), and always include an unsubscribe link. Check your sender reputation in your ESP dashboard.
Emails arriving for completed carts
Emails arriving for completed carts
Add a final status check right before the Send Email action. The schedule fires every hour — between the query and the send, a customer might have completed checkout. The Condition step on
status == 'abandoned' guards against this.Personalization tokens showing as literal text
Personalization tokens showing as literal text
The query didn’t return the field, or the loop item path is wrong. In Runs, inspect the query output — if
customer_name is null, add a fallback like {{item.customer_name || 'there'}}. Confirm you’re referencing {{item.x}} inside the loop, not {{trigger.x}}.What’s Next?
Workflows Basics
How triggers, actions, and runs fit together
Email Webhooks
Track opens, clicks, and unsubscribes