Guía técnica oficial Arquitectura Zero-Build PHP 8.2+ Optimizado para hosting compartido

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.

Filter:
Núcleo

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.

100% Prepared PDO

Cero inyecciones SQL

Cada consulta a la base de datos utiliza prepared statements estrictos sin sobrecarga de ORM.

AES-256-GCM

Cifrado en reposo

Credenciales SMTP, claves API de IA y secrets de webhook cifrados en Crypto.php.

Atomic Queue

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.

UI Zero-Build

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.

IMMUNITY

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.

PERFORMANCE

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.

IDEMPOTENCY

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.

SINGLE-TENANT

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.

AES-256-GCM

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.

RANDOM_BYTES()

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.

SECRETS CATALOG

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.

MASTER KEY ISOLATION

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.

UNIFIED RUNNER

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.

CLI & WEB-CRON

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.

ATOMIC CLAIM

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 RECOVERY

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.

Módulo 01

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 backend
Tarjeta KPI 1

Total enviados

Agregación de logs y contador mensual
Tarjeta KPI 2

Aperturas / Tasa de apertura

Píxel de seguimiento 1x1 y nota sobre Apple MPP
Tarjeta KPI 3

Clics / CTR

Inyector de redirección de clics
KPI 04

Audiencia desuscrita

Tasa de bajas y cumplimiento RFC
Tarjeta de operación 4

Heartbeat del worker

Estado del cron e intervalo de 1 min
Visualizador

Gráfico de crecimiento de volumen

Escala 7d, 30d, 90d, YTD
Feed de actividad

Tabla de emisiones recientes

Ciclo de estado y registro de auditoría
Banner de seguridad

Salud de entregabilidad

Disponibilidad del perfil SMTP

Impacto en la base de datos:

Consejo profesional del equipo de soporte:

1.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.

Períodos seleccionables (7d, 30d, 90d, YTD)

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).

Barras flexibles ligeras sin dependencias externas

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.

Telemetría de doble métrica al pasar el cursor

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.

Completed

status = 'completed'

Sending

status = 'sending'

Failed

status = 'failed'

Draft

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.

Nombre y origen de Campaign

Muestra el asunto de la Campaign, la fecha de creación y la etiqueta de origen (manual, recurring, rss o resend_unopened).

Destinatarios y ratio de entrega

Recuento instantáneo de mensajes entregados frente a fallidos, más porcentajes en vivo de tasa de apertura y tasa de clics.

Enlace al informe de analíticas

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.5 Banner de advertencia de chequeo de entregabilidad

Cuando su dominio remitente carece de records SPF, DKIM o DMARC verificados, MarbleSend destaca un banner de atención directamente encima de las métricas KPI. Al hacer clic en Verificar DNS del dominio se abre el asistente de diagnóstico de 4 pasos en /settings?tab=deliverability, evitando que los usuarios dañen la reputación de su dominio con buzones no autenticados.

Verificación de perfiles SMTP activos

Muestra el recuento de perfiles de retransmisión SMTP activos en Settings. MarbleSend soporta rotación multi-SMTP para equilibrar la carga entre servidores.

Aviso de relé no configurado y guardia Preflight

Si no se encuentra un perfil SMTP activo, un banner rojo destacado bloquea envíos accidentales antes del lanzamiento de Campaigns para evitar fallos de cola.

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.

Módulo 02

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 operativos
PROGRESS

Monitor de Envío Live

Estadísticas y eventos en tiempo real
AUDIENCE

Selector de Destinatarios

Filtrado por tag y seleccionar todo
COMPOSER

Editor de Triple Vista

Código, split y vista previa
SAFETY

Motor de Comprobación Preflight

Inspección automatizada de 6 puntos
TESTING

Diagnóstico de Envío de Prueba

Muestra live sin cola
ATTRIBUTION

Reescritor de UTM y Enlaces

Parámetros UTM y seguimiento 302
PORTFOLIO

Historial de Transmisiones

Filtros de status y origen
ANALYTICS

Informe Detallado Post-Envío

CTR, MPP y reenvío automático

Impacto en la base de datos:

Consejo profesional del equipo de soporte:

2.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

Sending

74% complete

7,420 / 10,000 emails

En Cola

2,528

Enviando

40

Éxito

7,420

Fallido

12

Recent Events Real-time status
ana.wijaya@example.com Delivered
budi.santoso@example.org Delivered
chen.li@example.net 550 5.1.1 User unknown
dewi.lestari@example.com Delivered
eko.prasetyo@example.org Enviando
View Full Report

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.

TELEMETRY NOTE

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.

PIPELINE 01

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.

PIPELINE 02

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.

PIPELINE 03

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:

KPI METRICS

4 Métricas de Rendimiento Bento

Rastrea volumen Enviado (100%), Fallos de entrega, Aperturas únicas con tasa de apertura y Clics únicos con CTR.

TEMPORAL CLUSTERS

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.

ENGAGEMENT RECOVERY

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.

Módulo 03

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 operativos
CICLO DE VIDA

Máquina de 4 Estados

active/pending/unsub/supp
FILTRADO

Motor de Búsqueda y Filtros

