Skip to content

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.

You need three things. Missing any one of them means no recovery emails go out:

  1. WooCommerce active. The feature only appears on stores.
  2. Cart tracking switched on in Settings, Store, Abandoned Cart.
  3. 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.

Shopper adds items Sweep runs every 5 minutes Your automation
and gives an email --> and marks idle carts --> sends the recovery
(cart is recorded) as abandoned (trigger fires) email

Only 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.

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

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.

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.

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.

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.

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.

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.

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.

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.

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.
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.

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.

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.

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.

{{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 two-step recovery flow that most stores can use as-is:

  1. Trigger: Cart Abandoned, Minimum Cart Total 20.
  2. Wait: 1 hour.
  3. Send Email: subject “You left something behind”. Body contains {{cart.items_table}} and a button linking to {{cart.restore_url}}.
  4. Wait: 1 day.
  5. Generate Coupon: 10 percent, expires in 3 days.
  6. 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:

  1. Trigger: Cart Lost.
  2. Remove Tag: abandoned cart.
  3. Add Tag: lost cart.

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.

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.