Skip to content

Settings

Abandoned Cart Recovery keeps its settings in OpenCart's own setting table, under the module_abandoned_carts group. You set them at Admin > Extensions > Extensions > Modules > Abandoned Cart Recovery.

Each key below carries where it applies. per store means a multi-store install can hold a different answer per storefront, and both are honoured: a read takes what that store holds, then what the default store holds, then the shipped default. install-wide means one thing serves every storefront, and the key's own description names that one thing.

Scope

Key Default What it does
module_abandoned_carts_status
per store
0 Whether the module is enabled. Off, no pass runs for this store and nothing is detected or sent; the schedule moves its tail read past the checkouts abandoned meanwhile, so switching it back on emails none of them.
module_abandoned_carts_api_enabled
install-wide
0 Whether the extension answers API requests at all. Off, every API route answers 404 api_disabled in the API's own JSON envelope, so an extension with its API off is shaped like one that has none. Read once for the whole installation from the default store rather than per store, because the credential it checks is OpenCart's own API user, which has no store of its own: turning it off for one store would not stop that store's data being read through a credential that is not that store's either.

How you may email

Key Default What it does
module_abandoned_carts_position
per store
empty 1 is Reminder only — one email, a link back to the cart and the items in it, nothing else. 2 is Marketing sequence — up to three emails and the recovery coupon, and it cannot be saved without the acknowledgement. Empty is not chosen, and until a position is chosen nothing is sent: detection still runs, so the first look at the screen shows real abandonment from this store, but an episode opened while nothing was chosen is never emailed, and choosing a position later releases none of them. Each episode keeps the position it opened under, and the one it is emailed under is the lower of that and this setting — so narrowing back to Reminder only stops pending second and third emails on the next pass, and widening reaches no episode that opened under Reminder only. Anything else saved here is read as not chosen, never as the nearest position.
module_abandoned_carts_marketing_acknowledged
per store
0 Whether the merchant ticked the acknowledgement that a Marketing sequence is direct marketing. Marketing sequence is refused on save without it, in the same post — the one thing the settings screen refuses rather than clamps.
module_abandoned_carts_newsletter_only
per store
0 Under Marketing sequence only: whether an abandoned checkout is emailed only when the shopper is a customer subscribed to the store's newsletter, so every guest is skipped. Reminder only ignores it. Off by default, because the position already decides what kind of message may go.

Timing

Key Default What it does
module_abandoned_carts_delay_1_hours
per store
1 Hours from the abandonment to the first email. Measured from the abandonment, as all three delays are, not from the email before it.
module_abandoned_carts_delay_2_hours
per store
24 Hours from the abandonment to the second email, under Marketing sequence only. From the abandonment rather than from the first email, so a first email held back by the daily limit does not push this one out — and one that failed still lets this one go.
module_abandoned_carts_delay_3_hours
per store
72 Hours from the abandonment to the third and last email, under Marketing sequence only. At most a week, as all three delays are: past that the episode has expired, and a reminder a fortnight later is the thing the backfill's own ceiling exists to prevent.
module_abandoned_carts_expiry_days
per store
14 Days after the last email before an episode nobody acted on expires. An expired episode sends nothing more, and its link stops restoring the cart a fixed grace later.

Sending

Key Default What it does
module_abandoned_carts_daily_limit
per store
200 Emails per rolling 24 hours. A rate rather than a per-pass batch, because how often anything invokes cron.php is the merchant's crontab and the same batch is 50 a day on one store and 1,200 on another.
module_abandoned_carts_cooldown_days
per store
14 Days one address is left alone after an episode has emailed it, keyed on the address rather than the customer. 0 means 24 hours, not "no limit": the floor is not configurable, because the merchant who set it to zero while testing and forgot is the failure the floor exists for.
module_abandoned_carts_backfill_days
per store
7 How far back an initial collection reaches, in days. Seven at most, and that ceiling is deliberate rather than a default: an abandonment older than a week is not one a shopper remembers, so an email about it reminds them of nothing, and a longer window would be the one way to email a store's whole history of abandoned checkouts in a day.

The coupon

Key Default What it does
module_abandoned_carts_coupon_type
per store
P Whether the recovery coupon is a percentage (P) or a fixed amount (F), core's own two types. Under Marketing sequence only: one coupon per episode, minted at the first email carrying one and restated, never bettered, by the last.
module_abandoned_carts_coupon_value
per store
10 The recovery coupon's value: a percentage when the type is P, an amount in the store's default currency when it is F. A percentage above 100 is minted as 100.
module_abandoned_carts_coupon_days
per store
7 Days a recovery coupon stays redeemable after it is minted. It is a real single-use OpenCart coupon with its own expiry, so it stops working on that date whatever happens to the episode.
module_abandoned_carts_coupon_shipping
per store
0 Whether the recovery coupon also removes the shipping cost, core's own free-shipping flag on the coupon. Under Marketing sequence only. The email that carries the coupon says so, read back off the coupon itself, so an email always describes the coupon it holds rather than today's setting.
module_abandoned_carts_coupon_minimum
per store
0 The smallest subtotal the recovery coupon works on, as a whole amount in the store's default currency, and 0 is no minimum. Core compares it with the cart's subtotal before tax and shipping, not with the order total, and the email states it in the shopper's currency in those words. Under Marketing sequence only.
module_abandoned_carts_coupon_products
per store
0 Whether the recovery coupon applies only to the products listed in the email that minted it, rather than to the whole cart. The list is fixed when the coupon is minted: the third email restates the same coupon even if the cart changed after the second. A fixed-amount coupon restricted this way is spread across the qualifying products by core, not taken off the order as one sum. Under Marketing sequence only.