Etiquetas, estado y debounce
TELEMETRÍA

Panel de Auditoría y Consentimiento

IP, marcas de tiempo y rebotes
INGESTA

Importador CSV RFC 4180

50k filas y guardas dedup
EMBUDOS

Páginas de Captación Alojadas

Doble opt-in y embudos
AUTOMATIZACIÓN

Autoresponders por Etiqueta

Reglas de goteo por eventos
GESTIÓN

Centro de Gestión Masiva

Segmentación entre páginas
CUMPLIMIENTO

Privacidad y Supresión GDPR

Exportación JSON y purga total

Impacto en la base de datos:

Consejo profesional del equipo de soporte:

3.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'.

active

Suscriptor activo

Suscripción confirmada, email válido. Apto para recibir Campaigns, horarios y autoresponders.

pending

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.

unsubscribed

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.

suppressed

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.

Edición directa

Actualice el nombre, metadatos personalizados y chips de etiquetas en línea sin recargar la página.

Supresión manual

Suprima un contacto al instante para descalificarlo inmediatamente de todas las colas.

Eliminación definitiva GDPR

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.

Vistas Totales de Páginas

Controla las impresiones agregadas en todos los embudos de captación activos.

Tasa Promedio de Conversión

Calcula el porcentaje de envíos sobre visitas en todas las páginas de captación alojadas.

Páginas Activas / Capacidad

Muestra las páginas de destino activas respecto al límite operativo de 20 páginas.

Registros de los Últimos 30 Días

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.

Motor de doble opt-in

Genera tokens de confirmación firmados con HMAC con envío automatizado del email de confirmación.

Etiquetado automático

Asigna etiquetas de suscriptor designadas al registrarse para activar secuencias automatizadas personalizadas.

Redirección personalizada

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.

Módulo 04

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 operativos
SIDEBAR

Biblioteca de Templates

Búsqueda instantánea y slugs
PRESETS

Diseños Starter

8 diseños de email basados en tablas
EDITOR

Editor de Código Puro

Sangría Tab y formateador
VISTA PREVIA

Viewport Aislado

Marco de escritorio y móvil
TOKENS

Paleta de Tokens Dinámicos

Inyección de placeholders en 1 clic
DIAGNÓSTICO

Remitente de Prueba

Modal de verificación SMTP en vivo
AI COPY

Cajón de AI Copywriter

Generar y refinar templates
AUDITORÍA AI

Revisor de Asuntos

Puntuación 1–100 y filtro antispam
PUBLICACIONES

Publicaciones de noticias

Artículos en Markdown para boletines

Impacto en la base de datos:

Consejo profesional del equipo de soporte:

4.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:

1. Blanco minimalista

Lienzo limpio con pie de página obligatorio para darse de baja.

2. Lanzamiento de producto

Banner principal, propuesta de valor y CTA destacado.

3. Newsletter mensual

Editorial curado con destacados de publicaciones en 2 columnas.

4. Boletín de publicaciones de noticias

Banda de cabecera más el bloque {{news_posts}} para programaciones de Publicaciones de noticias.

5. Serie de bienvenida

Bienvenida personalizada con guía de introducción en 3 pasos.

6. Invitación a seminario web

Insignia de fecha/hora, biografía del ponente y botón de confirmación de asistencia.

7. Resumen de blog

Artículos numerados, tiempo de lectura y etiquetas de autor.

8. Oferta de recuperación

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.

{{name}}

Nombre completo del destinatario (usa "there" si está vacío)

{{email}}

Dirección de email del destinatario

{{unsubscribe_link}}

Enlace obligatorio de desuscripción en un clic según RFC 8058

{{confirm_link}}

URL de confirmación de double opt-in para páginas de registro

{{posts}}

Bucle de artículos de blog sindicados para newsletters automáticas de RSS

{{feed_title}}

Título del feed sindicado RSS/Atom

{{latest_post_title}}

Titular del artículo de blog publicado más recientemente

{{posts_count}}

Número de entradas nuevas del feed incluidas en el boletín

{{news_posts}}

Bloque de Publicaciones de noticias para una programación de Boletín (portada, título, subtítulo, cuerpo)

{{news_posts_count}}

Número de Publicaciones de noticias incluidas en este envío

{{news_latest_post_title}}

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:

6.7 Motor IA de modo dual: Proveedores BYOK y Créditos IA MarbleSend

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.

ParteQué hace
BibliotecaLista 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, portadaEl 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 estadoLas 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 MarkdownLos 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 vivoRenderiza 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 marcadorUn 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.

