Free · MIT licensed · no license key

Core locks the account. This locks the IP that's trying all of them.

Magento already locks a storefront customer account after too many failed attempts — but only once it knows that account exists. A credential-stuffing script spraying thousands of different emails from one IP never trips it, because no single email ever fails enough times. This module throttles by IP instead, closing the gap.

Get it free See how it works

Free forever, no credit card · just a free TVT Commerce account so we know where to send updates

Additive to core, not a replacement for it

Core's own customer account lockout keeps running exactly as before. This module closes the hole next to it.

Throttles by IP, not by account

Failed attempts are counted against the requesting IP address itself — before Magento even needs to know whether the email being tried belongs to a real account.

Stops enumeration tools cold

Tools that spray many different emails from one IP to find which accounts exist get blocked at the IP level, long before any single account accumulates enough failures on its own.

Covers the checkout login popup too

The standard /customer/account/login form and the inline "login" popup shown during checkout are both covered — the second one is easy to forget and just as exploitable.

Configurable time window & block duration

Set how long a window of failures counts and how long a triggered IP stays blocked — tune it to your store's real traffic, not a hardcoded default.

Configurable max attempts

Decide exactly how many failed attempts from one IP is too many before the block kicks in.

Doesn't duplicate core's lockout

Runs alongside Magento's existing per-account customer lockout rather than replacing it — you keep both layers of protection.

Why this exists: Magento's built-in customer lockout (customer/password/lockout_failures) only activates once the platform has resolved a login attempt to an existing customer account — the failure counter lives on that account's own record. A request for an email address that has never been registered never reaches that counter at all, because there's no account row to attach it to. A credential-stuffing script that sprays thousands of different, mostly non-existent emails from a single IP therefore sails straight through core's protection: no individual email ever accumulates enough failures to trip anything. This module counts failures against the IP address making the request instead of the account being targeted, so the volume of the attack itself — not which specific email happened to exist — is what triggers the block. More on the gap this closes: Why Magento's Customer Account Lockout Doesn't Stop Credential Stuffing.

Install & configure

1Download the module as a .zip from your account dashboard and copy it into app/code/TVTCommerce/LoginRateLimiter.

bin/magento module:enable TVTCommerce_LoginRateLimiter
bin/magento setup:upgrade
bin/magento cache:flush

2Set your max attempts, time window, and block duration to match your traffic, then save config — it protects the login form and the checkout login popup immediately.

Also from TVT Commerce

Closing the rest of the login surface?

This module is free and focused on one job — Login Rate Limiter protects the storefront. TVT Commerce also builds Admin Login Alert, which emails you the moment a backend admin logs in from an IP that account hasn't used before, and Disposable Email Blocker, which stops throwaway addresses at registration.