What the shopper is told

Key Default What it does
module_abandoned_carts_copy
per store
empty The email wording, per language code: the subject and opening of each of the three emails, the button and the unsubscribe link. Read whole to render one email and written whole by one form save, so it is one setting holding an array rather than a table. A field left empty for a language reads the shipped wording, so no email sentence can be blank. What the email is made of — the item list, the subtotal label, the reason line, the postal address — has no wording box; see "What the shopper is told" below.

Data

Key Default What it does
module_abandoned_carts_retention_days
per store
365 How long a closed episode keeps the shopper's address and lines, in days. Retention blanks them and never deletes the row, so what was sent and what came back is still counted. A year by default, which is the one retention period a data-protection regulator has accepted for exactly this data.

Diagnostics

Key Default What it does
module_abandoned_carts_passes_kept
per store
200 How many pass records are kept per store, newest first; each pass deletes the older ones. The newest is what the screen's freshness line reads, and the rest are history for a support exchange. A number of rows rather than an age, because a store invoking cron.php every minute would otherwise write 1,440 rows a day for a screen that shows the newest few.
module_abandoned_carts_fresh_seconds
per store
7200 How old the newest pass may be, in seconds, before the screen stops believing anything is driving the schedule. It reports; it never stops a send. A store whose own cron runs less often than hourly sets it higher rather than reading a warning that is telling the truth about nothing.
module_abandoned_carts_diary_verbose_until
install-wide
0 When detailed logging stops, as a unix timestamp, and 0 is off. Turning Detailed logging on from this extension's settings form stores the moment two days from now; the writer compares that against the clock every time it is asked for a DEBUG line, so the window closes on its own with no scheduled task and nothing to clean up. While it is open this extension records what it did in far more detail, and the shared diary consequently holds less history.

What you cannot change, and why

These are fixed on purpose. Each one is a decision with a reason beside it rather than a setting nobody got round to adding.

What came back

Seven days, from the last email. A merchant-tunable window is a knob whose only use is making the number bigger, which is the opposite of a claim that holds — and this number ends up quoted in a marketplace listing.

Rule Value
Days after an email in which an order still counts 7

Sending

Which episode goes first when more are due than the rate allows: fresh before harvest, then send 1 before send 3, then oldest first. Never by cart value — that is a silent decision to chase big carts, invisible to everyone it affects, turning a rate limit into a revenue-maximising sort nobody asked for.

What this conserves is the server's execution time, and a merchant who set the batch above the daily rate would have configured a contradiction no screen could explain back to them.

Rule Value
Messages one pass may send, whatever the rate allows 50

Nothing retries a failed send, so without a breaker a broken mail configuration burns the whole backlog's one chance, fifty at a time, silently. Three rather than one, because one timeout is weather.

Rule Value
Consecutive failures that end a pass 3

A lease shorter than the work it protects is a second pass joining the first, and the mark is what the lease protects.

Rule Value
A pass's lease, in seconds 900

A test goes to the address on your own admin account and nowhere else. A box you could type any address into is a way to send this store's mail to anybody, from a screen whose only other job is the shopper's one email.

How you may email

Two positions and no third. There is no member state where three promotional emails to everyone who abandoned is clearly lawful and four where it clearly is not, and offering it with a warning is still offering it.

The link lives as long as the episode plus a fixed grace. A merchant tuning a token lifetime is tuning something they cannot observe.

Rule Value
Grace after the episode expires, in days 7

Where the link puts the shopper. Straight to checkout when everything was restored, the cart page when something was dropped or was already there — because that is the page with room to say so. A setting here makes the extension's headline behaviour differ between stores in exchange for nothing a merchant can measure.

What the shopper is told

What the email says is yours; what it is made of is not. The card list, the subtotal label, the reason line, the store's postal address and — under Position 2 — the advertisement identification have no wording box. The postal address especially: a cart reminder fits none of the five closed categories in 15 U.S.C. § 7702(17), so § 7704(a)(5) requires it, and config_address is already mandatory and validated in core. "This is the only email we will send you about it" is structural too: it is a statement about your configuration rather than your voice, and it is removed automatically when you choose Marketing sequence. There is no {coupon} placeholder for the first email — a discount is what makes a reminder into marketing, so putting one there is a change of position, not a change of wording.

What came back

There is no dashboard widget. A tile is a second home for the recovered-revenue figure, and the figure has a paragraph of qualification attached that a tile cannot carry — a number without its qualification is precisely the claim that does not hold.

There is no way to close an abandoned checkout by hand. It ends only for one of the five reasons the pass records — converted, expired, nothing left to sell, unsubscribed, suppressed — so the recovered figure cannot be edited by a click. Stop emailing is the act instead: it withholds every send left and leaves the checkout open, so a shopper who buys anyway still counts as recovered.