Last reviewed June 2026 — the SQL Manager queries and Cart Rules settings below are current for PrestaShop 1.7, 8.x and 9.x; table and column names are unchanged across those versions.
A customer buys from your store. Maybe twice. Then nothing. They stop opening your emails, their account goes quiet, and the order history just... stops. They probably did not storm off to a competitor. Life moved on, a reorder got forgotten, your store slipped out of mind. That is the whole opportunity. A win-back email targets the easiest audience in e-commerce: someone who has already handed you their card details once and only needs a reason to do it again. The hard part is not the email — it is knowing which customers have gone quiet, when to act, and pulling that list out of PrestaShop without guessing. This guide is about exactly that: the lapsed-customer problem, solved on a PrestaShop store, with real back-office paths and the SQL to find them.
One boundary first, so this post stays in its lane. A win-back email is not an abandoned-cart email. Abandoned-cart fires within hours of someone leaving a full cart at checkout — see our overview of email as a channel for where each automation sits. A win-back fires weeks or months after a customer's last completed order, when the relationship itself has gone cold. Different trigger, different list, different message. Mixing them up is the most common reason win-back campaigns underperform.
First, define "lapsed" for your store — not in general
There is no universal number of days that means "lapsed." It is entirely a function of your purchase cycle, and you already have the data to calculate it. The principle: take your average gap between repeat orders and treat anything past roughly 1.5x that gap as at-risk, and past 2x as lapsed.
- Consumables (supplements, coffee, pet food, filters): a 30-day reorder rhythm means at-risk at ~45 days, lapsed at ~60. These are the highest-value win-backs because the need is recurring — you are catching a missed reorder, not reviving a dead interest.
- Fashion and accessories: a quarterly buyer who has gone six months silent is lapsing.
- Electronics and durable goods: long cycles by nature. Someone who bought a phone 18 months ago may genuinely not need another — so here you pivot from "buy the same thing again" to accessories, consumables, or the next model.
So what does that mean in practice? Do not guess your average gap — measure it. In PrestaShop you can read it straight out of the orders table. The query below pulls, per customer, the average days between consecutive valid orders for customers with at least two orders:
(Run read-only queries in Advanced Parameters → SQL Manager, the built-in back-office tool — no database client needed. Adjust the id_shop filter for multistore.)
| What you want | Where it lives in PrestaShop |
|---|---|
| Each customer's last order date | MAX(o.date_add) from ps_orders, grouped by id_customer |
| Only "real" orders (paid/valid) | join ps_order_state and filter logable = 1, or filter current_state to your paid states |
| Customer name / email for the export | ps_customer (firstname, lastname, email, newsletter, optin) |
| How much they were worth | SUM(total_paid_real) over their valid orders — your lifetime-value column |
A practical "who has lapsed" query looks like this — customers whose most recent valid order is between 60 and 365 days ago, who still accept newsletter:
SELECT c.id_customer, c.firstname, c.lastname, c.email,
MAX(o.date_add) AS last_order, SUM(o.total_paid_real) AS lifetime_value
FROM ps_orders o
JOIN ps_customer c ON c.id_customer = o.id_customer
WHERE o.valid = 1 AND c.newsletter = 1 AND c.deleted = 0
GROUP BY o.id_customer
HAVING last_order < DATE_SUB(NOW(), INTERVAL 60 DAY)
AND last_order > DATE_SUB(NOW(), INTERVAL 365 DAY)
ORDER BY lifetime_value DESC;
The o.valid = 1 condition is the one merchants forget — it excludes carts, cancelled and unpaid orders so you are not "winning back" someone who never actually bought. Two things matter beyond the SQL: c.newsletter = 1 is a starting filter — treat it as a first pass, then rely on your recorded marketing consent and your suppression/unsubscribe rules to decide who you can actually email — and the upper 365-day bound stops you wasting incentives on customers who are long gone rather than merely quiet. Export the result to CSV with the button at the top of the SQL Manager results, and that is your campaign audience.
Don't want to live in SQL? The back office gets you most of the way
Under Customers → Customers the list has a Last visit column and a Sales column, and you can sort by them to rough out your dormant high-spenders without writing a query. It is much coarser than the SQL: last visit is not last order (so it will not reliably surface a quiet high-spender who simply stopped buying), Sales is not date-range filterable, and there is no automatic "1.5x the average gap" logic — for true last-order dormancy you need the Orders export, reporting, or the SQL above. But for a first manual campaign, eyeballing the grid is a legitimate starting point. The moment you want this to run on its own every week, you have outgrown manual exports — which is the whole point of automation, below.
The win-back sequence: four emails, not one

