The emails a shop means to send and never does: thank somebody a day after their parcel went out, ask for a review a fortnight later, say hello to a customer who has not been back in three months. Gatemi Follow-Ups is a list of automations — a trigger, a wait, some conditions, and a message — deliberately smaller than a full marketing suite.
Every queued message is re-checked when it comes due, not when it was queued. This is the whole plugin, and it is what the category gets wrong. The obvious implementation decides once and mails whatever is in the queue, which means:
- a "we haven't seen you in ninety days" reaching somebody who ordered yesterday — a shop telling a regular it has forgotten them;
- a "please review your purchase" for an order that was refunded last week;
- a "how are you getting on with it?" for an order that was cancelled.
Here the queue records *what to check*, not a decision already taken. A message that no longer qualifies is called off, with the reason kept beside it — because "why did that not go out?" is the question a merchant asks, and a row that is simply gone answers with silence. The screen shows the count.
The same automation never queues twice for the same order. A UNIQUE index does it, not a check in PHP: an order status hook fires more than once in ordinary operation, and a merchant who moves an order back to processing and completes it again has fired it twice. A customer already thanked for order 1234 is not thanked again.
A send is claimed before it goes out. One conditional UPDATE, and the mail goes only if that statement moved the row. WP-Cron spawns on page loads, so two overlapping runs are ordinary, and a merchant with a real system cron *and* WP-Cron left on has two by construction.
Nothing is emailed inside the request that triggered it. An order completing usually happens in a payment callback, a bulk edit or a REST call, and mailing there is how "mark forty orders complete" becomes a timeout. Every trigger writes one row and returns.
Every follow-up carries an unsubscribe link, and it cannot be switched off. A receipt is not a mailing list, but "we haven't seen you in a while" is — and in most of the world that carries rules. The link is a token over the address and the site's own salts, so it holds no secret, cannot be minted from an address, and cannot be used to find out whether a shop has a customer. An address that has used it is never queued for again.
Triggers
- An order reaches a status — the thank-you, the review request
- A customer's first order — counted by billing email through WooCommerce's own query, so a guest's history counts and somebody who created an account after their third order is not new again
- A customer has not ordered for a while — the win-back
Conditions
The order was worth at least or at most; the order is still in one of these statuses; it contains one of these products or categories; the customer's role; the customer still has not ordered. Every condition must be satisfied — adding one narrows an automation, it never widens it — and a condition nothing understands is false, which holds a message back rather than sending it.
What's in it
- As many automations as you need, each with its own wait and conditions
- Placeholders:
{first_name},{order_number},{order_total},{products},{site_title},{shop_url},{email} - An outbox report: waiting, sent, and called off with reasons
- A batch cap on the hourly sweep, so a long queue cannot time out a cron run
- No storefront JavaScript, no stylesheet on a shopper's page
Every license includes
- One year of updates and priority support, delivered straight to your WordPress dashboard.
- Use on 1, 5 or 25 sites depending on your license — local, staging and development sites are always free.
- 30-day money-back guarantee — full refund, no questions asked.
- Keeps working after expiry — if you choose not to renew, the plugin keeps running exactly as installed; it simply stops receiving updates and support until you do.
Requires WordPress 6.4+ · PHP 7.4+ · tested up to WordPress 7.0. Works with the classic and block checkout alike.

Ruth W. (verified owner) –
Set it up, got confused, read the docs, fine ever since. Follow-Ups sits fine alongside my other plugins. No complaints worth making.
Romain (verified owner) –
A remplacé une extension bien plus lourde qui en faisait la moitié. Content d’avoir pris Single Site plutôt que la formule en dessous. Très content.
David D. (verified owner) –
Half a star off for the documentation. I’d to read the Follow-Ups docs twice, but it works.
Alessia V. (verified owner) –
Dopo la prima settimana fila liscio. Avrei voluto un’opzione in più in Follow-Ups. Buono, non perfetto.
Thomas D. (verified owner) –
Bang on. Exactly the job. Two months of Follow-Ups and it hasn’t skipped once. No hesitation recommending this.