Plugin de formulario de contacto WordPress: nada se pierde
Un formulario de contacto WordPress que guarda cada mensaje en la base de datos antes de intentar el email: si el email se pierde, el mensaje sigue ahí. Gratis, sin CAPTCHA.
Un visitante rellena tu formulario de contacto, pulsa Enviar, lee «Gracias, tu mensaje se ha enviado correctamente»… y tú no lo recibes nunca. El email acabó en spam, o directamente no salió. Para él, no le has contestado; para ti, ese mensaje nunca existió. Es un escenario frecuente, y tiene una causa precisa: el mensaje se confió a un email y a nada más. El módulo Forms de Blaminhor Essentials sigue el camino inverso: primero escribe, después envía.
Lo esencial
- Contact Form 7 no guarda nada por defecto: el mensaje sale por email y, si el email falla, se pierde. Hay que añadirle Flamingo (su compañero oficial) o un plugin de base de datos.
- WPForms Lite envía por email; consultar las entradas dentro de WordPress está reservado a la versión de pago: es lo que responde el propio AI Overview de Google, el 8 de septiembre de 2026, a quien busca el mejor formulario gratuito.
- En el módulo Forms, el guardado en base de datos es una casilla marcada por defecto (Keep each submission in the database, «conservar cada envío en la base de datos»), y se ejecuta antes de cualquier intento de email.
- Antispam sin CAPTCHA: campo trampa invisible, token firmado con marca de tiempo, límite de envíos por dirección IP con hash. reCAPTCHA y Cloudflare Turnstile siguen disponibles, como opción.
- RGPD: la dirección IP nunca se guarda salvo petición explícita (y entonces con hash), tiempo de conservación ajustable por formulario con purga diaria, casilla de consentimiento nunca premarcada.
¿Adónde van los mensajes enviados con Contact Form 7?
Por defecto, los mensajes enviados con Contact Form 7 no van a ningún sitio más que a un email: el plugin entrega el contenido a la función de envío de WordPress y luego lo olvida. No conserva ninguna copia en la base de datos. Si el email cae en spam o nunca llega a salir, el mensaje se pierde definitivamente.
Ese comportamiento es deliberado. Contact Form 7 es gratuito, sin versión de pago ni upsell, y su autor ha mantenido el plugin mínimo a propósito: un formulario, un email. Para la conservación escribió un segundo plugin gratuito, Flamingo, que intercepta cada envío y lo almacena en WordPress como contenido personalizado (un «custom post type», es decir, un tipo de contenido como las entradas o las páginas, pero reservado a los mensajes). Plugins de terceros como CFDB7 o Form Vibes hacen lo mismo. Mientras ninguno de ellos esté instalado, cada mensaje cuelga de un solo hilo: el email.
El punto ciego es que nada te avisa: la ausencia de mensajes se parece exactamente a la ausencia de visitantes. El problema se descubre semanas después, cuando alguien te escribe por otro canal: «te contacté dos veces a través de tu web».
¿Por qué se pierde tan a menudo el email de un formulario?
El email de un formulario se pierde porque WordPress lo envía, por defecto, con la función mail() de PHP: un envío sin autenticar, desde un servidor compartido con cientos de sitios, sin las firmas que Gmail y Outlook exigen hoy. Resultado: carpeta de spam, o rechazo silencioso.
Tres causas se repiten en la práctica totalidad de los casos:
- El alojamiento bloquea o limita
mail(): algunos hostings compartidos la desactivan, otros limitan los envíos por hora. El formulario, mientras tanto, muestra «enviado» pase lo que pase. - El dominio no está autenticado: sin SPF, DKIM y DMARC —las tres firmas que detalla la guía de entregabilidad de email en WordPress—, los grandes proveedores de correo clasifican el email como sospechoso.
- El propio formulario suplanta al remitente: enviar «de parte de» la dirección del visitante, desde tu servidor, activa exactamente las protecciones antisuplantación de los proveedores de correo.
La solución del lado del email es conocida: pasar por un servidor SMTP de verdad —el protocolo de envío autenticado que usa tu propio correo— con un relé que firme tus emails. Pero no basta por sí sola. Un SMTP bien configurado reduce las pérdidas; no las anula: una cuota superada, un relé caído durante una hora, una regla de filtrado demasiado celosa, y el mensaje vuelve a desaparecer. La única garantía es una copia que no dependa del email.
¿Cómo conserva cada mensaje el módulo Forms de Blaminhor Essentials?
El módulo Forms de Blaminhor Essentials guarda el envío en una tabla dedicada de tu base de datos y después intenta el email de notificación, el autorespondedor y el webhook, en ese orden. El guardado está activado por defecto (casilla Keep each submission in the database) y cada mensaje aparece en una pantalla de entradas, con estado no leído, leído o spam.
Escribí este módulo partiendo de esa grieta: en el código, la escritura en base de datos precede a la llamada a la notificación, y el email pasa después por la función estándar de WordPress; por tanto, por el módulo SMTP del mismo plugin si está activo. En concreto, cuando un visitante envía el formulario:
- Se verifica el token de seguridad (el «nonce», que demuestra que el envío viene realmente de tu sitio) y después se validan los campos en el servidor.
- Se ejecuta el control antispam; un envío sospechoso se conserva con el estado Spam pero no manda ningún email.
- La entrada se escribe en la base de datos, con la fecha, el estado No leído y los valores de cada campo.
- El email de notificación sale hacia la dirección que elijas, con la dirección del visitante como Responder a: contestas con un clic.
- El autorespondedor (si está activado) confirma la recepción al visitante; el webhook (si está configurado) transmite la entrada a tus herramientas: un envío automático a una dirección web de tu elección, para Zapier, Make o n8n.
Si el paso 4 falla, el módulo lo anota en su registro. Y el paso 3 ya ha ocurrido.