SyntaxResultado
## 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
> quoteCita en bloque
---Línea separadora
![alt](https://example.com/a.png)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}}.

MarcadorSe 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íntomaQué revisar
La vista previa no muestra artículosLa 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 pulsarEscríbelo como [text](https://…) con una dirección http, https o mailto; otros esquemas se dejan como texto.
Una imagen no apareceLa 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.
Módulo 05

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

Interactive Inspector
CALENDARIO

Matriz de Calendario & Mes

Mapa visual de horarios & cadencia
CADENCIA

Motor de Recurrencia

Diario, semanal, mensual & personalizado
RSS / ATOM

Extractor Automático de Blog

Deduplicación por hash & caché
AUDIENCIA

Audiencia Dinámica

Consulta de etiquetas en el segundo exacto
AUDITORÍA

Logs de Occurrences

Auditoría de ejecución & prevención de duplicados
EJECUCIÓN

Run Now Bajo Demanda

Ejecución inmediata sin alterar cadencia
OPTIMIZACIÓN

Optimización de Hosting

8 directrices operativas seleccionadas
WORKER

Latido de Cron & Bloqueo

Protección de concurrencia sin bloqueo
PUBLICACIONES

Modo Publicaciones de noticias

Boletines al estilo Substack

Impacto en la base de datos:

Consejo profesional del equipo de soporte:

5.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:

1. Ventana Óptima de Envío Matutino

Programe sus envíos los martes o jueves entre 09:00 y 10:30 hora local para maximizar las tasas de apertura y clics.

2. Precisión de Cron de 1 Minuto

Ejecute worker.php cada minuto (* * * * *) con protección flock para garantizar exactitud temporal sin colisiones de procesos.

3. Reclamaciones Atómicas de Lotes en Cola

Consulte cm_email_queue con sentencias preparadas indexadas y cláusulas LIMIT para evitar condiciones de carrera durante picos de envío.

4. Segmentación por Zona Horaria de Suscriptores

Organice contactos con etiquetas regionales (#us-east, #apac, #emea) y asigne horarios escalonados para no enviar a las 03:00 AM.

5. Margen de Espera para Publicación RSS

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.

6. Depuración Periódica de Historial

Limpie regularmente logs antiguos en cm_schedule_occurrences para mantener las tablas ligeras y las consultas rápidas en servidores compartidos.

7. Reenvío a No Abiertos a las 48 Horas

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.

8. Aislamiento de Rutas con Perfiles SMTP Dedicados

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

  1. 1Abre Plantillas → Publicaciones y escribe tu artículo en Markdown.
  2. 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).
  3. 3Abre Programaciones → Nueva, deja el tipo en Boletín y establece Origen del contenido en «Publicaciones de noticias».
  4. 4Elige la plantilla, la audiencia, el perfil SMTP, las publicaciones por correo (1–20) y la cadencia.
  5. 5Guarda. Solo las publicaciones que queden Listas después de este momento pueden ser enviadas por esta programación.
  6. 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.

Ejemplo: guardas la programación el lunes. Una publicación que quedó Lista el viernes se ignora; una que queda Lista el martes se envía en la siguiente ocurrencia y después nunca más por esta programació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íntomaQué 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 unaLa 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 antiguaCopia su texto en una publicación nueva y márcala como Lista — una programación nunca envía la misma publicación dos veces.
Módulo 06

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

Interactive Inspector
SMTP

Perfiles SMTP

BYO SMTP y Relay SES Gestionado
WORKER

Worker y Cron

Cadencia de ejecución de 1 minuto
LOCALES

23 Idiomas y Tema

Espejo RTL y Modo Oscuro/Claro
API KEYS

Claves REST API

Acceso de desarrollador con ámbito
WEBHOOKS

Webhooks de Eventos

Envío de eventos HMAC-SHA256
DELIVERABILITY

Suite de Entregabilidad

SPF, DKIM, DMARC y BIMI
AI BYOK

Proveedores de AI

BYOK y Créditos MarbleSend
LICENSE

Licencia Ed25519

Token de concesión criptográfico

Impacto en la base de datos:

Consejo profesional del equipo de soporte:

6.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.

Opción 1: BYO SMTP (Infraestructura de relay propia)

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 SMTP

Conecta tu propio transporte de correo con credenciales SMTP estándar. Elige entre relays en la nube dedicados o tus buzones de hosting.

Aviso Importante de Transparencia: Límites de Envío en Hosting Compartido

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.

Host: smtp.hostinger.com | Port 465 (SSL) / 587 (TLS)
Business Email Plans (Per Mailbox)
Free Business Email Rp0 / mo

1 GB storage, 1 forwarding rule, 1 alias, up to 100 mailboxes/domain. Standard webmail & antispam. Strict sending cap (~100-200/day).

Starter Business Email Rp7.900 / mo

5 GB storage, 5 forwarding rules, 5 aliases, expandable mailbox storage. No mailbox limit per domain.

Standard Business Email Rp10.900 / mo

20 GB storage, 20 forwarding rules, 10 aliases, AI Kodee mailbox assistant & smart replies.

Premium Business Email Rp19.900 / mo

50 GB storage, 50 forwarding rules, 30 aliases, full AI suite & priority deliverability.

Hostinger Reach (Email Marketing)
Starter Marketing Rp23.900 / mo

100 recipients, 200 emails / month. Suitable for basic transactional testing.

Grow Marketing Rp36.900 / mo

500 recipients, 500 emails / month, 10 AI credits, remove Reach branding, automations.

Pro Marketing Rp54.900 / mo

1,000 recipients, 7,000 emails / month, 20 AI credits, custom HTML code, send-time optimization.

Namecheap Jellyfish / cPanel

• 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).

View Namecheap Email
Bluehost cPanel / M365

• 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).

