The Problem: You Know They Left, But You Don’t Know Who Came Back
Most store owners can see their cart abandonment rate in Shopify analytics. A number like 70% gets flagged, everyone panics, and then someone sends a generic “you left something in your cart” email. That email gets a 2% click rate and the problem continues.
What you actually need is a dashboard that shows you which abandoned carts recovered themselves, which ones came back after an email, and which ones are gone forever. Without that data, you are flying blind. You cannot improve what you cannot measure, and the default Shopify abandonment report does not give you enough detail to make decisions.
This guide walks you through building a simple cart abandonment recovery dashboard using Shopify Flow and a Google Sheet. No plugins, no paid apps, no code. Setup takes about 45 minutes.
What You Need
- A Shopify store (any plan with Shopify Flow, which is included on Basic and above)
- A Google account (for Google Sheets)
- About 45 minutes
Step 1: Create Your Google Sheet Dashboard
Open Google Sheets and create a new spreadsheet. Name it “Cart Abandonment Dashboard”. Create the following column headers in row 1:
- Cart ID
- Customer Email
- Cart Value
- Items in Cart
- Abandoned At (timestamp)
- Recovery Email Sent (Yes/No)
- Came Back (Yes/No)
- Days to Recovery
- Recovery Source (Email / Direct / Other)
This sheet is your single source of truth. Every abandoned cart gets a row. Every recovery gets tracked. You will use this to spot patterns over time.
Step 2: Set Up Shopify Flow to Log Abandoned Carts
Open Shopify Flow and create a new workflow. Set the trigger to “Checkout created” so you capture every cart the moment someone starts checkout.
Add an action: “Send HTTP request”. Configure it as follows:
- Method: POST
- URL: Your Google Apps Script web app URL (we will set this up next)
- Headers: Content-Type: application/json
- Body: A JSON object containing the cart token, customer email, total price, item count, and timestamp
The body should look something like this:
{
"cart_id": "{{ order.token }}",
"email": "{{ order.email }}",
"value": "{{ order.total_price }}",
"items": "{{ order.line_items_count }}",
"timestamp": "{{ 'now' }}",
"event": "abandoned"
}Save the workflow. Every time someone starts a checkout and abandons it, this flow fires and logs the cart to your sheet.
Step 3: Create the Google Apps Script
In your Google Sheet, click Extensions, then Apps Script. Replace the default code with this:
function doPost(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var data = JSON.parse(e.postData.contents);
if (data.event === 'abandoned') {
sheet.appendRow([
data.cart_id,
data.email,
data.value,
data.items,
data.timestamp,
'No',
'No',
'',
''
]);
} else if (data.event === 'recovered') {
var rows = sheet.getDataRange().getValues();
for (var i = rows.length - 1; i >= 0; i--) {
if (rows[i][0] === data.cart_id) {
sheet.getRange(i + 1, 7).setValue('Yes');
sheet.getRange(i + 1, 8).setValue(data.days_to_recovery);
sheet.getRange(i + 1, 9).setValue(data.recovery_source);
break;
}
}
}
return ContentService.createTextOutput('OK');
}Click Deploy, then “New deployment”. Choose “Web app”. Set “Who has access” to “Anyone”. Copy the deployment URL. This is the URL you paste into Shopify Flow in Step 2.
Step 4: Track Recovery Emails
Go back to Shopify Flow and create a second workflow. Trigger: “Cart abandoned” (after a delay of your choice, typically 1 hour). Add an action to send your recovery email (use Shopify’s built-in email action or connect your email tool). Then add a second “Send HTTP request” action to log that the email was sent:
{
"cart_id": "{{ cart.token }}",
"event": "email_sent"
}Update your Google Apps Script to handle this event by setting column 6 (Recovery Email Sent) to “Yes” for the matching cart.
Step 5: Track Recoveries Automatically
Create a third Shopify Flow workflow. Trigger: “Order created” (this fires when someone completes checkout). Add a condition: check if the order was created from a recovered cart by looking at the order attributes for a cart token that matches an abandoned cart. Add a “Send HTTP request” action:
{
"cart_id": "{{ order.cart_token }}",
"event": "recovered",
"days_to_recovery": "{{ calculation }}",
"recovery_source": "Email"
}For the days to recovery calculation, you can use Flow’s built-in date math or approximate it based on the time between the abandonment timestamp and the order creation timestamp.
Step 6: Build Your Dashboard View
Go back to your Google Sheet. Create a second tab called “Dashboard”. Add these summary formulas:
- Total abandoned carts:
=COUNTA('Sheet1'!A2:A) - Recovery emails sent:
=COUNTIF('Sheet1'!F2:F,"Yes") - Carts recovered:
=COUNTIF('Sheet1'!G2:G,"Yes") - Recovery rate:
=COUNTIF('Sheet1'!G2:G,"Yes")/COUNTA('Sheet1'!A2:A) - Revenue recovered:
=SUMIFS('Sheet1'!C2:C,'Sheet1'!G2:G,"Yes") - Average days to recovery:
=AVERAGEIFS('Sheet1'!H2:H,'Sheet1'!G2:G,"Yes")
Format the recovery rate as a percentage and the revenue as currency. Now you have a live dashboard that updates every time a cart is abandoned or recovered.
Step 7: Review Weekly and Act on Patterns
Every Monday, open your dashboard and look at the numbers. The key metrics to watch:
- Recovery rate trend: Is it going up or down week over week? A dropping rate means your recovery emails are losing effectiveness.
- Average cart value of recovered vs abandoned: If high-value carts are being abandoned and not recovered, your shipping or pricing on expensive items might be the issue.
- Days to recovery: If most recoveries happen within 24 hours, a 1-hour delay on your recovery email is right. If recoveries happen 3 to 5 days later, try sending a second follow-up email on day 2.
- Recovery source: If most recoveries come from “Direct” (not from clicking your email), your emails might not be the driver. Check if your retargeting ads or social posts are doing the heavy lifting instead.
What This Dashboard Tells You That Shopify Default Reports Do Not
The default Shopify abandonment report shows you a count and a recovery total. It does not show you:
- Which specific carts were recovered and how long it took
- Whether your recovery email was the reason they came back
- The average value of abandoned carts versus recovered carts
- How many days typically pass before a shopper returns
This dashboard gives you all of that. After running it for a month, you will know exactly which levers to pull. Maybe your recovery emails work great for carts under $50 but fail for carts over $100. Maybe most recoveries happen on Tuesday mornings. Maybe your second email gets 3x the click rate of your first. You will only see these patterns if you track them.
Common Mistakes to Avoid
- Not logging abandoned carts fast enough: If you only log carts after 1 hour of inactivity, you miss the ones that bounce in 5 minutes. Log at checkout creation so you capture everything.
- Forgetting to mark email_sent: Without this flag, you cannot tell whether a recovery was organic or email-driven. Always log the email send event.
- Not cleaning up test data: When you first set this up, you will probably trigger test carts. Delete those rows from your sheet before going live so your numbers are clean.
Once this is running, you have a real abandonment recovery system. Not just a panic button when the rate looks high, but a structured way to understand what is working and what is not. That is worth 45 minutes of setup.
Want more like this? Join MOKU Club for free. Weekly resources, early access to new guides, and occasional templates you can actually use. Join below.