A single "we miss you" email rarely moves anyone. A sequence of three to four messages over four to six weeks consistently does better, because it lets you escalate: start with no discount and only reach for margin if the soft touch fails. Run the steps in this order.
| # | Send | Job of this email | The lever |
|---|---|---|---|
| 1 | Day 0 | Remind them you exist | No discount. "Here's what's new since you've been gone." Test whether memory alone is enough. |
| 2 | Day 7–10 | Re-establish why you're worth it | Social proof: bestsellers, reviews, products related to what they bought before. |
| 3 | Day 14–21 | Remove the price objection | A concrete, time-limited, unique-coded incentive. |
| 4 | Day 28–35 | Close the window | Genuine expiry urgency on the same offer. If they don't move, accept it and stop. |
The reason email 1 carries no discount is financial discipline: every customer you can reactivate with a plain reminder is a customer you did not have to discount. Leading with the coupon trains your best buyers to wait for one. Hold the incentive until you have evidence the soft approach failed.
Building the incentive in PrestaShop — properly
This is where PrestaShop specifics matter, because the difference between "15% off, valid 7 days" and a coupon someone forwards to a deal-aggregator site is how you configure the cart rule. Go to Catalog → Discounts (the Cart Rules controller) and create one with these settings:
- Per-customer codes, not one shared code. Generate a unique code per recipient so a leaked code can't be used by strangers, and so you can attribute revenue back to the campaign. The native back office creates cart rules one at a time, so for a whole campaign you either generate them in a loop via the
CartRuleobject (a small script) or use a coupon-generator module — your email platform's own coupon-sync feature often handles this too. - Limit it to the lapsed customer. On the cart rule's Conditions tab set Limit to a single customer so the discount only works for the person you sent it to. This is the single most-skipped setting and the one that protects your margin.
- Set a real expiry. Use the Valid from/to dates so "expires tomorrow" in email 4 is literally true — PrestaShop enforces it, you are not bluffing.
- Set Total available to 1 and Total available for each user to 1 so the code is single-use.
- Free shipping instead of a percentage? The same cart rule has a Free shipping action — often as persuasive as a discount, with no hit to product margin.
Which lever to pull depends on the customer:
- Percentage (10–20%): the default. Below 10% rarely motivates; above 20% starts eating margin you may never recover if they only buy once.
- Free shipping: best where shipping is a known friction point at your store; costs you a known fixed amount rather than a slice of every line item.
- Gift with purchase: "order this week, get a free sample" — perceived value without straight discounting.
- Loyalty points top-up: if you run a points program, a bonus balance pulls people back without a cash discount. We cover the program mechanics in loyalty programs for PrestaShop — a win-back is one trigger that feeds into it.
Segmentation: a lapsed customer is not a lapsed customer
One sequence for everyone wastes your best incentives on people who'd have come back for free, and under-serves the ones worth fighting for. The SQL above already hands you the two columns you need to segment — lifetime_value and last_order — so split the export before you send:
- By value. Your top spenders (sort the query by
lifetime_value DESC) earn a bigger gesture and a more personal tone — even a plain-text email that looks like it came from you, not the marketing machine. A 15% code on a customer who has spent four figures with you is cheap insurance. - By recency. Someone three months quiet is far more recoverable than someone two years gone. Spend effort and discount depth in proportion to the odds.
- By what they bought. Join ps_order_detail back in and a consumable buyer gets a replenishment nudge ("running low?"), while a gift buyer gets "another occasion coming up?" — the product history is right there in PrestaShop, use it.
- By engagement. A lapsed customer who still opens your emails is a different prospect from one who has ignored every send for six months. Your email platform's open data tells you which is which; the second group needs a stronger hook or a graceful exit.
Timing: when to start the clock
The trigger point is not the same for every customer, and getting it wrong costs you either way — too early feels needy, too late and they have already settled into a competitor's habit.
- Start sooner for high-value customers, before a competitor's routine hardens around them.
- Start sooner for one-time buyers. A single-order customer has formed no loyalty; the window for a second purchase is short and the second purchase is what turns a buyer into a customer. (What you send in those critical first weeks after a first order is its own discipline — see post-purchase emails.)
- Wait longer for established repeat buyers who suddenly go quiet — they may simply be on a seasonal pattern, and a panicky win-back at week three is noise.
And know when to stop. After the four-email sequence, halt. Continuing to email someone who ignored four attempts stops being marketing and starts being spam — it hurts your deliverability for the customers who do engage. Move non-responders to a low-frequency segment (a quarterly check-in at most) or out of active sending entirely. In PrestaShop terms, you can flip their newsletter flag off via the customer record, or maintain a suppression segment in your email tool.
Automating it so it runs without you
Everything above can be done by hand — SQL export, CSV, cart rules, paste into your mail tool — and for a first campaign you should, to learn what your numbers look like. But a win-back only earns its keep when it runs continuously, catching each customer as they cross your "lapsed" threshold instead of in occasional manual batches. That means connecting PrestaShop to a platform that can hold the multi-step sequence, fire the unique coupon, and read your order data.
The right tool depends on how much automation you need, and we've compared them in depth elsewhere so this post doesn't sprawl:
- Just getting started / want it free to begin: Mailchimp for PrestaShop handles basic lapsed-customer journeys.
- Serious behavioral automation and segmentation: Klaviyo and ActiveCampaign let you build the four-email flow on a "days since last order" trigger and branch by value.
- Email plus SMS in one place: Omnisend if you want the win-back to escalate from email to a text on the final attempt.
Whichever you choose, the upstream job is the same: keep your subscriber list clean and growing so there are engaged customers to lapse in the first place. If your list is the weak link, start with growing your PrestaShop email list the right way.
Measuring whether it actually worked
Do not judge a win-back campaign by how many emails opened — judge it by recovered revenue, and watch that you are not simply renting customers with discounts. Track four numbers:
- Reactivation rate: the share of targeted customers who placed a valid order within ~60 days of email 1. A 5–15% rate is a reasonable expectation for a well-built sequence — treat that as a directional range, not a guarantee, and benchmark against your own first run rather than someone else's number.
- Revenue per email sent: recovered revenue divided by emails sent. Compare it to your regular broadcasts — win-backs often beat them because the audience is pre-qualified.
- Discount cost vs. revenue recovered: because every code was per-customer and trackable (you set it up that way), you can total the discounts given against the revenue they unlocked. If the discounts cost more than they recovered, tighten the incentive.
- Second-order rate: the real test. Do won-back customers buy again at full price, or grab the coupon once and lapse straight back? If it is the latter, you did not re-engage anyone — you ran a one-off sale. Genuine re-engagement shows up as a third order weeks later, with no discount attached.
You can read the first metric straight out of PrestaShop: after a campaign, re-run your lapsed query filtered to that customer list and count how many now have a valid order dated after the send. The platform holds the proof; you just have to ask it. The read-only query below does that count for one campaign window — replace the date with the day you sent email 1, and paste the IDs from your campaign export into the IN (...) list:
SELECT COUNT(DISTINCT o.id_customer) AS reactivated
FROM ps_orders o
WHERE o.valid = 1
AND o.date_add > '2026-05-01'
AND o.id_customer IN (101, 102, 103 /* your campaign customer IDs */);
Divide that count by the number of customers you mailed and you have your reactivation rate — measured against your own store, not a borrowed benchmark.
Win-back emails work because they aim at the friendliest audience you have — people who already know you, already trusted you with their money, and need a nudge rather than a sales pitch. The cost is close to nothing. The return, in recovered customer lifetime value, can be substantial. The merchants who get it right are not the ones with the cleverest subject lines; they are the ones who defined "lapsed" honestly, pulled the right list out of PrestaShop, and let the sequence run continuously — catching customers as they start to drift, not years after they're gone.
Frequently asked questions
What counts as a "lapsed" customer in PrestaShop?
There's no fixed number of days — it depends on your reorder cycle. Measure your average gap between repeat orders from ps_orders, then treat roughly 1.5x that gap as at-risk and 2x as lapsed. A 30-day consumable rhythm makes ~60 days lapsed; a quarterly fashion buyer isn't lapsed until around six months. Always base the threshold on o.valid = 1 orders so unpaid and cancelled carts don't distort it.
Can PrestaShop send win-back emails automatically on its own?
No. Native PrestaShop only fires transactional emails on order-status changes; it has no "X days since last order" trigger and no multi-step sequence. You can run a first win-back manually with a SQL export and CSV, but to have it fire continuously as each customer crosses the lapsed threshold you need an email-automation platform (Mailchimp, Klaviyo, ActiveCampaign or Omnisend) synced to your order data.
How do I stop a win-back coupon from being shared or reused?
In Catalog → Discounts, on the cart rule's Conditions tab, enable Limit to a single customer so only the recipient can redeem it, and set both Total available and Total available for each user to 1 for single use. Generate a unique code per recipient rather than one shared code, and set the Valid from/to dates so the expiry in your email is genuinely enforced.
Is the SQL Manager query safe to run on a live store?
Yes — the SQL Manager in Advanced Parameters → Database only permits read (SELECT) queries, so the lapsed-customer and reactivation queries here can't change your data. Use the CSV button above the results to export your audience. Only switch to a database client if you intend to write data (for example, bulk-generating cart rules), which is a separate, riskier task.
When should I stop emailing a customer who doesn't respond?
After the four-email sequence. Someone who ignored all four has told you they're done for now, and continuing to mail them raises spam complaints that hurt deliverability for the customers who do engage. Move non-responders to a low-frequency segment (a quarterly check-in at most), or clear their newsletter flag and maintain them as a suppression segment in your email tool.
Comments
No comments yet. Be the first!
Be the first to ask a question or share useful feedback.
Leave a comment
Share a question, an installation detail, or feedback that could help another reader.