"Sarah from Munich just purchased the Blue Winter Jacket." You have seen this notification slide into the corner of a thousand stores, hang around for a few seconds, then fade. The idea is older than e-commerce: people look to other people to decide what is safe to buy. A sales popup borrows that instinct and aims it at a specific moment. The seconds when a first-time visitor is deciding whether your store is real, whether the product is any good, and whether it is worth handing over a card number. Done with care, it answers all three quietly. Done carelessly, it does the opposite and makes you look like every drop-shipping store the visitor has learned to distrust.
This guide is about that one job: using a recent-purchase popup to build confidence at the point of decision. We will stay narrow on purpose. If your question is the broader "do these notifications actually lift sales, and by how much," that evidence question is handled in live sales notifications: does showing real purchases really increase sales. If you want a count instead of a stream, "2,847 sold" on the product page, that is a different tool, covered in total products sold counter. Here we focus on the confidence mechanic and on getting it right inside PrestaShop specifically.
What the popup is actually proving
A trust badge says "we are secure." A review says "this product was good for me." A recent-purchase popup proves something neither of those does: that the store is alive right now. A static "127 reviews" could have been earned three years ago. A purchase notification that just appeared says someone trusted you with their money in the last few minutes, and that is the precise doubt a new visitor carries onto a store they have never heard of. They are not asking "is this a good jacket." They are asking "will this place actually ship me a jacket." The popup answers the second question, which is the one that kills the sale before the first one ever gets asked.
That framing matters because it tells you where the popup belongs and where it does not. It is a top-of-funnel trust signal, most valuable on the homepage, category pages, and product pages for a visitor who arrived cold from Google or an ad. It is nearly worthless, and often harmful, deeper down, where the visitor has already decided to buy and someone else's purchase is just noise. We will come back to that.
The honesty problem comes first

