Por qué autoalojar Mautic en lugar de pagar un SaaS de marketing
Un SaaS de marketing factura lo único que usted no controla: el tamaño de su lista. Mailchimp cobra por tramo de contactos — de 110 a 350 $ al mes para 10 000 contactos, de 385 a 815 $ para 50 000, de Essentials a Premium — y cada tramo limita ADEMÁS cuánto tiene derecho a enviar: 10 veces su número de contactos en Essentials, 12 veces en Standard, 15 veces en Premium. La lista crece, y tanto la factura como el techo se vuelven en su contra. Brevo y ActiveCampaign facturan sobre el mismo eje. (El precio mostrado en euros es solo una conversión: la referencia contractual de Mailchimp es el dólar.)
Mautic elimina ese eje. Usted paga el servidor y nada más: la cuenta es la misma tanto si la base guarda 5 000 contactos como 500 000. El tramo de VPS de entrada de ServOrbit (2 vCPU, 4 GB de RAM, 50 GB de SSD, desde 99 DH/mes) mueve una pila Mautic sin apuros. Sus datos permanecen en su infraestructura — ningún proveedor SaaS los analiza para sus propios fines.
La plataforma se publica bajo licencia GPL-3.0 y se describe como propiedad al 100 % de su comunidad: no hay ninguna empresa detrás del software. En concreto, el proyecto es independiente desde que Acquia se retiró, su anfitrión fiscal es la Open Source Collective — que ostenta la marca MAUTIC y los dominios en nombre del proyecto — y su conducción recae en un Mautic Council electo, designado a su vez por una asamblea general. Tampoco hay una edición gratuita recortada que sortear: Mautic no es la versión mutilada de un producto de pago. Existe un Mautic Cloud gestionado, pero aloja exactamente el mismo software que usted puede ejecutar por su cuenta.
Lo que obtiene con Mautic autoalojado
- Constructor visual de campañas — ramificaciones condicionales, retardos temporales y disparadores de eventos, sobre un lienzo donde el recorrido se lee de un vistazo.
- Lead scoring — asignación de puntos por aperturas, clics, visitas a páginas y envíos de formularios, con umbrales que disparan una acción.
- Segmentación dinámica — filtros sobre cualquier atributo de contacto, reevaluados en cada pasada de las tareas programadas.
- Páginas de destino y formularios — alojados en su dominio, sin dependencias externas ni scripts de terceros cargados en sus visitantes.
- REST API completa — integración con sus aplicaciones, su CRM y sus herramientas mediante webhooks, en ambos sentidos.
- Licencia GPL-3.0 — sin límite de contactos, sin cargos por correo enviado y sin cláusula de retención propietaria sobre sus datos.
Arquitectura Docker de Mautic 5: cuatro contenedores, una sola imagen
Mautic 5.x adopta una arquitectura multirrol: la misma imagen Docker (mautic/mautic:5.2.3-apache) se instancia tres veces, y cada instancia corre bajo un valor distinto de DOCKER_MAUTIC_ROLE:
- mautic_web: la fachada Apache — sirve el asistente de instalación y después el panel de control
- mautic_cron: ejecuta los comandos programados (reconstrucción de segmentos, disparo de campañas, envío de la cola, limpieza, estadísticas)
- mautic_worker: consume la cola de mensajes asíncronos (tracking, webhooks, notificaciones)
Un cuarto contenedor, MySQL 8.0, almacena los contactos, las campañas y los eventos. Los tres contenedores Mautic comparten un mismo volumen (mautic_data:/var/www/html) para que la configuración escrita por el asistente sea visible de inmediato para los roles cron y worker.
El rol cron es el que se subestima. Mautic no envía nada desde la petición web: una campaña publicada solo sale porque mautic:campaigns:trigger y mautic:emails:send se ejecutan a intervalos regulares. Detenga ese contenedor y la interfaz seguirá mostrando la campaña como publicada mientras nada abandona el servidor — una avería que se parece a un problema de entregabilidad sin serlo.
PHP también vive dentro de la imagen: Mautic 5.2 funciona sobre PHP 8.1 a 8.3, y la versión de PHP instalada en el host no interviene. En cuanto a la base de datos, los requisitos publicados por el proyecto son MySQL 5.7 o MariaDB 10.2 como mínimo; la plantilla de ServOrbit entrega MySQL 8.0, lo que tiene una consecuencia directa sobre los informes (última sección).
Instalar Mautic en su VPS ServOrbit
Desplegar desde el Marketplace
En su área de cliente ServOrbit, abra Marketplace → Automatización y flujos de trabajo → Mautic y haga clic en Desplegar. El playbook AWX aprovisiona Ubuntu 24.04, instala Docker, genera la contraseña de MySQL, arranca los cuatro contenedores y configura nginx como reverse proxy en su dominio. El contenedor Apache solo escucha en la interfaz de loopback: nunca queda expuesto directamente a Internet.
Completar el asistente de instalación de Mautic
Abra su dominio en el navegador. Mautic redirige al asistente
/s/setup. Indique la URL del sitio, compruebe la conexión a la base de datos (ya rellenada desde el entorno del compose), cree su cuenta de administrador y confirme. Acierte con la URL del sitio a la primera: los píxeles de tracking, las páginas de destino y los enlaces de baja se construyen todos a partir de ella.Configurar su relay SMTP
Vaya a Ajustes → Ajustes de correo y elija su proveedor SMTP: Amazon SES, Mailgun, Brevo (nivel gratuito de 300 correos al día) o Postmark. Dos cosas que conviene saber sobre SES antes de montar un presupuesto. Primero, su tarifa de referencia es de 0,10 $ por cada 1 000 correos — no «menos de» — y se factura POR DESTINATARIO, no por mensaje: un envío a 100 destinatarios cuenta como 100 correos, que es justamente el régimen de una campaña de Mautic. Segundo, esa tarifa es la de la modalidad a la carta: una cuenta SES nueva arranca en la modalidad Essentials, a 0,16 $ por cada 1 000, y le toca a usted cambiar a la carta. Los archivos adjuntos se facturan aparte, por gigabyte. Después haga clic en Probar el correo y confirme la recepción antes de tocar una campaña: un relay que falla en silencio se parece exactamente a una campaña que aún no ha arrancado.
Crear un segmento e importar sus contactos
En Segmentos → Nuevo segmento, defina sus criterios de filtrado. En Contactos → Importar, suba su CSV y asigne las columnas Email, Nombre y Apellidos a los campos de Mautic. Active el doble opt-in si su audiencia reside en la UE o en Marruecos.
Construir y publicar su primera campaña
En Campañas → Nueva campaña, arrastre una fuente (su segmento) al lienzo, añada una acción Enviar un correo, defina un retardo de 24 horas y después un correo de seguimiento condicional. Publique y deje que los contenedores cron y worker vacíen la cola de envío en segundo plano.
SPF, DKIM y DMARC no son opcionales antes de su primer envío. Sin ellos, sus campañas acaban en spam en Gmail y Outlook — un problema que el relay SMTP por sí solo no resuelve, porque depende de lo que declare su DOMINIO y no de la calidad del servidor de envío. Nuestra guía [SPF/DKIM/DMARC](/blog/spf-dkim-dmarc-delivrabilite-emails-pro) detalla la configuración DNS paso a paso.
Caso de uso: sustituir Mailchimp en una pyme
Una agencia de marketing que gestionaba listas para 15 clientes — 80 000 contactos en total — pagaba 620 €/mes a Mailchimp. El paso a Mautic autoalojado en un VPS de 4 GB de RAM sustituyó esa factura por el coste de un único servidor de gama de entrada, es decir, más de 7 000 € retirados del presupuesto anual.
La migración llevó dos días: exportación CSV desde Mailchimp, importación en Mautic y reconstrucción de las automatizaciones en el constructor de campañas. Las plantillas de correo HTML se importaron desde Mailchimp sin modificaciones. La entregabilidad se mantuvo comparable porque se conservó Mailgun como relay SMTP — la reputación de envío sigue al relay, no a la plataforma que se pone delante.
Lo que una exportación CSV no transporta, en cambio, es el historial de interacción. Las aperturas, los clics y las visitas a páginas se quedan en Mailchimp: cada contacto importado llega a Mautic con una puntuación de cero, y cualquier segmento basado en un comportamiento pasado hay que volver a ganarlo desde la primera campaña. Planifique ese primer envío como una oleada de reactivación, no como la reanudación idéntica de lo que funcionaba antes.
Compatibilidad con MySQL 8: HTTP 500 en los informes y el modo ONLY_FULL_GROUP_BY
Algunos informes de Mautic devuelven un HTTP 500 en cuanto se abren — normalmente un informe «Page hits» que agrupa (Group by) y añade una columna COUNT. El síntoma es discreto: página de informe en blanco, nada en el log de aplicación de Mautic, ningún mensaje de error explícito en la interfaz.
Diagnóstico. El modo SQL ONLY_FULL_GROUP_BY rechaza las consultas SELECT cuyas columnas no agregadas no figuran en la cláusula GROUP BY — la regla de dependencia funcional del estándar SQL, que el constructor de informes de Mautic no siempre cumple. MySQL responde con el error 1055, Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mautic.ph.id'. Consulte el servidor con:
SHOW GLOBAL VARIABLES LIKE 'sql_mode';Este modo está activo por defecto desde MySQL 5.7.5, y no desde MySQL 8.0. Estar en 5.7 no le deja fuera de alcance, y la plantilla Mautic de ServOrbit incorpora MySQL 8.0: un despliegue desde el Marketplace está afectado por defecto. MariaDB, en cambio, deja este modo fuera de su sql_mode por defecto.
Aguas arriba, el fallo se registró como mautic/mautic#17092 (reportado sobre Mautic 7.1.3 contra MySQL 8.4) y se corrigió mediante la pull request #17099, integrada en la rama 7.x para el hito 7.2.0. La línea 5.2.x que ejecuta esta plantilla no lleva esa corrección — su última versión es la 5.2.11 — así que el rodeo que sigue continúa siendo necesario en esta pila.
Rodeo A — relajar el modo, pero escribirlo donde sobreviva. Aplicada en caliente, la orden siguiente solo afecta a las conexiones abiertas DESPUÉS, no a la sesión que la ejecuta:
SET GLOBAL sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));y se pierde en cuanto el contenedor db se reinicia, algo que restart: unless-stopped convierte en rutina. Editar /etc/mysql/my.cnf tampoco ayuda: en la imagen mysql:8.0 ni siquiera es el fichero que lee el servidor (es /etc/my.cnf, que incluye /etc/mysql/conf.d/), y sobre todo todos esos ficheros viven DENTRO del contenedor mientras que solo /var/lib/mysql es un volumen con nombre — la modificación desaparece en la siguiente recreación. Dos formas sí persisten: SET PERSIST sql_mode = …, que MySQL escribe en mysqld-auto.cnf del data directory, es decir en el volumen mautic_db; o una línea command: --sql-mode=… en el servicio db del fichero compose, la única que sobrevive a un redespliegue completo de la pila.
Rodeo B — pasar a MariaDB. MariaDB no activa ONLY_FULL_GROUP_BY por defecto, y Mautic 5 admite MariaDB 10.2 en adelante. No es una elección que se haga en el momento del despliegue: la plantilla Mautic es MySQL 8.0, cambiar de motor es una modificación de esta pila, y supone volcar y recargar la base de datos.