View Bluehost Email
SiteGround Site Tools

• 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).

View SiteGround Email
DreamHost Custom Panel

• 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).

View DreamHost Email
HostGator cPanel

• 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).

View HostGator Email
GoDaddy Microsoft 365

• 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).

View GoDaddy Email

Selecciona el puerto y protocolo de seguridad adecuado según tu red.

Port 587 (STARTTLS) STANDARD

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.

Port 465 (SSL / SMTPS) ENCRYPTED

Implicit TLS/SSL wrapper connection (RFC 8314). Required by Hostinger, Namecheap cPanel, and selected enterprise relays. Highly reliable when hosting firewalls restrict 587.

Port 25 (Plain / MTA) BLOCKED

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 SES

Infraestructura 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.

Opción 2: MarbleSend SMTP via Amazon SES (Relay Gestionado)

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.

Libro mayor de créditos atómico, idempotencia y reembolso automático

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.

Diagnóstico de socket TLS en tiempo real y registro detallado
Easy DKIM

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.

Enrutamiento por campaña y respaldo predeterminado fluido

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).

Verificación de dominio remitente (SPF, DKIM, DMARC)

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.

Identidad del remitente

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.

Baja en cada correo

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.

Listas basadas en permiso

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.

Rebotes y quejas

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.

Límites y pausa automática

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.

Envío autenticado

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.

Guía de Easy DKIM por proveedor

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)
RULE 1
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.

RULE 2
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.

RULE 3
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.

Comandos de verificación DNS (CLI)
# 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
Hostinger hPanel → Dominios → Seleccionar dominio → DNS / Servidores de nombres
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)
1

Inicie sesión en el panel hPanel de Hostinger y vaya a Dominios.

2

Seleccione su dominio y haga clic en DNS / Servidores de nombres en el menú lateral izquierdo.

3

En Administrar registros DNS, elija CNAME en el menú desplegable Tipo.

4

En el campo Nombre, ingrese SOLAMENTE token._domainkey (hPanel añade automáticamente .tudominio.com).

5

En el campo Objetivo, ingrese token.dkim.amazonses.com y mantenga el TTL en 300 o predeterminado (14400).

6

Haga clic en Agregar registro. Repita el proceso para los 3 tokens de MarbleSend.

Hostinger hPanel muestra su dominio en gris junto a la casilla. No agregue su nombre de dominio ni puntos adicionales en el campo Nombre.
DreamHost (Panel web DreamHost)
DreamHost Web Panel
Panel DreamHost → Sitios web → Administrar sitios web → Configuración DNS (o Dominios → Administrar dominios → DNS)
Tipo de registro Host / Nombre Valor / Destino / Apunta a TTL
CNAME <token>._domainkey (DreamHost appends .yourdomain.com) <token>.dkim.amazonses.com Default
1

Inicie sesión en el panel de DreamHost y vaya a Sitios web > Administrar sitios web.

2

Ubique su dominio y haga clic en Configuración DNS (o Dominios > Administrar dominios > DNS).

3

Desplácese hasta la sección "Agregar un registro DNS personalizado" y haga clic en Agregar registro.

4

En el campo Nombre, ingrese token._domainkey (DreamHost muestra .tudominio.com automáticamente).

5

Seleccione Tipo CNAME e ingrese token.dkim.amazonses.com en el campo Valor.

6

Haga clic en Guardar / Agregar registro. Repita para los 3 tokens.

Las actualizaciones de DNS en DreamHost pueden tardar entre 1 y 2 horas en sincronizarse en todos sus servidores de nombres.
Namecheap (DNS Avanzado)
Advanced DNS
Namecheap Dashboard → Domain List → Manage → Pestaña 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)
1

Inicie sesión en Namecheap, vaya a Domain List y haga clic en Manage junto a su dominio.

2

Haga clic en la pestaña Advanced DNS en la parte superior.

3

En la sección Host Records, haga clic en el botón rojo ADD NEW RECORD.

4

Seleccione CNAME Record en el menú desplegable Type.

5

En el campo Host, ingrese ÚNICAMENTE token._domainkey (nunca incluya su dominio).

6

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.

Si su dominio usa Custom DNS externos, esta pestaña estará deshabilitada; agregue los registros en su proveedor de DNS activo.
Bluehost (Administrador de cuentas / Zone Editor)
Bluehost DNS
Portal Bluehost → Dominios → DNS (o cPanel → Zone Editor)
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)
1

Inicie sesión en Bluehost, haga clic en Dominios y elija su dominio.

2

Vaya a la pestaña DNS (o abra cPanel Zone Editor si utiliza hosting cPanel tradicional).

3

Desplácese hasta la sección CNAME (Alias) y haga clic en Add Record.

4

En el campo Host Record, ingrese token._domainkey.

5

En Points To, ingrese token.dkim.amazonses.com y seleccione el TTL (4 Hours o Default).

6

Haga clic en Guardar. Repita para los 2 tokens CNAME restantes.

Bluehost gestiona el sufijo del dominio de forma automática en segundo plano. Nunca introduzca el dominio raíz en el campo Host Record.
SiteGround (Editor de zona DNS de Site Tools)
Site Tools DNS
Área de clientes SiteGround → Sitios web → Site Tools → Dominio → Editor de zona 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)
1