La pantalla Entries de cada formulario muestra el recuento de mensajes no leídos, permite filtrar por estado, marcar como leído o spam y exportar el conjunto a CSV (un archivo de hoja de cálculo que se abre en Excel o Numbers). Con WP-CLI, la herramienta de línea de comandos de WordPress, wp blaminhor forms resend-notification <id> reenvía el email de un mensaje almacenado, normalmente después de reparar un SMTP averiado.
¿Qué se ve realmente cuando se corta el email?
Haz la prueba en un sitio de pruebas: configura a propósito un SMTP con una contraseña falsa, envía un mensaje por el formulario y abre la pantalla de entradas. El mensaje está ahí, con estado No leído, aunque no haya salido ningún email; el registro del plugin anota simplemente el fallo de la notificación.
El experimento cabe en cinco minutos:
- Activa el módulo Forms y crea un formulario a partir de la plantilla Contact.
- En el módulo SMTP Mailer, introduce una contraseña errónea: el envío fallará seguro.
- Rellena el formulario con calma (el control antispam espera al menos dos segundos) y envíalo.
- Aparece la confirmación; tu bandeja sigue vacía; la pantalla Entries marca 1 no leído.
- Corrige la contraseña y relanza el email con el comando de reenvío: esta vez, llega.

Cada fila se despliega en el sitio para mostrar los valores enviados, campo por campo, consentimiento incluido; no hay que abrir ninguna página intermedia.
Repite los pasos 2 a 4 con Contact Form 7 sin Flamingo: misma confirmación, misma bandeja vacía y ninguna pantalla donde mirar. Con Contact Form 7 solo, ese mensaje ya no existe en ningún sitio; con el módulo Forms, espera en la pantalla de entradas.
¿Qué pasa cuando el email falla, según el plugin?
| Plugin (versión gratuita) | ¿El mensaje se guarda en WordPress? | Si el email falla… | Para guardar hace falta… |
|---|---|---|---|
| Contact Form 7 | No | El mensaje se pierde | Flamingo (oficial, gratuito) o un plugin de base de datos de terceros |
| WPForms Lite | No (entradas reservadas a la versión de pago) | El mensaje se pierde | Pasar a WPForms Pro |
| Ninja Forms, Formidable Forms, Fluent Forms | Sí | El mensaje sigue consultable | Nada: incluido |
| Módulo Forms de Blaminhor Essentials | Sí, antes incluso de intentar el email | El mensaje está en la base de datos, estado No leído, fallo registrado, reenvío posible con WP-CLI | Nada: marcado por defecto |
Las filas de Contact Form 7 y WPForms Lite recogen lo que responden los buscadores con asistente de IA el 8 de septiembre de 2026: el AI Overview de Google precisa, sobre WPForms Lite, que guardar las entradas «directamente en tu escritorio de WordPress requiere una actualización de pago o un complemento»; Brave resume Contact Form 7 de la misma manera. Son dos productos honestos que han tomado dos decisiones de arquitectura distintas: uno minimalista, el otro freemium.
¿Hace falta un CAPTCHA para proteger del spam un formulario de contacto?
No: el módulo Forms protege cada formulario con tres controles invisibles —un campo trampa que solo rellenan los robots («honeypot»), un token firmado con marca de tiempo que rechaza cualquier envío realizado en menos de dos segundos y un límite de diez envíos por hora por dirección IP con hash (convertida en una huella irreversible)—. Ninguna cuadrícula de imágenes, ninguna casilla «no soy un robot».
Es el mismo enfoque que el módulo Anti-Spam del plugin, integrado directamente en el formulario: el módulo Anti-Spam puede desactivarse y el formulario sigue protegido. El campo trampa está oculto tanto para los lectores de pantalla como para la vista, para que un usuario ciego no tropiece con él; un defecto que otros plugins antispam han tenido que corregir a posteriori.
El retardo mínimo es de dos segundos por defecto y se ajusta formulario por formulario, y el contador de envíos solo guarda una huella con hash en un valor temporal de WordPress (un «transient») que caduca por sí solo. Si tu sitio sufre spam humano, pagado por tarea, añade un campo reCAPTCHA (v2 o v3) o Cloudflare Turnstile: se coloca como cualquier otro campo, las claves se introducen una sola vez en los ajustes del módulo y la verificación siempre se hace en el servidor. Una segunda capa visible, nunca una obligación.
¿Cómo cumplir el RGPD con mensajes guardados en la base de datos?
Guardar los mensajes crea un tratamiento de datos personales, y el módulo Forms lo trata como tal: dirección IP nunca registrada por defecto (y solo con hash si la activas), tiempo de conservación ajustable por formulario con purga automática diaria, casilla de consentimiento nunca premarcada, exportación y borrado a un clic.

