CheckoutOTP añade una capa de verificación por correo electrónico antes de que el cliente llegue al checkout de WooCommerce. El comprador introduce su email, recibe un código de 6 dígitos y lo confirma. Solo entonces puede completar la compra.
Con esto consigues:
Bloquear pedidos falsos, spam y bots que usan correos inventados.
Garantizar que el email de facturación es real y pertenece a quien compra.
Reducir devoluciones, contracargos (chargebacks) y fraude.
Obtener una base de correos limpia para tus campañas de marketing.
Idea clave
La verificación es previa al checkout: el plugin redirige al cliente a una página de verificación y, al confirmar el código, lo devuelve al checkout con su email fijado y bloqueado.
2. Requisitos
Componente
Mínimo
Probado en
WordPress
7.1
7.1.2
WooCommerce
11.2
11.2.1
PHP
8.3
8.3
WooCommerce debe estar activo. Sin él, el plugin muestra un aviso y no se activa su lógica.
Un servidor capaz de enviar correos (idealmente con un plugin SMTP configurado; ver Solución de problemas).
3. Instalación
Descarga el paquete checkoutotp.zip.
En WordPress ve a Plugins → Añadir nuevo → Subir plugin.
Selecciona el archivo .zip, pulsa Instalar ahora y luego Activar.
Al activarse, el plugin crea sus tablas y ajustes por defecto automáticamente.
Recomendación
Tras activar, entra a WooCommerce → CheckoutOTP para revisar los ajustes antes de abrir la tienda al público.
4. Configuración inicial
La verificación ocurre en una página de tu sitio que contiene un shortcode. Solo necesitas una página para esto.
Paso 1 — Crear la página de verificación
Ve a Páginas → Añadir nueva.
Ponle un título, por ejemplo Order Verification o Verificación de pedido.
En el contenido, añade este shortcode:
[checkoutotp_form]
Publica la página.
Nota
El plugin detecta automáticamente la página que contiene el shortcode y redirige ahí a los clientes sin verificar. No necesitas configurar ninguna URL.
Usa una sola página de verificación
Si existen dos o más páginas publicadas con el shortcode [checkoutotp_form], el plugin redirige siempre a la más reciente (la última publicada o actualizada). Las demás seguirán mostrando el formulario si se visitan directamente, pero nunca serán el destino de la redirección. Para evitar confusiones (por ejemplo, editar una página que no es la que se usa), mantén una única página activa con el shortcode y deja las demás en borrador o en la papelera.
Paso 2 — Ajustar los valores básicos
En WooCommerce → CheckoutOTP → Settings revisa, como mínimo:
OTP Expiry Time: minutos de validez del código (por defecto 15).
Admin Notification Recipients: correos que recibirán las alertas de seguridad.
Notify When User is Blocked y Notify on Multiple Failed Attempts: actívalos si quieres recibir avisos.
Paso 3 — Probar
En una ventana de incógnito, añade un producto al carrito y ve al checkout.
Deberías ser redirigido a la página de verificación.
Introduce tu email, recibe el código y confírmalo.
Al verificarte, volverás al checkout con el email bloqueado y podrás completar la compra.
5. Cómo funciona
El recorrido del cliente
El cliente agrega productos al carrito e intenta entrar al checkout.
El plugin lo redirige a la página de verificación ([checkoutotp_form]).
Introduce su email y pulsa enviar → recibe un código de 6 dígitos por correo.
Introduce el código. Si es correcto, queda verificado.
Vuelve al checkout: su email aparece fijado y en solo lectura.
Completa la compra.
Cuándo se recuerda la verificación
Situación
Comportamiento
Primer checkout tras instalar el plugin (administradores, clientes existentes, cuentas recién registradas)
Todos se verifican una vez, sin excepciones. No hay bypass automático por estar logueado ni por tener una cuenta antigua.
Cliente con cuenta, ya verificado una vez
Queda verificado de forma permanente (meta de usuario). En sus siguientes compras no se le vuelve a pedir el código.
Cliente invitado
Se guarda una cookie firmada (7 días, o 30 si marca «recordarme»). Al volver dentro de ese plazo, sigue verificado.
Importante
La insignia Verification en «Mis pedidos» (solo para clientes con cuenta) indica si, al crear ese pedido, el comprador estaba verificado. Un cliente ya verificado tendrá todos sus pedidos marcados como «Verified» sin que se le pida el código cada vez.
Modo de emergencia
Si el envío de correos falla, el Modo de emergencia desactiva temporalmente la verificación para no perder ventas. Úsalo solo como solución puntual y desactívalo cuanto antes.
6. El panel de CheckoutOTP
Todo se gestiona desde WooCommerce → CheckoutOTP. El panel tiene estas pestañas:
Pestaña
Para qué sirve
⚙️ Settings
Todas las opciones de configuración (ver sección 7).
Últimos 50 eventos de seguridad (envíos, verificaciones, fallos, bloqueos).
🚫 Blocked Emails
Correos bloqueados temporalmente, con botón para desbloquearlos manualmente.
7. Opciones de configuración
General OTP Settings
Opción
Por defecto
Qué hace
OTP Expiry Time
15 min
Minutos de validez del código (1–60).
Maximum Failed Attempts
5
Fallos permitidos por código antes de invalidarlo (3–20).
Email Block Threshold
10
Fallos acumulados por correo (entre códigos) antes de bloquearlo (3–50).
Email Block Duration
60 min
Cuánto tiempo queda bloqueado un correo (5–1440 min).
🚨 Emergency Mode
No
Desactiva la verificación temporalmente (emergencias).
🌐 Site Behind Proxy/CDN
No
Actívalo si tu sitio está detrás de Cloudflare o un proxy/CDN, para detectar la IP real del visitante.
Express Checkout Protection
Oculta los botones de pago exprés (PayPal, Google Pay, Apple Pay, Stripe…) a los clientes que aún no están verificados, para que no puedan saltarse la verificación.
Opción
Por defecto
Qué hace
🔒 Strict Mode
No
Oculta botones de pago exprés mediante patrones CSS genéricos (más agresivo).
Custom CSS Selectors
—
Selectores CSS adicionales de tu tema/plugins (uno por línea) para ocultar botones concretos.
Ten en cuenta
El ocultamiento visual es una barrera de mejor esfuerzo (se puede burlar manipulando el HTML). La protección real contra el cobro sin verificación en PayPal se aplica en el servidor de tu WordPress: el plugin intercepta la petición de pago exprés antes de que se envíe a PayPal, de modo que no se realiza ningún cobro. No interviene el servidor de PayPal.
Security Notifications
Opción
Por defecto
Qué hace
Admin Notification Recipients
—
Correos que reciben las alertas (puedes añadir varios).
Notify When User is Blocked
No
Avisa cuando un correo queda bloqueado por fallos repetidos.
Notify on Multiple Failed Attempts
No
Avisa cuando hay varios intentos fallidos.
REST API Security
Opción
Por defecto
Qué hace
Maximum Orders Per Hour
5
Límite de pedidos por hora por IP/email (1–50).
Block Bot User-Agents
No
Bloquea peticiones de bots conocidos por su User-Agent.
Notify on API Abuse
No
Avisa ante abuso de la API REST.
Notify on Suspicious Orders
No
Avisa cuando un pedido se marca como sospechoso.
Configurable Block Lists
Opción
Qué hace
Custom Disposable Email Domains
Dominios de correo temporal adicionales que quieres rechazar (uno por línea). Se suman a la lista integrada de 32 dominios; no la reemplazan.
Custom Suspicious User-Agents
Firmas de bots adicionales (una por línea).
Custom Suspicious Names
Nombres sospechosos (p. ej. «test», «asdf») que activan la detección.
Enable Regex Patterns
Trata las listas anteriores como expresiones regulares (avanzado).
Lista de dominios desechables incluida
El plugin ya rechaza, sin configurar nada, estos 32 dominios de correo temporal:
tempmail.com, guerrillamail.com, 10minutemail.com, throwaway.email, mailinator.com, maildrop.cc, temp-mail.org, fakeinbox.com, trashmail.com, yopmail.com, getnada.com, mailnesia.com, sharklasers.com, guerrillamail.info, grr.la, guerrillamail.biz, spam4.me, mailcatch.com, emailondeck.com, mohmal.com, mintemail.com, mytrashmail.com, tempr.email, disposablemail.com, throwawaymail.com, spamgourmet.com, mailexpire.com, tempinbox.com, dispostable.com, getairmail.com, mailnator.com y tempail.com.
El campo Custom Disposable Email Domains añade dominios a esta lista, nunca la sustituye.
Data Maintenance
Opción
Por defecto
Qué hace
Auto Purge Logs
Sí
Elimina automáticamente los registros antiguos.
Log Retention Period
30 días
Cuántos días se conservan los registros (7–365).
Al desinstalar
Si eliminas el plugin desde WordPress (no solo lo desactivas), borra por completo sus datos: ajustes, tablas, metadatos de usuario, cookies de sesión y tareas programadas. No deja rastro en la base de datos.
Design & Colors
Personaliza el aspecto del formulario de verificación:
Header Background ColorHeader Text ColorButton Background ColorButton Text Color
8. Correos y personalización
El código OTP se envía como un correo de WooCommerce, por lo que aparece en WooCommerce → Ajustes → Correos con el nombre CheckoutOTP. Desde ahí puedes cambiar el asunto, el encabezado y el pie, e incluso desactivarlo.
Plantillas de correo
El plugin incluye dos plantillas:
templates/emails/checkoutotp-otp.php — versión HTML.
templates/emails/plain/checkoutotp-otp.php — versión texto plano.
Cómo personalizar sin perder cambios al actualizar
Copia la plantilla a la carpeta de tu tema, respetando la ruta de WooCommerce:
tu-tema/woocommerce/emails/checkoutotp-otp.php
(para la versión de texto plano, tu-tema/woocommerce/emails/plain/checkoutotp-otp.php). WordPress usará tu copia en lugar de la del plugin.
9. Compatibilidad
Checkout clásico
Compatible con el checkout por shortcode de WooCommerce.
WooCommerce Blocks
Compatible con el checkout por bloques (Store API), incluido el bloqueo del campo de email.
HPOS
Compatible con el almacenamiento de pedidos de alto rendimiento.
Pagos exprés
Protección de PayPal Express y otros botones exprés.
Seguridad
El código OTP se almacena como un hash SHA-256 (nunca en texto plano) y se compara de forma segura; las cookies de verificación están firmadas y son HttpOnly/SameSite=Strict. El email verificado nunca se imprime en el HTML de páginas cacheadas.
Idiomas
El plugin incluye traducciones al español, portugués (Brasil) y francés, además de la plantilla .pot para que puedas traducirlo a cualquier otro idioma. El idioma base (código fuente) es el inglés.
10. Solución de problemas
No llegan los correos con el código
El envío depende de wp_mail() de WordPress. Si tu servidor no está bien configurado, instala un plugin SMTP (WP Mail SMTP, Post SMTP, etc.) y pruébalo.
Revisa la carpeta de spam del destinatario.
Comprueba que la plantilla de email CheckoutOTP esté activa en WooCommerce → Ajustes → Correos.
Como último recurso, activa el Modo de emergencia para no bloquear ventas mientras resuelves el correo.
La IP que se registra no es la del cliente (sitio tras Cloudflare)
Activa la opción 🌐 Site Behind Proxy/CDN. Solo si tu sitio está realmente detrás de Cloudflare o un proxy/CDN.
El cliente sigue viendo el checkout sin verificar (caché)
El plugin envía cabeceras «no-cache», pero algunos plugins de caché las ignoran.
Excluye de tu caché las páginas de checkout y de verificación.
No se ocultan los botones de pago exprés
Activa el Strict Mode.
Si aun así aparecen, añade su selector CSS en Custom CSS Selectors.
Un cliente legítimo quedó bloqueado
Ve a la pestaña 🚫 Blocked Emails y pulsa Unblock en su fila. Los bloqueos también caducan solos según la duración configurada.
La columna «Verification» muestra «Not verified»
Significa que ese pedido se creó sin una verificación registrada (por ejemplo, un pedido manual del administrador, o creado antes de instalar el plugin). Es el comportamiento correcto.
11. Preguntas frecuentes
¿Funciona con el checkout por bloques?
Sí. La verificación, el bloqueo del email y la validación en el servidor funcionan tanto en checkout clásico como en bloques.
¿Puedo usar un cliente invitado (sin cuenta)?
Sí. Los invitados se verifican igual mediante una cookie firmada.
¿Se le pide el código al cliente en cada compra?
No. Todos (administradores, clientes existentes, cuentas recién registradas) se verifican una sola vez en su próximo checkout. Después se les recuerda (cuenta: de forma permanente; invitado: cookie de 7 o 30 días). Para forzar una nueva verificación, en un invitado basta con que espere a que caduque la cookie; en una cuenta, se necesitaría eliminar la marca de verificación del usuario (ajuste avanzado).
¿Puedo cambiar la página de verificación?
Sí, cualquiera que contenga el shortcode [checkoutotp_form]. El plugin la detecta solo.
¿Qué pasa si tengo dos o más páginas con el shortcode?
El plugin redirige siempre a la más reciente. Las demás siguen mostrando el formulario si se visitan directamente, pero no son el destino de la redirección. Recomendación: usa una sola página activa con el shortcode y deja las demás en borrador o papelera.
¿Qué pasa si un atacante prueba muchos códigos?
Cada código admite un número limitado de intentos. Además, el plugin cuenta los fallos por correo y bloquea la dirección temporalmente al superar el umbral configurado.
¿El plugin ralentiza la tienda?
No. Solo actúa en las páginas de checkout y verificación, y no añade consultas pesadas en el resto del sitio.
12. Registro de cambios
1.3.0
El CSS que oculta Express Checkout ahora solo se carga en checkout, carrito, producto y página de verificación.
Nuevo ajuste: máximo de envíos OTP por hora (límite configurable de solicitudes de código).
Los patrones regex personalizados se validan al guardar con un aviso claro; los inválidos se descartan.
Eliminados métodos y tabla heredados sin uso (los OTP usan transients).
Los errores del checkout por bloques ahora devuelven un 403 propio en vez de un 500 genérico.
Los bloqueos de seguridad (discrepancia de email, express) también aparecen en la pestaña Historial.
El Modo de emergencia registra activación y desactivación al cambiar de estado.
1.2.2
Traducciones incluidas: español, portugués (Brasil) y francés, más la plantilla .pot para añadir más idiomas.
1.2.1
Eliminado código heredado sin uso (una clase de correo antigua y un verificador antiguo).
Documentación actualizada al estado real.
1.2.0
Bloqueo temporal de correos por fallos repetidos, con umbral y duración configurables.
Pestaña «Blocked Emails» con desbloqueo manual.
Avisos al administrador con el correo completo.
Columna «Verification» con estado real por pedido (Verified / Not verified).
Bloqueo del campo de email también en checkout por bloques.
1.1.0
Correcciones de seguridad (IP real, cookies endurecidas, protección PayPal, caché sin PII).
1.0.0
Versión inicial: verificación OTP pre-checkout, bloqueo de bots, logs y notificaciones.
13. Privacidad y datos
CheckoutOTP guarda sus datos en tu propia base de datos de WordPress, así que tú tienes el control. Esto es lo que gestiona:
Dirección de correo que el cliente introduce para recibir el código, y los correos bloqueados temporalmente tras fallos repetidos (pestaña Blocked Emails).
Dirección IP, usada para los límites de frecuencia y las comprobaciones de seguridad.
Código OTP, guardado solo como hash SHA-256 y válido únicamente durante el tiempo de caducidad configurado (15 minutos por defecto).
Estado de verificación: en clientes registrados se guarda en sus metadatos de usuario; en invitados, en una cookie firmada (7 días, o 30 si marcan «recordarme»).
Registro de seguridad (pestaña Historial): eventos como envíos, verificaciones, fallos y bloqueos, que pueden incluir el correo y la IP implicados.
Sin terceros
CheckoutOTP no envía datos a terceros ni a servicios externos. El correo con el código se envía a través del sistema de correo de tu propio sitio (WordPress o el servicio SMTP que hayas configurado).
Conservación y eliminación
Con Auto Purge Logs activado, los registros antiguos se eliminan automáticamente tras el periodo de retención (30 días por defecto, configurable de 7 a 365).
Los correos bloqueados se liberan solos al terminar la duración de bloqueo configurada, o manualmente desde la pestaña Blocked Emails.
Si eliminas el plugin desde WordPress (no solo lo desactivas), se borran todos sus datos: ajustes, tablas, metadatos de usuario, cookies de sesión y tareas programadas.
Recomendación
Indica en la política de privacidad de tu tienda que verificas el correo del cliente con un código de un solo uso y que se utiliza una cookie de verificación. Si esa cookie requiere consentimiento depende de tu país, así que consúltalo con tu asesor legal.
14. Soporte
Si tienes dudas o incidencias, abre un ticket en nuestro centro de soporte indicando la versión del plugin, la versión de WordPress/WooCommerce y una descripción del problema.