Este artigo ainda não está disponível no seu idioma. Mostrando a versão em inglês.
Win Back Lost Sales: Recover Abandoned Shopify Carts on WhatsApp
Many shoppers add something to their cart and leave before paying. Most stores try to win them back by email, but many of those emails are never opened. WhatsApp is different: WhatsApp messages tend to get read quickly. So a short, friendly nudge ("Hi Alex, you left the Merino Wool Jacket behind. Here's your link to finish.") can bring some of those customers back.
The best part: you can set this up yourself. No code, no developer, no technical knowledge. This guide walks you through the exact path with WhatsTeam, from start to your first recovered sale.
What you're setting up
When a customer leaves your Shopify store mid-checkout, they automatically get a WhatsApp message with their name, the product they left behind and a link straight back to checkout. Still no purchase? A second message the next day adds a small coupon. That's the whole thing, and once it's on, it runs by itself.
You connect three things, once:
- Shopify: it already spots abandoned checkouts for you, on every plan.
- WhatsTeam: it sends and automates your WhatsApp messages, with no code.
- Your WhatsApp number: on the official WhatsApp Business API.
Here's how, step by step.
WhatsTeam does the recovering. It sends the reminder, waits and follows up. Shopify's only job is to tell WhatsTeam the moment a checkout is abandoned, because Shopify can't send WhatsApp messages itself. Think of Shopify as the doorbell and WhatsTeam as the salesperson.
Step 1: Create your WhatsTeam account
Go to app.whats.team/register and sign up. It takes a minute, the free trial lasts 14 days and you don't need a card.
You'll build the recovery in Flows, which comes with the Business and Enterprise plans. So if you're trying WhatsTeam for free, pick Business or Enterprise when you connect your number.
Step 2: Connect your WhatsApp number
Inside WhatsTeam, connect your number on the official WhatsApp Business API (run by Meta). WhatsTeam guides you through registering the number with Meta. You can use a brand-new number or bring the one your business already uses. Not sure which? Here's how to choose.
Step 3: Create your reminder messages
WhatsApp asks businesses to use an approved message template for reminders like this: a message you write once and Meta checks before you can send it. It's a Meta rule, and it's what keeps WhatsApp free of spam.
In WhatsTeam, create two simple templates, each with three blanks: the customer's name, the product and the link back to checkout.
- abandoned_checkout_reminder: the friendly first reminder.
- abandoned_checkout_reminder_coupon: the follow-up, with your coupon code written into the message.
Set the language of both templates to English, with the language code en. The template editor starts on English (US), which has a different code (en_US), so change it. The flow asks WhatsApp for the en version of each template, and if your template is saved under another code, the message isn't sent and you get a "template not found" error.
Submit them. Approval usually takes up to 24 hours. Already have templates like these? Skip ahead, and use their names in step 4. If their language code isn't en, change "language": "en" in both sending steps of the flow to match.
Two simple rules keep you on the right side of the line:
- Only message customers who gave you permission (add a WhatsApp opt-in at checkout).
- Always stop messaging anyone who replies STOP.
Step 4: Build your recovery flow in WhatsTeam
In WhatsTeam, open Flows and create your recovery flow. Here's what the flow does, in order:
- Abandoned cart receives the checkout details from Shopify, but only when the request carries your secret header (more on that below).
- Has phone? stops here if the customer didn't leave a phone number.
- Send reminder sends your first template.
- Wait 24 hours does what it says.
- Send reminder + coupon sends your second template.
You don't build it from a blank canvas. Copy the ready-made flow below and paste it into the Flows editor. Then change these placeholders:
- YOUR_API_KEY (twice): your WhatsTeam API key, from Developers, then API keys.
- YOUR_DEVICE_ID (twice): the Number ID shown on your number's page in WhatsTeam. Click it to copy it.
- your-store in the first step's path: your shop's name, so the web address is yours alone.
- The two template names, if yours are different.
hljs json{
"name": "WhatsApp abandoned-cart recovery",
"nodes": [
{ "parameters": { "httpMethod": "POST", "path": "your-store-abandoned-cart", "authentication": "headerAuth", "responseMode": "onReceived", "options": {} },
"id": "a1", "name": "Abandoned cart", "type": "n8n-nodes-base.webhook", "typeVersion": 2, "position": [260, 300], "webhookId": "abandoned-cart" },
{ "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "loose", "version": 2 }, "conditions": [ { "id": "c1a2b3", "leftValue": "={{ $json.body.customer.phone }}", "rightValue": "", "operator": { "type": "string", "operation": "notEmpty", "singleValue": true } } ], "combinator": "and" }, "options": {} },
"id": "a2", "name": "Has phone?", "type": "n8n-nodes-base.if", "typeVersion": 2.2, "position": [480, 300] },
{ "parameters": { "method": "POST", "url": "https://api.whats.team/v1/messages", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Token", "value": "YOUR_API_KEY" }, { "name": "Content-Type", "value": "application/json" } ] }, "sendBody": true, "specifyBody": "json", "jsonBody": "={ \"device\": \"YOUR_DEVICE_ID\", \"phone\": \"{{ $('Abandoned cart').item.json.body.customer.phone }}\", \"template\": { \"name\": \"abandoned_checkout_reminder\", \"language\": \"en\", \"components\": [ { \"type\": \"body\", \"parameters\": [ { \"type\": \"text\", \"text\": \"{{ $('Abandoned cart').item.json.body.customer.first_name }}\" }, { \"type\": \"text\", \"text\": \"{{ $('Abandoned cart').item.json.body.line_items[0].title }}\" }, { \"type\": \"text\", \"text\": \"{{ $('Abandoned cart').item.json.body.checkout.recovery_url }}\" } ] } ] } }", "options": {} },
"id": "a3", "name": "Send reminder", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [720, 300] },
{ "parameters": { "amount": 24, "unit": "hours", "resume": "timeInterval" },
"id": "a4", "name": "Wait 24 hours", "type": "n8n-nodes-base.wait", "typeVersion": 1, "position": [940, 300], "webhookId": "wait-24h" },
{ "parameters": { "method": "POST", "url": "https://api.whats.team/v1/messages", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Token", "value": "YOUR_API_KEY" }, { "name": "Content-Type", "value": "application/json" } ] }, "sendBody": true, "specifyBody": "json", "jsonBody": "={ \"device\": \"YOUR_DEVICE_ID\", \"phone\": \"{{ $('Abandoned cart').item.json.body.customer.phone }}\", \"template\": { \"name\": \"abandoned_checkout_reminder_coupon\", \"language\": \"en\", \"components\": [ { \"type\": \"body\", \"parameters\": [ { \"type\": \"text\", \"text\": \"{{ $('Abandoned cart').item.json.body.customer.first_name }}\" }, { \"type\": \"text\", \"text\": \"{{ $('Abandoned cart').item.json.body.line_items[0].title }}\" }, { \"type\": \"text\", \"text\": \"{{ $('Abandoned cart').item.json.body.checkout.recovery_url }}\" } ] } ] } }", "options": {} },
"id": "a5", "name": "Send reminder + coupon", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [1160, 300] }
],
"connections": {
"Abandoned cart": { "main": [[{ "node": "Has phone?", "type": "main", "index": 0 }]] },
"Has phone?": { "main": [[{ "node": "Send reminder", "type": "main", "index": 0 }], []] },
"Send reminder": { "main": [[{ "node": "Wait 24 hours", "type": "main", "index": 0 }]] },
"Wait 24 hours": { "main": [[{ "node": "Send reminder + coupon", "type": "main", "index": 0 }]] }
},
"active": false, "settings": { "executionOrder": "v1" }, "pinData": {}
}
Now protect and copy your webhook address. A webhook is a web address that waits for another app to send it something, and this one is the single link between Shopify and WhatsTeam.
That address needs a lock. Without one, anyone who learned it could make your number send paid template messages to any phone they like. So the first step only accepts requests that carry a secret password in a header (a short label sent along with each request). You choose the password once, save it in WhatsTeam and give the same one to Shopify:
- Open the flow's first step, Abandoned cart. Its Authentication is already set to Header Auth.
- In the credential field just below it, choose Create new credential.
- For Name, type
X-Shop-Secret. - For Value, paste a long random password: at least 32 letters and numbers, for example one made by a password manager. Save the credential, and keep a copy of the value for the next step.
- Copy the step's Production URL: the address Shopify will send each abandoned checkout to.
- Save the flow and turn it on, then keep the address for the next step.
The flow arrives switched off and with no password filled in, so nothing can reach it until you've done this.
Step 5: Connect Shopify (it just signals WhatsTeam)
Shopify Flow can't send WhatsApp messages. Its only job is to ping WhatsTeam the moment a checkout is abandoned. The whole chain is: Shopify Flow sends the checkout details to your WhatsTeam webhook, and WhatsTeam sends the WhatsApp. Set it up once.
In your Shopify admin, open the App Store, search for Shopify Flow and click Install. It's free and it's made by Shopify.
Now tell Shopify to run a workflow whenever someone abandons a checkout. Open the Shopify Flow app and:
- Click Create workflow.
- Click Add trigger, search
abandonsand pick Customer abandons checkout. Then click the + below it. - Choose Action.
- Search Send HTTP request and select it. The request form opens empty.
- Fill in the request:
- Method:
POST - URL: the webhook address from your WhatsTeam flow (the Abandoned cart step you copied earlier)
- Header
Content-Typewith the valueapplication/json - Header
X-Shop-Secretwith the long random password you saved in step 4. Add it as a second header, and make sure the name and the value match the WhatsTeam credential exactly - Body: paste the block below. The parts in double curly brackets are Shopify's own details (name, phone, link and products), and Shopify fills them in for each checkout. You don't need to read it, just paste it as it is.
- Method:
hljs json{
"event": "abandoned_checkout",
"checkout": {
"recovery_url": "{{ abandonedCheckout.abandonedCheckoutUrl }}",
"total": "{{ abandonedCheckout.totalPriceSet.presentmentMoney.amount }}",
"currency": "{{ abandonedCheckout.totalPriceSet.presentmentMoney.currencyCode }}"
},
"customer": {
"first_name": "{{ abandonedCheckout.customer.firstName }}",
"email": "{{ abandonedCheckout.customer.email }}",
"phone": "{{ abandonedCheckout.customer.phone }}"
},
"line_items": [
{% for lineItem in abandonedCheckout.lineItems %}
{ "title": "{{ lineItem.title }}", "quantity": {{ lineItem.quantity }} }{% unless forloop.last %},{% endunless %}
{% endfor %}
]
}
Note: Shopify's Send HTTP request action is available on the Grow plan or higher.
Don't add your WhatsTeam API key to this request: the key stays inside your WhatsTeam flow. The only secret Shopify needs is the X-Shop-Secret password, and that's what keeps strangers from using your webhook address.
Step 6: Turn it on
Click Turn on workflow. That's it: every abandoned checkout now triggers an automatic WhatsApp reminder. Your customer gets a WhatsApp message from your business with their name, the product they left behind and a link they can tap to go straight back to checkout.
Try it once yourself: start a checkout in your own store with your own phone number, leave before paying, and wait for the message. If nothing arrives, first check that the X-Shop-Secret header in Shopify has exactly the same name and value as the credential in WhatsTeam. If they don't match, WhatsTeam turns the request away.
No Shopify store yet? Start a free Shopify trial. You can set up your store and test this whole flow before committing to a paid plan.
A gentle reminder sequence
One message recovers some carts. A short, respectful sequence recovers more, and it's already built into the flow above.
| When | Message |
|---|---|
| As soon as Shopify marks the checkout as abandoned | Friendly reminder + link back to checkout |
| 24 hours later | Follow-up + a small coupon |
Keep it to these two messages, and stop for anyone who replies STOP. One thing to know: the flow doesn't check whether the customer bought in the meantime, so someone who finishes their order during that day still gets the coupon message. Word it so it still reads well in that case (for example, "If you've already ordered, thank you!").
Frequently asked questions
Do I need a plugin to detect abandoned carts?
No. Shopify tracks abandoned checkouts on every plan. You're simply adding WhatsApp on top.
Do I need to know how to code?
No. The whole setup is clicking through Shopify Flow and WhatsTeam, and pasting two ready-made blocks.
Which plans do I need?
WhatsTeam Business or Enterprise, because Flows comes with those plans (see plans and prices). On Shopify, the Send HTTP request step needs the Grow plan or higher.
What if the customer didn't leave a phone number?
Then WhatsApp can't reach them: Shopify only has a phone number if the customer typed one in. Those customers can still get Shopify's own recovery email, if you have it turned on.
Resources
- Create your free WhatsTeam account
- How Flows works
- Shopify Flow
- More ways to use WhatsApp with your Shopify store
Ready to recover more sales?
Set this up once and it works while you sleep. Create your free WhatsTeam account and turn abandoned carts into completed orders.