Bad email addresses cause failed deliveries, chargebacks, fake accounts, and support tickets. Email Guard checks the customer’s address at checkout and blocks disposable email before the order goes through, entirely on your own server, with no account required.
It ships with a bundled list of over 8,200 disposable email and temporary email domains, a map of the typos people actually make, and your own block and allow lists. Every check runs locally. The plugin makes no outbound request of any kind unless you deliberately activate a Pro licence key.
A disposable email address is a working inbox that is designed to stop working. Services like Mailinator, Guerrilla Mail, 10 Minute Mail and several thousand others hand out an address that receives mail for a few minutes or a few hours and then discards it, usually without asking anyone to register. Some of them publish hundreds of alternate domains precisely so that blocklists cannot keep up.
None of that is inherently sinister. People use throwaway email to avoid newsletters, to test something, or to sign up for a download they will never come back to. That is fine on a blog. It is a problem on a shop, because an order carries obligations that a ten-minute inbox cannot meet.
Here is what actually goes wrong when a disposable email address reaches an order:
Not every disposable address is fraud. Most of it is friction. The point of Email Guard is to remove the friction at the one moment it is cheap to remove, which is before the order exists.
Email Guard hooks into WooCommerce checkout validation and account registration. When a shopper submits an address, the plugin runs four checks in a fixed order and either lets the order through or stops it with a message the shopper can act on.
1. Your allow list wins over everything.
If the domain is on your allow list, the address passes immediately and no further check runs. This is deliberate and it is checked first, before anything else, including the bundled list of 8,200 domains. At that size a false positive stops being hypothetical, and a shop owner needs a way to overrule the plugin that does not mean switching protection off for everybody. If a real customer is ever refused, you add their domain and they are through, permanently.
2. Your own blocklist.
Domains you have added yourself are refused next. This is for the addresses that are not disposable but that you do not want ordering: a competitor, a domain that has produced repeated fraud, a free provider your business does not serve. It is your list, it is checked on every order, and it takes precedence over the typo and disposable checks below.
3. Likely typos, with a correction offered.
If the domain looks like a near-certain mistake, the shopper is shown the corrected address rather than a flat refusal. “Did you mean bob@gmail.com?” recovers a sale that a plain error message loses. The bundled typo map covers 34 of the mistakes people make most often on the large providers. It handles the two distinct kinds. Misspelled names: gmial.com, gnail.com, gamil.com, hotmial.com, hotmali.com, yhaoo.com, outlok.com. And truncated or fumbled endings, which are just as common and easier to miss: gmail.con, gmail.co, yahoo.con, outlook.co, icloud.con, aol.co, live.con, protonmail.con.
The providers covered are Gmail, Hotmail, Yahoo, Outlook, iCloud, AOL, Live and Proton Mail, which between them account for the overwhelming majority of consumer addresses that reach a shop.
This check runs before the disposable check, which is not an accident. Several well-known typosquats are on the disposable list, because somebody registered them specifically to catch mistyped mail. Checking disposable first told a shopper who fat-fingered “gmail” that disposable addresses are not accepted. True of the domain, and completely useless to the person trying to buy something. The order is stopped either way. This way they can fix it.
4. The bundled disposable email list.
Finally, the address is checked against over 8,200 known disposable email and temporary email domains. The list is a file inside the plugin, not a service call, so it works whether or not your server can reach the internet, and no customer address is ever transmitted anywhere.
Throwaway providers hand out addresses on subdomains constantly. A service listed as example.com will happily issue you an address at mail.example.com, inbox.example.com or a random string in front of it. A blocklist that only compares the whole domain string misses every one of those.
Email Guard walks the labels of the address domain from the left and stops when two labels remain. An address at deep.sub.mailinator.com is tested as deep.sub.mailinator.com, then sub.mailinator.com, then mailinator.com, and is refused on the last one. The same walk applies to your own blocklist, so adding competitor.com also covers shop.competitor.com without you listing it.
Over-stripping is safe here. A candidate only has an effect if it is actually present in one of the lists, and real public suffixes are not. Testing “co.uk” against the list costs one array lookup and cannot produce a false positive, because “co.uk” is not a disposable domain and nobody would put it on a blocklist.
Email Guard validates in three places, which between them cover how WooCommerce actually takes orders:
woocommerce_after_checkout_validation. A blocked address surfaces as a checkout notice and the order is not created.woocommerce_registration_errors, which covers both the My Account registration form and the create-an-account option during checkout.If WooCommerce is not active, the plugin does nothing to your site except show an admin notice explaining that it needs WooCommerce. It does not touch WordPress core registration, the comment form, or any contact form.
Being specific about scope is more useful than claiming everything.
wp_remote_ and you will find outbound calls only in the Pro licence activation path, which runs only if you enter a key.The plugin’s whole pitch is that it makes no outbound requests and keeps no customer data, so it is worth being exact about the small amount it does record.
What is stored: counters in your site’s own options table. How many blocks fired, split by reason. Which domains were refused and how many times. Which typo corrections were offered. A daily count for the last 30 days so the dashboard can draw a line. That is it.
What is not stored: no email addresses. The local part of the address is discarded before anything is written. No names, no order IDs, no IP addresses, no user agents. A domain is not personal data: “mailinator.com” identifies a mail provider, not a person.
Where it is stored: the sbeg_stats option on your own site, written with autoload set to false so it is not loaded on front-end requests. It is never transmitted.
When it is written: only when a block actually fires, which on a typical shop is a few times a week rather than once per checkout. Nothing is written on a normal order.
Growth is capped. The daily series keeps 30 days. The domain and typo tables keep the 12 most frequent rows. A shop hit by many distinct throwaway domains cannot grow the option without bound.
On uninstall, the plugin deletes sbeg_settings, sbeg_stats, sbeg_review_dismissed and sbeg_license. Removing the licence record does not release the activation slot on your account; that stays with you to manage.
The bundled domain list is a plain newline-delimited text file of about 116 KB. It is read on the first check that actually needs it and not before.
That laziness is the point. The plugin is loaded on requests that never validate an address, and holding 8,201 domains permanently in memory to answer a question that only arises at checkout is waste. Shipped as a PHP array it would have been roughly a quarter of a megabyte held in opcache on every single request. Read from a file on demand it costs nothing until it is needed, and once per request after that.
Lookups are array key hits, not string scanning, so a single check is a handful of hash lookups regardless of whether the list holds 50 domains or 8,201.
Under WooCommerce > Email Guard you get a screen that answers one question: is this thing doing anything?
The numbers are only useful if they change a decision. Here is what each one should make you do.
A steady trickle of disposable blocks, no complaints. This is the normal, healthy state. The plugin is doing its job quietly and there is nothing to act on. Most shops sit here.
One domain dominating the blocked list. If a single provider is responsible for most of your blocks, you are being probed rather than casually shopped. It is worth glancing at whether those attempts correlate with a discount code being live. That is the usual reason.
A sudden spike from many different domains. Distinct throwaway domains arriving together is the signature of somebody working through a list, usually against a first-order discount or a free trial. The plugin is already refusing them. The decision it should prompt is about the offer, not the plugin.
Typo corrections climbing. This is the number nobody expects to matter and it is often the most valuable one on the screen. Every typo caught is an order that would otherwise have completed with an address that silently bounces. If this count is high, your checkout is quietly losing confirmation emails, and it was doing so before you installed this.
Zero blocks after several weeks. Not a fault. It means your traffic is clean. Use the tester to confirm the plugin is live, and then stop worrying about it.
Everything lives on one screen at WooCommerce > Email Guard.
Block risky emails at checkout. The master switch. Off means every check is skipped and nothing is refused or recorded. Leave it on.
Suggest corrections for typos. When on, a likely typo stops checkout and shows the corrected address. When off, typos are ignored entirely and only disposable domains and your own blocklist are enforced. Turn it off only if you have a reason to accept obviously mistyped addresses.
Custom blocked domains. One domain per line, or comma separated. Pasting a whole address works too; the plugin takes the part after the @. Subdomains of anything listed are covered automatically.
Always allow these domains. Same format. Checked before every other rule, including the bundled list. This is your override and your safety valve.
The tester. Type any address, press the button, see the verdict and the reason. It runs the same code path as checkout and does not affect your counters, so you can use it freely.
There are four common approaches. They are not interchangeable and it is worth knowing which problem each one actually solves.
Format validation with a regular expression. Checks that an address looks like an address. WooCommerce already does this, and it catches almost nothing that matters: x@mailinator.com is a perfectly well-formed address. Necessary, nowhere near sufficient.
A bundled domain list, which is what this plugin does. Fast, private, free, works offline, no per-check cost, and catches the providers that get used at volume. The trade is that it is a snapshot: newly registered throwaway domains are not in it until the plugin updates.
Live DNS and MX lookups. Asks whether the domain can receive mail at all, at the moment of …