Abandoned Cart Recovery
Abandoned Cart Recovery is a Pro feature for WooCommerce stores. It records carts that shoppers fill and then leave, waits for a period you choose, and hands the shopper to an automation so you can email them a link that rebuilds their exact cart.
Before you start
Section titled “Before you start”You need three things. Missing any one of them means no recovery emails go out:
- WooCommerce active. The feature only appears on stores.
- Cart tracking switched on in Settings, Store, Abandoned Cart.
- A published automation using the Cart Abandoned trigger.
The third one catches most people. Recording carts and sending emails are separate systems, so a store can track carts perfectly and email nobody. The Reports, Abandoned Cart tab warns you when this is the case.
How it works
Section titled “How it works”Shopper adds items Sweep runs every 5 minutes Your automationand gives an email --> and marks idle carts --> sends the recovery(cart is recorded) as abandoned (trigger fires) emailOnly carts with a known email address are ever stored. PrimoCRM learns the email in one of three ways: the shopper is logged in, they typed it into the checkout billing field, or the blocks checkout sent it. A shopper browsing anonymously creates no record at all, so there is nothing to email and nothing to hold.
The cart lifecycle
Section titled “The cart lifecycle”Every recorded cart is in exactly one state:
| State | Set when | Meaning |
|---|---|---|
| Active | Items are in the cart | Still shopping |
| Abandoned | Idle past your cut-off time | Ready to chase |
| Recovered | An order reaches a recovering status | They bought, stop everything |
| Lost | Abandoned past your “mark as lost” window | Written off |
| Deleted | Settled and past your retention window | Removed from the database |
Settings
Section titled “Settings”All of these live in Settings, Store, Abandoned Cart.
| Setting | What it does |
|---|---|
| Track abandoned carts | Master switch for capture and the sweep |
| Cart abandoned after | Minutes of inactivity before a cart is marked abandoned |
| Mark as lost after | Days before an un-recovered cart is written off |
| An order counts as recovered when it reaches | Which WooCommerce order statuses end the chase |
| Skip shoppers who bought recently | Cool-off period, in days |
| Add new shoppers as | CRM status for a shopper who is not yet a contact |
| Checkout consent | Whether to show a consent checkbox, and how it defaults |
| Do not track these roles | Logged-in roles to ignore |
| Add to lists when abandoned | Lists applied on abandonment, removed on purchase |
| Add tags when abandoned | Tags applied on abandonment, removed on purchase |
| Delete recovered and lost carts after | Retention period, in days |
Several of these deserve more than one line.
Cart abandoned after
Section titled “Cart abandoned after”The background sweep runs every 5 minutes, so a value below 5 cannot be honoured and is raised to 5 automatically. Most stores use somewhere between 30 and 60 minutes. Too short and you email people who are still shopping, too long and you lose the moment.
An order counts as recovered when it reaches
Section titled “An order counts as recovered when it reaches”This decides when a cart stops being chased. The default is Processing and Completed.
Leave Pending payment switched off unless you specifically want unpaid orders to count. A pending order is created the moment a shopper reaches the payment step, so counting it would mark someone as recovered even though they abandoned at the payment screen and never paid.
When a cart is recovered, three things happen at once: the cart is closed, any lists and tags you configured are removed, and any reminder still waiting in an automation is cancelled. Nobody receives “you left something behind” after they have paid.
Skip shoppers who bought recently
Section titled “Skip shoppers who bought recently”A cool-off period stops a regular customer being chased every time they browse. If they placed an order within the number of days you set, their cart is still recorded as abandoned, so your reports stay accurate, but no contact is created and no automation runs. Set it to 0 to disable it.
Add new shoppers as
Section titled “Add new shoppers as”When an abandoning shopper is not already a contact, PrimoCRM creates one. This setting chooses their status.
The default is Transactional, and that is the recommended value. Someone who typed an email address into a checkout field has not opted into your marketing. A transactional contact can be reached by automations, which is what a cart reminder is, but is never included in campaigns. See Contact Status.
Checkout consent
Section titled “Checkout consent”Three options:
- No checkbox. Carts are captured as normal. Reasonable in regions with no consent requirement, and PrimoCRM already stores far less than most tools, since anonymous carts are never recorded.
- Show, ticked by default (opt-out). The shopper sees the checkbox already ticked and can untick it.
- Show, unticked (opt-in). Nothing is stored unless the shopper ticks it.
Unticking the box does more than stop future capture. It also deletes the cart already recorded for that session, so a shopper who changes their mind leaves nothing behind.
The checkbox appears on the classic checkout. The blocks checkout has no field for it yet, so on a blocks store opt-out still captures and opt-in does not capture at all.
Do not track these roles
Section titled “Do not track these roles”Useful once you are live, so your staff browsing the store does not fill the report with test carts. Leave it empty while you are testing, or your own carts will never be captured and the feature will look broken.
Add to lists and tags when abandoned
Section titled “Add to lists and tags when abandoned”Anything you choose here is applied when the cart is marked abandoned and removed again automatically when the shopper buys.
The removal is the important half. It means a segment such as “has an abandoned cart” stays accurate over time instead of slowly filling with people who ordered months ago.
Delete recovered and lost carts after
Section titled “Delete recovered and lost carts after”Only settled carts, meaning recovered or lost ones, are removed. A cart that is still active or still abandoned is never deleted, however old it is.
The Cart Abandoned trigger
Section titled “The Cart Abandoned trigger”This is the trigger you build your recovery automation on. It fires once per cart, at the moment the sweep marks that cart as abandoned.
It does not fire when:
- cart tracking is switched off,
- the shopper is inside the cool-off period,
- no email address was ever known for the cart, or
- the cart was already processed. Re-running the sweep cannot fire it twice.
Trigger setting
Section titled “Trigger setting”| Setting | Purpose |
|---|---|
| Minimum Cart Total | Only fire for carts worth at least this amount. Leave empty for all carts |
Use it to avoid spending your sending reputation chasing very small carts.
What your automation receives
Section titled “What your automation receives”The contact, already carrying any lists and tags you configured. From there it behaves like any other automation, so you can add waits, conditions, coupons and emails. See Triggers and Actions.
The Cart Lost trigger
Section titled “The Cart Lost trigger”This fires when an abandoned cart passes your Mark as lost after window without being recovered. It also fires once per cart, and it takes the same Minimum Cart Total setting.
There is one deliberate difference worth knowing. Cart Lost only fires for carts that had a contact attached when they were abandoned. A cart that was suppressed by the cool-off period still becomes lost, but stays silent. Staying quiet during cool-off would be pointless if the lost event reopened the door.
Use Cart Lost for the end of the funnel: swap the “abandoned cart” tag for a “lost cart” one, move the contact into a win-back segment, or send a single last-chance offer.
Smart codes for your email
Section titled “Smart codes for your email”These five codes are available in any email sent from a cart automation. They are resolved when the email is sent, not when the automation starts, so they always describe the cart as it stands at that moment.
| Smart code | Renders |
|---|---|
{{cart.items_table}} |
A product table with thumbnails, names, options, quantities, line prices and a total |
{{cart.restore_url}} |
A one-click link that rebuilds the shopper’s exact cart and takes them to checkout |
{{cart.total}} |
The cart value, formatted in your store currency |
{{cart.items}} |
A plain text list such as “Blue Shirt x2, Mug x1”, good for subject lines |
{{cart.item_count}} |
The number of items in the cart |
Resolving at send time has two benefits. A shopper who abandons a second cart before the first reminder goes out receives one email describing one cart, never a mixture of both. And once they buy, these codes render as nothing rather than a dead link to a cart that no longer exists.
You can also use every ordinary contact smart code, such as
{{contact.first_name}}. See Smart Codes.
The restore link
Section titled “The restore link”{{cart.restore_url}} contains a long random token unique to that cart. Opening
it empties whatever is in the visitor’s cart, rebuilds the saved one, and sends
them to checkout.
If a product has been deleted or is out of stock, the link restores everything else and quietly skips that item rather than failing.
A worked example
Section titled “A worked example”A two-step recovery flow that most stores can use as-is:
- Trigger: Cart Abandoned, Minimum Cart Total 20.
- Wait: 1 hour.
- Send Email: subject “You left something behind”. Body contains
{{cart.items_table}}and a button linking to{{cart.restore_url}}. - Wait: 1 day.
- Generate Coupon: 10 percent, expires in 3 days.
- Send Email: subject “Here is 10 percent off,
{{contact.first_name}}”. Body contains{{contact.meta.coupon_code}}and{{cart.restore_url}}.
Steps 4 to 6 only reach people who still have not bought, because a recovered order cancels the rest of the flow automatically.
Then a separate, much shorter flow:
- Trigger: Cart Lost.
- Remove Tag: abandoned cart.
- Add Tag: lost cart.
Reading the report
Section titled “Reading the report”Reports, Abandoned Cart shows the last 7, 30 or 90 days:
| Figure | Meaning |
|---|---|
| Recovered revenue | Value of orders from carts that were abandoned and then bought |
| Still open | Value sitting in abandoned carts that have not settled either way |
| Lost revenue | Value of carts written off |
| Recovery rate | Recovered carts as a share of settled carts |
Recovery rate deliberately ignores carts that are still open. Counting them would drag the figure down simply because a reminder has not had time to work yet, which would make a healthy setup look broken.
Below the figures is a list of recent carts with their status and, for recovered ones, a link straight to the WooCommerce order.
Troubleshooting
Section titled “Troubleshooting”Carts appear in the report but nobody receives an email. Almost always a draft automation. The trigger fires into nothing. Open Automations and confirm your cart automation is published, not draft. The report shows a warning when no published automation is listening.
Nothing is recorded at all. Check that cart tracking is on, then check Do not track these roles. If your own role is listed, your carts are ignored by design. Also remember that a shopper who never provides an email is never recorded.
Carts are marked abandoned far too quickly, or far too slowly. Check Cart abandoned after. Remember the sweep runs every 5 minutes, so the real delay is your setting plus up to 5 minutes.
Nothing happens on a schedule. The sweep depends on WordPress cron. On a quiet site cron only runs when someone visits. See WordPress Cron.
Shoppers are marked recovered without paying. Switch off Pending payment in the recovered statuses.
The email shows the wrong cart.
This should not happen, because the smart codes resolve at send time from the
shopper’s current open cart. If you see it, check that you are not using an old
{{contact.meta.cart_...}} tag from a much older version. Those were replaced by
the {{cart.*}} codes above.