Inicie sesión en SiteGround, vaya a Sitios web y abra Site Tools de su dominio.

2

En el menú lateral izquierdo, expanda Dominio y haga clic en Editor de zona DNS.

3

Seleccione la pestaña CNAME en Crear nuevo registro.

4

En el campo Nombre, ingrese token._domainkey (Site Tools añade .tudominio.com automáticamente).

5

En Resuelve a, ingrese token.dkim.amazonses.com y deje el TTL en 1 hora (3600).

6

Haga clic en Crear. Repita para los 3 tokens.

Los servidores de nombres de SiteGround propagan cambios en segundos. Verifique que no existan registros TXT obsoletos en el mismo subdominio selector.
HostGator (cPanel Zone Editor)
cPanel Zone Editor
Portal HostGator → cPanel → Dominios → 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)
1

Inicie sesión en el Portal de HostGator y abra cPanel.

2

En la sección Dominios, haga clic en Zone Editor.

3

Busque su dominio y haga clic en + CNAME Record (o Administrar > Agregar registro).

4

En Nombre, ingrese token._domainkey (cPanel lo completa automáticamente con su dominio y un punto final).

5

En CNAME / Record, ingrese token.dkim.amazonses.com.

6

Haga clic en Add a CNAME Record. Repita para los 3 tokens.

En cPanel Zone Editor, verifique en la tabla que el registro figure como token._domainkey.tudominio.com. sin duplicar el dominio.
GoDaddy (Portafolio de dominios DNS)
GoDaddy DNS
Cuenta GoDaddy → Mis productos → Dominios → DNS (o Administrar 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)
1

Inicie sesión en su cuenta de GoDaddy y vaya a Mis productos.

2

En Dominios, localice su dominio y haga clic en DNS (o en los tres puntos > Administrar DNS).

3

En la sección Registros DNS, haga clic en Agregar nuevo registro.

4

Elija CNAME en el menú desplegable Tipo.

5

En el campo Nombre, escriba ÚNICAMENTE token._domainkey (¡no incluya .tudominio.com!).

6

En Valor, ingrese token.dkim.amazonses.com, configure el TTL en 1/2 hora (o Default) y guarde. Repita para los 3 registros.

GoDaddy anexa su dominio automáticamente. Escribir el dominio completo generará un error de sintaxis DNS o creará un registro doble no funcional.
Verificación y propagación DNS

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.

Paso 1: Copie su línea de cron

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.

Paso 2: Añádala en su panel de hosting

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)
  1. Abra hPanel → Websites → Dashboard de su sitio y haga clic en Cron Jobs en la barra lateral.
  2. Ponga Type en Custom. (El tipo PHP solo acepta la ruta de un file .php; su línea también contiene el comando PHP.)
  3. Pegue la línea del Paso 1 en Command to run.
  4. Ponga la programación en cada minuto, o escriba * * * * *.
  5. 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.

  1. Abra cPanel y, en la sección Advanced, haga clic en Cron Jobs.
  2. En Add New Cron Job, elija Once Per Minute (* * * * *) en Common Settings.
  3. Pegue la línea del Paso 1 en Command.
  4. 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
  1. Inicie sesión en Bluehost Portal, haga clic en Websites y luego en Manage Site para su sitio.
  2. Abra la pestaña Advanced, busque Cron Jobs y haga clic en Manage y luego en Add Cron.
  3. Elija una frecuencia en Common Settings (o rellene Minute, Hour, Day, Month y Weekday).
  4. 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.

  1. Abra cPanel y, en la sección Advanced, haga clic en Cron Jobs.
  2. En Add New Cron Job, elija Once Per Minute (* * * * *) en Common Settings.
  3. Pegue la línea del Paso 1 en Command.
  4. 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.

  1. Abra cPanel y, en la sección Advanced, haga clic en Cron Jobs.
  2. En Add New Cron Job, elija Once Per Minute (* * * * *) en Common Settings.
  3. Pegue la línea del Paso 1 en Command.
  4. 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
  1. Abra el panel de DreamHost, vaya a Cron Jobs y haga clic en Add New Cron Job.
  2. 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.
  3. 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).
  4. 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
  1. Abra Site Tools → Devs → Cron Jobs.
  2. Elija el intervalo de la lista (o configure minuto, hora, día, mes y día de la semana).
  3. Pegue la línea del Paso 1 en Command. La dirección de correo para la salida es opcional.
  4. 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.

¿Sin acceso a cron, o su proveedor lo limita? Use Web-Cron
  1. Abra Settings → Sistema y copie la Web-Cron URL. Manténgala privada: contiene su token secreto.
  2. Cree una cuenta gratuita en un servicio de cron como cron-job.org.
  3. Cree un job, pegue la URL y configúrelo para que se ejecute cada minuto. Guárdelo y actívelo.
  4. Use Web-Cron o un cron job de su proveedor, no ambos: uno basta.
Paso 3: Compruebe que funciona

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.

¿Sigue mostrando Cron No Detectado?
  • 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.