El ajuste Delete entries after («borrar las entradas después de») acepta un número de días; a cero, las entradas se conservan indefinidamente; si no, una tarea programada pasa cada día y borra, formulario por formulario, las entradas más antiguas que la ventana elegida: treinta días para un formulario de contacto, indefinidamente para un formulario de pedido, sin que uno borre los datos del otro.
Hay una confusión que conviene aclarar de paso, porque afecta a dos ajustes que se parecen. Del lado del formulario no hay nada que activar: el guardado de los envíos viene marcado de fábrica. El ajuste apagado a propósito por defecto está en otro sitio, en el módulo SMTP: Store email content («guardar el contenido del email») conserva el cuerpo completo de cada email registrado, para releerlo y reenviarlo desde el escritorio. Permanece apagado porque el cuerpo de un email contiene a menudo datos personales de terceros: activarlo es aceptar convertirse en responsable de ellos, es decir, informar a las personas afectadas y atender las solicitudes de supresión. El registro de entrega basta por sí solo para diagnosticar un envío que falla, y el reenvío de una notificación de formulario no depende de ese ajuste: reconstruye el email a partir de la entrada guardada.
El campo Consent es un tipo de campo con entidad propia, guardado como sí/no e imposible de premarcar: una casilla ya marcada no vale como consentimiento según el RGPD. Las plantillas Contact, Newsletter y Quote request lo incluyen de serie. Para los rastreadores, ese es el papel del banner de cookies RGPD del mismo plugin.
¿Qué sabe hacer el constructor más allá de un simple formulario de contacto?
El constructor ofrece veinticuatro tipos de campo —entre ellos firma manuscrita, valoración con estrellas, elección de imagen, repetidor, archivo y campo de cálculo—, lógica condicional evaluada en el servidor y en el navegador, formularios multipaso o conversacionales, un autorespondedor, un webhook JSON, un bloque de Gutenberg y un shortcode.