Before any setting, one decision determines whether this helps or hurts: the data has to be real. This is not a moral footnote. It is the entire mechanism. The popup works because the visitor believes the purchase happened. The moment that belief breaks, the tool inverts: instead of "this store is busy" the visitor reads "this store is faking it," and that suspicion contaminates everything else on the page, including your genuine reviews and real stock numbers.
Visitors are better at spotting this than merchants assume. If a store with a handful of reviews shows a purchase every twenty seconds, the arithmetic does not survive thirty seconds of attention. If the same three names cycle on a loop, a returning visitor notices. If "someone from Paris" buys a product that is out of stock, the illusion shatters. So the first rule is the unglamorous one: drive it from real orders, joining ps_orders to ps_order_detail and ps_address via id_address_delivery, not a fictional generator. If your real order volume is too thin to produce a believable stream, the answer is not to invent orders. It is to use a quieter signal until volume catches up. We will list those alternatives at the end.
How recent-purchase data lives in PrestaShop
Everything the popup needs already exists in your database; the work is querying and presenting it tastefully. A real order writes a row to ps_orders (with date_add, the id_customer, and the delivery address), the line items land in ps_order_detail (product name, quantity), and the customer's city and country come from ps_address joined through ps_country. A module showing "a customer from Lyon just bought the Oak Dining Table" is doing exactly this join, filtered to recent date_add values and to order states you trust, you almost always want to exclude unpaid, canceled, refunded, or test orders by filtering on current_state against the "Payment accepted" / "Processing" states rather than showing every order, whatever its state, as if it were a clean sale.
On the front end, a well-built module injects via a display hook so it appears on the pages you choose without theme edits, typically displayFooter (and for product-only placement, an appropriate product-page hook supported by your theme, such as displayProductAdditionalInfo, or displayFooter scoped by controller), with the notification rendered client-side and the order data delivered through a small AJAX call so it never blocks page rendering. So what does that mean for you? A popup that loads after your content keeps your Google PageSpeed score intact and never makes a cold visitor wait, the opposite of the heavy third-party scripts that slow a store to prove it is busy. This real-orders-only, anonymized, footer-hooked behaviour is exactly how our Sales Popup module is built, so you get the confidence mechanic without wiring the joins by hand.
The settings that decide whether it builds or breaks confidence
Most of the difference between a popup that reassures and one that irritates comes down to a handful of controls. Get these wrong and even real data feels like a gimmick.
| Control | Confidence-building setting | Why it matters |
|---|---|---|
| Data source | Real orders only, filtered to paid/processing states | A single fake-feeling notification poisons every other trust signal on the page. |
| Frequency | One every 30–60s; stop after 3–4 per session | The first notification is a signal; the sixth is wallpaper the brain blocks out. |
| Name display | "A customer from Lyon", city, not full name | Keeps the proximity effect while removing the GDPR exposure of broadcasting a name. |
| Recency window | Last few days, shown as "2 hours ago" not a fake live clock | Honest recency beats a fake "just now" that the math contradicts. |
| Page targeting | Home, category, product, never cart or checkout | Once the visitor is buying, someone else's purchase is a distraction, not proof. |
| Position | Bottom-left, dismissible | Stays clear of the cart and nav in the top-right; respects the visitor's control. |
Relevance is the multiplier most stores skip
A random recent purchase is generic social proof. A recent purchase from the same category the visitor is browsing is targeted reassurance, and the gap between the two is large. Someone weighing an espresso machine is barely moved by "a customer bought a phone case." Show them "a customer just bought the Barista Pro Grinder" while they are on the coffee-equipment pages and the proof now speaks to their exact hesitation.
In PrestaShop this is achievable because the controller already knows the context. On a product page the ProductController exposes the current product's id_category_default; on a category page the CategoryController exposes the category id. A module that reads that context can filter its order query to the matching category through ps_category_product, so the notification always lands in the visitor's lane. If you only ever set up one thing beyond "use real data," make it this.
Where the popup must stay silent
The single most common self-inflicted wound is showing the popup during checkout. By the time a visitor reaches the cart or the order controller, they have already done the thing the popup was meant to encourage, they are buying. Interrupting them with someone else's purchase does not reinforce the decision; it pulls attention off the form they are trying to complete and reintroduces hesitation at the worst possible moment. Exclude the cart, the checkout, and payment-return pages without exception. This is exactly why hooking to a footer you can scope per controller beats a blunt site-wide script: you keep the signal where it persuades and remove it where it leaks.
The same restraint applies to frequency. A notification every fifteen seconds stops being information and becomes a flickering distraction the eye learns to ignore, and a popup the brain has filtered out is doing nothing except adding motion to your page. Three or four well-spaced notifications per session is plenty to establish "this store is busy" without tipping into nag.
GDPR: why anonymizing is the easy, correct default
Displaying a real purchase means displaying real personal data to the public, and in the EU that is not a detail you get to skip. "John Kowalski from Kraków bought X" publishes an identifiable person's purchase to every stranger on your site. That needs a lawful basis and, realistically, the customer's awareness. The clean way out is to never show the name in the first place. "A customer from Kraków" keeps the two elements that actually do the persuading, location proximity and the product, while removing the one that creates the exposure. The name was never the part that built confidence; the city and the product were.
Three habits keep this defensible: anonymize by default (city and country, no name), mention purchase notifications in your privacy policy, and prefer modules that pull location from the order's country/city fields rather than scraping a precise address. Anonymized display is not a weaker version of the feature. For this specific job it is the better version, because it works nearly as well and it does not invite a complaint.
When a quieter signal beats the popup entirely
The popup is the loudest member of a family of social-proof tools, and it is not always the right one. If your order volume is genuinely thin, or your audience skews toward markets where pop-up notifications read as pushy (Germany and Northern Europe are notably less tolerant of them), a static signal often does the confidence job with none of the risk:
- A "sold this many times" line on the product page. Static, honest, and tied to one product, covered in total products sold counter.
- Live views or sales stats on the product itself. "12 people viewing" or recent sales figures shown in place rather than as a corner popup, see product sales and views.
- Bestseller and "hot" badges on thumbnails, which deliver social proof at the browsing stage. Whether they actually move buyers is examined in product badges and labels: do they actually work, with the PrestaShop setup in custom product badges.
- Visible review counts and ratings, which prove quality rather than activity. Start with PrestaShop product reviews: built-in vs third-party.
The popup and these static signals are not rivals; they answer different doubts. The popup proves the store is alive; reviews prove the product is good; trust badges prove the transaction is safe. A confident product page usually carries one of each rather than three of one, and the trust-badge half of that picture is its own topic in trust badges.
Test it like you mean it
Never assume a popup helps just because it is fashionable. The honest way to know is a split test: show the popup to half your visitors and nothing to the other half, then compare cart-to-order conversion, bounce rate, and time on site across enough traffic to see a real trend rather than a few good days. Watch the bounce rate especially, if it climbs, the popup is annoying people faster than it is reassuring them, and that is your signal to soften the frequency or pull it. A useful secondary check: do the product pages named in your notifications see a lift in visits? If so, the relevance targeting is doing its job. Give it at least 30 days and a few hundred orders before you trust the verdict, for the same reason you would not judge any conversion change on a single week.
Common questions about recent-purchase popups
Is showing a customer's purchase in a popup legal under GDPR? Showing real personal data, a full name tied to a purchase, needs a lawful basis and realistically the customer's awareness, so the clean default is to never show the name. "A customer from Kraków" keeps the proximity and the product (the parts that persuade) while dropping the identifier that creates the exposure. Mention purchase notifications in your privacy policy and pull location from the order's country/city fields rather than the precise street address.
What if my store doesn't have enough orders for a believable stream? Don't invent orders to fill the gap, a fake-feeling notification poisons every other trust signal on the page. Until your real volume catches up, use a quieter static signal instead: a "sold this many times" line, live view counts, or visible review counts. Switch to the live popup once genuine orders can sustain it.
Which pages should the popup never appear on? The cart, the checkout, and payment-return pages. Once a visitor is buying, someone else's purchase is a distraction that pulls focus off the form and reintroduces hesitation. Scope the popup to the home, category and product pages where a cold visitor is still deciding to trust you.
How many notifications per session is too many? The first notification is a signal; the sixth is wallpaper the brain learns to block. Show one every 30–60 seconds and stop after three or four per session. Enough to establish "this store is busy" without tipping into nag.
How long should I run it before deciding it works? Split-test it against showing nothing and give it at least 30 days and a few hundred orders before you trust the verdict. Watch bounce rate especially, if it climbs, the popup is annoying people faster than it reassures them, and that's your cue to soften the frequency or pull it.
A recent-purchase popup is one of the cheapest confidence signals you can add to a PrestaShop store, and one of the easiest to get wrong. The whole thing turns on a single discipline: show real purchases, anonymized, where a cold visitor is still deciding to trust you, and nowhere else. Do that, and the popup quietly answers the question that kills more first-time orders than price ever does: "is this store real?" For where it sits in the wider job of making a product page convince rather than just inform, see PrestaShop product page design: conversion best practices.