Envía correos con WebBlocks Campaigns
Convierte la suscripción de un visitante en un proceso de correo controlado y revisable. WebBlocks Campaigns guarda contactos, listas, registros de consentimiento, plantillas reutilizables y destinatarios de campañas en tu CMS. El bloque nativo Newsletter Sign-up recoge solicitudes; la confirmación incorpora al suscriptor a la audiencia. El registro de envío explica a qué destinatarios se envió el mensaje y para cuáles falló o se omitió.
El ejemplo es Northstar Studio y su boletín Studio notes. Importarás a Ada y Casey, añadirás a Robin mediante un bloque público, prepararás un mensaje personalizado, elegirás una lista, pondrás una campaña en cola y consultarás los resultados. Casey se dará de baja después de entrar en cola, para mostrar cómo la comprobación al enviar impide ese mensaje. Una audiencia de prueba independiente demuestra un fallo temporal y su reintento.
Esta guía se comprobó con el archivo publicado de Campaigns 0.7.4 en WebBlocks CMS 1.105.37, interfaz inglesa, tema claro y datos ficticios. Todas las pruebas usan un receptor SMTP local desechable. Acepta o rechaza deliberadamente los mensajes sin entregarlos al exterior. Sent en estas capturas significa aceptado por ese receptor local, no entregado a un buzón real. No se probaron la entrega ni la programación en producción. Las capturas están en inglés; conservamos las etiquetas de la interfaz en inglés para facilitar su identificación.
Consulta la referencia de Campaigns para la arquitectura e integración y el Sistema de plugins para los fundamentos de instalación.
Antes de empezar
Utiliza un sitio de prueba y una cuenta con acceso al sitio correcto. La instalación requiere Super admin. Campaigns separa los permisos de consulta, gestión, envío y ajustes. Poder editar una campaña no implica poder enviarla ni enviar una prueba de plantilla. Revisa Roles y permisos antes de delegar estas tareas.
El manifiesto 0.7.4 exige CMS ^1.92.0 y PHP >=8.3; el catálogo indica compatibilidad con PHP ^8.3 y Laravel ^13.0. Comprueba el resultado para tu instalación real, incluidos los requisitos del propio CMS. Utiliza el archivo publicado del catálogo de plugins WebBlocks.
Pide al administrador del alojamiento que configure un transporte de correo funcional y los procesos de envío. Los ajustes de remitente del plugin no configuran SMTP. Las direcciones ficticias example.test son datos de ejemplo; usa buzones de prueba bajo tu control para comprobar la entrega real. Guarda las credenciales del proveedor en la configuración privada de la aplicación anfitriona.
Campaigns está pensado para campañas de correo. No añade a estas pantallas un diseñador visual, un calendario automático ni estadísticas de aperturas o clics. Contact Messages, los envíos de Forms y los contactos de Campaigns cumplen funciones distintas. Enviar un formulario no equivale automáticamente a autorizar un boletín.
1. Instala y activa Campaigns
- Abre System → Plugins como Super admin.
- Selecciona Browse Plugin Catalog y busca WebBlocks Campaigns.
- Lee la versión, el resultado de compatibilidad y las notas de publicación.
- Elige Install from Catalog y después Enable Plugin en los detalles.
- Si el administrador proporciona el ZIP publicado y de confianza, utiliza Plugin ZIP → Upload Plugin ZIP, revisa el paquete y actívalo.
Las instalaciones nuevas empiezan desactivadas. La instalación y activación actuales del CMS preparan los cambios de base de datos. Si aparece una advertencia de configuración o migraciones, resuélvela desde los detalles del plugin y el procedimiento admitido por el alojamiento antes de introducir contactos. Instalar correctamente no demuestra que funcionen el transporte ni los procesos programados.
Tras activarlo, localiza Campaigns, Contacts, Templates, Lists, Suppressed, Delivery problems y Settings en la navegación. Confirma el sitio seleccionado en cada pantalla. Contactos, ajustes y campañas pertenecen a un sitio; una lista de otro sitio no es tu audiencia actual.
Abre Templates → Add template y comprueba que aparecen el editor y los campos de combinación. Campaigns 0.7.4 corrige el error de compilación de la pantalla de plantillas presente en 0.7.3. Tras actualizar una instalación anterior, prueba tanto crear una plantilla como volver a abrir una guardada.
2. Configura el remitente y los límites de envío
Abre Campaigns Settings para tu sitio. El ejemplo local utiliza:
| Ajuste | Ejemplo | Finalidad |
|---|---|---|
| From name | Northstar Studio | Nombre que ven los destinatarios. |
| From email | hello@example.test | Remitente ficticio de la prueba local. |
| Reply-to | studio@example.test | Dirección de respuesta ficticia. |
| Batch size | 1 | Procesar un destinatario pendiente por lote para facilitar la revisión. |
| Most per hour | 5 | Lee la explicación del límite por ejecución antes de confiar en esta etiqueta. |
| Soft-bounce threshold | 5 | Los fallos temporales repetidos pueden bloquear una dirección al alcanzar el umbral configurado. |
Revisa los valores y pulsa Save. Esta versión admite lotes de 1–500, límites de 1–20000 y umbrales de rebotes temporales de 0–50. Un umbral cero desactiva el bloqueo automático por rebotes temporales repetidos; no convierte una dirección con fallo permanente en entregable.
La ayuda de Most per hour describe un máximo para una campaña en una ejecución. El contador se reinicia para cada campaña y cada invocación. No es una cuota horaria móvil compartida por todo el sitio o proveedor. También se comprueba antes de procesar un lote completo, por lo que un lote mayor que la capacidad restante puede superarla. Mantén el tamaño del lote dentro del límite, decide la frecuencia de ejecución y utiliza la limitación del proveedor o alojamiento cuando necesites garantizar una tasa real.
Pide al administrador que verifique el remitente con el proveedor y pruebe la entrega real, incluidas las respuestas. Un receptor local, un mailer de registro o unos ajustes guardados no acreditan que un proveedor externo autorice tu dominio para enviar.
3. Crea una lista para el boletín
Abre Lists, crea Studio notes y añade una descripción útil, como «Noticias y talleres de Northstar Studio». La lista separa este boletín de otros contactos. Las capturas también incluyen Delivery test only, una audiencia mantenida aparte para el ejercicio de reintento.
Una lista agrupa contactos; no concede permiso para escribirles. La campaña sigue comprobando consentimiento y bloqueos. Eliminar la lista quita la agrupación, pero no borra sus contactos ni registra una retirada del consentimiento. Utiliza las funciones de consentimiento y bloqueo para esas decisiones.
Elige una lista concreta cuando el mensaje se dirija a una audiencia específica. Everyone on this site abarca una audiencia mayor y debe ser una elección consciente, no una opción predeterminada que pase inadvertida.
4. Prepara y sube un CSV
Abre Contacts → Import. Se aceptan CSV de hasta 20 MB, separados por comas o punto y coma y con marca de orden de bytes UTF-8 opcional. Incluye una fila de encabezados. El archivo del ejercicio es:
email;first_name;last_name;interest
ada@example.test;Ada;North;Design
casey@example.test;;River;Writing
ada@example.test;Ada;North;Design
not-an-address;Taylor;Example;Workshops
La fila duplicada de Ada y la dirección no válida son intencionadas. Conserva un original limpio de tu archivo real para investigar filas rechazadas sin importar repetidamente el mismo documento.
Selecciona el archivo y la consent basis adecuada, registra el texto exacto aplicable cuando esas personas dieron su consentimiento y elige Studio notes como lista de destino. El texto ficticio significa: «Sí, quiero recibir por correo las noticias y talleres de Northstar Studio. Puedo darme de baja cuando quiera». Pulsa Continue.
Estos campos registran tu declaración sobre el permiso del contacto; elegir una base no prueba que exista. Utiliza la base y las pruebas que realmente correspondan. En esta versión, importar contactos solo con base contractual no activa el indicador independiente de consentimiento operativo.
5. Revisa la asignación de columnas antes de importar
En la pantalla de asignación, comprueba expresamente cada columna:
| Encabezado CSV | Asignación |
|---|---|
| Email address | |
| first_name | First name |
| last_name | Last name |
| interest | Campo personalizado llamado interest |
Revisa las sugerencias automáticas. En especial, comprueba la columna del nombre en lugar de suponer que first_name se ha reconocido bien. Asigna una sola columna de dirección a Email e ignora las que no necesites. La vista previa enseña filas de ejemplo; llegar a ella todavía no crea contactos.
Pulsa Import únicamente cuando asignación, base, texto y lista sean correctos. El ejemplo crea dos contactos y omite dos filas. El contacto previo del ejercicio de reintento también aparece en el entorno de muestra, por lo que el total no coincide con lo importado desde este archivo.
La interfaz actual ofrece resultados agregados. No incluye aquí un visor del historial de problemas por fila. Si el total no cuadra, busca direcciones duplicadas, no válidas o bloqueadas en el CSV original antes de preparar otro archivo.
Volver a importar no restablece los datos. Un nombre no vacío puede actualizar el existente; un valor vacío no lo borra, y los campos personalizados se combinan con el contacto. Una importación no elimina un consentimiento concedido o retirado ni quita un bloqueo. No utilices importaciones repetidas para eludir una retirada.
6. Añade un bloque Newsletter Sign-up
Crea o edita un borrador de página y añade el bloque nativo Newsletter Sign-up. Para el ejemplo, configura:
| Ajuste del bloque | Ejemplo |
|---|---|
| Heading | Join Studio notes |
| Intro text | Subscribe, then confirm through the email link. |
| What the visitor agrees to | El mismo texto explícito del boletín utilizado arriba. |
| Add confirmed subscribers to | Studio notes |
| Button label | Subscribe |
| Also ask for a name | Activado |
Guarda el bloque y sigue el proceso de revisión y publicación de la página. La página pública de registro debe ser accesible antes de emplearla para captar suscriptores reales. Si no seleccionas lista, los contactos confirmados se guardan sin esa asignación; elige Studio notes de forma expresa.
En esta versión, el título personalizado, la introducción y el texto de consentimiento del bloque son ajustes compartidos entre los idiomas de la página. Traducir el título de la página no los traduce automáticamente. Comprueba el idioma y el texto que ve el visitante en cada ubicación antes de usar el bloque en un sitio multilingüe.
7. Prueba ambos pasos como visitante
Abre la página pública con una dirección de prueba controlada. El visitante ficticio es Robin Example, robin@example.test. Introduce nombre y correo, lee el texto de consentimiento, marca su casilla y elige Subscribe.
La página muestra Almost done. La solicitud sigue pendiente y Robin aún no es un contacto confirmado. La respuesta genérica tampoco revela si una dirección ya está suscrita o bloqueada. No prueba que el correo de confirmación haya llegado al buzón.
Abre el enlace de confirmación desde tu propio buzón de prueba. Abrirlo solo muestra la página; la suscripción no queda confirmada hasta elegir Yes, confirm my subscription.
Tras pulsarlo, el visitante ve el resultado correcto. Campaigns crea o actualiza el contacto, registra el consentimiento explícito y añade al suscriptor confirmado a la lista elegida.
Una nueva solicitud genera otro token de confirmación que caduca a los siete días; el enlace anterior deja de funcionar al sustituirse. Solicita un mensaje nuevo cuando corresponda en lugar de compartir una URL privada. Una petición normal no anula bloqueos manuales o por queja. La confirmación puede levantar los bloqueos permitidos por baja o rebote permanente; no es un desbloqueo universal.
Los datos de prueba recorrieron los endpoints reales de registro y confirmación usando correo local. Después se descartaron los cuerpos y enlaces privados. La recepción en un buzón real sigue necesitando una comprobación independiente en producción.
8. Escribe una plantilla reutilizable
Abre Templates → Add template, introduce los campos siguientes y pulsa Save. La plantilla guardada se abre en Edit template, donde puedes modificarla y revisar su vista previa.
El formulario incluye Name, Subject, HTML body y Plain-text body. Usa Studio notes email como nombre interno. En Subject introduce:
A studio note for {{ first_name | friend }}
Para HTML body, empieza con algo pequeño y legible:
<p>Hello {{ first_name | friend }},</p>
<p>Here is this month's Northstar Studio news.</p>
<p><a href="{{ unsubscribe_url }}">Unsubscribe from studio notes</a></p>
Escribe por separado la versión de texto sin formato:
Hello {{ first_name | friend }},
Here is this month's Northstar Studio news.
Unsubscribe: {{ unsubscribe_url }}
El texto sin formato no se convierte automáticamente desde HTML. Revisa ambas versiones. El HTML lo escribe el operador; utiliza marcado de confianza y prueba su apariencia en clientes de correo.
Los campos integrados incluyen email, first_name, last_name y unsubscribe_url. También pueden estar disponibles campos importados como interest. La lista se obtiene de una muestra de contactos recientes, de modo que un campo poco frecuente de un contacto antiguo podría no reconocerse. Revisa la lista real y su validación antes de poner la campaña en cola.
{{ first_name | friend }} utiliza «friend» cuando no hay nombre. Casey muestra por qué conviene un valor de reserva. Los campos desconocidos impiden el test y la puesta en cola; carecer de reserva genera una advertencia, pero no bloquea automáticamente el envío.
En correo comercial, conserva un enlace real de baja en HTML y su URL en texto sin formato. El validador busca el campo reservado en el conjunto del asunto y ambos cuerpos; no demuestra que todos los formatos incluyan un enlace utilizable. Revisa los dos por tu cuenta.
9. Revisa la vista previa y envía una prueba controlada
Después de guardar en el editor, revisa Preview, indica un destino test email bajo tu control y pulsa Send test. Estas acciones requieren permiso de envío. El asunto lleva el prefijo [TEST].
La vista previa inserta los valores y muestra HTML como código fuente. No simula visualmente un cliente de correo. Usa un contacto de muestra, normalmente el más antiguo del sitio. No supongas que es Ada ni que existe un selector visible. Comprueba valores presentes y ausentes con datos controlados.
unsubscribe_url está vacío en vistas previas y pruebas de plantilla. La URL específica del destinatario se introduce al enviar una campaña real. Por tanto, un test de plantilla correcto no verifica el proceso de baja de la campaña. Haz esa comprobación con una campaña pequeña y aprobada.
En el ejercicio creamos y guardamos la plantilla desde el editor, la reabrimos y guardamos un cambio de asunto. La vista previa sin nombre mostró «friend» como correspondía. El test llegó al receptor SMTP local. Esto verifica el proceso de la aplicación, no la entrega a un buzón externo. Antes de producción, comprueba un buzón real controlado, ambos cuerpos, reservas del asunto, respuestas y enlace real de baja.
La advertencia de falta de reserva puede mencionar unsubscribe_url. Mantén el campo reservado en el enlace real: su valor específico se genera al enviar la campaña. Sustituirlo por texto genérico para ocultar la advertencia eliminaría el destino de baja funcional.
Resuelve primero cualquier transporte inexistente o inutilizable. Los mailers log, array y null no acreditan entrega externa; el plugin rechaza el test si el mailer no sirve. No uses una audiencia real para diagnosticar la configuración básica de SMTP.
10. Crea la campaña y elige su audiencia
Abre Campaigns → Add campaign. Escribe November studio notes, elige Studio notes email, selecciona Studio notes y el canal Commercial. Guarda el borrador.
Una campaña comercial requiere consentimiento de marketing concedido con una base válida, como consentimiento explícito o relación de cliente existente. Excluye las direcciones bloqueadas. El canal independiente Operational exige consentimiento operativo; cambiar de canal no permite saltarse un bloqueo. La supresión de dirección se aplica a ambos canales de Campaigns.
El contador de contactos aptos para marketing no garantiza que todos reciban esta campaña. La lista, la base válida y los bloqueos pueden modificar la audiencia real. Revisa el total de destinatarios y el registro de la campaña.
Los borradores y campañas pausadas se pueden editar; las que están en cola o enviándose no son libremente editables. La plantilla y los valores de contacto se leen al despachar, no se congelan completos al entrar en cola. Mantén plantilla y audiencia estables durante el proceso. No borres una plantilla que una campaña aún necesita.
11. Pon en cola, revisa y pausa
Cuando el borrador esté listo, pulsa Queue for sending. Se crean filas para las direcciones elegibles. La puesta en cola por sí sola no entrega mensajes. En el ejemplo entran Ada, Casey y Robin, ya confirmado.
Utiliza Pause para detener el procesamiento posterior mientras revisas. En la prueba local ejecutamos el dispatcher con la campaña pausada y los destinatarios permanecieron pendientes.
Queue for sending reanuda una campaña pausada. Si la audiencia no cambia, no duplica filas. Sin embargo, puede incorporar nuevos contactos elegibles; no elimina los anteriores ni reconstruye la audiencia desde cero. Cambiar de lista tras una pausa no equivale a retirar las direcciones ya en cola.
Revisa los destinatarios pendientes y los cambios de audiencia antes de reanudar. Si necesitas otra audiencia sustancialmente distinta, prepara una campaña revisada por separado en vez de asumir que pausar y editar restablece la anterior.
12. Ejecuta el dispatcher en el alojamiento
El administrador ejecuta el comando desde la aplicación anfitriona del CMS:
php artisan webblocks-campaigns:dispatch
Para una ejecución controlada de una campaña, sustituye 123 por su identificador real:
php artisan webblocks-campaigns:dispatch --campaign=123 --batches=1
El valor predeterminado es un lote. Esta versión no tiene opción --dry-run. Dispatch puede enviar correo; úsalo solo con la campaña prevista y un transporte verificado. Con nuestro lote de uno, la audiencia necesita varias invocaciones.
Programa las ejecuciones con el scheduler o cron admitido por tu alojamiento. Ejecutar el scheduler de Laravel no registra automáticamente el comando de Campaigns: hace falta una tarea explícita. El envío de campañas en sí no necesita un queue worker independiente. Considera frecuencia, lotes y límites del proveedor junto con el comportamiento por ejecución de Most per hour.
La prueba invocó manualmente el comando contra el receptor local aislado. No comprobó programación de producción, cuota del proveedor ni entrega externa.
13. Verifica la baja antes del siguiente envío
Una campaña comercial real proporciona un enlace individual de baja. Al abrirlo aparece una página de confirmación. Un GET por sí solo no retira el consentimiento, evitando que una inspección normal de enlaces cause una baja silenciosa.
Elegir Unsubscribe me completa la acción y muestra el resultado. Casey lo hizo después de entrar en cola y antes del envío.
Campaigns registra un bloqueo de la dirección específico del sitio y retira su consentimiento de marketing. Dispatch vuelve a comprobarlo, por lo que la fila de Casey pasa a Skipped en lugar de enviarse. Por eso una audiencia en cola no garantiza la entrega.
La baja pública crea un bloqueo que también afecta al canal Operational de Campaigns. Los demás mensajes del CMS pertenecen a flujos distintos; no prometas que una sola acción de Campaigns controla todos los correos del alojamiento.
14. Lee el registro de envío, no solo el estado
Abre el registro y revisa los totales, filas y motivos. La campaña terminada muestra 2 sent, 0 failed, 1 skipped: el SMTP local aceptó a Ada y Robin, mientras que Casey se omitió después de darse de baja.
| Estado del destinatario | Significado en el proceso |
|---|---|
| Pending | A la espera de procesamiento de envío. |
| Sent | El transporte configurado aceptó el mensaje; la entrega en buzón necesita pruebas aparte. |
| Failed | Falló el intento; revisa el motivo antes de reintentar. |
| Skipped | No se envió deliberadamente, por ejemplo por bloqueo o correo no configurado. |
La campaña puede llegar a Sent cuando todas las filas sean definitivas, incluidas Failed y Skipped. El porcentaje mide destinatarios procesados, no entregas correctas en buzón. Una campaña terminada con omisiones no significa éxito total.
Investiga con el filtro de estado y los motivos agrupados de Why not sent. Un mailer inutilizable puede dejar destinatarios omitidos y aun así terminar la campaña. Corregir el alojamiento no hace que el reintento exclusivo de fallidos reenvíe las filas omitidas. Si deben reconsiderarse esas direcciones, revisa conscientemente otra campaña.
15. Gestiona los bloqueos por separado de los contactos
Abre Suppressed para consultar el registro por dirección. Casey sigue apareciendo con el motivo Unsubscribed, independientemente de su ficha de contacto.
Usa los controles manuales cuando debas bloquear una dirección y anota el motivo adecuado. Liberar un bloqueo no restablece el consentimiento: un contacto con marketing retirado sigue así hasta una nueva autorización válida. Volver a importar su dirección no quita el bloqueo.
Retirar permiso de marketing también difiere de bloquear una dirección. Lo primero cambia el permiso comercial; lo segundo bloquea ambos canales de Campaigns. Al investigar una exclusión, revisa motivo, registro de consentimiento y canal previsto.
16. Investiga un fallo temporal y reintenta cuando esté resuelto
La lista separada Delivery test only tiene una dirección ficticia. El SMTP local rechazó deliberadamente el primer intento con una respuesta temporal de buzón lleno. El registro muestra una fila Failed y Try 1 failed again.
Lee el motivo y corrige la causa antes de elegir esa acción. El reintento devuelve los fallidos a pendientes, reutiliza sus filas y vuelve a comprobar consentimiento y bloqueo al enviar. No crea un duplicado para la misma dirección. Ejecuta Dispatch de nuevo después de solicitar el reintento.
El segundo intento local funcionó porque el receptor estaba preparado para aceptarlo. Demuestra el mecanismo de reintento, no la recuperación de una avería real del proveedor. Repetir sin cambios un error de autenticación o de política de remitente suele ser inútil.
Abre Delivery problems para consultar los errores guardados. El evento temporal permanece aunque el destinatario termine correctamente; es un dato histórico, no necesariamente un bloqueo vigente.
Los fallos permanentes de dirección pueden bloquearla inmediatamente. Los rebotes temporales repetidos pueden alcanzar el umbral del sitio. Los rechazos de política o remitente y los errores desconocidos no se consideran automáticamente direcciones inexistentes. Revisa clasificación y respuesta del proveedor en vez de bloquear toda una audiencia por un fallo de configuración del alojamiento.
17. Completa la comprobación antes de producción
Antes de usar contactos reales, repite todo el proceso con tus versiones compatibles. Confirma acceso al sitio correcto y permiso de envío independiente. Importa una audiencia pequeña y controlada, revisa consentimiento y pertenencia a la lista y completa la confirmación pública con un buzón real.
Crea y guarda la plantilla desde la interfaz funcional. Prueba reservas del asunto, HTML, texto sin formato, enlaces reales y respuestas. Verifica proveedor, autorización del remitente y recepción. Ejecuta una campaña pequeña aprobada, inspecciona cada estado y comprueba pausa, baja y un reintento elegido con cuidado. Por último, verifica la tarea de envío explícita y su tasa frente a los requisitos del proveedor.
Mantén el texto de consentimiento adecuado cuando cambie el boletín. Revisa los bloqueos sin devolver permisos silenciosamente. La lista organiza, la campaña es un trabajo de envío y el registro de destinatarios documenta lo que realmente hizo.
Solución de problemas
| Síntoma | Qué comprobar |
|---|---|
| Falla crear o editar una plantilla en Campaigns 0.7.3 | Actualiza a 0.7.4 o una versión compatible posterior; pide limpiar vistas compiladas antiguas si hace falta y prueba plantillas nuevas y guardadas. |
| El plugin indica configuración incompleta | Resuelve las migraciones en sus detalles y confirma que está activado. |
| Se crean menos contactos que filas CSV | Comprueba duplicados, direcciones no válidas y bloqueadas, asignación y resultado agregado. |
| Falta un nombre | Asigna expresamente la columna del nombre y usa un valor de reserva en la plantilla. |
| Aparece Almost done pero no el contacto | Falta la confirmación; revisa el transporte y usa el enlace más reciente no caducado. |
| Falta un contacto en la campaña | Comprueba sitio, lista, estado y base de consentimiento, indicador operativo cuando proceda y bloqueos. |
| La campaña sigue en cola | Verifica programación explícita, ejecución del comando y estado de pausa. |
| La campaña dice Sent pero no llegan mensajes | Lee estados y motivos; distingue aceptación por transporte de entrega real al buzón. |
| El enlace de baja está vacío en el test | La vista previa y el test no tienen URL individual; compruébala con una campaña controlada. |
| Liberar el bloqueo no permite correo comercial | Revisa el consentimiento retirado; liberar por sí solo no lo concede. |
| No hay botón de reintento en una fila omitida | Solo se reintentan fallidos; investiga la omisión y revisa por separado otra campaña. |
| El envío supera el valor horario aparente | El límite es por campaña y ejecución y se comprueba por lote; revisa tamaño, frecuencia y limitación del proveedor. |
Consulta también Crea formularios personalizados con WebBlocks Forms, Roles y permisos y la referencia de Campaigns.