Crontab Nativo de CLI (Opción A)
* * * * * 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.

Alternativa de Web-Cron HTTP (Opción B)
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.

Concurrency Guard flock No Bloqueante

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.

Reclamaciones de Cola Atómicas y Backoff

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.

23 Idiomas Nativos Sin Dependencias

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.

Espejo de Diseño RTL Bidireccional

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.

Motor de Tema Tri-State Persistente

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.

Seguridad Reforzada de Administrador Único

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).

Cómo funciona

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.

Actívala paso a paso

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.

El código QR se queda en tu servidor

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.

Iniciar sesión con un código

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.

Códigos de recuperación

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.

Teléfono perdido y sin códigos de recuperación

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.

1 Crea o inicia sesión en una cuenta de Cloudflare

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.

2 Abre Turnstile y añade un widget

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.

3 Pon nombre al widget y lista tus hostnames

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.

4 Elige el modo del widget

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.

5 Copia las dos claves

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.

6 Pégalas en MarbleSend

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.

7 Pruébalo

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.

Cuando Cloudflare no está disponible

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.

Claves de prueba para desarrollo

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.

Solución de problemas

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.

Obligatorio mientras uses el SES Relay

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.

Generación de Tokens y Visualización Solo de Escritura

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.

Almacenamiento de Hash SHA-256 Unidireccional

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.

Ámbitos de Capacidad Granulares

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.

Autenticación Bearer y Registros de Auditoría

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.

Suscripciones a Eventos de Ciclo de Vida

Suscríbase a activadores críticos: contact.created, contact.unsubscribed, campaign.sent, campaign.bounced y link.clicked con activación individual por webhook.

Encabezado de Firma HMAC-SHA256

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.

Mecanismo de Circuit Breaker y Reintento

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.

Historial de Auditoría de Entregas y Test Ping

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.

1. SPF (Sender Policy Framework)

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).

2. DKIM (DomainKeys Identified Mail)

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.

3. Directiva y Alineación DMARC

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.

4. Avatar de Marca BIMI y VMC

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.

BYOK Modo 1: BYOK (Bring Your Own Key)

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.

METERED Modo 2: Créditos IA MarbleSend (Modelos Seleccionados)

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.

DYNAMIC Dynamic Edge Pricing & Instant Checkout

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.

PRIVACY AES-256-GCM Key Vault & Strict Data Privacy

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.

MarbleSend AI (Relay Administrado)

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.

BYOK (Trae tu propia clave)

Comunicación directa de servidor a proveedor sin sobrecostes. Seleccione cualquier proveedor configurado e identificador de modelo como su motor predeterminado.

Flujo de Generación Unificado

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.

Persistencia del Estado del Sistema

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.

Asignación de Créditos Iniciales Gratuitos

Cada licencia activada recibe créditos de IA iniciales gratuitos obtenidos dinámicamente del servidor de licencias para evaluar AI Assist de inmediato.

Registro Atómico e Idempotencia

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.

Catálogo de Precios Dinámico en Edge y Recarga

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.

Saldo en Tiempo Real y Sincronización en 1 Clic

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.

Registro Multi-Proveedor

Mantenga conexiones simultáneas a OpenAI, Anthropic Claude, Google Gemini, DeepSeek, Kimi/Moonshot, OpenRouter o instancias privadas de Ollama.

Protocolos Duales y URLs Base Personalizadas

Compatible con endpoints estándar de OpenAI (/chat/completions) y formato de mensajes de Anthropic (/v1/messages) con URLs base proxy personalizadas.

Bóveda Criptográfica AES-256-GCM

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.

Diagnósticos Previos en Vivo

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:

OpenAI GPT-4o / o-series
Format: openai
Base URL: https://api.openai.com/v1
Steps: Inicie sesión en platform.openai.com → abra Dashboard → seleccione "API keys" en la barra lateral → haga clic en "+ Create new secret key" → asigne el nombre "MarbleSend" → copie la clave (comienza con sk-...). Revise platform.openai.com/docs/models para ver modelos vigentes.
Anthropic Claude Claude 3.5 / 3.7 Sonnet
Format: anthropic
Base URL: https://api.anthropic.com/v1
Steps: Inicie sesión en console.anthropic.com → vaya a Settings → "API Keys" → haga clic en "Create Key" → etiquétela como "MarbleSend" → copie la clave (comienza con sk-ant-...). Consulte docs.anthropic.com/en/docs/about-claude/models para IDs de Claude.
Google Gemini Gemini 2.0 / 2.5 Flash
Format: gemini
Base URL: https://generativelanguage.googleapis.com/v1beta
Steps: Inicie sesión con su cuenta Google en aistudio.google.com → haga clic en "Get API key" en la navegación → seleccione "Create API key" → copie la clave (comienza con AIzaSy...). Explore ai.google.dev/gemini-api/docs/models/gemini para modelos Gemini.
DeepSeek DeepSeek-V3 / R1
Format: openai
Base URL: https://api.deepseek.com
Steps: Inicie sesión en platform.deepseek.com → seleccione "API keys" en el menú lateral → haga clic en "Create API key" → ingrese el nombre "MarbleSend" → copie la clave (comienza con sk-...). Visite api-docs.deepseek.com para ver IDs disponibles.
Kimi (Moonshot AI) Kimi k1.5 / Moonshot v1
Format: openai
Base URL: https://api.moonshot.cn/v1
Steps: Inicie sesión en platform.moonshot.cn → abra la Consola → seleccione "API Key Management" (API Key 管理) → haga clic en "Create" (新建) → copie su token secreto. Visite platform.moonshot.cn/docs para ver modelos.
OpenRouter Aggregator (200+ Models)
Format: openai
Base URL: https://openrouter.ai/api/v1
Steps: Inicie sesión en openrouter.ai → vaya a Account → "Keys" → haga clic en "Create Key" → configure límites opcionales → copie la clave (comienza con sk-or-v1-...). Explore openrouter.ai/models para acceder a más de 100 modelos integrados.
Ollama & Local / Groq Local LLM / Ultra-Fast LPU
Format: openai
Base URL: http://localhost:11434/v1 / https://api.groq.com/openai/v1
Steps:
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:

