Documentación y Enciclopedia del Sistema
Guía técnica completa, directorio de elementos de interfaz y manual de optimización para hosting compartido de MarbleSend.
Arquitectura del sistema y base de alojamiento
Filosofía: Autoalojado, single-tenant, zero-build y compatible con hosting compartido
MarbleSend está diseñado desde cero para solucionar un problema común en el software de email marketing: la necesidad de costosos servidores VPS dedicados, servidores Redis, pipelines de compilación en Node o una compleja orquestación con Docker. MarbleSend funciona en hosting compartido estándar (cPanel, Hostinger, DirectAdmin, Plesk, LiteSpeed) utilizando PHP 8.2+ puro sin compilación en el servidor.
Cero inyecciones SQL
Cada consulta a la base de datos utiliza prepared statements estrictos sin sobrecarga de ORM.
Cifrado en reposo
Credenciales SMTP, claves API de IA y secrets de webhook cifrados en Crypto.php.
Sin envíos duplicados
El worker reclama lotes de la cola de forma atómica mediante actualizaciones de estado en MySQL con control estricto de plazos.
Despliegue instantáneo
Tailwind CSS precompilado y Alpine.js incorporado. Suba el zip, ejecute el instalador y listo.
0.1 Filosofía de hosting y runtime Zero-Build
La mayoría de las aplicaciones web modernas exigen pipelines de compilación Node.js, servidores daemon Redis, orquestación Docker o acceso root VPS. MarbleSend rechaza esta complejidad. Diseñado específicamente para hosting compartido accesible (cPanel, Hostinger, Plesk, LiteSpeed), se ejecuta en PHP 8.2+ puro con cero compilación en el servidor.
Cero compilación en servidor
Sin necesidad de npm, Webpack, Vite ni Composer en el servidor de producción. Tailwind CSS está precompilado en activos estáticos, Alpine.js está empaquetado localmente y PHPMailer 6.9.x se incluye directamente en vendor-lite.
Bajo consumo de memoria
El uso máximo de memoria se mantiene por debajo de 32MB incluso al procesar lotes de la cola de email. Funciona con fluidez dentro de los límites estrictos de memoria de hosting compartido (asignaciones de 64MB-128MB en php.ini).
Sin funciones prohibidas
Evita estrictamente funciones peligrosas comúnmente deshabilitadas por proveedores de hosting compartido (exec, shell_exec, system, passthru, eval, proc_close). Todas las operaciones externas usan cURL nativo con timeouts.
0.2 Perímetro de seguridad y aislamiento de directorios
MarbleSend implementa un diseño de directorio estricto de dos niveles que separa los activos web públicos del código de aplicación y storage confidenciales, eliminando riesgos de directory traversal y exposición de files.
Document Root aislado (public/)
Solo el directorio public/ queda expuesto al servidor web. Apunte el DocumentRoot de su dominio o subdominio a /public. Incluso si el listado de directorios está habilitado en Apache/Nginx, los files fuente principales no pueden explorarse.
Núcleo de aplicación protegido (app/)
Controladores, servicios, bibliotecas, vistas y configuración residen fuera de document root en app/. Las credenciales de base de datos en app/config/config.php y las claves de cifrado son inalcanzables mediante solicitudes HTTP directas.
Storage y migraciones seguras
El directorio storage/ (con logs de worker) y migrations/ (con files SQL de schema puros) residen completamente fuera de public/, impidiendo descargas no autorizadas de logs del sistema o estructuras de base de datos.
0.3 Base de datos Zero-ORM y Prepared Statements PDO
Los Object-Relational Mappers (ORM) como Eloquent o Doctrine introducen una sobrecarga masiva de memoria, capas complejas de hidratación y patrones de consulta N+1 impredecibles. MarbleSend utiliza directamente PDO nativo de PHP con 100% de prepared statements.
100% Prepared Statements
Cada consulta a la base de datos vincula parámetros explícitamente (PDO::PARAM_STR, PDO::PARAM_INT). Las estructuras de consulta SQL y los datos de usuario nunca se mezclan, brindando inmunidad matemática contra ataques de SQL Injection.
Consultas predecibles de alto rendimiento
La ejecución directa de SQL elimina la sobrecarga de hidratación de objetos ORM, ejecutando operaciones de lista y actualizaciones por lotes de cola hasta 5 veces más rápido con un consumo mínimo de CPU en servidores compartidos.
Migraciones de schema idempotentes
Las versiones de base de datos se rastrean mediante files SQL numerados (0001_initial.sql hasta 0019_add_feedback_attachment.sql) ejecutados por un ejecutor idempotente con cláusulas IF NOT EXISTS y registrados en cm_migrations.
Aislamiento de datos Single-Tenant
Diseñado como software standalone single-tenant sin columnas tenant_id. Los índices se mantienen compactos, se evitan escaneos secuenciales y el riesgo de fuga de datos entre inquilinos es cero.
0.4 Cifrado en reposo y estándares criptográficos
Los secretos confidenciales nunca se almacenan en texto plano. MarbleSend cifra credenciales utilizando criptografía simétrica autenticada estándar de la industria mediante App\Lib\Crypto.
Cifrado AES-256-GCM
Utiliza Advanced Encryption Standard en Galois/Counter Mode (AES-256-GCM), proporcionando tanto confidencialidad como verificación de integridad criptográfica para detectar cualquier manipulación.
IV aleatorio único de 96 bits
Cada valor cifrado genera un vector de inicialización (IV) aleatorio y seguro de 12 bytes (96 bits) mediante random_bytes(), garantizando que textos idénticos produzcan ciphertexts completamente distintos.
Catálogo de secretos cifrados
Protege automáticamente contraseñas de relay SMTP, API keys de IA BYOK (OpenAI, Claude, Gemini, DeepSeek, Kimi, OpenRouter), secrets de firma de webhook y Purchase Code de Envato.
Aislamiento de Master Key
La ENCRYPTION_KEY de 32 bytes se genera durante la instalación y se almacena exclusivamente en app/config/config.php (chmod 0600). La base de datos nunca contiene la clave de cifrado.
0.5 Dual-Worker Engine y seguridad de concurrencia
MarbleSend delega todas las tareas intensivas y programadas a un worker en segundo plano unificado, garantizando que el dashboard de administración se mantenga rápido y receptivo en todo momento.
Ejecutor principal único en segundo plano
worker.php coordina el envío de lotes de cola, ejecución de programaciones periódicas, sondeo de posts RSS, activación de secuencias de autorespondedor y reenvío de campañas no abiertas.
Flexibilidad CLI Cron y Web-Cron
Ejecución mediante crontab nativo del sistema (* * * * * php /path/to/worker.php) o mediante ping HTTP externo seguro a /cron.php?key=YOUR_KEY. Ambos caminos ejecutan una lógica de servicio subyacente idéntica.
Reclamo atómico de cola (sin envíos dobles)
Las instancias de worker reclaman lotes de cola mediante actualizaciones atómicas de estado SQL (UPDATE cm_email_queue SET status = 'processing' WHERE status = 'pending' LIMIT N). Incluso ejecuciones simultáneas nunca envían emails duplicados.
Heartbeat y recuperación de tareas bloqueadas
Rastrea el heartbeat de ejecución en cm_settings. Si un proceso worker se interrumpe durante el envío (ej. timeout del host), las ejecuciones posteriores detectan y recuperan automáticamente los elementos estancados.
0.6 Requisitos del servidor y matriz de compatibilidad de hosting
MarbleSend está verificado y es compatible con todos los entornos de hosting compartido estándar, paneles de control y configuraciones de servidor que cumplan con los requisitos base de PHP 8.2+.
| Componente | Requisito Mínimo | Recomendado | Notas Operativas |
|---|---|---|---|
| Runtime PHP | PHP 8.2.0+ | PHP 8.2 o 8.3 | strict_types=1 declarado en todos los files de la aplicación. |
| Motor de base de datos | MySQL 8.0+ / MariaDB 10.6+ | MariaDB 10.11+ o MySQL 8.0+ | Motor InnoDB obligatorio. Charset UTF8MB4 full Unicode. |
| Extensiones obligatorias | pdo_mysql, openssl, mbstring, json, curl, simplexml, sodium | Todas las extensiones estándar del núcleo activadas | Estándar en el 99% de hosting compartido. Opcional: intl para formateo regional. |
| Servidor Web | Apache, Nginx, LiteSpeed, Caddy | Apache + mod_rewrite o LiteSpeed | Files .htaccess preconfigurados incluidos en la raíz y en public/. |
| Asignación de memoria | 32MB memory_limit | 64MB - 128MB | Los fragmentos de cola se procesan en lotes conservadores para evitar agotamiento de memoria. |
| Programador Cron | CLI crontab O ping HTTP Web-Cron | CLI cron cada 1 minuto | Endpoint de respaldo Web-Cron (/cron.php?key=...) para hosts sin acceso a CLI. |
Paneles de control de hosting comprobados
Completamente probado y verificado en cPanel, Hostinger hPanel, Plesk, DirectAdmin, CyberPanel, AApanel, CloudPanel y entornos estándar Ubuntu/Debian LAMP/LEMP.
Descripción general del Dashboard (/dashboard)
Centro de control unificado para la salud de la audiencia, KPI de entrega, heartbeat del worker y automatización de horarios.
Anatomía de componentes del Dashboard e inspector de soporte
Pase el cursor o haga clic en cualquier elemento a continuación para ver detalles del backendTotal enviados
Agregación de logs y contador mensualAperturas / Tasa de apertura
Píxel de seguimiento 1x1 y nota sobre Apple MPPClics / CTR
Inyector de redirección de clicsAudiencia desuscrita
Tasa de bajas y cumplimiento RFCHeartbeat del worker
Estado del cron e intervalo de 1 minGráfico de crecimiento de volumen
Escala 7d, 30d, 90d, YTDTabla de emisiones recientes
Ciclo de estado y registro de auditoríaSalud de entregabilidad
Disponibilidad del perfil SMTP1.1 Tarjetas KPI de rendimiento de email
| Elemento | Cálculo y origen | Significado visual | Fundamento para prevención de soporte |
|---|---|---|---|
| Tarjeta de total enviados | COUNT(cm_email_logs) + SUM(cm_campaigns.sent_count) | Muestra el total histórico de emails de difusión y programados despachados. El subtexto muestra el volumen enviado en este mes calendario. | Evita confusiones cuando se depuran entradas de log antiguas; los contadores históricos de Campaign garantizan que los totales nunca disminuyan. |
| Total aperturas / Tasa de apertura | COUNT(DISTINCT contact_id WHERE opened_at IS NOT NULL) / Total Sent * 100 | Mide la interacción mediante un píxel de seguimiento transparente de 1x1 inyectado en el pie de página del email HTML. | Aviso sobre Apple MPP: Mail Privacy Protection de iOS precarga imágenes a través del proxy de Apple, lo que puede elevar artificialmente las aperturas. El CTR es la verdadera métrica de negocio. |
| Total clics / CTR | COUNT(DISTINCT contact_id WHERE clicked_at IS NOT NULL) / Total Sent * 100 | Mide los clics únicos de suscriptores en enlaces. Reescrito a través de /track/click.php. | Los enlaces para darse de baja y los enlaces de confirmación se excluyen del CTR de Campaign para preservar la integridad estadística. |
| Tarjeta de cancelaciones de suscripción | COUNT(status = 'unsubscribed') / Total Contacts * 100 | Tasa de destinatarios que se dan de baja mediante el mecanismo obligatorio de cancelación en un solo clic. | El umbral saludable es < 0,5%. Una tasa de bajas > 1% indica fatiga de la audiencia, listas compradas o baja relevancia. |
Total enviado y rendimiento mensual
Registra el total histórico de correos enviados con éxito mediante emisiones, programaciones recurrentes, fuentes RSS y respuestas automáticas. El subtexto resalta el volumen enviado en el mes en curso. Como MarbleSend combina los contadores de Campaigns con los registros activos, las cifras globales se mantienen intactas tras tareas de mantenimiento de la base de datos.
Aperturas únicas y dinámica Apple MPP
Registrado mediante un píxel de seguimiento transparente de 1x1 incrustado en el pie de página HTML del correo. Las aperturas se contabilizan de forma única por contacto y Campaign (primer toque). Nota crucial: Apple Mail Privacy Protection (MPP) descarga imágenes en caché mediante servidores proxy, inflando las aperturas. La tasa de clics (CTR) refleja la intención de conversión real.
Clics únicos y motor de reescritura de URL
Cada enlace estándar del cuerpo del mensaje se reescribe para enrutarse a través de /track/click.php, registrando ID de contacto, ID de Campaign, URL de destino y marca temporal. Los enlaces de desuscripción (/unsubscribe.php) y de confirmación (/confirm.php) están estrictamente exentos del seguimiento para proteger la privacidad.
Contactos desuscritos y protección del dominio
Registra bajas mediante el enlace del pie de página o el encabezado RFC 8058 List-Unsubscribe de un clic. Una lista saludable mantiene bajas por debajo del 0,5%. Si superan el 1,0%, MarbleSend advierte a los administradores para revisar la calidad de su lista y evitar penalizaciones de reputación por proveedores (Gmail, Yahoo, Outlook).
1.2 Operaciones y heartbeat de salud del worker
MarbleSend opera con un único ejecutor maestro en segundo plano: worker.php. El dashboard inspecciona cm_settings['worker_last_run'] para determinar si el cron se está ejecutando cada 60 segundos.
Estado activo (Cron saludable)
Cuando worker.php se ejecuta en los últimos 3 minutos, la insignia muestra Activo. Los lotes de la cola se procesan en tiempo real, los newsletters programados se disparan a tiempo y los autoresponders se envían puntualmente.
Estado inactivo (Cron no detectado)
Si no se registra ningún heartbeat durante más de 3 minutos, la insignia cambia a rojo. Al hacer clic en la tarjeta se accede inmediatamente a Settings → Sistema con el comando crontab CLI exacto y la URL de reserva Web-Cron.
Contactos activos frente a audiencia total
Muestra los contactos activos en relación con el total de suscriptores. MarbleSend impone una máquina de estados estricta de 4 fases: active, pending (esperando double opt-in), unsubscribed y suppressed (rebotados/quejas). Los workers salientes solo envían a destinatarios con WHERE status = 'active'.
Volumen de Campaigns mensual e histórico
Resume las emisiones enviadas en el mes calendario activo junto con el total histórico de Campaigns. Proporciona visibilidad instantánea sobre el ritmo y volumen de marketing por correo.
Resolución de la próxima programación prevista
Consulta las programaciones recurrentes activas (ordenadas por next_run_at ASC LIMIT 1) y muestra el próximo boletín y la cuenta regresiva. Todos los cálculos se realizan exclusivamente con SchedulerService::computeNextRun(), gestionando zonas horarias en UTC sin desfases por horario de verano (DST).
Heartbeat del worker y Cron en hosting compartido
El latido del sistema comprueba si worker.php se ejecutó en los últimos 180 segundos. En hosting compartido (cPanel, Hostinger), configure crontab como * * * * * php /ruta/a/worker.php >/dev/null 2>&1. Si no tiene acceso a CLI cron, use el endpoint Web-Cron seguro (/cron.php?key=YOUR_KEY) compatible con servicios externos como cron-job.org.
1.3 Visualizador de crecimiento de Campaign
El visualizador de crecimiento muestra la distribución de volumen en cuatro períodos seleccionables: 7 días, 30 días, 90 días y lo que va del año (YTD). Cada barra representa un bloque de tiempo agregado, mostrando el recuento de envíos y aperturas al pasar el cursor.
Permite alternar al instante entre ritmo semanal (7 días), ciclos mensuales (30 días), desempeño trimestral (90 días) y volumen anual acumulado (año a la fecha).
Calculado con CSS flexbox puro en función del volumen máximo de envío. Carga de manera instantánea en dispositivos móviles y alojamientos de recursos modestos.
Al posarse sobre una barra, se desglosa el intervalo temporal exacto, los mensajes enviados y las aperturas únicas para una comparación ágil.
Feed en vivo de emisiones y latido del sistema
El feed de la columna derecha muestra en tiempo real las emisiones recientes con insignias animadas de estado (Completed, Sending pulsante, Failed, Draft), tasas de entrega y estado de salud.
status = 'completed'
status = 'sending'
status = 'failed'
status = 'draft'
Historial de Campaigns y tabla de auditoría
La tabla inferior audita las emisiones recientes detallando: nombre de la Campaign, estado, etiqueta de origen (manual, schedule, rss, auto_resend), porcentaje de destinatarios atendidos y aperturas comprobadas.
Muestra el asunto de la Campaign, la fecha de creación y la etiqueta de origen (manual, recurring, rss o resend_unopened).
Recuento instantáneo de mensajes entregados frente a fallidos, más porcentajes en vivo de tasa de apertura y tasa de clics.
Acceso directo a la página de informe de Campaign para ver logs de eventos por destinatario y el modal de reenvío a no abiertos.
1.6 Accesos rápidos y automatización de flujos de trabajo
Acciones directas para conectar el panel de control con flujos de alta frecuencia: calendarios de boletines periódicos, procesamiento de fuentes RSS a correo, captación de listas, double opt-in y listas de supresión.
Automatización de flujo (Recurrente y RSS)
Lanza envíos automáticos de correo según intervalos cron programados o cada vez que una fuente RSS de WordPress/Ghost/Substack publique nuevos artículos.
Gestión de audiencia y suscriptores
Facilita la importación veloz de contactos por CSV, segmentación por listas, verificación obligatoria por double opt-in y bloqueo automático de direcciones rebotadas o desuscritas.
Gestor de Campaigns e Informes (/campaigns)
Compositor de difusiones de alta velocidad, selector de destinatarios por etiquetas, motor de seguridad preflight e informes detallados de entrega.
Interactive Campaigns UI Inspector
Haga clic en cualquier componente para inspeccionar el impacto en el esquema y consejos operativosMonitor de Envío Live
Estadísticas y eventos en tiempo realSelector de Destinatarios
Filtrado por tag y seleccionar todoEditor de Triple Vista
Código, split y vista previaMotor de Comprobación Preflight
Inspección automatizada de 6 puntosDiagnóstico de Envío de Prueba
Muestra live sin colaReescritor de UTM y Enlaces
Parámetros UTM y seguimiento 302Historial de Transmisiones
Filtros de status y origenInforme Detallado Post-Envío
CTR, MPP y reenvío automático2.1 Banner de monitorización en vivo de Campaign
Siempre que se esté enviando una difusión de forma activa, aparece un banner de monitorización fijo en la parte superior de /campaigns. Consulta /api/campaigns/:id/progress cada 1,5 segundos sin recargar la página completa.
Summer Launch Newsletter
Sending74% complete
7,420 / 10,000 emails
En Cola
2,528
Enviando
40
Éxito
7,420
Fallido
12
Recent Events Real-time status
Motor de Sondeo de 1,5 Segundos
Consulta /api/campaigns/:id/progress de forma asíncrona cada 1,5 segundos, mostrando el rendimiento en directo sin recargas de página.
Flujo de Eventos de Entrega Recientes
Registrador en vivo que muestra los últimos 5 cambios de status de destinatarios con confirmaciones en tiempo real y diagnósticos de errores SMTP.
Si worker.php en segundo plano se retrasa o el cron está inactivo, aparece una advertencia con instrucciones de solución en un clic.
2.2 Selector de destinatarios y filtros por etiqueta (columna izquierda)
La columna izquierda permite una segmentación precisa de suscriptores. Los administradores pueden filtrar por etiquetas personalizadas de contacto, buscar por email/nombre parcial y seleccionar contactos individuales o pulsar Seleccionar todos los coincidentes.
Garantía de filtrado de la máquina de estados:
Independientemente de la selección o búsqueda, el motor de consultas aplica estrictamente status = 'active'. Los contactos no suscritos, pendientes o suprimidos se excluyen automáticamente de la cola.
Intersecciones Multi-Tag
Seleccione segmentos específicos de suscriptores por tags. El selector calcula dinámicamente el recuento de intersecciones en tiempo real.
Búsqueda en Vivo con Debounce (300ms)
Búsqueda predictiva que filtra contactos por nombre o correo con un debounce de 300ms para evitar picos de base de datos en listas extensas.
Controles Maestros de Selección
Seleccione contactos individuales o use Seleccionar Todo para abarcar todos los contactos que coincidan con el filtro activo en un solo clic.
Grupos
Los contactos se organizan en grupos (un contacto puede estar en varios; todos están en al menos uno, General por defecto). En Select Recipients elige «Por grupo» para enviar a cada contacto activo de los grupos elegidos —el grupo completo, no solo la página que ves— o «Elegir manualmente» para escoger contactos individuales (con filtro opcional por un grupo).
Los grupos también pueden elegirse como audiencia de una programación, como disparador de una regla de autoresponder, como destino de una página de registro y para acotar un reenvío a quienes no abrieron. Eliminar un grupo nunca elimina sus contactos; las reglas de autoresponder que dependen de él se desactivan.
2.3 Compositor de Campaign y modos del editor dividido
Modo dividido
Edición simultánea de código a la izquierda y vista previa responsive en iframe en vivo a la derecha.
Modo solo código
Editor de código HTML de ancho completo libre de distracciones con numeración de líneas y pestañas de syntax.
Modo vista previa en vivo
Renderizado aislado con selectores de visualización para dispositivos de Escritorio (100%), Tablet (600px) y Móvil (375px).
Variables de Marcador de Posición y Motor de Sustitución
Personalice correos dinámicamente mediante tags {{name}}, {{email}}, {{unsubscribe_link}}, {{offer_url}} y {{track_pixel}}.
Viewports Responsivos en Sandbox
Pruebe la representación responsiva en móvil (375px), tablet (600px) y escritorio (100%) dentro de un iframe aislado antes del lanzamiento.
2.4 La verificación de seguridad preflight automatizada de 6 puntos
Para evitar errores catastróficos (por ejemplo, enviar emails con placeholders rotos, sin enlace para darse de baja o con detonantes de spam), MarbleSend requiere una verificación preflight antes del lanzamiento.
| Comprobación de seguridad | Gravedad | Regla y detección | Consecuencia si falla |
|---|---|---|---|
| 1. Enlace para darse de baja | CRÍTICO | Comprueba la presencia del token {{unsubscribe_link}}. | El envío queda BLOQUEADO. Obligatorio bajo CAN-SPAM, GDPR y los requisitos para remitentes de Google y Yahoo de 2024. |
| 2. Validez de placeholders | CRÍTICO | Detecta etiquetas de placeholder desconocidas (por ejemplo, errores tipográficos como {{first_nam}}). | Envío bloqueado hasta que las etiquetas desconocidas se corrijan o eliminen. |
| 3. Audiencia de destinatarios | CRÍTICO | Valida que haya > 0 destinatarios activos seleccionados. | No se puede transmitir a una selección vacía. |
| 4. Conectividad SMTP | CRÍTICO | Verifica el host y las credenciales del perfil SMTP seleccionado. | Evita bloqueos en la cola causados por credenciales de relay erróneas. |
| 5. Palabras detonantes de spam | ADVERTENCIA | Analiza el asunto y el cuerpo en busca de frases detonantes de spam ("100% free", "act now", "limited time"). | Se muestra un banner de advertencia; el administrador puede revisar y continuar. |
| 6. Longitud de la línea de asunto | INFORMACIÓN | Recomienda entre 30 y 60 caracteres para un truncamiento óptimo del asunto en móviles. | Aviso informativo para lograr tasas de apertura más altas. |
Barrera de Verificación Preflight
Evalúa 6 reglas automáticas de seguridad antes de confirmar en cola. Cualquier fallo de verificación CRÍTICA desactiva el botón de envío.
2.5 Diagnóstico de envío de prueba y modal de confirmación
Antes de comprometer miles de emails en la cola, el botón Enviar email de prueba despacha un único mensaje de prueba instantáneo directamente al administrador o buzón de control de calidad sin tocar la lista de destinatarios en la base de datos. Todas las etiquetas de placeholder ({{first_name}}, {{email}}, {{unsubscribe_link}}) se rellenan con valores de vista previa simulados para que pueda inspeccionar el renderizado del email en Gmail, Apple Mail y Outlook.
Interpolación de Tags de Prueba Simuladas
Rellena las variables de suscriptor con valores de vista previa realistas (ej. Jane Doe, enlace de desuscripción de prueba) para una verificación visual auténtica.
Modal de Verificación Previo al Lanzamiento
Confirmación modal en dos pasos que muestra el total de destinatarios, el perfil de remitente seleccionado y las tags UTM activas antes de crear la cola.
2.6 Inyección automatizada de seguimiento UTM
Todas las etiquetas de enlace salientes (<a href="...">) se procesan a través de App\Services\TrackingInjector. Los parámetros UTM (utm_source, utm_medium, utm_campaign, utm_content) se anexan automáticamente antes de envolverlos para la redirección de clics. Los enlaces mailto, enlaces tel y bajas se conservan intactos.
Paso 1: Inyección de Consultas UTM
Añade utm_source, utm_medium, utm_campaign y utm_content a cada hipervínculo sin alterar los parámetros de consulta existentes.
Paso 2: Inserción de Píxel de Seguimiento
Inyecta una imagen GIF transparente de 1x1 antes de la etiqueta de cierre </body> para registrar eventos de apertura al renderizarse en el cliente de correo.
Paso 3: Motor de Reescritura de Clics 302
Reescribe URLs salientes hacia /track/click.php?h=... para redirecciones instantáneas de latencia milimétrica con registro telemétrico de primer toque.
Exenciones Estrictas de Cumplimiento
Los enlaces de desuscripción, los protocolos mailto/tel y las URLs de confirmación double opt-in están estrictamente exentos de UTM y de envoltura de clics.
2.7 Historial y portafolio de Campaigns (/campaigns/history)
El historial completo ofrece filtrado por múltiples atributos: origen (manual, recurring, rss, resend_unopened), estado (completed, sending, failed, draft) y rango de fechas. Los administradores pueden seleccionar múltiples Campaigns para descargar logs de entrega CSV agregados.
Canal de Seguimiento de Origen
Categoriza las transmisiones según su fuente: Composer manual, Horarios periódicos, Desencadenadores de blog RSS o Clones de reenvío a no aperturas.
Filtrado Multi-Status y Exportación a CSV
Filtre el archivo por estados completado, enviando, fallido y borrador. Descargue registros de entrega detallados con un solo clic.
Duplicación de Transmisión en un Clic
Clone cualquier transmisión histórica de vuelta al composer conservando su diseño HTML completo, línea de subject y ajustes de remitente.
2.8 Informes analíticos y función "Reenviar a no abiertos"
Opcional: elige grupos para reenviar solo a quienes no abrieron y pertenecen a ellos. Un reenvío nunca va más allá de los destinatarios de la campaña original.
En /campaigns/:id/report, MarbleSend presenta un informe completo posterior a la Campaign:
4 Métricas de Rendimiento Bento
Rastrea volumen Enviado (100%), Fallos de entrega, Aperturas únicas con tasa de apertura y Clics únicos con CTR.
Curva de Interacción Horaria
Muestra grupos de aperturas por hora durante las primeras 72 horas para identificar las ventanas de envío óptimas para suscriptores.
Reenvío Dirigido a No Aperturas
Clona la Campaign dirigiéndose a suscriptores con opened_at IS NULL, permitiendo probar un nuevo subject para recuperar un 15–25% más de aperturas sin duplicar envíos a lectores activos.
Centro de Contactos y herramientas de crecimiento (/contacts)
Gestión del ciclo de vida del suscriptor, importación CSV, cumplimiento de GDPR, páginas de registro personalizadas y autoresponders.
Inspector Interactivo de UI de Contactos
Haga clic en cualquier componente para inspeccionar el impacto en el esquema y consejos operativosMáquina de 4 Estados
active/pending/unsub/suppMotor de Búsqueda y Filtros
Etiquetas, estado y debouncePanel de Auditoría y Consentimiento
IP, marcas de tiempo y rebotesImportador CSV RFC 4180
50k filas y guardas dedupPáginas de Captación Alojadas
Doble opt-in y embudosAutoresponders por Etiqueta
Reglas de goteo por eventosCentro de Gestión Masiva
Segmentación entre páginasPrivacidad y Supresión GDPR
Exportación JSON y purga total3.1 La máquina de estados de suscriptores de 4 estados
MarbleSend mantiene una máquina de estados estricta y unificada para todos los contactos. No hay flags booleanos secundarios. Cada pipeline de envío filtra WHERE status = 'active'.
Suscriptor activo
Suscripción confirmada, email válido. Apto para recibir Campaigns, horarios y autoresponders.
Doble Opt-In pendiente
Registrado a través del formulario de doble opt-in, esperando clic en el email de confirmación. Excluido de difusiones hasta que se confirme.
Suscripción cancelada
Hizo clic en el enlace para darse de baja. Nunca más se le enviarán emails. No se puede reactivar manualmente sin un re-opt-in explícito.
Rebote duro / Queja
Suprimido permanentemente debido a buzón inválido (5xx SMTP), queja de spam o supresión manual por el administrador.
| Estado | Disparador de Transición | Estado Destino | Impacto en Envío de Campaign |
|---|---|---|---|
| active | El suscriptor hace clic en el enlace de desuscripción o cabecera RFC 8058 | unsubscribed | Excluido inmediatamente de todas las colas de broadcast y programaciones futuras. |
| active | Rebote permanente SMTP 5xx o 3er rebote suave consecutivo | suppressed | Puesto en cuarentena permanente para proteger la reputación del dominio remitente. |
| pending | El suscriptor hace clic en el enlace con token de confirmación de doble opt-in | active | Promovido a active; apto para recibir Campaigns y autoresponders. |
| suppressed | Anulación manual de supresión por administrador con confirmación | active | Contador de rebotes suaves reiniciado; reincorporado a las colas de entrega activa. |
Guarda de Arquitectura: Cero Banderas Booleanas Secundarias
MarbleSend impone una única columna ENUM (cm_contacts.status). Otras plataformas a menudo sufren corrupción de datos cuando banderas booleanas como is_active, is_unsubscribed e is_bounced entran en conflicto. En MarbleSend, cada consulta de envío contiene WHERE status = 'active' sin ambigüedad.
3.2 Filtros en tiempo real, búsqueda y acciones de fila
La tabla de Contactos ofrece filtrado reactivo instantáneo con Alpine.js por etiquetas, estado del suscriptor (active, pending, unsubscribed, suppressed) y búsqueda debounce de texto libre por email y nombre/apellido.
Cada contacto pertenece al menos a un grupo (General por defecto). Usa el filtro Grupos para acotar la tabla y Administrar grupos para crear, renombrar o eliminar grupos; eliminar un grupo nunca elimina sus contactos.
Almacenamiento y Normalización de Etiquetas JSON
Las etiquetas se guardan como arreglos JSON normalizados en cm_contacts.tags. No distinguen mayúsculas de minúsculas, se recortan y se indexan para un filtrado veloz.
Búsqueda Instantánea con Debounce de 300ms
Las consultas filtran simultáneamente por dirección de correo, nombre y apellido con un retardo de 300ms para minimizar sobrecargas en la base de datos.
Paginación en Servidor y Escalabilidad
Navega fluidamente por listas de más de 50.000 suscriptores mediante consultas SQL LIMIT y OFFSET optimizadas con bajo consumo de memoria.
Actualice el nombre, metadatos personalizados y chips de etiquetas en línea sin recargar la página.
Suprima un contacto al instante para descalificarlo inmediatamente de todas las colas.
Elimina permanentemente el perfil del contacto, los logs y los elementos de la cola conforme al Artículo 17 del GDPR.
3.3 Panel lateral de detalle, pista de auditoría GDPR y exportación JSON
Al hacer clic en cualquier fila de contacto se abre el panel lateral de auditoría. Muestra métricas históricas (total de emails recibidos, tasa de apertura, recuento de clics), dirección IP de opt-in, marca de tiempo de opt-in, slug del formulario de registro y un botón para Exportar JSON GDPR con un solo clic para cumplir con el Artículo 15 (Derecho de acceso) y el Artículo 20 (Portabilidad de datos).
Marca de Tiempo de Opt-in y Origen
Registra la fecha, hora exacta y canal de captación (Manual, Importación CSV, slug de Página de Registro o API) para verificación legal.
Captura de Dirección IP Verificada
Registra la dirección IP del suscriptor en el momento del envío del formulario, aportando prueba indispensable de consentimiento para GDPR y CAN-SPAM.
Telemetría de Interacción Histórica
Supervisa el volumen acumulado de envíos junto con marcas de tiempo de apertura verificadas para distinguir suscriptores activos de inactivos.
Escalado Automático de Rebote Suave
Monitorea fallos temporales de entrega consecutivos (X / 3). Al registrarse el 3er rebote suave sucesivo, el estado cambia automáticamente a suppressed.
3.4 Importador CSV y mapeo de columnas
El importador procesa files CSV de hasta 50.000 filas. Detecta automáticamente delimitadores (coma, punto y coma, tabulación) y proporciona menús desplegables visuales para mapear columnas a: Email, Nombre, Apellido y Etiquetas.
Elige a qué grupos se unen los contactos importados (General si no eliges). Los contactos existentes se añaden a esos grupos; nunca se les quita de los grupos a los que ya pertenecen.
Subida por Bloques con Memoria Segura
Transmite archivos de hasta 50.000 filas en bloques transaccionales, manteniendo el uso de memoria por debajo de 32MB incluso en alojamientos compartidos restringidos.
Autodetección de Delimitador y Mapeo Inteligente
Identifica comas, puntos y comas y tabulaciones automáticamente, con asignación interactiva para Correo, Nombre, Apellido y Etiquetas.
Etiquetado en Lote y Auditoría Posterior
Aplica una etiqueta global a todos los contactos del lote e informa detalladamente sobre registros insertados, actualizados y omitidos.
Omitir duplicados
Conserva los detalles y etiquetas de contactos existentes. Solo se insertan filas nuevas.
Actualizar campos vacíos
Rellena nombres faltantes y anexa nuevas etiquetas sin sobrescribir datos existentes.
Sobrescribir todo
Actualiza nombres y etiquetas por completo para coincidir con el file CSV entrante.
3.5 Páginas públicas de registro (/s/:slug)
Ubicado en la Pestaña 2 de Contactos. Cree páginas de suscripción independientes con su propia marca, con titular, descripción, etiquetas de campo y botones de envío personalizados. Las características incluyen:
Elige los grupos a los que se unen los suscriptores de esta página (General si no eliges). Los grupos eliminados después se descartan automáticamente.
Controla las impresiones agregadas en todos los embudos de captación activos.
Calcula el porcentaje de envíos sobre visitas en todas las páginas de captación alojadas.
Muestra las páginas de destino activas respecto al límite operativo de 20 páginas.
Monitorea las nuevas altas captadas durante la ventana móvil de 30 días.
Integración Multicanal de Formularios
Incruste formularios donde desee usando URL directa (/subscribe?slug=...), código HTML limpio, iframe adaptable o popup modal.
Genera tokens de confirmación firmados con HMAC con envío automatizado del email de confirmación.
Asigna etiquetas de suscriptor designadas al registrarse para activar secuencias automatizadas personalizadas.
Dirige a los nuevos suscriptores a su página de agradecimiento o URL de lead magnet tras el opt-in.
3.6 Autoresponders y secuencias de goteo
Está en la pestaña 3 de Contacts. Configura correos de bienvenida automáticos que se ponen en cola en cuanto un nuevo suscriptor pasa a estar activo: justo después del registro o tras confirmar el double opt-in. Una regla coincide con una etiqueta o un grupo; no hay ajuste de retraso. Los correos los entrega el worker en segundo plano y respetan automáticamente las reglas de suppression.
Una regla puede dispararse por un grupo en lugar de una etiqueta. Las reglas de grupo se ejecutan cuando se crea un nuevo contacto activo en ese grupo o confirma por correo, no cuando un contacto existente se añade al grupo más tarde (igual que las reglas de etiqueta). Eliminar el grupo desactiva la regla.
Escuchador de Eventos por Etiqueta
Se dispara cuando un nuevo suscriptor activo tiene la etiqueta de la regla o pertenece a su grupo: justo después de una página de registro, una llamada API o un alta manual (single opt-in), o cuando se confirma el double opt-in. No se dispara con importaciones CSV ni cuando se añade una etiqueta o un grupo a un contacto existente más tarde.
Enrutamiento por SMTP Dedicado
Canaliza correos transaccionales de bienvenida mediante perfiles SMTP dedicados de alta reputación, separados del tráfico masivo.
Ejecución Asíncrona en Worker
Delega el procesamiento y envío a worker.php, evitando bloqueos web y manteniendo respuestas inmediatas en los formularios.
Prevención de Bucles y Deduplicación
Evita activaciones repetidas, garantizando que los suscriptores no reciban mensajes duplicados si son reetiquetados.
3.7 Gestión masiva y segmentación de listas (/contacts/list)
En /contacts/list, gestione listas de gran volumen con operaciones por lotes: seleccione entre páginas, aplique o elimine etiquetas en masa, suprima miles de prospectos inactivos simultáneamente o exporte segmentos específicos a files CSV en UTF-8.
Añadir al grupo y Quitar del grupo se aplican a cada contacto seleccionado. Quitar a un contacto de su último grupo lo devuelve a General.
Añadir Etiquetas Masivamente
Agrega etiquetas a todos los contactos seleccionados en una única consulta sin alterar las etiquetas preexistentes.
Eliminar Etiquetas Masivamente
Remueve etiquetas específicas con precisión de los contactos seleccionados en múltiples listas.
Exportación CSV Filtrada
Genera archivos CSV bajo estándar RFC 4180 con los contactos filtrados y sus metadatos completos.
Supresión Masiva
Pone en cuarentena contactos fríos o inactivos de inmediato para proteger la reputación del remitente.
Desuscripción Masiva
Procesa solicitudes de baja colectivas provenientes de canales externos o campañas fuera de línea.
Purga Definitiva GDPR
Elimina permanentemente los registros de los contactos y sus datos de telemetría cumpliendo con el Artículo 17 del GDPR.
3.8 Privacidad GDPR, Exportación de Auditoría y Purga de Datos
Controles de privacidad integrados que cumplen rigurosamente con el Reglamento General de Protección de Datos (GDPR) de la UE, CCPA de California y CAN-SPAM.
La exportación GDPR (JSON) también lista los grupos a los que pertenece el contacto.
Artículos 15 y 20: Exportación JSON Estructurada
Genera un expediente JSON estructurado con el perfil del suscriptor, IP de consentimiento, marcas de tiempo de opt-in y registros de envío.
Artículo 17: Derecho de Supresión (Borrado Definitivo)
La eliminación irreversible purga datos en cm_contacts, cm_email_logs y cm_email_queue, destruyendo todo rastro identificable.
Protección al Reactivar Direcciones Suprimidas
Requiere confirmación explícita del administrador para rehabilitar un correo suprimido, evitando envíos accidentales a buzones inválidos.
Estudio de Plantillas y Redactor con IA (/templates)
8 diseños de correo basados en tablas, vista previa en iframe aislado con reinicio de CSS en miniatura, redactor con IA orientado a ventas y publicaciones de noticias en Markdown para boletines.
Inspector de UI de Templates Studio
Haga clic en cualquier componente para ver consultas de base de datos, impacto en esquema y consejos operativosBiblioteca de Templates
Búsqueda instantánea y slugsDiseños Starter
8 diseños de email basados en tablasEditor de Código Puro
Sangría Tab y formateadorViewport Aislado
Marco de escritorio y móvilPaleta de Tokens Dinámicos
Inyección de placeholders en 1 clicRemitente de Prueba
Modal de verificación SMTP en vivoCajón de AI Copywriter
Generar y refinar templatesRevisor de Asuntos
Puntuación 1–100 y filtro antispamPublicaciones de noticias
Artículos en Markdown para boletines4.1 Biblioteca de Templates, Slugs Personalizados y Gestión de Metadatos
Repositorio centralizado para todos los templates de marketing, transaccionales y de autoresponder. Incorpora filtrado instantáneo, slugs inmutables e indicadores de estado de borrador en vivo.
Slugs de Templates Inmutables
Los IDs de slug (#monthly-newsletter) se definen al crear y quedan bloqueados permanentemente al guardar. Esto evita roturas en Campaigns RSS automáticas y autoresponders.
Búsqueda Instantánea con Debounce
Filtro Alpine en el cliente que busca en títulos de templates, asuntos e IDs de slug sin generar consultas innecesarias a la base de datos.
Sincronización de Estado de Borrador
Una tarjeta de borde discontinuo distingue de forma visual los borradores activos en memoria frente a los templates de producción guardados.
Instantáneas Independientes de Campaigns
Editar o eliminar un template de la biblioteca nunca altera envíos históricos. Las Campaigns enviadas almacenan instantáneas estáticas independientes en cm_campaigns.
4.2 8 Diseños Starter Responsivos Basados en Tablas Probados
Los motores de email de escritorio modernos (especialmente Microsoft Outlook con Word HTML) no admiten CSS Grid ni Flexbox. MarbleSend incluye 8 diseños responsivos basados en tablas probados en Gmail, Outlook, Apple Mail y Yahoo:
Lienzo limpio con pie de página obligatorio para darse de baja.
Banner principal, propuesta de valor y CTA destacado.
Editorial curado con destacados de publicaciones en 2 columnas.
Banda de cabecera más el bloque {{news_posts}} para programaciones de Publicaciones de noticias.
Bienvenida personalizada con guía de introducción en 3 pasos.
Insignia de fecha/hora, biografía del ponente y botón de confirmación de asistencia.
Artículos numerados, tiempo de lectura y etiquetas de autor.
Cupón de descuento urgente y copy con aversión a la pérdida.
Arquitectura de Tablas Anidadas y CSS Inline
Cada diseño starter está construido con elementos <table> anidados con anchos en píxeles explícitos, cellpadding/cellspacing en cero y CSS inline para garantizar estabilidad visual.
4.3 Editor de Código HTML Puro y Formateador Limpio
Un editor enfocado para desarrolladores de email con sangría Tab, telemetría de caracteres en tiempo real y normalizador automático de espacios en blanco.
Captura de Sangría con Tecla Tab
Pulsar Tab inserta 2 espacios en lugar de desenfocar el campo, facilitando la edición estructural del código directamente en el navegador.
Embellecedor de Código en 1 Clic ("Clean")
Normaliza sangrías irregulares, elimina saltos de línea redundantes y limpia estructuras de tablas anidadas sin alterar estilos inline.
Control de Peso y Protección contra Recortes
Monitoreo de caracteres en tiempo real. Mantener el peso de HTML bajo 102 KB evita que Gmail corte el correo con el aviso "[Message clipped]".
Cero Código Basura de Editores Visuales
El control directo de HTML previene clases CSS innecesarias, fuentes web no soportadas y spans ocultos que suelen degradar la entregabilidad del email.
4.4 Viewports Responsivos Multidispositivo Aislados
Simula clientes de escritorio y móviles en un iframe aislado con sandbox, protegiendo la interfaz del panel de administración contra estilos no deseados.
Seguridad de Iframe y Aislamiento de CSS
El atributo sandbox="allow-same-origin" aísla por completo las reglas CSS del email para que no afecten la interfaz de MarbleSend.
Alternador entre Escritorio y Móvil de 320px
Alterne al instante entre el contenedor de escritorio completo y un marco móvil de 320px para verificar la adaptabilidad en una sola columna.
Simulador de Asuntos en Tiempo Real
La barra superior muestra el asunto renderizado en tiempo real, reflejando cómo se visualizarán los placeholders para el destinatario.
Aviso Dinámico de Errores de Syntax
Inspecciona el borrador y muestra un banner de advertencia si detecta tags de placeholders sin cerrar o tokens no compatibles.
4.5 Tokens Dinámicos de Personalización y Cumplimiento RFC
En el momento del envío, el motor de plantillas reemplaza dinámicamente los tokens por atributos del destinatario, enlaces de seguimiento seguros, resúmenes de artículos RSS y Publicaciones de noticias.
Nombre completo del destinatario (usa "there" si está vacío)
Dirección de email del destinatario
Enlace obligatorio de desuscripción en un clic según RFC 8058
URL de confirmación de double opt-in para páginas de registro
Bucle de artículos de blog sindicados para newsletters automáticas de RSS
Título del feed sindicado RSS/Atom
Titular del artículo de blog publicado más recientemente
Número de entradas nuevas del feed incluidas en el boletín
Bloque de Publicaciones de noticias para una programación de Boletín (portada, título, subtítulo, cuerpo)
Número de Publicaciones de noticias incluidas en este envío
Título de la Publicación de noticias más reciente de este envío
Requisito Legal y Protección de Entregabilidad
Todo envío publicitario debe contener {{unsubscribe_link}}. Los envíos sin opción clara de desuscripción violan CAN-SPAM, GDPR y CASL, acarreando el bloqueo de dominio por parte de proveedores de correo.
4.6 Diagnóstico de Envío de Prueba Único y Verificación Previa
Herramienta modal que permite despachar emails de prueba a cualquier dirección mediante perfiles SMTP elegidos antes de programar o transmitir.
Selección de Múltiples Perfiles SMTP
Enrute pruebas por cualquier perfil SMTP configurado para validar registros SPF, DKIM y entregabilidad en servidores de correo específicos.
Renderizado de Placeholders con Datos Sintéticos
Sustituye automáticamente los tokens por valores simulados realistas (ej. "John Doe") para comprobar alineaciones y estilos con precisión.
Envío Síncrono sin Cola
Omite la cola de fondo (cm_email_queue) para despachar de inmediato vía MailerFactory, entregando confirmación instantánea de éxito o fallo.
Control de Calidad en Modo Oscuro
Envíe pruebas a cuentas de Gmail, Outlook y Apple Mail para verificar inversiones de color en modo oscuro y legibilidad tipográfica.
4.7 Motor de Copywriting con AI Enganchado BYOK
Redactor con AI integrado operando directamente vía BYOK (Bring Your Own Key) para crear y optimizar templates seguros para email sin demoras de intermediarios.
Principio Crucial: La Calidad del Resultado Depende del Prompt y del Modelo
MarbleSend no lo limita a un único proveedor de IA cerrado. Dado que la generación se ejecuta mediante su proveedor BYOK configurado, la calidad del diseño, la persuasión, la precisión de las tablas HTML y la crítica del asunto se rigen fundamentalmente por dos variables: la especificidad de sus instrucciones en el prompt y la capacidad de razonamiento del modelo LLM seleccionado.
1. Especificidad y Profundidad de Contexto del Prompt
El modelo de IA refleja la claridad y el contexto de las instrucciones que proporcione. Un prompt genérico como "escribe un email promocional" generará textos estándar. Para obtener resultados excepcionales, proporcione un contexto estructurado: audiencia objetivo, puntos de dolor, oferta principal, tono deseado (urgente, conversacional, ejecutivo) y un Call-to-Action (CTA) claro. En la pestaña Editar plantilla, brinde instrucciones iterativas específicas (ej.: "acorta el segundo párrafo", "destaca el 20% de descuento en el botón CTA" o "agrega una caja destacada con 3 beneficios").
2. Nivel del Modelo LLM y Capacidad de Razonamiento
En Settings → AI Providers, puede conectar modelos insignia de razonamiento avanzado (como DeepSeek-V4.1-flash, Claude 5 Sonnet o GPT-6) o modelos locales ligeros (como 7B–8B parámetros vía Ollama o Groq). Los modelos insignia destacan en el anidamiento complejo de tablas HTML seguras para email, la colocación natural de token de personalización ({{name}}, {{email}}, {{unsubscribe_link}}) y un copywriting de alta conversión. En la pestaña Opciones de asunto, la puntuación en vivo (1–100), el análisis de spam y las sugerencias se generan directamente por el modelo activo; modelos superiores ofrecen análisis mucho más profundos y variantes más creativas.
Salvaguardas del System Prompt Integradas en MarbleSend
Independientemente de la longitud del prompt o del modelo elegido, AiService.php inyecta salvaguardas arquitectónicas estrictas: estructura responsiva de tabla única (máximo 600px de ancho, lienzo limpio, tarjetas de alto contraste), botones CTA basados en tablas a prueba de fallos compatibles con Outlook y Gmail, cero imágenes externas para proteger la entregabilidad y la inserción obligatoria del token {{unsubscribe_link}} en el pie de página para cumplir con las normativas globales.
Generación de Template Completo
Produce diseños HTML completos basados en tablas adaptados a su público objetivo, oferta principal, tono de voz y longitud requerida.
Ajustes Contextuales
Examina el template activo en el editor y aplica modificaciones precisas (ej. "agrega una sección de 3 beneficios" o "haz el CTA más persuasivo").
Comparación Visual Interactiva
Iframes aislados muestran simultáneamente las versiones "Antes" y "Después" para inspeccionar las mejoras visualmente antes de guardarlas.
Cómo Obtener API Keys en los Principales Proveedores
Una vez obtenida la API key y el ID del modelo, configúrelo en MarbleSend siguiendo estos pasos:
4.8 Puntuación de Asuntos con AI e Inspector de Entregabilidad
Examina los asuntos de toda su biblioteca, calculando la tasa de apertura esperada, riesgos de filtros spam y longitud de caracteres con sugerencias en 1 clic.
Carga de Asuntos de la Biblioteca
Escanea todos los asuntos en cm_templates y los presenta en una lista desplazable, resaltando el correspondiente al template en edición.
Puntuación Multifactorial 1–100
El LLM activo analiza curiosidad, claridad, propuesta de valor y urgencia, generando una calificación objetiva sobre 100.
Auditoría de Longitud Móvil y Filtros Antispam
Alerta si se sobrepasan los límites móviles (se aconseja <= 50 caracteres) y detecta términos de riesgo como "GRATIS", "URGENTE $$$" o signos de puntuación exagerados.
Variantes Optimizadas de Alta Conversión
Propone alternativas orientadas a la curiosidad, el beneficio directo o la aversión a la pérdida, listas para aplicarse con un solo clic.
Publicaciones de noticias — artículos al estilo Substack para boletines
Escribe artículos en la pestaña Publicaciones de Plantillas (Markdown con vista previa en vivo). Una programación de Boletín configurada en «Publicaciones de noticias» envía cada publicación Lista una sola vez, la más antigua primero, rellenando el marcador {{news_posts}} de su plantilla. Las publicaciones solo existen en tu correo: no hay página pública.
Escribe y marca como Lista
Usa la barra de herramientas o Markdown simple. Una publicación solo se envía después de pasarla de Borrador a Lista.
Marcador de plantilla
Coloca {{news_posts}} donde deban aparecer los artículos (la plantilla inicial «Boletín de publicaciones de noticias» ya lo incluye). {{news_posts_count}} y {{news_latest_post_title}} funcionan en el asunto.
Prográmala
En Programaciones elige Boletín y luego Origen del contenido: Publicaciones de noticias. Solo se envían las publicaciones marcadas como Listas desde ese momento, así tu archivo nunca se reenvía. Supresión Inteligente no se usa.
Seguro por diseño
El texto de la publicación se escapa como HTML y solo se permiten enlaces e imágenes https. Mantén cada correo por debajo de unos 100 KB para que Gmail no recorte el enlace de baja: el editor te avisa.
El espacio de trabajo de Publicaciones de un vistazo
Abre Plantillas y cambia a la pestaña Publicaciones. La biblioteca está a la izquierda y el editor con su vista previa en vivo a la derecha — el mismo diseño que el estudio de plantillas.
| Parte | Qué hace |
|---|---|
| Biblioteca | Lista cada publicación con una insignia de Borrador o Lista, cuántas veces se envió y cuándo cambió por última vez. El cuadro de búsqueda filtra por título y subtítulo; el icono de papelera aparece al pasar el cursor. |
| Título, subtítulo, portada | El título es obligatorio (hasta 255 caracteres, una línea). El subtítulo (hasta 500) se muestra debajo. La imagen de portada debe ser una URL https — cualquier otra se rechaza al guardar. |
| Interruptor de estado | Las publicaciones en Borrador nunca se envían. Al pasar una publicación a Lista se registra el momento en que quedó Lista; ese momento decide qué programaciones pueden enviarla. |
| Editor Markdown | Los botones de la barra (encabezado, negrita, cursiva, enlace, listas, cita, separador, imagen) insertan syntax alrededor de tu selección. Una publicación puede contener hasta 100.000 caracteres. |
| Vista previa en vivo | Renderiza la publicación sin guardar dentro de la plantilla que elijas, con el mismo código que un envío real, y muestra el tamaño del correo en KB. Los marcadores como {{name}} usan valores de ejemplo. |
| Atajo del marcador | Un botón bajo el editor copia {{news_posts}} para que lo pegues en una plantilla. |
Referencia de Markdown
El texto de la publicación se escribe en un subconjunto pequeño y seguro de Markdown. Lo que quede fuera de esta lista se queda como texto sin formato.
| Syntax | Resultado |
|---|---|
| ## Heading ### Smaller | Encabezado (los niveles 1–3 se convierten en encabezados seguros para correo) |
| **bold** *italic* | Negrita y cursiva |
| [text](https://example.com) | Enlace. Solo se enlazan direcciones http, https y mailto; cualquier otro esquema (como javascript:) se deja como texto sin formato. |
| - item 1. item | Listas con viñetas y numeradas |
| > quote | Cita en bloque |
| --- | Línea separadora |
|  | Imagen. Solo https; añade siempre una descripción breve para quienes bloquean imágenes. |
| (blank line) | Los párrafos se separan con una línea en blanco; un salto de línea simple sigue siendo un salto de línea dentro del párrafo. |
| <script>alert(1)</script> | El HTML en bruto nunca se interpreta: una etiqueta <script> o <img> que escribas se muestra como texto literal. |
La familia de marcadores {{news_posts}}
Colócalos en una plantilla; una programación de Publicaciones de noticias los rellena al enviar, antes de resolver los tokens habituales por destinatario como {{name}}.
| Marcador | Se convierte en |
|---|---|
| {{news_posts}} | El bloque de publicaciones de este envío: imagen de portada, título, subtítulo y cuerpo de cada una, la más antigua primero. Obligatorio en el cuerpo de la plantilla. |
| {{news_posts_count}} | El número de publicaciones de este envío, por ejemplo 1. Funciona en el asunto y en el cuerpo. |
| {{news_latest_post_title}} | El título de la publicación más reciente de este envío. Ideal para el asunto. |
Obligatorio en el cuerpo
Una programación de Publicaciones de noticias se rechaza al guardar si el cuerpo de su plantilla no tiene {{news_posts}}, y una ejecución falla de forma segura (las publicaciones siguen pendientes) si la plantilla se edita después.
Nunca se envía como texto sin procesar
Si se usa en otro lugar — una Campaign manual, una programación RSS o una programación solo de plantilla — los marcadores se reemplazan por texto vacío, y la comprobación previa de la Campaign te avisa antes de enviar.
Personalizado y con seguimiento
El texto de la publicación pasa por el flujo normal: {{name}} dentro de una publicación se personaliza por destinatario, los enlaces reciben parámetros UTM y seguimiento de clics, y el enlace de baja de tu plantilla se mantiene intacto.
Ciclo de vida de una publicación
Cada publicación pasa por los mismos estados sencillos; la insignia de la biblioteca siempre muestra el actual.
Borrador
Aún se está escribiendo. Nunca se envía. Devolver una publicación Lista a Borrador borra su hora de Lista.
Lista
En cola para el envío. Una programación solo la envía si quedó Lista después de activar el modo Publicaciones de noticias de esa programación. Guardar una publicación que ya está Lista no cambia su lugar en la cola.
Enviada
Se registra por programación y aparece como “Enviada 1×” en la biblioteca. Una programación nunca envía la misma publicación dos veces, aunque la edites después.
Eliminada
Quita la publicación y su historial de entrega. Los correos ya entregados no se ven afectados, y una publicación eliminada no se puede recuperar.
Tamaño del correo y seguridad
Las publicaciones llevan su texto completo dentro del correo — no hay página pública —, así que el tamaño y la seguridad importan más que en un resumen solo de enlaces.
Escapar primero
Cada carácter que escribes se escapa como HTML antes de aplicar cualquier formato, de modo que scripts y etiquetas no llegan a la bandeja de entrada del destinatario.
Solo https
Las imágenes y la portada deben ser https. Los enlaces aceptan http, https y mailto. Otros esquemas se muestran como texto sin formato.
Mantente por debajo de unos 100 KB
Gmail recorta los mensajes de más de unos 102 KB y oculta el pie, incluido el enlace de baja. La vista previa muestra el tamaño en KB y avisa por encima de 80 KB; usa pocas publicaciones por correo en artículos largos.
Sin archivo público
Las publicaciones existen solo dentro de los correos que envías. No hay páginas web, ni subida de imágenes, ni llamadas automáticas a IA — las imágenes se enlazan por URL.
Solución rápida de problemas
| Síntoma | Qué revisar |
|---|---|
| La vista previa no muestra artículos | La plantilla seleccionada no tiene el marcador {{news_posts}} (aparece marcada como “sin {{news_posts}}” en la lista). Elige otra plantilla o añade el marcador. |
| Aviso de “Correo grande” | Acorta la publicación, quita formato pesado o reduce “Publicaciones por correo” en la programación. |
| Un enlace no se puede pulsar | Escríbelo como [text](https://…) con una dirección http, https o mailto; otros esquemas se dejan como texto. |
| Una imagen no aparece | La dirección debe empezar por https y ser accesible públicamente. Algunas apps de correo también bloquean imágenes remotas hasta que el lector lo permite. |
Schedules & Automatización RSS (/schedules)
Envíos recurrentes de boletines (plantilla o Publicaciones de noticias), calendario mensual interactivo de envíos, motor de cadencia, segmentación dinámica de audiencia y Campaigns automáticas de RSS/Atom del blog.
Inspector de UI de Programaciones, RSS y Publicaciones de noticias
Haga clic en cualquier tarjeta para ver la consulta a la base de datos, el impacto en el esquema y consejos operativos
Matriz de Calendario & Mes
Mapa visual de horarios & cadenciaMotor de Recurrencia
Diario, semanal, mensual & personalizadoExtractor Automático de Blog
Deduplicación por hash & cachéAudiencia Dinámica
Consulta de etiquetas en el segundo exactoLogs de Occurrences
Auditoría de ejecución & prevención de duplicadosRun Now Bajo Demanda
Ejecución inmediata sin alterar cadenciaOptimización de Hosting
8 directrices operativas seleccionadasLatido de Cron & Bloqueo
Protección de concurrencia sin bloqueoModo Publicaciones de noticias
Boletines al estilo Substack5.1 Operaciones Dual-Mode: Schedule Manager Interactivo & Vista de Calendario
MarbleSend proporciona dos vistas operativas sincronizadas para diferentes flujos de trabajo: un Schedule Manager compacto en cuadrícula Bento (/schedules) y un amplio Calendario Mensual interactivo (/schedules/list).
Vista Tabular Densa & Bento
Muestra todos los envíos recurrentes con cuenta regresiva, selectores de estado activo, vistas previas de plantillas y accesos directos de ejecución.
Cuadrícula de Calendario de 7 Columnas
Mapea las próximas entregas en un calendario mensual de domingo a sábado, con resalte del día actual, selector de mes y etiquetas interactivas.
Panel de Detalle del Horario Seleccionado
Panel de inspección instantánea con vista previa en iframe aislado, especificaciones de recurrencia, etiquetas de destinatarios y acciones rápidas.
5.2 Motor de Cadencia, Reglas de Recurrencia & Normalización de Zona Horaria UTC
Los horarios recurrentes funcionan mediante SchedulerService::computeNextRun(), que sustituye los cálculos manuales por matemáticas robustas de DateTimeImmutable en PHP.
Almacenamiento UTC Universal con Presentación Localizada
Todos los valores next_run_at se almacenan en UTC en cm_schedules. Al renderizarse en el navegador, se convierten a la zona horaria del administrador sin alterar las ventanas de entrega.
Recurrencia Diaria & Semanal
Soporte para envíos diarios a horas fijas o días específicos de la semana (por ejemplo, martes y jueves por la mañana) con botones interactivos.
Ajuste de Días en Meses Cortos
Para envíos programados en los días 29–31, MarbleSend ajusta automáticamente la ejecución al último día válido de los meses más cortos (por ejemplo, 28/29 de febrero).
Compatibilidad con Horario de Verano (DST)
Aplica cálculos nativos de DateTimeZone para garantizar que los envíos se activen a la hora local deseada al cambiar el horario de verano.
5.3 Canalización Automatizada para Feeds RSS & Atom
MarbleSend se conecta directamente a su blog o feed mediante SimpleXML y cURL nativos, convirtiendo artículos nuevos en campañas automatizadas sin herramientas intermedias.
Analizador Dual (RSS 2.0 & Atom 1.0)
Examina el elemento raíz XML, extrayendo títulos, resúmenes, enlaces permanentes y fechas de publicación sin librerías externas.
Diagnóstico Previo de Feed en Tiempo Real
El botón "Test Feed" consulta la URL en tiempo real, validando el esquema XML, verificando respuestas HTTP 200 y mostrando las 3 publicaciones más recientes.
Deduplicación & Instantánea Inicial
Rastrea last_rss_item_id y fechas de publicación. Al crear el horario, registra el ID más reciente como referencia para no enviar retroactivamente el archivo histórico.
5.4 Resolución Dinámica de Audiencia & Segmentación en el Momento del Envío
La audiencia de una programación también puede limitarse a un grupo (combinada con una etiqueta, deben cumplirse ambas). Si se elimina el grupo, la programación se desactiva en lugar de enviar en silencio a nadie.
A diferencia de las campañas estáticas, los envíos programados resuelven su lista de destinatarios dinámicamente en el segundo exacto en que se ejecuta la occurrence.
Expansión de Audiencia en Tiempo Real
Los suscriptores registrados o etiquetados minutos antes de la ejecución se incluyen automáticamente sin necesidad de re-sincronizaciones manuales.
Filtro Estricto de Estado de Entregabilidad
La consulta aplica WHERE status = 'active', excluyendo incondicionalmente a contactos pendientes, desuscritos y suprimidos de las colas recurrentes.
Aislamiento por Etiquetas
Permite enviar a todos los contactos activos o a segmentos específicos que coincidan con arreglos de etiquetas JSON (por ejemplo, #resumen-semanal, #clientes).
5.5 Logs de Ejecución de Occurrences & Política de Catch-Up Único
Cada ejecución automatizada genera un registro inmutable en cm_schedule_occurrences con marcas de tiempo, resultados, conteo de destinatarios y telemetría de errores.
Telemetría de 3 Estados para Occurrences
Distingue entre 'completed' (correos en cola), 'skipped' (sin nuevos artículos RSS) y 'failed' (desconexión SMTP, plantilla faltante o tiempo agotado).
Protección Idempotente de Catch-Up Único
Si el cron estuvo inactivo durante varios intervalos omitidos, MarbleSend ejecuta como máximo UN envío de recuperación y avanza next_run_at hacia el futuro.
Modal de Historial de Occurrences
Haga clic en "View Execution History" en la barra lateral para revisar ejecuciones pasadas, volúmenes de envío y registros diagnósticos en la interfaz.
5.6 Envíos Manuales Bajo Demanda ("Run Now") & Anulaciones de Emergencia
Los administradores pueden omitir el temporizador de cuenta regresiva y disparar un envío inmediato de cualquier horario con la acción "Trigger Send Now".
Compilación Inmediata a la Cola
Compila instantáneamente la plantilla, resuelve los miembros activos y despacha los lotes a cm_email_queue para el siguiente ciclo del worker.
Línea Temporal de Recurrencia Preservada
Activar un envío manual no altera ni retrasa la próxima fecha programada next_run_at, manteniendo intacta la cadencia del calendario.
Utilidad Diagnóstica & Anuncios Urgentes
Ideal para probar el diseño de plantillas con datos reales de suscriptores o enviar alertas críticas fuera del horario habitual.
5.7 Concurrencia Segura en Workers, Prevención de Traslapes & Bloqueos con flock
MarbleSend incorpora un perímetro de concurrencia empresarial diseñado para prevenir envíos duplicados en planes de shared hosting económicos.
Bloqueo flock No Bloqueante
worker.php solicita un bloqueo exclusivo en storage/worker.lock. Si la ejecución previa aún procesa envíos por SMTP lento, los nuevos procesos terminan silenciosamente.
Paridad Dual entre CLI & HTTP
Tanto worker.php por línea de comandos como cron.php por HTTP comparten rutas idénticas de ejecución y bloqueo, asegurando uniformidad en cPanel o cron jobs.
Reserva Atómica de Occurrences
Los horarios pendientes se reservan mediante sentencias preparadas atómicas en PDO, impidiendo dobles encolamientos en contenedores multi-hilo.
5.8 Optimización para Shared-Hosting & 8 Consejos Seleccionados
La tarjeta dinámica Optimization Tip en Schedules ofrece 8 recomendaciones operativas comprobadas para envíos fiables en shared hosting:
Programe sus envíos los martes o jueves entre 09:00 y 10:30 hora local para maximizar las tasas de apertura y clics.
Ejecute worker.php cada minuto (* * * * *) con protección flock para garantizar exactitud temporal sin colisiones de procesos.
Consulte cm_email_queue con sentencias preparadas indexadas y cláusulas LIMIT para evitar condiciones de carrera durante picos de envío.
Organice contactos con etiquetas regionales (#us-east, #apac, #emea) y asigne horarios escalonados para no enviar a las 03:00 AM.
Espere entre 1 y 2 horas tras publicar en su CMS antes de disparar el envío RSS para que las cachés de CDN y XML se actualicen por completo.
Limpie regularmente logs antiguos en cm_schedule_occurrences para mantener las tablas ligeras y las consultas rápidas en servidores compartidos.
Programe un reenvío 48–72 horas después a contactos donde opened_at IS NULL con un asunto alternativo para recuperar 15–25% de interacción.
Separe perfiles SMTP para feeds RSS automáticos de aquellos para envíos masivos de marketing a fin de proteger la reputación de su dominio.
5.9 Programaciones de Publicaciones de noticias (boletines al estilo Substack)
Una programación de Boletín ahora puede enviar artículos en lugar de una plantilla fija. Establece Origen del contenido en «Publicaciones de noticias» y cada ejecución entrega las siguientes Publicaciones Listas de Plantillas → Publicaciones, insertadas en la plantilla mediante {{news_posts}}. No se envía nada cuando no hay publicaciones esperando.
¿Qué origen de contenido debo usar?
Solo plantilla
La misma plantilla en cada ejecución — para anuncios o recordatorios recurrentes. Supresión Inteligente está disponible.
Resumen RSS
Publicaciones nuevas de un feed de blog externo. La primera ejecución solo marca las publicaciones existentes como vistas; las siguientes envían solo las nuevas.
Publicaciones de noticias
Artículos que escribes dentro de MarbleSend. Cada publicación Lista se envía una vez, la más antigua primero. Ideal para un boletín al estilo Substack.
Configúralo en seis pasos
- 1Abre Plantillas → Publicaciones y escribe tu artículo en Markdown.
- 2Crea o abre una plantilla y coloca {{news_posts}} donde deban aparecer los artículos (la plantilla inicial «Boletín de publicaciones de noticias» ya lo incluye).
- 3Abre Programaciones → Nueva, deja el tipo en Boletín y establece Origen del contenido en «Publicaciones de noticias».
- 4Elige la plantilla, la audiencia, el perfil SMTP, las publicaciones por correo (1–20) y la cadencia.
- 5Guarda. Solo las publicaciones que queden Listas después de este momento pueden ser enviadas por esta programación.
- 6Marca la publicación como Lista. La siguiente ocurrencia — o Ejecutar ahora — la envía.
Qué publicaciones se envían en cada ejecución
En cada ocurrencia, la programación elige publicaciones con cuatro reglas, en este orden.
Solo Listas
Los borradores se ignoran, por antiguos que sean.
Después del punto de corte
Una publicación debe haber quedado Lista después de activar el modo Publicaciones de noticias de la programación. Tu archivo existente nunca se reenvía.
Aún no enviada por esta programación
La entrega se registra por programación, así que dos programaciones pueden enviar cada una la misma publicación una vez, pero nunca dos.
Las más antiguas primero, hasta el límite
«Publicaciones por correo» (1 por defecto, máximo 20) limita cuántas se combinan. El resto espera a la siguiente ejecución.
Qué registra cada ejecución
Cada ocurrencia aparece en el historial de la programación. Las publicaciones se marcan como entregadas solo cuando un lote de correos se puso realmente en cola.
Enviada
Se creó y puso en cola una Campaign, por ejemplo «1 post · 5 recipients queued». Las publicaciones se marcan como enviadas por esta programación.
Omitida: sin publicaciones nuevas
No hay ninguna publicación Lista esperando. No se envía nada y la programación vuelve a intentarlo en la siguiente ocurrencia.
Omitida: sin destinatarios
La audiencia estaba vacía. Las publicaciones siguen pendientes y se envían en cuanto la audiencia tenga contactos activos.
Fallida
Falta la plantilla o ya no contiene {{news_posts}}. Las publicaciones siguen pendientes; corrige la plantilla y ejecuta de nuevo.
Ejecutar ahora y envíos de prueba
Ejecutar ahora
Una ocurrencia real, ejecutada por el worker en cerca de un minuto. Envía las publicaciones pendientes y las marca como entregadas.
Enviar resumen de prueba
Envía las siguientes publicaciones pendientes — o, si no hay ninguna, la publicación Lista más reciente — a una dirección mediante el perfil SMTP propio de la programación. Nunca marca nada como entregado y comparte el límite de pruebas de 5 por minuto.
Edición y pausa
- Cambiar una programación de Solo plantilla a Publicaciones de noticias fija un nuevo punto de corte en ese momento; volver atrás lo borra.
- Guardar el formulario de la programación vuelve a comprobar que la plantilla contiene {{news_posts}}. Pausar y Reanudar solo cambian el interruptor de activado/desactivado y nunca lo comprueban, así que siempre puedes pausar.
- Supresión Inteligente se desactiva automáticamente en el modo Publicaciones de noticias: excluiría a todos los que recibieron una edición anterior.
- Publicaciones de noticias solo está disponible para programaciones de Boletín; las programaciones RSS mantienen su propia lógica de feed.
Cómo leer las pantallas de programaciones
- La lista de programaciones etiqueta estas programaciones como «Publicaciones de noticias» en lugar de «Boletín».
- El panel de detalle muestra cuántas publicaciones Listas esperan a esta programación.
- En el formulario, las plantillas sin {{news_posts}} aparecen marcadas, y aparece un aviso si eliges una.
Solución rápida de problemas
| Síntoma | Qué revisar |
|---|---|
| Mi publicación Lista no se envió | Comprueba que quedó Lista después de guardar la programación (o de cambiarla a Publicaciones de noticias), que la programación está activada, y mira la entrada del historial por «no recipients» o «failed». |
| La programación dice «no new posts» justo después de escribir una | La publicación puede seguir en Borrador, o ya fue enviada por esta programación. Abre Plantillas → Publicaciones y revisa la insignia y «Enviada N×». |
| No puedo guardar: la plantilla debe contener {{news_posts}} | Añade el marcador al cuerpo de la plantilla (no solo al asunto) o elige otra plantilla. |
| Quiero reenviar una publicación antigua | Copia su texto en una publicación nueva y márcala como Lista — una programación nunca envía la misma publicación dos veces. |
Settings e Infraestructura (/settings)
Gestión de múltiples relays SMTP, heartbeat de cron, 23 idiomas, diagnóstico de entregabilidad y activación de licencias.
UI Inspector de Ajustes e Infraestructura
Haga clic en cualquier componente a continuación para ver el impacto en la base de datos, procesos en segundo plano y pautas operativas
Perfiles SMTP
BYO SMTP y Relay SES GestionadoWorker y Cron
Cadencia de ejecución de 1 minuto23 Idiomas y Tema
Espejo RTL y Modo Oscuro/ClaroClaves REST API
Acceso de desarrollador con ámbitoWebhooks de Eventos
Envío de eventos HMAC-SHA256Suite de Entregabilidad
SPF, DKIM, DMARC y BIMIProveedores de AI
BYOK y Créditos MarbleSendLicencia Ed25519
Token de concesión criptográfico6.1 Arquitectura de entrega dual: BYO SMTP y Relay Amazon SES Gestionado
MarbleSend desacopla la ejecución de campañas de los relays de envío mediante dos modelos de transporte: (1) Bring Your Own (BYO) SMTP para conectar sus servidores de correo existentes, y (2) MarbleSend SMTP via Amazon SES para entrega empresarial en la nube sin configurar cuentas AWS ni calentar IPs. Las campañas se vinculan dinámicamente con respaldo predeterminado y contabilidad atómica de créditos.
Conecte cualquier proveedor SMTP estándar como Postmark, Mailgun, Brevo, SendGrid, Resend o el buzón cPanel de su hosting. Admite Puerto 587 con STARTTLS, Puerto 465 con SSL/TLS implícito y Puerto 25 para relays locales, con autenticación personalizada y encabezados de remitente aislados.
6.1.1 Proveedores de Servidores SMTP (Gratis, Comerciales y Hosting Compartido)
Directorio y Comparativa SMTPConecta tu propio transporte de correo con credenciales SMTP estándar. Elige entre relays en la nube dedicados o tus buzones de hosting.
Los buzones estándar de hosting compartido aplican límites estrictos (habitualmente 100–500 correos/día). Para campañas de marketing, actualiza a paquetes de Business Email o conecta un relay en la nube.
Optimizados para grandes volúmenes de envío y alta entregabilidad.
| Proveedor / Sitio Web | Cuota Gratuita | Precios Comerciales | Host y Puerto SMTP | Reglas y Limitaciones Clave |
|---|---|---|---|---|
| Amazon SES (Direct) | Free tier on EC2 only (62k/mo); Otherwise pay-as-you-go | $0.10 / 1,000 emails ($1 per 10k) | email-smtp.<region>.amazonaws.com Port 587 (TLS) or 465 (SSL) |
Requires AWS account setup, IAM SMTP user credentials, and sandbox exit request. |
| Brevo | 300 emails / day (Free forever) | Starter from ~$9/mo (5k emails) to ~$18/mo (20k emails) | smtp-relay.brevo.com Port 587 (TLS) |
Free tier resets daily. Great for low-volume testing without entering a credit card. |
| Mailgun (Sinch) | Trial (5,000 emails for 30 days) | Foundation: $35/mo (50,000 emails); Scale: $90/mo | smtp.mailgun.org (or smtp.eu.mailgun.org) Port 587 (TLS) or 465 (SSL) |
Robust analytics and deliverability. Supports EU data residency. |
| Twilio SendGrid | 100 emails / day (Free forever) | Essentials: ~$19.95/mo (50k emails); Pro: ~$89.95/mo | smtp.sendgrid.net Port 587 (TLS) (User: apikey) |
Requires Two-Factor Authentication. Username must literally be apikey. |
| Postmark (ActiveCampaign) | Free Developer trial: 100 emails/mo | From $15/mo (10,000 emails), $55/mo (50,000 emails) | smtp.postmarkapp.com Port 587 (TLS) or 2525 |
Industry-leading transactional speed and strict spam filters. Separate broadcast streams required. |
| Resend | 3,000 emails / month (100 / day free) | Pro: $20/mo (50,000 emails/mo) | smtp.resend.com Port 465 (SSL) or 587 (TLS) (User: resend) |
Modern developer experience, clean UI, quick domain verification via DNS. |
Los buzones cPanel estándar son aptos para correspondencia ligera, pero tienen límites estrictos para marketing masivo.
Business Email Plans (Per Mailbox)
1 GB storage, 1 forwarding rule, 1 alias, up to 100 mailboxes/domain. Standard webmail & antispam. Strict sending cap (~100-200/day).
5 GB storage, 5 forwarding rules, 5 aliases, expandable mailbox storage. No mailbox limit per domain.
20 GB storage, 20 forwarding rules, 10 aliases, AI Kodee mailbox assistant & smart replies.
50 GB storage, 50 forwarding rules, 30 aliases, full AI suite & priority deliverability.
Hostinger Reach (Email Marketing)
100 recipients, 200 emails / month. Suitable for basic transactional testing.
500 recipients, 500 emails / month, 10 AI credits, remove Reach branding, automations.
1,000 recipients, 7,000 emails / month, 20 AI credits, custom HTML code, send-time optimization.
• cPanel Shared: Max ~500 emails/hour per cPanel domain.
• Private Email: Starter (~$1.24/mo per mailbox, 5GB). Pro (~$2.82/mo, 30GB).
• SMTP Host: mail.privateemail.com (Port 465 SSL or 587 TLS).
• Shared cPanel: Default cap ~500 emails/hour. Internal mail system may defer large sudden bursts.
• Professional Email: Integrated with Microsoft 365 or Google Workspace ($2.99–$9.99/mo).
• SMTP Host: box###.bluehost.com or mail.yourdomain.com (Port 465 SSL).
• Site Tools Mail: Included in hosting (StartUp, GrowBig, GoGeek).
• Rate Limits: ~400 emails/hour on StartUp; up to ~800/hour on GoGeek. Strictly intended for transactional mail.
• SMTP Host: mail.yourdomain.com (Port 465 SSL).
• Paid Business Email: ~$1.99/mo per mailbox (25GB storage).
• Strict Outbound Policy: Maximum 100 recipients per hour. Mass marketing prohibited via shared SMTP.
• SMTP Host: smtp.dreamhost.com (Port 465 SSL or 587 TLS).
• cPanel Limit: Max 500 emails/hour per domain on shared plans.
• Workspace Option: Google Workspace addon ($6–$18/mo).
• SMTP Host: mail.yourdomain.com (Port 465 SSL or 587 TLS).
• M365 Reseller: Email Essentials from ~$1.99–$5.99/mo (10GB-50GB).
• SMTP Relay Note: Direct SMTP AUTH requires enabling Authenticated SMTP in the M365 Admin Portal.
• SMTP Host: smtp.office365.com (Port 587 TLS).
Selecciona el puerto y protocolo de seguridad adecuado según tu red.
The modern standard for email client-to-relay submission (RFC 6409). Starts in cleartext and immediately upgrades connection to TLS. Supported by almost all cloud relays.
Implicit TLS/SSL wrapper connection (RFC 8314). Required by Hostinger, Namecheap cPanel, and selected enterprise relays. Highly reliable when hosting firewalls restrict 587.
Server-to-server MTA routing. Almost universally blocked on cloud hosts (Hostinger, AWS, DigitalOcean, Hetzner, etc.) to combat spam. Do NOT use for outbound SMTP credentials.
6.1.1 Relay Amazon SES Administrado y Dominios de Remitente Personalizados
MANAGED SESInfraestructura de entrega cloud empresarial administrada por MarbleSend a través de api.marblesend.com. Elimina bloqueos de puertos SMTP, gestión de credenciales IAM y riesgos de reputación de IP en hosting compartido. Ofrece modos duales de remitente (Friendly From y Easy DKIM), créditos iniciales gratuitos, auditoría de ledger atómica y escalabilidad dinámica.
Entrega en la nube de Amazon SES preconfigurada y gestionada por MarbleSend. Cero configuración de cuenta AWS, sin gestión de credenciales IAM y sin calentamiento de IP. Recargue créditos mediante nuestro proveedor de pagos a demanda con sincronización automática de cuota en tiempo real.
Cada correo enviado mediante MarbleSend SES reserva 1 crédito de forma atómica usando la idempotencia UUID de la cola (cm_addon_ledger.uq_addon_ledger_key). Si falla la transmisión, la reserva se libera y se reembolsa al instante sin intervención manual.
El modal Test Connection realiza un handshake SMTP en vivo y un envío de prueba vía MailerFactory. Muestra el diálogo del socket en tiempo real para diagnosticar errores de autenticación (535 Auth Failed), denegación de relay (550 Relay Denied) y tiempos de espera TLS.
Cada campaña, programación periódica o respuesta automática puede vincularse a un perfil SMTP aislado mediante cm_campaigns.smtp_profile_id. Si no se asigna, el motor enruta automáticamente a través del perfil predeterminado (is_default = 1).
Ya sea con BYO SMTP o con MarbleSend SES, su dominio remitente debe tener registros SPF, DKIM y DMARC válidos. La suite de entregabilidad de 4 pilares integrada audita su DNS activamente para garantizar la llegada a la bandeja de entrada.
6.1.2 Reglas de envío con el SES Relay
Amazon SES solo funciona para remitentes que mantienen sus listas limpias, por lo que estas reglas las aplica el propio relay de MarbleSend, no solo esta aplicación. No se pueden desactivar y afectan a todos los correos enviados por el SES Relay.
Antes del primer envío, completa Settings → SMTP → Identidad del remitente y uso aceptable: nombre legal, dirección postal, país, teléfono y aceptación de la Política de Uso Aceptable. El envío sigue bloqueado hasta que se guarde. Tu nombre y dirección aparecen en el pie de cada correo; el teléfono nunca se muestra.
El cuerpo de toda campaña debe contener la etiqueta {{unsubscribe_link}}; si no, el envío se rechaza. Además, el relay añade los encabezados List-Unsubscribe y de un clic, y un pie con tu nombre, dirección, un enlace de baja y “Sent with MarbleSend”. El pie no se puede quitar.
Mientras se use el SES Relay, las páginas de registro y la API usan siempre double opt-in, el registro público exige Cloudflare Turnstile y una importación CSV requiere marcar que todos dieron su permiso. Quien se dio de baja o fue suprimido no puede volver a suscribirse desde un formulario público.
Los rebotes duros y las quejas de spam llegan a MarbleSend automáticamente y dejan al contacto como suprimido. El relay también se niega a enviar a una dirección suprimida y no consume crédito. Los rebotes suaves se reintentan y solo suprimen al contacto tras fallos repetidos.
Cada cuenta tiene un límite diario de envío (2.000 correos por defecto). Si las tasas de rebote o de quejas suben demasiado, el envío se pausa solo hasta que soporte revise la cuenta, y también se detiene si la licencia está inactiva. Un aviso en Settings → SMTP explica el motivo y los correos en cola esperan en lugar de perderse.
Los correos se firman con DKIM para marblesend.com (o para tu propio dominio una vez verificado). El return path usa mail.marblesend.com, así que SPF se alinea y DMARC pasa. Las respuestas van a la dirección Reply-To que configures.
Directorio de configuración 3 CNAME Easy DKIM (Multi-proveedor)
Guía paso a paso de configuración DNS para agregar los 3 registros CNAME Easy DKIM de AWS SES en los proveedores de hosting y registradores de dominio más populares, evitando errores comunes de sintaxis y logrando verificación instantánea.
Arquitectura DNS universal y reglas de oro
Easy DKIM delega la firma criptográfica a Amazon SES mediante 3 registros CNAME. Dado que AWS administra y rota automáticamente las claves RSA de 1024/2048 bits sin requerir actualizaciones DNS manuales, estos 3 registros CNAME deben permanecer activos de forma permanente.
| Tipo de registro | Host / Nombre | Valor / Destino / Apunta a | TTL |
|---|---|---|---|
| CNAME | <token1>._domainkey.yourdomain.com | <token1>.dkim.amazonses.com | 300 (or Auto) |
| CNAME | <token2>._domainkey.yourdomain.com | <token2>.dkim.amazonses.com | 300 (or Auto) |
| CNAME | <token3>._domainkey.yourdomain.com | <token3>.dkim.amazonses.com | 300 (or Auto) |
Regla 1: Cuidado con la trampa del "Doble Dominio"
La mayoría de registradores y paneles agregan automáticamente su dominio raíz al campo Host/Nombre. Si pega "token._domainkey.tudominio.com", el servidor DNS resolverá "token._domainkey.tudominio.com.tudominio.com", haciendo fracasar la verificación DKIM. Ingrese siempre únicamente "token._domainkey" a menos que su proveedor exija explícitamente el FQDN completo.
Regla 2: CNAME, no TXT
A diferencia de DKIM manual que emplea un registro TXT con clave pública estática, Amazon SES Easy DKIM utiliza 3 registros CNAME que apuntan a token.dkim.amazonses.com. No seleccione TXT.
Regla 3: Modo Proxy y Cloudflare Grey Cloud
Si utiliza Cloudflare u otro proxy HTTP, configure los 3 registros CNAME DKIM en Solo DNS (Nube gris / Sin proxy). El proxy HTTP oculta el destino CNAME e invalida la verificación criptográfica del correo.
# Check resolution via dig (macOS / Linux): dig CNAME <token1>._domainkey.yourdomain.com +short # Check resolution via nslookup (Windows / PowerShell): nslookup -type=CNAME <token1>._domainkey.yourdomain.com
Hostinger (Zona DNS de hPanel)
hPanel DNS| Tipo de registro | Host / Nombre | Valor / Destino / Apunta a | TTL |
|---|---|---|---|
| CNAME | <token>._domainkey (hPanel auto-appends .yourdomain.com) | <token>.dkim.amazonses.com | 300 (or 14400) |
Inicie sesión en el panel hPanel de Hostinger y vaya a Dominios.
Seleccione su dominio y haga clic en DNS / Servidores de nombres en el menú lateral izquierdo.
En Administrar registros DNS, elija CNAME en el menú desplegable Tipo.
En el campo Nombre, ingrese SOLAMENTE token._domainkey (hPanel añade automáticamente .tudominio.com).
En el campo Objetivo, ingrese token.dkim.amazonses.com y mantenga el TTL en 300 o predeterminado (14400).
Haga clic en Agregar registro. Repita el proceso para los 3 tokens de MarbleSend.
DreamHost (Panel web DreamHost)
DreamHost Web Panel| Tipo de registro | Host / Nombre | Valor / Destino / Apunta a | TTL |
|---|---|---|---|
| CNAME | <token>._domainkey (DreamHost appends .yourdomain.com) | <token>.dkim.amazonses.com | Default |
Inicie sesión en el panel de DreamHost y vaya a Sitios web > Administrar sitios web.
Ubique su dominio y haga clic en Configuración DNS (o Dominios > Administrar dominios > DNS).
Desplácese hasta la sección "Agregar un registro DNS personalizado" y haga clic en Agregar registro.
En el campo Nombre, ingrese token._domainkey (DreamHost muestra .tudominio.com automáticamente).
Seleccione Tipo CNAME e ingrese token.dkim.amazonses.com en el campo Valor.
Haga clic en Guardar / Agregar registro. Repita para los 3 tokens.
Namecheap (DNS Avanzado)
Advanced DNS| Tipo de registro | Host / Nombre | Valor / Destino / Apunta a | TTL |
|---|---|---|---|
| CNAME Record | <token>._domainkey (never paste root domain here) | <token>.dkim.amazonses.com | Automatic (or 1 min) |
Inicie sesión en Namecheap, vaya a Domain List y haga clic en Manage junto a su dominio.
Haga clic en la pestaña Advanced DNS en la parte superior.
En la sección Host Records, haga clic en el botón rojo ADD NEW RECORD.
Seleccione CNAME Record en el menú desplegable Type.
En el campo Host, ingrese ÚNICAMENTE token._domainkey (nunca incluya su dominio).
En Target, escriba token.dkim.amazonses.com, configure TTL en Automatic (o 1 min) y guarde con la marca verde ✓. Repita para los 3 registros.
Bluehost (Administrador de cuentas / Zone Editor)
Bluehost DNS| Tipo de registro | Host / Nombre | Valor / Destino / Apunta a | TTL |
|---|---|---|---|
| CNAME | <token>._domainkey (Bluehost handles suffix automatically) | <token>.dkim.amazonses.com | 4 Hours (or Default) |
Inicie sesión en Bluehost, haga clic en Dominios y elija su dominio.
Vaya a la pestaña DNS (o abra cPanel Zone Editor si utiliza hosting cPanel tradicional).
Desplácese hasta la sección CNAME (Alias) y haga clic en Add Record.
En el campo Host Record, ingrese token._domainkey.
En Points To, ingrese token.dkim.amazonses.com y seleccione el TTL (4 Hours o Default).
Haga clic en Guardar. Repita para los 2 tokens CNAME restantes.
SiteGround (Editor de zona DNS de Site Tools)
Site Tools DNS| Tipo de registro | Host / Nombre | Valor / Destino / Apunta a | TTL |
|---|---|---|---|
| CNAME | <token>._domainkey (Site Tools appends .yourdomain.com) | <token>.dkim.amazonses.com | 1 hour (3600) |
Inicie sesión en SiteGround, vaya a Sitios web y abra Site Tools de su dominio.
En el menú lateral izquierdo, expanda Dominio y haga clic en Editor de zona DNS.
Seleccione la pestaña CNAME en Crear nuevo registro.
En el campo Nombre, ingrese token._domainkey (Site Tools añade .tudominio.com automáticamente).
En Resuelve a, ingrese token.dkim.amazonses.com y deje el TTL en 1 hora (3600).
Haga clic en Crear. Repita para los 3 tokens.
HostGator (cPanel Zone Editor)
cPanel Zone Editor| Tipo de registro | Host / Nombre | Valor / Destino / Apunta a | TTL |
|---|---|---|---|
| CNAME | <token>._domainkey (cPanel automatically appends dot) | <token>.dkim.amazonses.com | 14400 (or 3600) |
Inicie sesión en el Portal de HostGator y abra cPanel.
En la sección Dominios, haga clic en Zone Editor.
Busque su dominio y haga clic en + CNAME Record (o Administrar > Agregar registro).
En Nombre, ingrese token._domainkey (cPanel lo completa automáticamente con su dominio y un punto final).
En CNAME / Record, ingrese token.dkim.amazonses.com.
Haga clic en Add a CNAME Record. Repita para los 3 tokens.
GoDaddy (Portafolio de dominios DNS)
GoDaddy DNS| Tipo de registro | Host / Nombre | Valor / Destino / Apunta a | TTL |
|---|---|---|---|
| CNAME | <token>._domainkey (never include root domain in GoDaddy) | <token>.dkim.amazonses.com | 1/2 Hour (or Default) |
Inicie sesión en su cuenta de GoDaddy y vaya a Mis productos.
En Dominios, localice su dominio y haga clic en DNS (o en los tres puntos > Administrar DNS).
En la sección Registros DNS, haga clic en Agregar nuevo registro.
Elija CNAME en el menú desplegable Tipo.
En el campo Nombre, escriba ÚNICAMENTE token._domainkey (¡no incluya .tudominio.com!).
En Valor, ingrese token.dkim.amazonses.com, configure el TTL en 1/2 hora (o Default) y guarde. Repita para los 3 registros.
Tras guardar los 3 registros CNAME, la propagación DNS suele demorar entre 5 y 30 minutos (hasta 24–48 horas según el TTL). Regrese a MarbleSend Configuración > SMTP, abra la tarjeta de dominio remitente personalizado y haga clic en "Verificar DNS". Una vez validado por Amazon SES, el estado cambiará a Verificado.
6.2 Heartbeat del Worker en Segundo Plano, Cron de 1 Minuto y Concurrency Guard
MarbleSend envía correo en segundo plano. Un cron job es un temporizador en su panel de hosting que despierta a MarbleSend cada minuto para que pueda ejecutar programaciones y autoresponders, reintentar envíos fallidos, recoger bounces y mantener en marcha una Campaign larga. Una Campaign que usted envía empieza de inmediato, pero todo lo que deba ocurrir después depende de este temporizador. Si Settings → Sistema muestra Cron No Detectado, el temporizador no existe, no se ejecuta cada minuto o apunta al lugar equivocado. Los tres pasos siguientes lo resuelven.
Abra Settings → Sistema, busque Comando Cron Job y haga clic en Copiar Comando. La línea ya contiene el folder correcto y, cuando su servidor nos lo indica, el PHP correcto. Úsela exactamente como está; los ejemplos más abajo en esta página solo muestran la forma de una línea. Si Settings indica que no pudo detectar PHP, pregunte a su proveedor por la ruta de PHP en línea de comandos y sustituya la palabra php al principio de la línea.
Elija su proveedor abajo. Los nombres de menú cambian de vez en cuando, así que busque la coincidencia más cercana. En cualquier panel, el job debe ejecutarse cada minuto (* * * * *) y su comando es la línea del Paso 1. Plesk, DirectAdmin y otros paneles lo llaman Scheduled Tasks o Cron Jobs.
Hostinger (hPanel)
- Abra hPanel → Websites → Dashboard de su sitio y haga clic en Cron Jobs en la barra lateral.
- Ponga Type en Custom. (El tipo PHP solo acepta la ruta de un file .php; su línea también contiene el comando PHP.)
- Pegue la línea del Paso 1 en Command to run.
- Ponga la programación en cada minuto, o escriba * * * * *.
- Haga clic en Save. El job aparece en List of Cron Jobs, donde también puede leer su última salida.
Hostinger ejecuta los cron jobs en UTC. El plan Single permite 2 cron jobs; Premium y superiores no tienen límite.
Namecheap
Abra cPanel desde su cuenta de hosting de Namecheap y siga estos pasos.
- Abra cPanel y, en la sección Advanced, haga clic en Cron Jobs.
- En Add New Cron Job, elija Once Per Minute (* * * * *) en Common Settings.
- Pegue la línea del Paso 1 en Command.
- Haga clic en Add New Cron Job. Desde ahora el job se ejecuta cada minuto.
Namecheap no permite en servidores compartidos cron jobs que se ejecuten con más frecuencia que cada 5 minutos, ni más de 5 cron jobs. Use Web-Cron más abajo si necesita cada minuto.
Bluehost
- Inicie sesión en Bluehost Portal, haga clic en Websites y luego en Manage Site para su sitio.
- Abra la pestaña Advanced, busque Cron Jobs y haga clic en Manage y luego en Add Cron.
- Elija una frecuencia en Common Settings (o rellene Minute, Hour, Day, Month y Weekday).
- Pegue la línea del Paso 1 en Command y haga clic en Add.
La propia documentación de Bluehost dice que el hosting compartido solo ejecuta cron jobs cada 15 minutos o más (una página dice 5 minutos). Use Web-Cron más abajo si necesita cada minuto.
HostGator
En Customer Portal abra Websites → Manage Site → Advanced y, en Cron Jobs, haga clic en Manage y Add Cron. El formulario tiene los mismos campos que cPanel, así que los pasos de abajo se aplican. O abra cPanel → Advanced → Cron Jobs.
- Abra cPanel y, en la sección Advanced, haga clic en Cron Jobs.
- En Add New Cron Job, elija Once Per Minute (* * * * *) en Common Settings.
- Pegue la línea del Paso 1 en Command.
- Haga clic en Add New Cron Job. Desde ahora el job se ejecuta cada minuto.
Las páginas de ayuda de HostGator no indican el intervalo más corto permitido en hosting compartido. Si rechaza cada minuto, use Web-Cron más abajo.
GoDaddy
En la página de su producto de GoDaddy, junto a Linux Hosting haga clic en Manage, luego en cPanel Admin y siga estos pasos.
- Abra cPanel y, en la sección Advanced, haga clic en Cron Jobs.
- En Add New Cron Job, elija Once Per Minute (* * * * *) en Common Settings.
- Pegue la línea del Paso 1 en Command.
- Haga clic en Add New Cron Job. Desde ahora el job se ejecuta cada minuto.
Las páginas de ayuda de GoDaddy no indican el intervalo más corto permitido. Si rechaza cada minuto, use Web-Cron más abajo.
DreamHost
- Abra el panel de DreamHost, vaya a Cron Jobs y haga clic en Add New Cron Job.
- Elija un usuario (un usuario SFTP o shell existente), dé un título al job y, opcionalmente, una dirección de correo para su salida.
- Pegue la línea del Paso 1 en Command. DreamHost guarda PHP en rutas como /usr/local/php83/bin/php (use su versión de PHP).
- Configure el horario y active locking para que dos ejecuciones nunca se solapen, y guarde.
En el horario personalizado, el panel permite elegir como máximo 12 minutos distintos por hora, así que la programación regular más corta que puede crear es cada 5 minutos. Las horas son de la zona del Pacífico. Use Web-Cron más abajo si necesita cada minuto.
SiteGround
- Abra Site Tools → Devs → Cron Jobs.
- Elija el intervalo de la lista (o configure minuto, hora, día, mes y día de la semana).
- Pegue la línea del Paso 1 en Command. La dirección de correo para la salida es opcional.
- Haga clic en Create.
La documentación de SiteGround muestra ajustes predefinidos como Twice Per Hour y no indica el intervalo más corto. Si su plan no tiene la opción de cada minuto, use Web-Cron más abajo.
- Abra Settings → Sistema y copie la Web-Cron URL. Manténgala privada: contiene su token secreto.
- Cree una cuenta gratuita en un servicio de cron como cron-job.org.
- Cree un job, pegue la URL y configúrelo para que se ejecute cada minuto. Guárdelo y actívelo.
- Use Web-Cron o un cron job de su proveedor, no ambos: uno basta.
Espere uno o dos minutos y recargue Settings → Sistema. La insignia debe decir Activo y Último Latido debe mostrar una hora del último minuto. Estado del sitio en la misma página debe mostrar el worker como Correcto. Si su proveedor solo permite un job cada 5 o 15 minutos, la insignia puede alternar entre Activo y Cron No Detectado, porque espera una ejecución en los últimos 5 minutos; el correo sigue saliendo cada vez que el worker se ejecuta.
- El comando PHP es incorrecto. Pregunte a su proveedor por la ruta de PHP en línea de comandos (por ejemplo /opt/alt/php83/usr/bin/php en Hostinger o /usr/local/bin/php en muchos hostings cPanel) y sustituya php al principio de la línea.
- Solo se pegó parte de la línea. Pegue la línea completa, incluido >/dev/null 2>&1 al final.
- El folder es incorrecto. worker.php está en el folder que contiene public, no dentro de public.
- Para ver el error, ejecute el job una vez sin >/dev/null 2>&1 y lea su salida. Un worker que funciona imprime una línea como worker.php: processed=0.
- El job es de otro sitio de la misma cuenta. Compruebe el folder en el comando.
- Dele hasta 5 minutos después de guardar antes de volver a comprobar.
Para usuarios técnicos
La compilación de correos electrónicos, la resolución de consultas de audiencia, el despacho de entregas y el procesamiento de webhooks funcionan de forma asíncrona mediante un worker en segundo plano de 1 minuto. MarbleSend emplea una arquitectura de doble punto de entrada (CLI nativa worker.php o HTTP cron.php) protegida por bloqueos de archivos no bloqueantes para eliminar ejecuciones superpuestas en shared hosting con recursos limitados.
* * * * * php /home/USER/your-folder/worker.php >/dev/null 2>&1
Se ejecuta directamente desde el shell del sistema operativo (* * * * * php /ruta/a/worker.php >/dev/null 2>&1). Omite por completo los límites de tiempo de espera y pasarela HTTP, lo que lo convierte en la opción ideal en cPanel, Plesk y DirectAdmin.
GET https://your-domain.com/cron.php?token=SECURE_TOKEN
Para entornos de hosting sin acceso a crontab de shell, hacer ping a GET /cron.php?token=SECURE_TOKEN a través de servicios de terceros (como cron-job.org o UptimeRobot) activa exactamente el mismo procesamiento de cola de forma segura.
El worker bloquea storage/worker.lock con flock(LOCK_EX | LOCK_NB) al iniciar. Si una ejecución previa aún procesa una cola pesada, las ejecuciones posteriores salen limpiamente sin condiciones de carrera ni agotamiento de memoria.
Reclama lotes de 50 elementos de cola de forma atómica mediante consultas de estado indexadas. Las entregas fallidas incurren en un backoff exponencial con contadores de reintentos hasta max_attempts antes de pasar a estado fallido.
6.3 23 Idiomas Nativos, RTL Árabe y Máquina de Seguridad de Administrador
MarbleSend está diseñado como una plataforma autoalojada internacional. Incluye 23 diccionarios de idiomas nativos completos seleccionados por humanos, duplicación automática de diseño de derecha a izquierda para árabe, personalización de tema tri-state persistente y un perímetro de seguridad de inquilino único inquebrantable.
Los archivos de idioma en app/lang/*.php son matrices PHP puras cargadas en memoria en tiempo submilimétrico, sin necesidad de binarios de servidor gettext ni dependencias de API de traducción externa.
Al seleccionar árabe (ar) se inyecta automáticamente dir='rtl' en la raíz del documento HTML, reflejando barras laterales de navegación, columnas de tablas, paneles y símbolos de contenido en toda la interfaz.
Permite alternar sin problemas entre Dark Palette, Light Palette y la preferencia del sistema operativo. La selección activa se guarda en cookies (marblesend_theme) para garantizar cero desplazamientos de diseño al cargar.
Las credenciales de administrador almacenadas en cm_settings.admin_user se cifran con bcrypt con factor de trabajo 12. Protege contra la fijación de sesiones mediante la regeneración automática de ID de sesión al iniciar sesión.
6.3.1 Autenticación de dos factores (TOTP) y configuración del código QR
La autenticación de dos factores añade un segundo candado a la cuenta de administrador: tras la contraseña, MarbleSend pide un código de 6 dígitos que cambia cada 30 segundos y que solo tu teléfono puede generar. Es opcional, se activa en aproximadamente un minuto y funciona con cualquier aplicación de autenticación estándar, como Google Authenticator, Microsoft Authenticator, 1Password, Bitwarden, Authy o Aegis. La encontrarás en Settings → Idioma y Cuenta → Autenticación en dos pasos (TOTP).
MarbleSend usa el estándar abierto TOTP (RFC 6238: HMAC-SHA1, 6 dígitos, intervalos de 30 segundos). Al activarlo se crea un secreto aleatorio que se comparte una sola vez con tu aplicación. Desde entonces, iniciar sesión requiere la contraseña y luego un código vigente. Un código ya usado no puede reutilizarse y el segundo paso caduca a los 5 minutos.
1) Abre Settings → Idioma y Cuenta y pulsa Activar. 2) En tu aplicación de autenticación elige “Escanear código QR” y escanea el cuadrado que aparece en pantalla. 3) Escribe el código de 6 dígitos que muestra ahora tu aplicación y pulsa “Confirmar y activar”. 4) Guarda los ocho códigos de recuperación que aparecen una sola vez: cópialos en un gestor de contraseñas o imprímelos.
La imagen QR la dibuja tu propia instalación como un pequeño gráfico vectorial; el secreto nunca se envía a un generador de QR en línea ni a terceros. Si no puedes escanear (por ejemplo, porque la aplicación está en el mismo teléfono), usa la clave de configuración o el enlace otpauth que aparece bajo el código QR. El secreto se guarda cifrado (AES-256-GCM) con tu ENCRYPTION_KEY, como el resto de credenciales.
Tras la contraseña correcta se te pide el código de 6 dígitos. Los códigos erróneos tienen límite de intentos por cuenta, así que adivinar no es viable. Si se rechazan códigos que escribes bien, comprueba que la fecha y la hora del teléfono estén en automático; un reloj incorrecto genera códigos incorrectos.
Al activar 2FA se crean ocho códigos de un solo uso. Cada uno sirve una vez en el campo del código en lugar del código de 6 dígitos. Solo se guardan como hashes, por lo que no pueden mostrarse de nuevo; usa “Nuevos códigos de recuperación” (requiere un código vigente) para reemplazar todo el conjunto, lo que invalida los anteriores.
El enlace por correo para una contraseña olvidada no se salta la verificación en dos pasos (2FA), a propósito, así que aquí no sirve. En el servidor, ejecuta “php tools/reset-admin.php” (SSH o el terminal de tu hosting): restablece la contraseña de administrador, borra los bloqueos, cierra todas las sesiones y desactiva 2FA; después puedes activarla de nuevo con el dispositivo nuevo. Para desactivarla normalmente, usa Desactivar en la misma tarjeta (contraseña más un código vigente o de recuperación).
6.3.2 Protección del registro (Cloudflare Turnstile): consigue tus claves gratuitas
Turnstile es la alternativa gratuita y respetuosa con la privacidad de Cloudflare frente a CAPTCHA. Cuando está activado, tus páginas de registro públicas (los formularios /s/tu-pagina y /subscribe) comprueban que el visitante es una persona real antes de aceptar una suscripción, lo que evita que los bots inunden tu lista y tus correos de confirmación. Funciona junto al honeypot integrado y los límites por IP y por dirección, y es opcional, salvo mientras envíes por el SES Relay (consulta la última nota). Necesitas dos claves, una Site key (pública) y una Secret key (privada), de tu propia cuenta gratuita de Cloudflare; tu dominio no tiene que usar Cloudflare para el DNS.
Ve a dash.cloudflare.com y regístrate (es gratis) o inicia sesión. No necesitas añadir tu sitio web a Cloudflare ni cambiar tu DNS para usar Turnstile.
En el menú del panel abre “Turnstile” (o búscalo) y pulsa “Add widget” (los paneles antiguos dicen “Add site”). Los nombres de los menús cambian de vez en cuando; busca Turnstile en Application security.
Dale cualquier nombre, por ejemplo “MarbleSend signup”. En Hostname añade el dominio donde funciona MarbleSend, sin https:// ni ruta, por ejemplo app.tudominio.com. Si tus páginas de registro se muestran en otro dominio, añádelo también. Añade localhost solo mientras pruebas en tu propio ordenador.
Elige Managed (recomendado): la mayoría de los visitantes pasa sin ningún puzzle y Cloudflare pide un clic rápido solo cuando una visita parece sospechosa. Non-interactive muestra una barra de progreso breve sin clics e Invisible no muestra nada. Deja pre-clearance desactivado y pulsa Create.
Cloudflare muestra una Site key (pública) y una Secret key (privada). Copia ambas. El secreto solo lo usa tu servidor para confirmar cada visitante con Cloudflare, así que nunca lo pegues en un sitio público. Puedes verlo o rotarlo más tarde en los ajustes del widget.
Abre Settings → Idioma y Cuenta → Protección del registro (Cloudflare Turnstile), pega la Site key y la Secret key y pulsa Guardar. La insignia cambia a “La protección está ACTIVADA”. Para desactivarlo después, vacía ambos campos y guarda. El secreto guardado se almacena cifrado y no se vuelve a mostrar; deja el campo vacío para conservarlo.
Abre una de tus páginas públicas de registro en una ventana privada del navegador: el widget de Turnstile aparece encima del botón. Suscríbete con una dirección de prueba y deberías recibir el correo de confirmación. Un envío que no haya superado la comprobación se rechaza.
Si tu servidor no puede llegar al servicio de verificación de Cloudflare (una caída o una conexión saliente bloqueada), MarbleSend normalmente deja pasar el registro y registra el evento en lugar de bloquear a todos los visitantes; el honeypot y los límites por IP y por dirección siguen aplicándose. Mientras envíes por el SES Relay ocurre lo contrario y falla en modo cerrado: los registros se rechazan hasta que Cloudflare vuelva a estar accesible.
Cloudflare publica claves de prueba: la Site key 1x00000000000000000000AA con la Secret key 1x0000000000000000000000000000000AA siempre pasa. Nunca protegen un sitio real, así que sustitúyelas por tus propias claves antes de publicar.
El widget no aparece: comprueba que el hostname de la página figura en el widget de Turnstile y que ninguna extensión del navegador bloquea challenges.cloudflare.com. “Invalid site key”: la Site key se copió con un espacio o pertenece a otro widget. Se rechaza a visitantes reales: pega de nuevo la Secret key; debe pertenecer al mismo widget que la Site key.
Si envías por el Managed Amazon SES Relay, Turnstile es obligatorio en los formularios de registro públicos. Hasta que guardes las dos claves, la página de registro muestra «el registro no está disponible temporalmente» y Settings → Idioma y Cuenta muestra un aviso con un botón que te lleva a la tarjeta correcta. En este modo, además, cada nuevo suscriptor debe confirmar por correo (double opt-in), aunque una página de registro o una llamada a la API pida single opt-in.
6.4 Claves REST API con Ámbito y Acceso Programático para Desarrolladores
La REST API permite que sitios web externos, landing pages, aplicaciones móviles y el plugin oficial de WordPress MarbleSend Forms interactúen de forma segura con su base de datos de contactos y motor de transmisión. Las claves API utilizan prefijos criptográficos, almacenamiento SHA-256 unidireccional y delimitación granular de capacidades.
Las claves se generan con el prefijo ms_ seguido de 32 bytes aleatorios criptográficamente seguros mediante random_bytes(24). La clave en bruto se revela solo una vez durante la creación y nunca se puede volver a recuperar.
Solo el hash SHA-256 (hash('sha256', $rawKey)) se almacena en cm_api_keys.key_hash. Incluso si se lee la base de datos directamente, los tokens activos no se pueden descifrar ni recuperar.
Restrinja las claves a capacidades específicas: contacts:read, contacts:write, campaigns:read, campaigns:write, campaigns:send, schedules:read y schedules:write para un control estricto de privilegios mínimos.
Las solicitudes entrantes se autentican a través de encabezados Authorization: Bearer ms_... evaluados con hash_equals(). Los registros registran la marca de tiempo exacta last_used_at en cada llamada exitosa.
6.5 Webhooks de Eventos Salientes y Entrega Criptográfica HMAC-SHA256
Los eventos de contacto (subscribed, confirmed, unsubscribed, suppressed) ahora incluyen un array groups de {id, name} junto a tags.
Los webhooks proporcionan transmisión de eventos HTTP en tiempo real a endpoints externos, lo que permite que las sincronizaciones de CRM, notificaciones de Slack o flujos de trabajo personalizados reaccionen instantáneamente ante suscripciones, envíos, bajas y rebotes duros.
Suscríbase a activadores críticos: contact.created, contact.unsubscribed, campaign.sent, campaign.bounced y link.clicked con activación individual por webhook.
Cada solicitud POST de webhook incluye X-MarbleSend-Signature: sha256=... generado usando hash_hmac('sha256', $payload, $secret), lo que permite a los servidores receptores verificar la autenticidad.
Las entregas de webhooks fallidas (HTTP 5xx o tiempos de espera) desencadenan reintentos de backoff exponencial. Los endpoints con fallas consecutivas se pausan automáticamente para evitar sobrecarga del servidor.
El botón Test Webhook envía cargas útiles simuladas de inmediato. El panel de historial de entregas muestra códigos de estado de respuesta HTTP, latencia de ejecución en milisegundos y mensajes de error.
6.6 Suite de Entregabilidad de 4 Pilares (SPF, DKIM, DMARC, BIMI)
La entregabilidad del correo electrónico determina si sus mensajes llegan a la bandeja de entrada o se desvían a spam. MarbleSend cuenta con un motor de inspección DNS integrado que ejecuta cuatro consultas secuenciales no bloqueantes directamente en nameservers autorizados sin dependencias de API de terceros.
Consulta los registros TXT raíz en busca de la sintaxis v=spf1. Verifica los mecanismos de host SMTP autorizados, señala los límites de búsqueda DNS (>10 búsquedas causan hardfail) y verifica los calificadores de aplicación (~all o -all).
Inspecciona selector._domainkey.domain.com para validar claves criptográficas públicas RSA o Ed25519. Garantiza que los encabezados de correo saliente se puedan verificar criptográficamente contra los dominios del remitente.
Verifica _dmarc.domain.com en busca de etiquetas de directiva (p=none, p=quarantine o p=reject). En 2026, los requisitos para remitentes masivos de Gmail y Yahoo exigen registros DMARC activos con informes rua.
Consulta default._bimi.domain.com en busca de archivos de logotipo de marca SVG Tiny P.S. y certificados de marca verificada (VMC), habilitando avatares verificados directamente en Gmail, Yahoo y Apple Mail.
6.7 Motor IA de modo dual: Proveedores BYOK y Créditos IA MarbleSend
MarbleSend proporciona un motor de IA versátil de modo dual para redacción, generación de asuntos y auditoría de spam: (1) Bring Your Own Key (BYOK) para conectar directamente con los principales modelos LLM sin márgenes, y (2) Créditos IA MarbleSend para acceso inmediato pay-as-you-go a modelos selectos sin administrar claves API.
Conéctese directamente a OpenAI, Anthropic Claude, Google Gemini, DeepSeek, Moonshot, OpenRouter o instancias privadas de Ollama. Las claves API se cifran en reposo con AES-256-GCM. Las peticiones van directo de su servidor a la API del proveedor sin cargos intermedios.
Créditos de IA prepagados gestionados directamente a través de MarbleSend. Incluye modelos selectos de alta eficiencia calibrados para la conversión y entregabilidad en email marketing. El servidor gestiona el enrutamiento y las actualizaciones de modelos dinámicamente, deduciendo 1 crédito por generación atómicamente.
Official add-on pricing is retrieved dynamically from admin.marblesend.com. Purchase top-up credit packs via global and local payment gateways with instant real-time balance activation.
All BYOK credentials are encrypted at rest with hardware-accelerated AES-256-GCM using your installation's unique APP_KEY. No prompt contents, contact lists, or recipient emails are ever stored or logged by the license server.
6.7.1 Selección de Modelo Predeterminado y Enrutamiento de Ejecución
Define cómo MarbleSend enruta la redacción con IA, sugerencias de asuntos y auditorías de entregabilidad en la aplicación. Puede alternar entre relays curados del proveedor y proveedores BYOK directos.
Acceso sin configuración a modelos curados de alto rendimiento optimizados para conversión de correo. Sin necesidad de cuentas de desarrollador externas ni claves API.
Comunicación directa de servidor a proveedor sin sobrecostes. Seleccione cualquier proveedor configurado e identificador de modelo como su motor predeterminado.
Templates Studio, el Inspector de Asuntos con IA y AI Assist ejecutan automáticamente según la selección activa con respaldo fluido ante agotamiento de saldo.
La selección activa se guarda en cm_settings.ai_provider_default, garantizando sincronización en todas las sesiones de administrador y tareas worker.
6.7.2 Créditos de IA MarbleSend y Hub de Relay Administrado
Los Créditos de IA MarbleSend brindan infraestructura instantánea de pago por uso para redacción de correos sin complicaciones de facturación, cuotas o límites de terceros.
Cada licencia activada recibe créditos de IA iniciales gratuitos obtenidos dinámicamente del servidor de licencias para evaluar AI Assist de inmediato.
Las generaciones descuentan exactamente 1 crédito por solicitud mediante cm_addon_ledger. UUIDs de transacción únicos evitan cobros duplicados en reintentos de red.
Los paquetes de créditos (ej. ai_100) se cargan dinámicamente desde el catálogo edge del proveedor. Pagos procesados de forma segura por nuestro proveedor de pagos.
Los eventos webhook acreditan su cuenta de inmediato tras completar el pago. Un botón de actualización manual en 1 clic brinda sincronización instantánea con el servidor.
6.7.3 Proveedores Configurados e Infraestructura BYOK
Conecte y orqueste múltiples proveedores de LLM externos con almacenamiento de claves cifrado, protocolos de API duales y diagnósticos de conexión instantáneos.
Mantenga conexiones simultáneas a OpenAI, Anthropic Claude, Google Gemini, DeepSeek, Kimi/Moonshot, OpenRouter o instancias privadas de Ollama.
Compatible con endpoints estándar de OpenAI (/chat/completions) y formato de mensajes de Anthropic (/v1/messages) con URLs base proxy personalizadas.
Todas las claves API de BYOK se cifran en reposo con aceleración de hardware AES-256-GCM. Las claves nunca se exponen en respuestas HTML ni registros del sistema.
El botón de prueba de conexión envía una sonda ligera para verificar credenciales y registrar latencia de ida y vuelta (ms) antes de usar modelos en producción.
Cómo Obtener API Keys en los Principales Proveedores
MarbleSend se conecta directamente a los proveedores de IA mediante BYOK sin intermediarios. A continuación encontrará enlaces oficiales, pasos de generación y directorios de modelos:
Proveedores Locales, Autoalojados y Alternativos (Ollama, Groq, Mistral, GLM)
Para IA local sin costos, instale Ollama (ollama.com), ejecute su modelo (ej.: ollama run llama3.1), asigne la Base URL a http://localhost:11434/v1, seleccione formato OpenAI y active "No Auth". Para inferencia veloz en la nube, regístrese en console.groq.com.
Configuración de AI Providers en Settings (/settings)
Una vez obtenida la API key y el ID del modelo, configúrelo en MarbleSend siguiendo estos pasos:
En la barra lateral, haga clic en Settings y acceda a la pestaña "AI Providers" (o directamente en /settings).
Haga clic en un preset de Quick Add (OpenAI, DeepSeek, Gemini, Anthropic, etc.) para autocompletar o use "+ Add Provider".
Seleccione formato de protocolo: "OpenAI format" o "Anthropic format". Confirme la Base URL correspondiente.
Pegue su clave. MarbleSend la guarda cifrada con AES-256-GCM mediante Crypto.php sin exposición en texto plano.
Ingrese el ID del modelo y context window, luego haga clic en "Test Connection" para validar el handshake en vivo antes de guardar.
En "Default AI Model" en la parte superior, seleccione el proveedor y modelo configurados y haga clic en "Save Default".
6.8 Motor de Token de Concesión de Licencia Criptográfica Ed25519
MarbleSend verifica la autenticidad del producto mediante criptografía asimétrica Ed25519 a través de la extensión libsodium nativa de PHP. Se emite un License Grant Token firmado tras la activación inicial y se valida localmente sin demandas constantes de conexión.
Valida la firma digital con sodium_crypto_sign_verify_detached(). Cualquier manipulación manual en la base de datos rompe inmediatamente la firma matemática, asegurando una integridad absoluta.
El token firmado incrusta el nombre de host del dominio con licencia, el nivel de licencia (Regular o Extended) y los derechos activos. Los traslados multidominio se pueden iniciar directamente desde la interfaz de ajustes.
Las caídas temporales de red o el mantenimiento del servidor de licencias nunca interrumpirán las transmisiones de correo electrónico ni la ejecución del cron. MarbleSend proporciona un margen de gracia de 7 días antes de restringir los envíos.
Si una licencia caduca, MarbleSend aplica un soft-lock elegante: los datos de suscriptores, campañas, informes y herramientas de exportación existentes siguen siendo 100% accesibles, mientras que el lanzamiento de nuevas campañas se pausa.
Una vez al día, el worker pregunta al servidor de licencias si existe una versión más reciente. Solo envía tu código de compra y la versión instalada, igual que la comprobación manual. Desactívalo con «Actualizaciones de versiones» en esta pestaña: no se hace ninguna comprobación ni se muestra el aviso de actualización. Las instalaciones de desarrollo (APP_ENV=local) nunca hacen esta llamada. Nunca se envía nada sobre tus contactos o Campaigns.
«Registro de cambios» (barra lateral, encima de Documentación) lista cada versión con su guía de actualización. Cuando existe una versión más reciente ves un aviso en el panel (una actualización de seguridad muestra un aviso rojo en todas las páginas y no se puede cerrar), un punto junto a «Registro de cambios» y, si está activado, un correo por versión a la dirección del administrador mediante tu perfil SMTP predeterminado. Las notas de versión están escritas en inglés.
Preguntas frecuentes y diagnóstico
Soluciones inmediatas para los problemas más comunes en hosting compartido.
7.1 Diagnóstico operativo del Dashboard
7.1.1 ¿Por qué el Dashboard muestra el estado "Worker Not Detected" o inactivo?
El crontab del sistema operativo no se ejecuta, la ruta de PHP CLI es incorrecta o un file de bloqueo residual impide la ejecución.
El worker actualiza cm_settings.worker_last_run con una marca de tiempo UTC en cada ciclo. El dashboard señala inactividad si han pasado más de 180 segundos.
Vaya a Settings → System. Copie la línea exacta de crontab. Si el crontab por CLI está restringido, configure la URL de Web-Cron en cron-job.org cada 1 minuto. Si el bloqueo persiste, revise storage/worker.lock.
7.1.2 ¿Por qué difieren las tasas de apertura y clics entre las tarjetas KPI del Dashboard y los registros del proveedor SMTP?
Pre-obtención por Apple Mail Privacy Protection (MPP), almacenamiento en proxy, bloqueo de imágenes por el destinatario o bloqueadores que eliminan parámetros UTM.
MarbleSend inserta un GIF de seguimiento transparente de 1x1 en los correos salientes para registrar cm_email_logs.opened_at. Si el destinatario bloquea imágenes, la apertura no se registra; Apple MPP descarga imágenes inmediatamente en sus servidores.
Considere los clics únicos (CTR) como la métrica primordial de interacción. MarbleSend redirige los enlaces del template a través de public/click.php para registrar clics verificados.
7.2 Diagnóstico de envío de Campaign y Preflight
7.2.1 ¿Por qué se detuvo o pausó mi broadcast de campaign en pleno envío?
Límites de tiempo de ejecución de PHP CLI o del servidor web en shared hosting (max_execution_time 30s/60s) alcanzados durante envíos masivos.
MarbleSend procesa la cola en lotes atómicos de 50 destinatarios. Al acercarse al límite de tiempo, el worker finaliza limpiamente y guarda el progreso en cm_email_queue para no agotar la memoria.
¡No requiere intervención manual! El siguiente ciclo de cron de 1 minuto procesará automáticamente el siguiente lote pendiente de cm_email_queue sin duplicar correos.
7.2.2 ¿Por qué el Preflight Check automatizado de 6 puntos bloquea el lanzamiento de mi campaign?
Falta el token obligatorio {{unsubscribe_link}}, asunto inválido, cero destinatarios activos seleccionados o syntax de token sin cerrar.
El motor de Preflight analiza 6 vectores de cumplimiento normativo y deliverability antes de autorizar el cambio de estado a queued o sending.
Revise los avisos rojos en el modal de preflight de la campaign. Inserte {{unsubscribe_link}} (obligatorio por RFC 8058 y CAN-SPAM) y compruebe que las etiquetas coincidan con contacts activos.
7.2.3 ¿Cuándo se activa "Resend to Non-openers" y cómo evita saturar a los suscriptores?
El botón de acción en el reporte de campaign permanece deshabilitado mientras el envío sigue en curso o no ha transcurrido un periodo de enfriamiento prudencial.
MarbleSend requiere que la campaign tenga status = completed y recomienda aguardar entre 24 y 48 horas para dar tiempo a destinatarios en distintas zonas horarias.
Una vez concluida, haga clic en "Resend to Non-openers". Esto crea una nueva campaign secundaria dirigida exclusivamente a contacts con opened_at IS NULL, permitiendo probar un asunto alternativo.
7.3 Gestión de Contacts, importación CSV y rebotes
7.3.1 ¿Por qué el importador CSV omitió filas o no pudo importar ciertos record de suscriptores?
Syntax de correo inválida según RFC 5322, direcciones duplicadas con "Skip Duplicates" activo, codificación distinta de UTF-8 o contacts suprimidos.
MarbleSend analiza cada fila, valida la syntax mediante filter_var(FILTER_VALIDATE_EMAIL) y coteja contra cm_contacts para no sobreescribir estados unsubscribed o bounced.
Asegúrese de guardar su file CSV en UTF-8 sin BOM. Verifique el mapeo de columnas (email, name, tags). Revise el modal de importación para comprobar los números de línea omitidos.
7.3.2 ¿Cómo gestiona MarbleSend los rebotes suaves (Soft Bounces) frente a los duros (Hard Bounces)?
Fallos definitivos de entrega (códigos de error SMTP 5xx: buzón inexistente) frente a fallos transitorios (códigos de error SMTP 4xx: buzón lleno, límite de tasa).
Una respuesta 5xx cambia inmediatamente el estado del contact a bounced. Una respuesta 4xx registra un intento en cm_email_logs y reintenta hasta 3 veces antes de marcar bounced.
No intente reactivar contacts con rebote duro (hard bounce). Hacerlo dañará severamente la reputación de su dominio de envío ante proveedores como Gmail y Yahoo.
7.4 Renderizado de Templates, Outlook y diseño email-safe
7.4.1 ¿Por qué el diseño de mi template de correo se desalinea o rompe en Microsoft Outlook de escritorio?
Microsoft Outlook para Windows utiliza el motor de renderizado de Microsoft Word (MSO), que no admite CSS Flexbox, Grid, margin auto ni etiquetas de diseño HTML5.
Word MSO solo interpreta estructuras clásicas basadas en tablas (nested <table>, <tr>, <td>) con anchos en píxeles explícitos y estilos inline.
Utilice los 8 starter layouts email-safe incluidos en MarbleSend. Emplean tablas HTML anidadas y comentarios condicionales MSO (<!--[if mso]>) para garantizar un renderizado impecable en Outlook.
7.4.2 ¿Por qué Gmail muestra "[Message clipped] View entire message" al final de mis correos?
El tamaño del file HTML sin procesar supera el límite estricto de 102 KB (104.448 bytes) impuesto por Gmail.
Al exceder los 102 KB, Gmail trunca el mensaje, ocultando contenido y desactivando el enlace de baja del pie y el píxel de seguimiento.
Aloje imágenes en servidores HTTPS externos en vez de incrustar cadenas base64 inline. Evite CSS redundante. En Templates Studio, pulse el formateador "Clean HTML" antes de enviar.
7.4.3 ¿Por qué {{news_posts}} aparece vacío o ausente en mi correo?
El marcador solo lo rellena una programación de Boletín cuyo Origen del contenido sea «Publicaciones de noticias». En una Campaign manual, una programación RSS o una programación solo de plantilla se reemplaza por texto vacío.
La comprobación previa de la Campaign muestra un aviso cuando una plantilla usa {{news_posts}} sin un origen de publicaciones de noticias; la vista previa en Plantillas → Publicaciones siempre muestra el bloque relleno.
Envía la plantilla mediante una programación de Boletín configurada en «Publicaciones de noticias», o quita el marcador de las plantillas usadas en otros lugares.
7.5 Schedules, feeds RSS y cadencia del Worker
7.5.1 ¿Por qué mi schedule automatizado de RSS no envió correos cuando se publicaron nuevos artículos?
La URL del feed era inaccesible, la syntax XML estaba mal formada o el GUID del último artículo coincidía con cm_schedules.last_rss_item_id.
MarbleSend guarda un hash SHA-256 del último elemento detectado en last_rss_item_id. Si no hay elementos <item> o <entry> nuevos, el worker omite el envío sin generar cola.
Abra el schedule en /schedules y pulse "Test Feed" para revisar la respuesta XML en directo. Verifique que el feed RSS devuelva etiquetas <pubDate> válidas y un <guid> único.
7.5.2 ¿Qué ocurre con los schedules periódicos si el servidor o el cron del worker estuvo desconectado varios días?
Transcurrieron múltiples intervalos de ejecución mientras el proceso worker no estaba disponible.
MarbleSend implementa una estricta "Single Catch-Up Policy" en SchedulerService. En lugar de encolar todos los envíos acumulados (lo que saturaría las bandejas), ejecuta únicamente la última ocurrencia.
Al reanudarse el cron, se compila y envía exactamente 1 broadcast de recuperación. La marca next_run_at del schedule avanza automáticamente a la próxima fecha programada futura.
7.5.3 ¿Por qué la programación de Publicaciones de noticias no envió mi publicación Lista?
La publicación quedó Lista antes de activar el modo Publicaciones de noticias de la programación, ya fue entregada por esta programación, o la audiencia o la plantilla bloquearon la ejecución.
Abre el historial de la programación: «no new posts» significa que nada es elegible, «no recipients» que la audiencia estaba vacía, y «failed» que falta la plantilla o no contiene {{news_posts}}.
Marca una copia de la publicación como Lista una vez que exista la programación, corrige la audiencia o la plantilla y usa Ejecutar ahora.
7.5.4 ¿Pueden dos programaciones enviar la misma publicación?
La entrega se registra por programación, no por publicación.
Cada programación de Publicaciones de noticias guarda su propio registro de las publicaciones que entregó, por eso la biblioteca muestra el total «Enviada N×».
Sí — una publicación que está Lista después de crear ambas programaciones la envía cada una una vez; ninguna la envía dos veces.
7.6 Settings, Deliverability, Webhooks y licencias
7.6.1 ¿Cómo diagnostico los errores SMTP "535 Authentication Failed" o "550 Relay Access Denied"?
Credenciales SMTP incorrectas, discrepancia entre puerto y cifrado (Puerto 587 STARTTLS vs Puerto 465 SSL) o dirección de correo del remitente no verificada.
Settings → SMTP cuenta con una prueba de socket en vivo que exhibe el diálogo directo entre PHPMailer y su servidor SMTP.
Utilice el Puerto 587 con TLS para la mayoría de los relays. Para Gmail/Google Workspace, genere un App Password. Para Amazon SES, verifique el dominio remitente. En cPanel, use la dirección completa como usuario.
7.6.2 ¿Por qué el Deliverability Suite notifica errores de validación en SPF, DKIM o DMARC?
Faltan registros DNS en el dominio remitente, se superó el límite de 10 consultas en SPF o el prefijo de selector en DKIM no coincide.
MarbleSend efectúa consultas DNS no bloqueantes (dns_get_record) directamente a nameservers autorizados para SPF (root TXT), DKIM (selector._domainkey) y DMARC (_dmarc).
Agregue el mecanismo include de su relay SMTP a su registro SPF. Compruebe que el selector DKIM coincida con las instrucciones de su proveedor. Asegúrese de que el registro DMARC posea una dirección de informe rua válida.
7.6.3 ¿Cómo opera el Circuit Breaker de Webhooks y cómo reactivo un endpoint pausado?
El endpoint de destino devolvió errores HTTP 5xx consecutivos, tiempos de espera superiores a 10s o respuestas 404 Not Found.
Para no colapsar la cola del servidor, MarbleSend supervisa las entregas y pausa automáticamente el webhook (enabled = 0) tras fallos sucesivos reiterados.
Abra el drawer de historial de entregas de webhooks para examinar los códigos HTTP y mensajes de error. Una vez solventado el receptor, haga clic en "Test Webhook", verifique la firma HMAC y vuelva a habilitarlo.
7.6.4 ¿Cómo funciona la verificación de licencias Ed25519 y qué es el periodo de gracia offline de 7 días?
Interrupciones de red, fallos en la resolución DNS o mantenimiento temporal en el servidor de licencias principal.
La autenticidad de la licencia se valida localmente en memoria mediante libsodium sodium_crypto_sign_verify_detached(). Modificar los record de la base de datos invalida la firma criptográfica.
MarbleSend brinda un periodo de gracia offline de 7 días (grace_until). Los envíos en curso continúan sin interrupción. Si vence, los datos de suscriptores y reportes siguen 100% accesibles bajo soft-lock.
Integración con WordPress y Formularios de Terceros
Recoge suscriptores en un sitio WordPress y envíalos a MarbleSend. El plugin complementario tiene su propio formulario de suscripción y conecta WPForms, Contact Form 7, Fluent Forms, Formidable Forms y Forminator.
Inspector de integración de formularios
Selecciona un componente para ver su hook, qué envía y un consejo para configurarlo.
Puente REST API
Sin base de datos compartidaCola de envío
Almacenamiento transientMarbleSend Form
Shortcode, Block y WidgetHook de WPForms
wpforms_process_completeHook de Contact Form 7
wpcf7_mail_sentHook de Fluent Forms
submission_insertedFormidable Forms
frm_after_create_entryHook de Forminator
submit_before_set_fieldsAutoresponders por tag
Tags y emails de bienvenidaInstala primero el plugin complementario (marblesend-forms.zip)
MarbleSend funciona en su propio servidor, así que WordPress necesita un plugin pequeño para enviarle suscriptores. El plugin da servicio al formulario integrado de MarbleSend y conecta WPForms, Contact Form 7, Fluent Forms, Formidable Forms y Forminator. Es gratuito, requiere WordPress 6.3 o superior y PHP 7.4 o superior, y habla con MarbleSend solo a través de la REST API.
¿Dónde aparecen los menús de Settings?
Tras activar el plugin, WordPress muestra dos páginas dentro de Settings en wp-admin: MarbleSend Forms (URL de conexión, API key, tags por defecto y el registro de fallos) y MarbleSend Integrations (asignación de campos de cada plugin de formularios). Ambas están en WordPress. El panel de MarbleSend no las tiene. Tus propios formularios, con su grupo, etiquetas y protección contra spam, se gestionan en MarbleSend Forms, en la barra lateral.
1. Descarga marblesend-forms.zip
Descarga marblesend-forms.zip desde Settings → Licencia en MarbleSend, o directamente desde https://marblesend.com/download/marblesend-forms.zip. Es un zip de plugin de WordPress listo para instalar: súbelo tal cual, sin descomprimirlo.
2. Instala y activa en WordPress
En wp-admin ve a Plugins → Add New → Upload Plugin, elige marblesend-forms.zip, pulsa Install Now y luego Activate Plugin. Para actualizar más adelante, sube el zip nuevo del mismo modo. WordPress ofrece reemplazar la versión instalada y tus ajustes se conservan.
3. Conecta la API key (contacts:write)
En MarbleSend abre Settings → API y Webhooks y crea una API key con el scope contacts:write. En WordPress abre Settings → MarbleSend Forms, introduce la MarbleSend Site URL y la key, guarda y pulsa Test Connection. Debe mostrar Connected con el scope contacts:write. Después elige un Default Group y Default Tags de las listas cargadas desde MarbleSend, o crea allí un grupo nuevo.
4. Asigna tus formularios
En wp-admin abre Settings → MarbleSend Integrations. Cada plugin de formularios activo aparece con sus formularios. Marca Enabled, escribe el campo de email y, si el formulario lo tiene, el campo de nombre, añade tags si quieres y guarda. El formulario integrado no necesita asignación.
8.1 Cómo habla el plugin con MarbleSend
El plugin llama a la REST API de MarbleSend por HTTPS, así que WordPress y MarbleSend pueden funcionar en servidores distintos. No tiene acceso a la base de datos de MarbleSend.
WordPress nunca lee las tablas de MarbleSend y MarbleSend nunca lee wp_posts ni wp_users. Ambos pueden funcionar en hosts distintos con bases de datos distintas.
Cada petición lleva una API key Bearer de Settings → API y Webhooks. El scope contacts:write basta, así que la key no puede enviar Campaigns ni cambiar programaciones.
Test Connection en Settings → MarbleSend Forms llama a GET /api/verify-key y muestra los scopes de la key, de modo que una URL o una key incorrectas se ven al instante.
Cada envío va a POST /api/contacts. Un email nuevo se convierte en contacto. Uno existente conserva su estado y recibe los tags nuevos sumados a los actuales; su nombre cambia solo cuando el formulario envía uno. Con double opt-in activado, un contacto nuevo queda como pending hasta que confirma.
curl -X POST https://your-domain.com/api/contacts \
-H "Authorization: Bearer ms_live_abc123..." \
-H "Content-Type: application/json" \
-d '{"email":"visitor@example.com","name":"John Doe","tags":["newsletter","source:wpforms"]}'
Opcional: añade "group_ids":[1,2] para poner el contacto en grupos concretos (lístalos con GET /api/groups; si se omite = General). GET /api/contacts acepta group_id para filtrar por grupo.
8.2 Cola de envío y WP-Cron
Un MarbleSend lento o inaccesible no debe colgar el formulario de un visitante ni hacer perder un lead. Los envíos de los plugins de formularios se ponen en cola y se mandan en segundo plano.
Cuando un plugin de formularios envía, MarbleSend_Integration_Base::dispatch() limpia los campos y los guarda en un transient de WordPress (set_transient). Mientras el visitante espera no se hace ninguna petición a MarbleSend.
Un evento de WP-Cron, marblesend_forms_process_queue, se programa para aproximadamente un minuto después y envía los envíos en cola.
WP-Cron envía cada elemento en cola una vez. El formulario integrado llama primero a MarbleSend directamente y pone el envío en cola para un intento de WP-Cron solo si esa llamada falla. Un elemento en cola se conserva hasta una hora.
Si el envío falla, o un elemento caduca antes de que WP-Cron pueda enviarlo, el plugin añade una línea a marblesend_forms_log (se conservan los últimos 50 records) y muestra un aviso de administrador en wp-admin. Settings → MarbleSend Forms muestra el registro y el número de elementos pendientes.
// Non-blocking submission buffer in WordPress
set_transient('marblesend_forms_queue_' . wp_generate_uuid4(), $payload, 3600);
if (!wp_next_scheduled('marblesend_forms_process_queue')) {
wp_schedule_single_event(time() + 5, 'marblesend_forms_process_queue');
}
8.3 El formulario de suscripción integrado
El plugin incluye un formulario de suscripción, así que no necesitas un constructor de formularios. Añádelo con un shortcode, un bloque de Gutenberg o un widget. Los tres ejecutan el mismo código.
Usa [marblesend_form], el bloque de Gutenberg marblesend/subscribe-form o el widget MarbleSend Subscribe Form. El shortcode acepta tags, show_name (1 o 0) y consent (el texto de una casilla obligatoria). El bloque y el widget ofrecen las mismas opciones. Crea tus propios formularios en MarbleSend Forms → Add New Form e inserta uno con [marblesend_form id="12"].
Un campo honeypot fuera de pantalla (marblesend_hp), un nonce que se pide al enviar el formulario para que una página en caché nunca sirva uno caducado, y un límite de 5 envíos por 60 segundos por IP (guardada con hash). Una petición que rellena el honeypot o no tiene un nonce válido recibe un mensaje de éxito de aspecto normal y se descarta. Demasiadas peticiones reciben un breve mensaje de "espera un momento". Los formularios creados en el editor también pueden usar Cloudflare Turnstile o Google reCAPTCHA, configurados en Settings → MarbleSend Forms.
La página no se recarga. El plugin envía el contacto a MarbleSend de inmediato (tiempo límite de 5 segundos). Si no se puede contactar con MarbleSend, o el plugin aún no está configurado, el envío pasa a la cola para un intento de WP-Cron y el visitante sigue viendo el mensaje de éxito. Si la propia petición falla, el formulario muestra un error y se puede volver a enviar.
Cuando el visitante da solo un email, un contacto nuevo se nombra con la parte anterior a la @, porque la API necesita un nombre. Un contacto existente conserva su nombre. Cada contacto recibe el tag source:wp-form más los tags del formulario y de Settings → MarbleSend Forms. Con double opt-in activado, el visitante ve un mensaje que le pide revisar su email. El contacto se une al grupo del formulario, o al Default Group de Settings → MarbleSend Forms.
[marblesend_form tags="newsletter,inbound" show_name="1" consent="I agree to receive email updates and accept the privacy policy."]
8.4 WPForms (Lite y Pro)
WPForms es uno de los constructores de formularios más usados. El plugin lee el envío cuando WPForms lo ha validado, así que no necesitas ningún complemento de WPForms.
El plugin detecta WPForms con function_exists('wpforms') y escucha la acción wpforms_process_complete (prioridad 10), que recibe los campos ya validados.
WPForms identifica los campos por número. Selecciona un campo en el constructor y lee su ID en la parte superior de las opciones del campo, por ejemplo Field ID #2. Escribe ese número en la asignación. Un campo de nombre con nombre y apellido se une en un solo nombre.
1. Anota el ID del campo Email y, si existe, del campo Nombre. 2. Abre Settings → MarbleSend Integrations y busca WPForms. 3. Marca Enabled, escribe los ID y los tags que quieras. 4. Guarda.
Cada contacto de WPForms recibe el tag source:wpforms junto a tus propios tags, así puedes enviar una Campaign solo a ese grupo.
add_action('wpforms_process_complete', function($fields, $entry, $form_data, $entry_id) {
$email = $fields[1]['value'] ?? ''; // Numeric Field ID #1
$name = $fields[0]['value'] ?? ''; // Numeric Field ID #0
MarbleSend_Integration_Base::dispatch('wpforms', $form_data['id'], $email, $name);
}, 10, 4);
8.5 Contact Form 7 (CF7)
Contact Form 7 define sus campos como tags en una plantilla de texto. El plugin se engancha después de que se haya enviado el email del formulario.
El plugin detecta CF7 con class_exists('WPCF7_ContactForm') y escucha wpcf7_mail_sent (prioridad 10). Un lead solo se reenvía cuando el formulario ha pasado las comprobaciones de spam y validación y Contact Form 7 ha enviado su propio email. Si el envío de email falla en tu hosting, no se reenvía nada.
CF7 da nombre a un campo en su tag, por ejemplo [email* your-email] y [text your-name]. Escribe el nombre (your-email, your-name) en las casillas Email Field y Name Field.
El plugin lee los datos enviados con WPCF7_Submission::get_instance()->get_posted_data(), que funciona con el envío AJAX de CF7.
1. En Contact → Contact Forms abre el formulario y anota los nombres de los tags. 2. En Settings → MarbleSend Integrations busca Contact Form 7. 3. Marca Enabled, escribe your-email y, si el formulario lo tiene, your-name, y añade los tags que quieras. 4. Guarda.
add_action('wpcf7_mail_sent', function($contact_form) {
$submission = WPCF7_Submission::get_instance();
$data = $submission ? $submission->get_posted_data() : [];
$email = $data['your-email'] ?? '';
$name = $data['your-name'] ?? '';
MarbleSend_Integration_Base::dispatch('cf7', $contact_form->id(), $email, $name);
}, 10, 1);
8.6 Fluent Forms (Free y Pro)
El plugin escucha la acción que Fluent Forms lanza después de guardar una entrada.
El plugin detecta Fluent Forms con function_exists('wpFluent') y escucha fluentform/submission_inserted (prioridad 10), que recibe $entry_id, $form_data y $form.
Fluent Forms identifica los campos por su Name Attribute, por ejemplo email para Email y names para el campo de nombre (nombre y apellido se unen). Lo encuentras en los ajustes del campo, en Advanced Options.
La página Integrations lista tus formularios leyendo la tabla de formularios del propio Fluent Forms, así que no tienes que buscar los ID de formulario.
1. Comprueba el Name Attribute de los campos de email y nombre. 2. En Settings → MarbleSend Integrations, marca Enabled para el formulario y escribe ambos. 3. Añade tags y guarda. Los contactos nuevos reciben el tag source:fluentforms.
add_action('fluentform/submission_inserted', function($entryId, $formData, $form) {
$email = $formData['email'] ?? '';
$name = is_array($formData['names'] ?? null) ? implode(' ', $formData['names']) : ($formData['first_name'] ?? '');
MarbleSend_Integration_Base::dispatch('fluentforms', $form->id, $email, $name);
}, 10, 3);
8.7 Formidable Forms (Lite y Pro)
El plugin lee la entrada justo después de que Formidable Forms la guarde.
El plugin detecta Formidable con class_exists('FrmForm') y escucha frm_after_create_entry (prioridad 30), que recibe $entry_id y $form_id.
Formidable asigna un Field ID numérico (p. ej. 12) a cada campo. Introdúcelo en la asignación; las claves de campo no son compatibles. Los datos se extraen con FrmEntry::getOne($entry_id)->metas.
El plugin se ejecuta después de crear la entrada, así que solo se reenvían los envíos que pasaron la validación de Formidable.
1. En el constructor de Formidable, haz clic en el campo de email y anota su Field ID. 2. En Settings → MarbleSend Integrations, activa el formulario e introduce el Field ID. 3. Guarda la asignación. Los leads ingresados reciben la etiqueta source:formidable.
add_action('frm_after_create_entry', function($entryId, $formId) {
$entry = FrmEntry::getOne($entryId, true);
$email = $entry->metas[12] ?? $entry->metas['email-address'] ?? '';
$name = $entry->metas[11] ?? $entry->metas['full-name'] ?? '';
MarbleSend_Integration_Base::dispatch('formidable', $formId, $email, $name);
}, 30, 2);
8.8 Forminator (Free y Pro)
El plugin escucha el hook que Forminator lanza mientras procesa un envío.
El plugin detecta Forminator con class_exists('Forminator_API') y escucha forminator_custom_form_submit_before_set_fields (prioridad 10), que recibe $entry, $form_id y $field_data.
Forminator da a cada campo un element ID como email-1, name-1 o text-1. Escribe estos ID en la asignación. El editor del formulario los muestra.
La página Integrations lista tus formularios de Forminator por nombre, leídos con Forminator_API::get_forms().
1. Abre Forminator y anota los element ID (email-1, name-1). 2. En Settings → MarbleSend Integrations, busca Forminator y escribe los ID. 3. Añade tags y guarda. 4. Haz un envío de prueba y comprueba que el contacto tiene el tag source:forminator.
add_action('forminator_custom_form_submit_before_set_fields', function($formId, $response, $fieldData) {
$fields = array_column($fieldData, 'value', 'name');
$email = $fields['email-1'] ?? '';
$name = $fields['name-1'] ?? '';
MarbleSend_Integration_Base::dispatch('forminator', $formId, $email, $name);
}, 10, 3);
8.9 Tags, segmentos y autoresponders
Los contactos del plugin de WordPress se unen al grupo elegido en Settings → MarbleSend Forms (Default Group) o en el formulario, y quedan en General si no se elige ninguno. Usa etiquetas para segmentarlos, o muévelos a grupos desde Contacts.
Captar un email es solo el primer paso. Los tags deciden qué pasa después con el contacto.
Además de tus propios tags, cada contacto recibe source:<slug>: source:wp-form, source:wpforms, source:cf7, source:fluentforms, source:formidable o source:forminator. Úsalos para enviar una Campaign a los suscriptores de un solo plugin de formularios.
En /contacts → Autoresponders, crea una regla para el tag que asignaste a tu formulario de WordPress. Cuando el contacto pasa a activo (justo después de enviar, o tras confirmar el double opt-in), MarbleSend pone en cola tu email de bienvenida con la plantilla y el perfil SMTP que elegiste.
El plugin envía los leads directamente a tu propia instalación de MarbleSend. Un servicio como Zapier o Make no forma parte del camino.
Con double opt-in activado, los contactos nuevos se guardan como pending con consent_source = 'api'. MarbleSend envía por email un enlace de confirmación ({{confirm_link}}). Cuando el contacto lo pulsa, el estado pasa a active y se registran la hora y la dirección IP para el RGPD.
{
"email": "lead@agency.com",
"name": "Jane Smith",
"tags": ["source:wpforms", "ebook-download", "vip-inbound"],
"consent_source": "api"
}
8.10 Solución de problemas
Problemas habituales al conectar formularios de WordPress, con su causa, cómo comprobarlos y cómo resolverlos.
¿Por qué los envíos llegan tarde, o no llegan, a MarbleSend?
WP-Cron solo se ejecuta cuando alguien visita el sitio. En un sitio con poco tráfico o de staging, los envíos en cola esperan a la siguiente visita. Un envío en cola se conserva una hora. Si WP-Cron no se ejecuta en ese tiempo, el envío se pierde y marblesend_forms_log registra que uno caducó (no puede nombrar al visitante, porque los datos guardados también caducaron).
Abre Settings → MarbleSend Forms en wp-admin. El contador de pendientes muestra los elementos que esperan a marblesend_forms_process_queue. Una entrada del registro que diga que un envío en cola caducó significa que WP-Cron no se ejecutó durante más de una hora.
Abre https://your-site.com/wp-cron.php?doing_wp_cron para ejecutarlo una vez, o configura un cron job real en el servidor (* * * * * wget -q -O - https://your-site.com/wp-cron.php >/dev/null 2>&1).
¿Por qué el registro dice "Skipped: no valid email in form submission"?
El campo de email de la asignación tiene una errata, o el visitante envió una dirección vacía o no válida que sanitize_email() rechazó.
MarbleSend_Integration_Base::log_skip() escribe una entrada en marblesend_forms_log siempre que un formulario activado no produce un email válido.
Comprueba el identificador que usa tu constructor de formularios: un número para WPForms (por ejemplo 2) y Formidable Forms, el nombre del tag para Contact Form 7 (your-email), el Name Attribute para Fluent Forms (email) y el element ID para Forminator (email-1).
¿Por qué WordPress informa de una API key no válida o de un scope que falta?
La key de WordPress se revocó, caducó, se borró en MarbleSend o se creó sin el scope contacts:write.
Test Connection llama a GET /api/verify-key. Una respuesta HTTP 401 o 403 significa que la autenticación falló.
En MarbleSend abre Settings → API y Webhooks y crea una key nueva con el scope contacts:write (o admin). Copia el token que empieza por ms_ en Settings → MarbleSend Forms de WordPress.
¿Por qué se pierden leads de Contact Form 7 cuando el formulario muestra un error?
El plugin solo reenvía un lead después de que Contact Form 7 haya enviado su propio email. Cuando el email falla, CF7 muestra su mensaje de error y el lead no se reenvía.
Envía el formulario tú mismo. Si ves "There was an error trying to send your message", CF7 no pudo enviar su email.
Arregla el envío de email en tu sitio WordPress, por ejemplo con un plugin SMTP. En cuanto CF7 pueda enviar su email, el lead llega a MarbleSend.
¿Por qué un contacto lleva como nombre su dirección de email?
El formulario no tiene campo de nombre, o no hay ningún campo de nombre asignado. La API de MarbleSend exige un nombre, así que un contacto nuevo recibe la parte del email anterior a la @.
Mira la fila del formulario en Settings → MarbleSend Integrations: la casilla Name Field está vacía. Un contacto que ya existía no se ve afectado, porque conserva el nombre que tiene.
Añade un campo de nombre al formulario y escríbelo en la asignación. Los contactos que ya existen conservan su nombre actual; cámbialo en /contacts si lo necesitas.