kwtSMS replaces or supplements WordPress passwords with SMS one-time codes, sends WooCommerce order updates automatically, and lets you verify phone numbers on any contact form. Built on the kwtSMS SMS gateway.
Built for Arabic-speaking markets (Kuwait, Saudi Arabia, UAE, Bahrain, Qatar, Oman) with full RTL admin support and bilingual SMS templates in English and Arabic.
Authentication
- 2FA Mode: users log in with username + password, then confirm with a 6-digit SMS code
- Passwordless Mode: users enter their phone number and receive an OTP to log in directly, no password needed
- Both Modes: let each user choose their preferred method
- Password Reset via SMS: replace the email link with an SMS OTP verification flow
- Role-Based Enforcement: configure which user roles must pass OTP (exclude administrators, apply only to customers, etc.)
- Welcome SMS: send a customisable welcome message when a new user registers
- Country Code Dropdown: restrict the dial-code selector on login forms to GCC countries or a custom list
WooCommerce Integration
- 7 order status notifications: Processing, On-Hold (Shipped), Completed, Cancelled, Pending Payment, Refunded, Failed
- Admin order notifications: automatically notify a configurable admin phone number on any order status change
- Checkout OTP Gate: require phone verification before the customer can place an order
- Per-status templates: independent English + Arabic SMS template for every order status
- Admin SMS panel: send a custom free-text SMS to any order’s customer from the order edit screen
- HPOS (High-Performance Order Storage) compatible
Contact Form Integrations
Each integration supports two modes: Notification (send a confirmation SMS on submit) and OTP Gate (block submission until the phone number is verified):
- Contact Form 7
- WPForms
- Ninja Forms
Security
- Sliding-window rate limiting per phone number, per IP address, and per user account
- Duplicate OTP guard: reuses existing valid OTP on double-click or page reload
- IP Allowlist/Blocklist with CIDR support for IPv4 and IPv6
- IPHub proxy/VPN detection (optional): silently block or flag OTP requests from known proxies
- Registration OTP gate: verify phone via OTP before account creation
- Trusted Devices: trust a device for 30 days after 2FA, with profile revoke controls
- Phone blocking list: silently drop OTP requests from blocked numbers (anti-enumeration)
- Attempt lockout after configurable max failures
- Google reCAPTCHA v3 and Cloudflare Turnstile support
- All credentials stored server-side, never output to HTML
- Nonces on every form and AJAX action
- Anti-enumeration: password reset never reveals whether an account exists
External Services
This plugin connects to the following external services:
1. kwtSMS API (required): sends SMS messages.
A kwtSMS account with SMS credits is required.
2. ipapi.co (optional): detects the visitor’s country to pre-select the dial-code flag on the phone input.
If ipapi.co is unavailable, the phone input falls back to the default country configured in General Settings. No personal data is stored by the plugin as a result of this call.
3. IPHub (optional): detects whether a visitor’s IP is a known proxy or VPN.
- Service: https://iphub.info
- API endpoint:
https://v2.api.iphub.info/ip/{ip}
- Data sent: visitor IP address, API key in request header
- When: on every OTP request when IPHub integration is enabled in General Settings, with result cached per IP (configurable TTL, default 24 hours)
- Terms of Service: https://iphub.info/legal
- Privacy Policy: https://iphub.info/legal
If IPHub is unavailable or returns an error, the request is allowed through (fail-open). No personal data is stored by the plugin as a result of this call beyond the cached block level.
4. Google reCAPTCHA v3 (optional): bot protection on OTP forms. Only active if you enter a reCAPTCHA Site Key in General Settings.
5. Cloudflare Turnstile (optional): alternative bot protection. Only active if you enter a Turnstile Site Key in General Settings.
Admin
- Users Without Phone sub-page under the WordPress Users menu: lists all registered users missing a phone number, with a dynamic count badge on the menu item
Test Mode
Enable Test Mode in the Gateway settings to test without receiving real SMS messages. Messages are queued on the kwtSMS server but never delivered to the phone. Credits are still deducted. To recover them, log in to your kwtSMS account dashboard and delete the queued messages. The OTP code is visible under kwtSMS > Logs > Debug Log so you can complete flows during development.
Languages
Ships with English (default) and Arabic translations. The plugin admin UI and all user-facing strings are fully translatable.
Help & Support