1 1. Abra Settings ➔ Pestaña AI Providers

En la barra lateral, haga clic en Settings y acceda a la pestaña "AI Providers" (o directamente en /settings).

2 2. Use Quick Add o "+ Add Provider"

Haga clic en un preset de Quick Add (OpenAI, DeepSeek, Gemini, Anthropic, etc.) para autocompletar o use "+ Add Provider".

3 3. Verifique Formato y Base URL

Seleccione formato de protocolo: "OpenAI format" o "Anthropic format". Confirme la Base URL correspondiente.

4 4. Pegue la API Key de Forma Segura

Pegue su clave. MarbleSend la guarda cifrada con AES-256-GCM mediante Crypto.php sin exposición en texto plano.

5 5. Defina el ID del Modelo y Pruebe Conexión

Ingrese el ID del modelo y context window, luego haga clic en "Test Connection" para validar el handshake en vivo antes de guardar.

6 6. Establezca el Modelo Activo Predeterminado

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.

Verificación de Firma Ed25519

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.

Vinculación de Dominio y Nivel

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.

Resiliencia de Gracia Offline de 7 Días

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.

Política de Soft-Lock

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.

Comprobación automática de actualizaciones

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 y correos de actualización

«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.

Manual de reducción de soporte

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?

Causa principal:

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.

Diagnóstico y mecanismo:

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.

Solución y playbook práctico:

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?

Causa principal:

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.

Diagnóstico y mecanismo:

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.

Solución y playbook práctico:

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?

Causa principal:

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.

Diagnóstico y mecanismo:

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.

Solución y playbook práctico:

¡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?

Causa principal:

Falta el token obligatorio {{unsubscribe_link}}, asunto inválido, cero destinatarios activos seleccionados o syntax de token sin cerrar.

Diagnóstico y mecanismo:

El motor de Preflight analiza 6 vectores de cumplimiento normativo y deliverability antes de autorizar el cambio de estado a queued o sending.

Solución y playbook práctico:

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?

Causa principal:

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.

Diagnóstico y mecanismo:

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.

Solución y playbook práctico:

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?

Causa principal:

Syntax de correo inválida según RFC 5322, direcciones duplicadas con "Skip Duplicates" activo, codificación distinta de UTF-8 o contacts suprimidos.

Diagnóstico y mecanismo:

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.

Solución y playbook práctico:

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)?

Causa principal:

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).

Diagnóstico y mecanismo:

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.

Solución y playbook práctico:

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?

Causa principal:

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.

Diagnóstico y mecanismo:

Word MSO solo interpreta estructuras clásicas basadas en tablas (nested <table>, <tr>, <td>) con anchos en píxeles explícitos y estilos inline.

Solución y playbook práctico:

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?

Causa principal:

El tamaño del file HTML sin procesar supera el límite estricto de 102 KB (104.448 bytes) impuesto por Gmail.

Diagnóstico y mecanismo:

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.

Solución y playbook práctico:

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?

Causa principal:

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.

Diagnóstico y mecanismo:

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.

Solución y playbook práctico:

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?

Causa principal:

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.

Diagnóstico y mecanismo:

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.

Solución y playbook práctico:

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?

Causa principal:

Transcurrieron múltiples intervalos de ejecución mientras el proceso worker no estaba disponible.

Diagnóstico y mecanismo:

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.

Solución y playbook práctico:

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?

Causa principal:

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.

Diagnóstico y mecanismo:

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}}.

Solución y playbook práctico:

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?

Causa principal:

La entrega se registra por programación, no por publicación.

Diagnóstico y mecanismo:

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×».

Solución y playbook práctico:

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"?

Causa principal:

Credenciales SMTP incorrectas, discrepancia entre puerto y cifrado (Puerto 587 STARTTLS vs Puerto 465 SSL) o dirección de correo del remitente no verificada.

Diagnóstico y mecanismo:

Settings → SMTP cuenta con una prueba de socket en vivo que exhibe el diálogo directo entre PHPMailer y su servidor SMTP.

Solución y playbook práctico:

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?

Causa principal:

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.

Diagnóstico y mecanismo:

