Limits and guarantees¶
What Abandoned Cart Recovery guarantees, what it does not touch, and where each promise stops. Everything below is true of the version you can install.
At a glance¶
| If you are asking | The short answer |
|---|---|
| Will it email somebody who only put something in their cart? | No. It notices a checkout that reached OpenCart's confirm step and was not paid, and nothing earlier. More |
| Is anything sent as soon as I install it? | No. Nothing goes until you have switched it on and chosen how it may email, and checkouts from before either are never mailed unless you run a backfill. More |
| Does it check that I have consent to send a marketing sequence? | No. Your tick is the only record it keeps. The two positions, and the decisions behind their wording, are below. More |
| Is the price in the email the price at checkout? | Not always. The email shows today's list price and option prices, before tax, without specials, quantity discounts or customer-group prices. More |
| Is the recovered figure revenue the email caused? | No. It is orders placed by people who were emailed, within seven days of their last email. The seven days is fixed. More |
| Can I set it up for each of my stores separately? | Not from the screen. The settings, the backfill and the status banner cover your default store; the other stores follow it. You can filter the episode list by store, but the funnel adds every store together. More |
| How many emails can it send in a day? | Your daily limit, and never more than 50 in one pass, so about 1,200 a day on an hourly schedule however high you set the limit. More |
| Does unsubscribing here take somebody off my newsletter? | No, and the other way round neither. The list is this extension's own, per store. More |
| Does uninstalling remove what it holds about people? | No. Uninstalling keeps every table. Removing personal data is a screen of its own. More |
| Is a failed email tried again? | Not automatically. You press Resend, and the next pass sends it once. More |
| Can I send a test email to any address? | No. A test goes only to the address on your own admin account, and counts toward nothing. More |
| Can the coupon require a minimum, or cover only some products? | Yes, both, and free shipping too, each off by default. It cannot be limited by category or to one customer. More |
Only a checkout that reached the confirm step counts¶
When a shopper reaches the last step of OpenCart's checkout, OpenCart writes an order with no status. It is the same unfinished order your admin already lists under Sales → Orders with the Missing Orders filter. That row is what this extension reads, and it reads nothing else.
So a shopper who put something in the cart and left, or who stopped at the address step, is never noticed, whether they were signed in or not. They gave you no address to write to at that point, and OpenCart keeps no record of them that is the same on 4.0.2 and 4.1.
There is no pop-up, no exit-intent box and no email field added to your storefront. Nothing of this extension runs while a shopper is on your site. It finds abandoned checkouts afterwards, in the scheduled pass, which is why what it costs shows nothing added to any storefront page.
On OpenCart 4.1.0.3, a shopper who reloads the confirm page leaves the order at your store's void status rather than at none. That is read as abandoned too, unless the order was ever paid, so voiding a real sale yourself never sends anybody a reminder.
The email goes to the address typed at checkout, capitalised however the shopper typed it, and a checkout with no address opens nothing. Two abandoned checkouts from one address are one abandonment: the second joins the first rather than starting the emails again, and the email shows the newer cart.
Nothing is sent until you choose, and nothing from before that¶
Installing arms nothing. Two things have to be true before an email goes:
- Status is on for the store. It installs off.
- How this extension may email your shoppers has been chosen and saved. Reminder only is ticked on the form when you first open it, but it is not stored until you press Save.
While the module is on and no position is saved, it still notices abandoned checkouts, so the Episodes tab shows you real abandonment from your store before anything is sent. None of those is ever emailed, including after you choose.
A checkout abandoned while Status is off is never emailed either. When the module is off, the pass does not run for that store and moves its reading position past everything abandoned meanwhile, so switching it back on sends nothing about that period. Status comes back off after every update, so switch it back on straight after one; see install.
Checkouts from before you installed are left alone unless you run a backfill, which reaches back seven days at most. A checkout abandoned more than your Give up after days ago is never mailed, whichever way it arrives: that includes a backlog that built up while your scheduler was not running.
The two ways it may email, and the decisions behind them¶
There are two positions and no third.
Reminder only sends one email: a link back to the cart, the items in it, and nothing else. No discount, no countdown, no second email. The email says This is the only email we will send you about it, and that stays true: once it has gone, no later change of setting adds another.
Marketing sequence sends up to three emails, the second and third carrying a recovery coupon, and every one of them says This email is an advertisement. It cannot be saved until you tick I have a lawful basis to send marketing email to shoppers who did not complete a purchase, and I am responsible for it. Saving it without the tick saves nothing at all, not even the other fields.
The extension does not check, collect or store anybody's consent. Your tick is its only record, and the reason line in each marketing email (…and agreed to hear from us) is a statement you are making. The one consent-shaped input it can read is OpenCart's own newsletter box: under Marketing sequence, Only email shoppers who ticked your newsletter box skips everyone who did not, which includes every guest. Under Reminder only that switch is ignored.
Changing position never reaches back. Each abandoned checkout keeps the position it was noticed under, so widening to Marketing sequence adds nothing to checkouts already open. Narrowing to Reminder only stops their second and third emails at the next pass. An email that has gone cannot be recalled.
The decisions we read, and what each one says¶
The wording on the settings screen is our reading of the decisions below. It is not legal advice, and none of these is a court ruling on an abandoned cart, because no court anywhere has decided one. If you are unsure which applies to you, ask someone who can advise you.
- Italy, Garante, decision 576 of 17 July 2024 (Iliad). The only detailed regulatory treatment of cart recovery. Soft opt-in did not apply, because the shopper had bought nothing. Recovering a cart without promotional intent is limited to one email with the link; anything promotional follows the person's own consent. It named stressing the offer, and three sends in seven days, as what made Iliad's promotional.
- Italy, Garante, decision 617 of 23 October 2025 (Bluepillow). A recall email is not marketing, and its basis is legitimate interest (GDPR Article 6(1)(f)), not the soft opt-in, because no sale was completed. The company's shorter retention of cart data was recorded approvingly.
- Court of Justice of the EU, C-654/23, 13 November 2025. A "sale" in the soft opt-in rule is an agreement entailing a payment. A shopper who left at checkout has concluded no agreement.
- France, CNIL. The customer exception cannot be used where no sale was made, even when the shopper created an account; and a message that looks informative is still prospecting if its aim is to make the person buy more.
- Germany, OLG Düsseldorf, I-20 U 155/16, 5 April 2018. "Sale" in the German rule means a contract actually concluded, not a customer who looked and decided against it.
- Netherlands, ACM. The customer exception is read narrowly and tied to the moment the customer enters the agreement.
- United Kingdom, ICO. Soft opt-in needs no purchase; "negotiations for the sale" are enough, which an address given at checkout comes much closer to than browsing does. Separately, the ICO's Halfords penalty (2022) held that even some promotional material, including a sense of urgency, makes an email direct marketing.
That is why the line sits where it does. A discount, an urgency line, or a
second and third email is what turns a reminder into marketing, so the coupon
and the extra emails exist only in Marketing sequence, and the first email
cannot carry a coupon in either position: typing {coupon} into its wording
leaves the braces as you typed them.
Every email carries your store's postal address, taken from System → Settings → Store → Address, and you cannot remove it. The US CAN-SPAM Act requires one on a message like this, and the address is already a required field in OpenCart.
The email shows today's list price, not the checkout price¶
Each item in the email shows the product's price today plus the price of the options chosen, before tax, in the currency the shopper checked out in at today's rate. It does not apply specials, quantity discounts or customer-group prices, and it does not say whether a price has changed since the cart was left. The line under the items says shipping and tax are worked out at checkout, and it gives no grand total.
A product that has been deleted, disabled, is not yet available or is no longer sold in that store is left out of the email. If nothing is left, no email goes and the checkout closes as Cart empty.
There is no tracking pixel. The only thing it records about a shopper's reading is the first click on the cart link.
The link puts the products back, and nothing else¶
Open my cart puts the products from the newest abandoned checkout back into the shopper's cart, without signing anybody in. It never restores an address, a telephone number or an email address; the shopper fills those in again, or their account supplies them.
- A product already in the cart with the same options is left exactly as it is. Its quantity is not added to.
- Stock is not checked by this extension. An enabled product with no stock goes back in the cart, and OpenCart's own stock rules apply at checkout.
- If everything went back cleanly, the shopper lands on the checkout. If anything was already there or could not go back, they land on the cart page, which names the products it left out. If nothing at all could go back, they land on a page that says so, with a Continue shopping button.
- The link works until your Give up after days, plus seven, from the last email: 21 days on the defaults. It keeps working after the shopper has bought. After that, or if it has been mistyped, it opens a page that says the link has expired and the store is open as usual.
Where the shopper lands, and how long the link lives, are fixed rather than settings. See settings.
What came back counts orders that followed an email¶
The funnel at the top of the Episodes tab covers the last 30 days and ends in one figure with its qualification beside it:
{amount} is the value of orders placed by people we emailed, within 7 days of the last email. It counts orders that followed an email, not orders the email caused.
- The seven days is fixed and is not a setting.
- An order counts when an email that was actually sent came before it and within seven days. Clicking the link is shown as a line of the funnel but is not what counts.
- The figure is the order total, shipping and tax included, in your default currency.
- The funnel covers all your stores together.
The Recovered pill on the episode list is a different, wider number. An
abandonment is marked Recovered whenever the same address places a paid order
at that store afterwards, including somebody who bought before any email went,
or more than seven days after the last one. The JSON API's recovered_total
follows the pill. Quote the funnel's figure, not the pill's count, when you want
a number an email can be credited with. The same care cuts the other way: an
abandoned order that is paid later in place, a bank transfer clearing for
instance, keeps its original date, so it is Recovered but not in the funnel.
What "paid" means is your store's own setting. An order counts once its status is one you list under System → Settings → Option → Processing Order Status or Complete Order Status. An order that sits at any other status, such as a Pending status you have not listed there, does not close the abandonment, and the shopper can still be emailed.
There is no dashboard tile and no comparison with an earlier period, and you cannot close an abandonment by hand. It ends only when the shopper buys, the cart empties, the shopper or you stop it, or it expires. Stop emailing is the act instead: it withholds every email left and leaves the abandonment open, so a purchase afterwards still counts.
One settings screen for every store¶
On a store with more than one storefront:
- Each store is handled on its own. Its abandoned checkouts, its suppression list, its daily limit and its passes are separate, and its emails use its own name, address, web address and mail settings.
- The settings screen edits your default store, and the other stores use its answers, Status and position included. There is no store picker.
- The backfill, Run a pass now and the banner above the tabs are about the default store only.
- The episode list can be filtered by store, and the funnel cannot. The list shows a Store column and a store filter, and the counts on the state pills follow the filter. The funnel always adds every store together.
- You can search the episode list by address: Address contains matches any part of it, ignoring case. An abandonment whose address retention has already blanked is never found this way. The JSON API has no search by address.
A store with no usable web address (blank, or missing its http:// or
https://) is held rather than mailed, because every link in the email would be
broken.
How fast it sends¶
At most your Emails per day in any rolling 24 hours, per store, and failed attempts count. On top of that, one pass never sends more than 50. OpenCart's scheduler runs the pass once an hour, so on its schedule the most that can go out is about 1,200 a day however high the daily limit is set.
When the limit is spent, the rest wait for the next pass and nothing is recorded against them. They go in this order, never by cart value: checkouts abandoned since you installed before backfilled ones, first emails before second before third, oldest first.
A test email counts toward nothing¶
Send me a test on the Emails tab sends one email to the address on your own admin account, and to nowhere else. There is no box to type another address into, so the screen cannot be used to send your store's mail to anybody. If your account has no email address, nothing is sent and the screen says so.
The test is the preview sent through your store's own mail settings, with [Test] before the subject. It uses a sample shopper called Alex and two sample products, and its links open the expired-link page. It counts toward nothing: not your daily limit, not the 50 in a pass, not the three failures that stop a pass. It creates no abandonment, no coupon and no record of a send, and it never reads or changes the suppression list. A failed test tells you your mail is broken without spending any shopper's one email.
A failed email is never retried on its own¶
A failed send is shown as Send failed with the mail server's error beside it. Nothing tries it again until you press Resend, and then the next pass sends it once, under the same limit and the same checks.
Three failures in a row stop the pass, recorded as failed, so a broken mail setting does not spend every shopper's one email in an afternoon.
A send that was interrupted part way (the server stopped the pass during the call to the mail server) is shown as Send interrupted and has no button at all. The email may have gone.
"Sent" means your mail server accepted the message. Nothing here can tell you it was delivered, and no screen says so.
The suppression list is its own¶
A shopper who presses Don't send me cart reminders and confirms is never emailed about a cart by that store again. It is one button on a page, so a mail scanner that opens links cannot unsubscribe anybody. There is no one-click unsubscribe header in the email, because OpenCart's mail library cannot set one.
- The list is this extension's, per store. It does not unsubscribe anybody from your newsletter or from another extension, and your newsletter's unsubscribes do not reach it.
- You cannot lift a shopper's own unsubscribe. You can add an address yourself with Suppress, and lift only the ones you added.
- The list is never shortened by retention or by erasure, because a request to stop has to outlive everything else.
One edge. An old email's unsubscribe link still opens after the retention period has blanked that abandonment, and still says the address will not receive any more reminders. By then the extension no longer knows which address the email went to, so the page offers no button and writes nothing. A later abandoned checkout from the same address would be emailed. Suppress is a button on an abandonment, so there is no way to add an address to the list before it abandons a checkout again.
What it keeps, and for how long¶
Each abandonment keeps the shopper's email address, whether they were a signed-in customer, the language and store, its dates and outcome, the link's token, any coupon code and any send error. It links to OpenCart's own order rows and copies no name, address or basket out of them. Nothing leaves your store: no third-party service, no outside request.
Retention blanks, and never deletes. A year (your Keep a closed episode's address for days) after an abandonment closes, its address, token, coupon code and errors are emptied. The row stays, so the counts and the recovered figure do not shrink. An open abandonment is not touched by retention.
Erasing a person from Customers → Personal Data blanks their abandonments, open ones included, and keeps their suppression entry. An erased abandonment that was still open is never emailed again and closes as expired there and then. Table by table, column by column: what this holds about a person.
The coupon is a real OpenCart coupon. It appears under Marketing → Coupons, named Abandoned cart recovery, episode N, single use, and it stays after uninstalling. A percentage above 100 is created as 100.
Three conditions can be added under The recovery coupon, each off by default: Also free shipping, a Minimum subtotal, and Only the products in the email. The minimum is compared with the cart's subtotal before tax and shipping, not the order total. Restricted to the products, a fixed amount is spread across those products by OpenCart rather than taken off the order as one sum. The coupon cannot be limited by category or to one customer.
A coupon is fixed once it is made, when the second email goes. The third email restates the same coupon even if the cart or your settings changed in between, and the line under the code (Includes free shipping, For orders of … or more before tax and shipping, Applies only to: …) is read off the coupon itself, so it always describes the coupon the email carries. Coupons made before these settings existed have no conditions and no line.
Uninstalling keeps everything¶
Uninstalling removes the scheduled task and the extension's event rows, and OpenCart deletes its settings. Every table stays: the abandonments, the emails sent, the suppression list and the reading position. So do the coupons it created, the permissions it granted and its lines in the log. To remove what it holds about people, use Remove everything held about a person on the Data & privacy tab, before or instead of uninstalling.
Where this page stops¶
Behaviour that is not built yet is not described here as though it were. If you are evaluating Abandoned Cart Recovery against a requirement you do not find on this page or on the overview, assume it is not there and ask rather than inferring it.