Tres decisiones que se notan al usarlo, y una reserva:
- Lógica condicional sin agujero de validación: una regla por campo (mostrar si tal otro campo vale tal valor), evaluada en el navegador y de nuevo en el servidor; un campo oculto no se valida ni se guarda.
- Campo de cálculo sin
eval(): la fórmula (cuatro operaciones, paréntesis) pasa por un evaluador propio; una expresión inesperada falla, no se ejecuta. - Multipaso y modo conversacional: un campo Page break (salto de página) divide el formulario en pasos con barra de progreso; el modo conversacional muestra un campo cada vez. Sin JavaScript, todo se muestra en bloque y el envío funciona.
- Pago con Stripe: el formulario puede exigir un pago a través de Stripe Checkout, la página de pago alojada por Stripe; la entrada solo se crea cuando el pago se confirma en el servidor. Verifica todo el recorrido en modo de prueba antes de ponerlo en producción.
¿Qué límites conviene conocer antes de elegir?
Tres, a tener en cuenta antes de instalar: no existe importador desde Contact Form 7 ni WPForms, el reenvío de una notificación se hace por línea de comandos y no desde un botón del escritorio, y la lógica condicional se limita a una regla por campo.
Sobre la importación, las plantillas devuelven un formulario de contacto clásico en un minuto; tus mensajes antiguos, en cambio, se quedan en Flamingo o en WPForms. La lógica condicional acepta una sola regla por campo: suficiente para la inmensa mayoría de formularios, no para un cuestionario con ramificaciones. Si alguno de estos puntos te bloquea, Fluent Forms o Formidable Forms también guardan las entradas gratis y llevan más tiempo en el mercado.
Lo que queda de tus mensajes cuando el email falla
Un formulario de contacto sirve para que un mensaje llegue hasta ti; el email no es más que el vehículo, práctico y falible. Al escribir cada envío en la base de datos antes de intentar mandarlo, el módulo Forms separa las dos cosas: la entrega puede fallar sin arrastrar consigo la conservación.
El módulo Forms forma parte de Blaminhor Essentials, el plugin modular gratuito que construyo para sustituir la pila de plugins de una sola función. Actívalo, mantén el SMTP al lado y haz la prueba de la contraseña falsa.
– blaminhor
FAQ
¿Cómo recupero un mensaje de Contact Form 7 que nunca llegó?
Sin un plugin de almacenamiento instalado antes del envío, ya no existe en ningún sitio: Contact Form 7 no conserva ninguna copia, entrega el mensaje a la función de envío de email de WordPress y lo olvida. Instala Flamingo, su compañero oficial, o un módulo que escriba en la base de datos, y revisa tus envíos SMTP: proteges los próximos mensajes, no los que ya se perdieron.
¿WPForms Lite guarda las entradas gratis?
No. WPForms Lite envía los mensajes por email; consultar las entradas en el escritorio de WordPress forma parte de la versión de pago. Es una decisión freemium asumida y anunciada con claridad. Ninja Forms, Formidable Forms, Fluent Forms y el módulo Forms de Blaminhor Essentials sí guardan las entradas en la base de datos sin pagar.
¿Puedo importar mis formularios de Contact Form 7 o WPForms a Blaminhor Essentials?
No en un clic: el módulo Forms no tiene importador para esos plugins. Cuatro plantillas listas para usar (contacto, newsletter, encuesta, solicitud de presupuesto) permiten recrear un formulario de contacto clásico en un minuto, con la casilla de consentimiento ya en su sitio. Los mensajes antiguos se quedan en su plugin de origen.
¿El formulario funciona con JavaScript desactivado?
Sí. El envío es un formulario HTML clásico procesado en el servidor; JavaScript solo añade comodidad (visualización condicional en directo, pasos ocultos, cálculos instantáneos). Sin él, todos los pasos se muestran a la vez, el botón de envío sigue ahí y los errores aparecen bajo cada campo tras recargar la página.
¿Puedo exportar los mensajes recibidos?
Sí, de dos maneras: con un botón Export CSV en la pantalla de entradas de cada formulario, que genera un archivo de hoja de cálculo con la fecha, el estado y una columna por campo; y desde la línea de comandos con WP-CLI (wp blaminhor forms export), práctico para una exportación automatizada o una migración a otra herramienta.
¿Los mensajes se envían a un servidor de terceros?
No. Las entradas se escriben en una tabla dedicada de tu propia base de datos WordPress, en tu alojamiento; nada pasa por un servicio externo. Las únicas conexiones salientes posibles son las que configuras de forma explícita: un webhook hacia una herramienta de automatización, un CAPTCHA de terceros o el pago con Stripe.
¿Un formulario ralentiza el resto del sitio?
No: la hoja de estilos y el script del módulo solo se cargan en las páginas que contienen realmente un formulario, a través del bloque o del shortcode. Una página sin formulario no carga ningún archivo del módulo. Y como todo Blaminhor Essentials, un módulo desactivado no carga ni una línea de PHP.
¿Puedo enviar los mensajes a Zapier, Make o n8n?
Sí, con el webhook del formulario: cada envío aceptado se manda en JSON a la URL que elijas, sin ralentizar al visitante. Si el envío falla, se programa un único reintento cinco minutos después; las direcciones de red privada se rechazan para que un formulario público no sirva de sonda contra tu propio servidor.
Comentarios