MarbleSend efectúa consultas DNS no bloqueantes (dns_get_record) directamente a nameservers autorizados para SPF (root TXT), DKIM (selector._domainkey) y DMARC (_dmarc).

Solución y playbook práctico:

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?

Causa principal:

El endpoint de destino devolvió errores HTTP 5xx consecutivos, tiempos de espera superiores a 10s o respuestas 404 Not Found.

Diagnóstico y mecanismo:

Para no colapsar la cola del servidor, MarbleSend supervisa las entregas y pausa automáticamente el webhook (enabled = 0) tras fallos sucesivos reiterados.

Solución y playbook práctico:

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?

Causa principal:

Interrupciones de red, fallos en la resolución DNS o mantenimiento temporal en el servidor de licencias principal.

Diagnóstico y mecanismo:

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.

Solución y playbook práctico:

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.

Plugin de WordPress y REST API

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.

Interactive Inspector
REST API

Puente REST API

Sin base de datos compartida
WP-CRON

Cola de envío

Almacenamiento transient
NATIVE

MarbleSend Form

Shortcode, Block y Widget
WPFORMS

Hook de WPForms

wpforms_process_complete
CF7

Hook de Contact Form 7

wpcf7_mail_sent
FLUENT

Hook de Fluent Forms

submission_inserted
FORMIDABLE

Formidable Forms

frm_after_create_entry
FORMINATOR

Hook de Forminator

submit_before_set_fields
AUTOMATION

Autoresponders por tag

Tags y emails de bienvenida

Impacto en la base de datos:

Consejo profesional del equipo de soporte:

REQUISITO PREVIO

Instala 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
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
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
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
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.

Sin el plugin no existe la página MarbleSend Integrations en wp-admin, y tus formularios de WordPress no pueden enviar sus envíos a MarbleSend.

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.

Sin base de datos compartida

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.

API key con scope limitado

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.

Prueba de conexión

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.

Upsert y fusión de tags

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.

API Ingestion Endpoint (cURL Example)
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.

Nada lento en la petición del visitante

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.

WP-Cron envía la cola

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.

Un intento por elemento 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.

Los fallos se registran

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.

Transient Queue Enqueuing Snippet
// 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.

Shortcode, bloque o widget

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"].

Protección contra bots

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.

Se envía en cuanto el visitante pulsa enviar

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.

Nombres, tags y confirmación

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.

Shortcode & Gutenberg Block Embed Syntax

[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.

Detección y hook

El plugin detecta WPForms con function_exists('wpforms') y escucha la acción wpforms_process_complete (prioridad 10), que recibe los campos ya validados.

ID de campo

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.

Configuración

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.

Tag de origen

Cada contacto de WPForms recibe el tag source:wpforms junto a tus propios tags, así puedes enviar una Campaign solo a ese grupo.

WPForms Complete Hook Architecture
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.

Detección y hook

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.

Nombres de tag

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.

Lectura del envío

El plugin lee los datos enviados con WPCF7_Submission::get_instance()->get_posted_data(), que funciona con el envío AJAX de CF7.

Configuración

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.

Contact Form 7 Mail Sent Hook
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.

Detección y hook

El plugin detecta Fluent Forms con function_exists('wpFluent') y escucha fluentform/submission_inserted (prioridad 10), que recibe $entry_id, $form_data y $form.

Name Attribute

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.

Lista de formularios

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.

Configuración

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.

Fluent Forms Insertion Action
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.

Detección y hook

El plugin detecta Formidable con class_exists('FrmForm') y escucha frm_after_create_entry (prioridad 30), que recibe $entry_id y $form_id.

Field 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.

Solo entradas guardadas

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.

Configuración Paso a Paso

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.

Formidable Metas Extraction Hook
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.

Detección y hook

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.

Element ID

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.

Lista de formularios

La página Integrations lista tus formularios de Forminator por nombre, leídos con Forminator_API::get_forms().

Configuración

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.

Forminator Submission Pre-Field Hook
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.

Tags de origen

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.

Email de bienvenida

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.

Sin servicio de automatización en medio

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.

Double opt-in y consent record

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.

Autoresponder Tag Structure (JSON Payload)
{
  "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?

Causa principal:

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).

Diagnóstico y mecanismo:

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.

Solución y playbook práctico:

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"?

Causa principal:

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ó.

Diagnóstico y mecanismo:

MarbleSend_Integration_Base::log_skip() escribe una entrada en marblesend_forms_log siempre que un formulario activado no produce un email válido.

Solución y playbook práctico:

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?

Causa principal:

La key de WordPress se revocó, caducó, se borró en MarbleSend o se creó sin el scope contacts:write.

Diagnóstico y mecanismo:

Test Connection llama a GET /api/verify-key. Una respuesta HTTP 401 o 403 significa que la autenticación falló.

Solución y playbook práctico:

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?

Causa principal:

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.

Diagnóstico y mecanismo:

Envía el formulario tú mismo. Si ves "There was an error trying to send your message", CF7 no pudo enviar su email.

Solución y playbook práctico:

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?

Causa principal:

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 @.

Diagnóstico y mecanismo:

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.

Solución y playbook práctico:

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.