Documentação & Enciclopédia do Sistema
Guia técnico abrangente, diretório de elementos de IU e manual de otimização para hospedagem compartilhada do MarbleSend.
Arquitetura do sistema e base de hospedagem
Filosofia: Auto-hospedado, single-tenant, zero-build e compatível com hospedagem compartilhada
O MarbleSend foi desenvolvido do zero para resolver uma dor notória em softwares de e-mail marketing: a necessidade de servidores VPS dedicados caros, servidores Redis, pipelines de compilação em Node ou orquestração complexa com Docker. O MarbleSend roda em hospedagem compartilhada padrão (cPanel, Hostinger, DirectAdmin, Plesk, LiteSpeed) usando PHP 8.2+ puro sem compilação no servidor.
Zero injeções SQL
Cada consulta ao banco de dados utiliza prepared statements rigorosos sem a sobrecarga de um ORM.
Criptografia em repouso
Credenciais SMTP, chaves API de IA e secrets de webhook criptografados em Crypto.php.
Sem envios duplicados
O worker reivindica lotes da fila atomicamente por meio de atualizações de status no MySQL com controle rígido de prazos.
Implantação instantânea
Tailwind CSS pré-compilado e Alpine.js integrado. Envie o zip, execute o instalador e pronto.
0.1 Filosofia de hospedagem e runtime Zero-Build
A maioria das aplicações web modernas exige pipelines de build Node.js, servidores daemon Redis, orquestração Docker ou acesso root VPS. MarbleSend rejeita essa complexidade. Projetado especificamente para hospedagem compartilhada acessível (cPanel, Hostinger, Plesk, LiteSpeed), roda em PHP 8.2+ puro com zero compilação no servidor.
Zero compilação no servidor
Nenhum npm, Webpack, Vite ou Composer necessário no servidor de produção. Tailwind CSS é pré-compilado em ativos estáticos, Alpine.js é empacotado localmente e PHPMailer 6.9.x é incluído diretamente em vendor-lite.
Baixo consumo de memória
O uso de memória de pico permanece abaixo de 32MB mesmo processando lotes da fila de email. Executa suavemente dentro dos limites rigorosos de memória da hospedagem compartilhada (alocações de 64MB-128MB no php.ini).
Sem funções proibidas
Evita estritamente funções perigosas comumente desativadas por provedores de hospedagem compartilhada (exec, shell_exec, system, passthru, eval, proc_close). Todas as operações externas utilizam cURL nativo com timeouts.
0.2 Perímetro de segurança e isolamento de diretórios
MarbleSend implementa uma estrutura estrita de dois níveis que separa ativos web públicos do código confidencial da aplicação e do storage, eliminando riscos de directory traversal e exposição de files.
Document Root isolado (public/)
Apenas o diretório public/ é exposto ao servidor web. Aponte o DocumentRoot do seu domínio ou subdomínio para /public. Mesmo que a listagem de diretórios esteja ativa no Apache/Nginx, os files de código-fonte não podem ser navegados.
Núcleo da aplicação protegido (app/)
Controladores, serviços, bibliotecas, visualizações e configurações residem fora do document root em app/. Credenciais de banco de dados em app/config/config.php e chaves de criptografia são inacessíveis via requisições HTTP diretas.
Storage e migrações seguras
O diretório storage/ (contendo logs do worker) e migrations/ (contendo files SQL de schema puros) residem completamente fora de public/, impedindo downloads não autorizados de logs do sistema ou estruturas de banco de dados.
0.3 Banco de dados Zero-ORM e Prepared Statements PDO
Object-Relational Mappers (ORMs) como Eloquent ou Doctrine introduzem overhead massivo de memória, camadas complexas de hidratação e consultas N+1 imprevisíveis. MarbleSend utiliza diretamente o PDO nativo do PHP com 100% de prepared statements.
100% Prepared Statements
Cada consulta vincula parâmetros explicitamente (PDO::PARAM_STR, PDO::PARAM_INT). Estruturas SQL e dados de usuário nunca se misturam, fornecendo imunidade matemática contra ataques de injeção de SQL.
Consultas previsíveis de alta performance
A execução SQL direta elimina a sobrecarga de hidratação de objetos ORM, processando operações de listagem e atualizações em lote da fila até 5x mais rápido com consumo mínimo de CPU em servidores compartilhados.
Migrações de schema idempotentes
Versões do banco de dados são rastreadas através de files SQL numerados (0001_initial.sql até 0019_add_feedback_attachment.sql) executados por um runner idempotente com cláusulas IF NOT EXISTS e registrados em cm_migrations.
Isolamento de dados Single-Tenant
Projetado como software standalone single-tenant sem colunas tenant_id. Índices permanecem compactos, varreduras sequenciais são evitadas e o risco de vazamento de dados entre clientes é zero.
0.4 Criptografia em repouso e padrões criptográficos
Segredos confidenciais nunca são armazenados em texto simples. MarbleSend criptografa credenciais usando criptografia simétrica autenticada padrão da indústria através de App\Lib\Crypto.
Criptografia AES-256-GCM
Utiliza Advanced Encryption Standard em Galois/Counter Mode (AES-256-GCM), fornecendo tanto confidencialidade quanto verificação de integridade criptográfica para detectar qualquer adulteração.
IV aleatório único de 96 bits
Cada valor criptografado gera um vetor de inicialização (IV) aleatório de 12 bytes (96 bits) via random_bytes(), garantindo que textos idênticos produzam ciphertexts totalmente distintos.
Catálogo de segredos criptografados
Protege automaticamente senhas de relay SMTP, chaves de API de IA BYOK (OpenAI, Claude, Gemini, DeepSeek, Kimi, OpenRouter), secrets de assinatura de webhook e o Purchase Code Envato.
Isolamento da Master Key
A chave ENCRYPTION_KEY de 32 bytes é gerada durante a instalação e armazenada exclusivamente em app/config/config.php (chmod 0600). O banco de dados nunca contém a chave de criptografia.
0.5 Dual-Worker Engine e segurança de concorrência
MarbleSend delega todas as tarefas agendadas e com uso intensivo de tempo a um worker em segundo plano unificado, garantindo que o dashboard administrativo permaneça rápido e responsivo o tempo todo.
Executor mestre único em segundo plano
worker.php coordena envio de lotes da fila, execução de agendamentos recorrentes, sondagem de posts RSS, disparo de autorrespondedores e reenvio de campanhas não abertas.
Flexibilidade de CLI Cron e Web-Cron
Executável via crontab nativo do sistema (* * * * * php /path/to/worker.php) ou via ping HTTP externo seguro para /cron.php?key=YOUR_KEY. Ambos os caminhos executam lógica de serviço idêntica.
Reivindicação atômica de fila (sem envios duplos)
Instâncias do worker reservam lotes da fila através de atualizações atômicas de status SQL (UPDATE cm_email_queue SET status = 'processing' WHERE status = 'pending' LIMIT N). Mesmo execuções paralelas nunca enviam emails duplicados.
Heartbeat e recuperação de trabalhos parados
Monitora o heartbeat de execução em cm_settings. Se um worker for interrompido no meio do envio (ex.: timeout da hospedagem), execuções posteriores detectam e recuperam automaticamente os itens pendentes.
0.6 Requisitos do servidor e matriz de compatibilidade de hospedagem
MarbleSend é verificado e compatível com todos os ambientes de hospedagem compartilhada padrão, painéis de controle e configurações de servidor que atendam aos requisitos básicos de PHP 8.2+.
| Componente | Requisito Mínimo | Recomendado | Notas Operacionais |
|---|---|---|---|
| Runtime PHP | PHP 8.2.0+ | PHP 8.2 ou 8.3 | strict_types=1 declarado em todos os files da aplicação. |
| Motor de banco de dados | MySQL 8.0+ / MariaDB 10.6+ | MariaDB 10.11+ ou MySQL 8.0+ | Engine InnoDB obrigatório. Charset UTF8MB4 full Unicode. |
| Extensões obrigatórias | pdo_mysql, openssl, mbstring, json, curl, simplexml, sodium | Todas as extensões padrão do núcleo habilitadas | Padrão em 99% das hospedagens compartilhadas. Opcional: intl para formatação regional. |
| Servidor Web | Apache, Nginx, LiteSpeed, Caddy | Apache + mod_rewrite ou LiteSpeed | Files .htaccess pré-configurados incluídos na raiz e em public/. |
| Alocação de memória | 32MB memory_limit | 64MB - 128MB | Os lotes da fila são processados de forma comedida para evitar exaustão de memória. |
| Agendador Cron | CLI crontab OU ping HTTP Web-Cron | CLI cron a cada 1 minuto | Endpoint alternativo Web-Cron (/cron.php?key=...) para hosts sem acesso à CLI. |
Painéis de controle de hospedagem testados
Totalmente testado e verificado no cPanel, Hostinger hPanel, Plesk, DirectAdmin, CyberPanel, AApanel, CloudPanel e pilhas LAMP/LEMP convencionais Ubuntu/Debian.
Visão geral do Dashboard (/dashboard)
Centro de comando unificado para saúde da lista, KPIs de entrega, heartbeat do worker e automação de agendamentos.
Anatomia dos componentes do Dashboard e inspetor de suporte
Passe o cursor ou clique em qualquer elemento abaixo para obter detalhes do backendTotal enviados
Agregação de logs e contador mensalAberturas / Taxa de abertura
Pixel de rastreamento 1x1 e nota sobre Apple MPPCliques / CTR
Injetor de redirecionamento de cliquesPúblico cancelado
Taxa de cancelamento e conformidade RFCHeartbeat do worker
Status do cron e intervalo de 1 minGráfico de crescimento de volume
Escala 7d, 30d, 90d, YTDTabela de transmissões recentes
Ciclo de status e trilha de auditoriaSaúde da entregabilidade
Prontidão do perfil SMTP1.1 Cartões KPI de desempenho de e-mail
| Elemento | Cálculo e origem | Significado visual | Justificativa de prevenção de suporte |
|---|---|---|---|
| Cartão de total enviados | COUNT(cm_email_logs) + SUM(cm_campaigns.sent_count) | Exibe o total histórico de e-mails de transmissão e agendados disparados. O subtexto exibe o volume enviado neste mês calendário. | Evita confusão quando entradas antigas de logs são limpas; os contadores históricos de Campaign garantem que os totais nunca diminuam. |
| Total de aberturas / Taxa de abertura | COUNT(DISTINCT contact_id WHERE opened_at IS NOT NULL) / Total Sent * 100 | Mede o engajamento através de um pixel de rastreamento transparente de 1x1 inserido no rodapé do e-mail HTML. | Aviso sobre Apple MPP: O Mail Privacy Protection do iOS pré-carrega imagens por meio do proxy da Apple, o que pode inflar artificialmente as aberturas. O CTR é a verdadeira métrica de negócios. |
| Total de cliques / CTR | COUNT(DISTINCT contact_id WHERE clicked_at IS NOT NULL) / Total Sent * 100 | Mede cliques únicos de assinantes em links. Reescrito através de /track/click.php. | Links de cancelamento de inscrição e links de confirmação são excluídos do CTR de Campaign para preservar a integridade estatística. |
| Cartão de cancelamentos de inscrição | COUNT(status = 'unsubscribed') / Total Contacts * 100 | Taxa de destinatários que optaram por cancelar a inscrição pelo mecanismo obrigatório de um clique. | O limite saudável é < 0,5%. Taxa de cancelamento > 1% indica fadiga do público, listas compradas ou baixa relevância. |
Total enviado e rendimento mensal
Acompanha o total histórico de e-mails despachados por transmissões, programações recorrentes, feeds RSS e respostas automáticas. O subtexto destaca o volume enviado no mês civil em curso. A consolidação dos contadores históricos de Campaigns preserva os dados mesmo durante a limpeza do banco de dados.
Aberturas únicas e dinâmica Apple MPP
Registrado por meio de um pixel de rastreamento transparente de 1x1 inserido no rodapé HTML do e-mail. Registra aberturas exclusivas por contato e Campaign (primeiro contato). Nota importante: o Apple Mail Privacy Protection (MPP) carrega imagens em proxy, inflando aberturas. A taxa de cliques (CTR) reflete o verdadeiro interesse de conversão.
Cliques únicos e motor de reescrita de URL
Cada link no corpo da mensagem é reescrito para apontar para /track/click.php, salvando o ID de contato, ID da Campaign, URL de destino e horário. Links de cancelamento (/unsubscribe.php) e confirmação (/confirm.php) estão rigorosamente isentos do rastreamento.
Contatos cancelados e proteção do domínio
Mede cancelamentos pelo link de rodapé ou cabeçalho RFC 8058 List-Unsubscribe de um clique. Uma lista saudável mantém a taxa abaixo de 0,5%. Acima de 1,0%, o MarbleSend alerta para que a qualidade dos envios seja revista antes que serviços como Gmail, Yahoo e Outlook penalizem o domínio.
1.2 Operações e heartbeat de saúde do worker
O MarbleSend opera com um único executor mestre em segundo plano: worker.php. O dashboard inspeciona cm_settings['worker_last_run'] para determinar se o cron está disparando a cada 60 segundos.
Estado ativo (Cron saudável)
Quando worker.php é executado nos últimos 3 minutos, o selo exibe Ativo. Os lotes da fila são processados em tempo real, newsletters agendadas são disparadas no prazo e autoresponders disparam prontamente.
Estado inativo (Cron não detectado)
Se nenhum heartbeat for registrado por mais de 3 minutos, o selo fica vermelho. Clicar no cartão direciona imediatamente para Settings → Sistema com o comando CLI crontab exato e a URL de fallback Web-Cron.
Contatos ativos vs Audiência total
Mostra os contatos em status ativo em relação ao total de inscritos. O MarbleSend aplica uma máquina de 4 estados: active, pending (aguardando double opt-in), unsubscribed e suppressed (erros/reclamações). Os disparos filtram rigidamente por WHERE status = 'active'.
Volume mensal e histórico de Campaigns
Resume os envios do mês civil ativo e o total histórico de Campaigns, permitindo acompanhar o ritmo de produção de marketing.
Resolução da próxima programação agendada
Consulta programações ativas (ordenadas por next_run_at ASC LIMIT 1) e apresenta o próximo boletim na fila e a contagem decrescente. Todos os horários são calculados por SchedulerService::computeNextRun() com reconhecimento de fuso horário e salvos em UTC.
Heartbeat do worker e Cron em hospedagem compartilhada
O sinal vital do sistema valida se o worker.php executou nos últimos 180 segundos. Em hospedagens compartilhadas (cPanel, Hostinger), configure a crontab para * * * * * php /caminho/para/worker.php >/dev/null 2>&1. Caso o cron CLI não esteja disponível, use o endpoint seguro de Web-Cron (/cron.php?key=YOUR_KEY) compatível com cron-job.org.
1.3 Visualizador de crescimento de Campaign
O visualizador de crescimento renderiza a distribuição de volume em quatro intervalos selecionáveis: 7 dias, 30 dias, 90 dias e no ano até a data (YTD). Cada barra representa um bloco de tempo agregado, exibindo contagem de envios e aberturas ao passar o cursor.
Permite alternar entre o ritmo semanal (7 dias), ciclos mensais (30 dias), desempenho trimestral (90 dias) e o acumulado anual (início do ano até hoje).
Renderizado com CSS flexbox puro com base no pico de envios, garantindo carregamento ultrarrápido em celulares e hospedagens simples.
Ao passar o cursor sobre as barras, visualizam-se a data, os e-mails enviados e o volume de aberturas únicas para comparações imediatas.
Feed de envios ao vivo e sinal do sistema
A coluna da direita exibe os disparos recentes de Campaign em tempo real com emblemas animados (Completed, Sending pulsante, Failed, Draft), taxas de entrega e cartão de atividade do worker.
status = 'completed'
status = 'sending'
status = 'failed'
status = 'draft'
Histórico de Campaigns e tabela de auditoria
A tabela de auditoria inferior lista as transmissões recentes com metadados: nome da Campaign, status, origem (manual, schedule, rss, auto_resend), proporção de destinatários atendidos e taxa de abertura apurada.
Exibe o assunto da Campaign, a data de criação e a tag de origem (manual, recurring, rss ou resend_unopened).
Contagem instantânea de mensagens entregues versus falhas, além de porcentagens em tempo real de taxa de abertura e taxa de cliques.
Atalho direto para a página de relatório da Campaign para ver logs de eventos por destinatário e o modal de reenvio para não abertos.
1.6 Atalhos de ação rápida e automação de fluxos
Acessos diretos para conectar o painel aos processos essenciais: boletins periódicos automatizados, digests de fontes RSS para e-mail, importação de contatos, double opt-in e supressão de endereços.
Automação de fluxo (Recorrente e RSS)
Despacha e-mails automáticos segundo agendamentos cron ou sempre que um feed RSS de WordPress/Ghost/Substack publicar novos artigos.
Gestão de público e assinantes
Permite a importação veloz de listas em CSV, segmentação em grupos, imposição de double opt-in e bloqueio preventivo de endereços rejeitados ou cancelados.
Gerenciador de Campaigns e Relatórios (/campaigns)
Compositor de transmissões de alta velocidade, seletor de destinatários por tags, motor de segurança preflight e relatórios detalhados de entrega.
Interactive Campaigns UI Inspector
Clique em qualquer componente para inspecionar o impacto no esquema e dicas operacionaisMonitor de Envio Live
Estatísticas e eventos em tempo realSeletor de Destinatários
Filtro de tags e seleção geralEditor de Visualização Tripla
Código, split e préviaMotor de Verificação Preflight
Inspeção automatizada em 6 pontosDiagnóstico de Envio de Teste
Amostra direta sem filaReescritor de UTM e Links
Parâmetros UTM e rastreio 302Histórico de Disparos
Filtros de status e origemRelatório Detalhado Pós-Envio
CTR, MPP e reenvio automático2.1 Banner de monitoramento em tempo real de Campaign
Sempre que uma transmissão estiver em envio ativo, um banner de monitoramento fixo desliza para a parte superior de /campaigns. Ele consulta /api/campaigns/:id/progress a cada 1,5 segundo sem recarregar a página.
Summer Launch Newsletter
Sending74% complete
7,420 / 10,000 emails
Na Fila
2,528
Enviando
40
Sucesso
7,420
Com Falha
12
Recent Events Real-time status
Motor de Polling de 1,5 Segundo
Consulta /api/campaigns/:id/progress assincronamente a cada 1,5 segundo, atualizando o rendimento ao vivo sem recarregar o navegador.
Fluxo de Eventos Recentes de Entrega
Registro em tempo real exibindo as 5 últimas atualizações de status de destinatários com confirmações de entrega e diagnósticos de erro SMTP.
Se o worker.php em segundo plano estiver atrasado ou o cron inativo, um alerta é exibido com orientações de solução imediatas.
2.2 Seletor de destinatários e filtros por tag (coluna esquerda)
A coluna esquerda permite a segmentação precisa de assinantes. Os administradores podem filtrar por tags personalizadas de contato, pesquisar por e-mail/nome parcial e selecionar contatos individuais ou clicar em Selecionar todos os correspondentes.
Garantia de filtragem da máquina de estados:
Independentemente da seleção ou busca, o motor de consulta aplica rigorosamente status = 'active'. Contatos cancelados, pendentes ou suprimidos são automaticamente excluídos da fila.
Interseção de Múltiplas Tags
Selecione segmentos específicos de assinantes por tags. O seletor calcula dinamicamente o número de contatos coincidentes em tempo real.
Busca em Tempo Real com Debounce (300ms)
Pesquisa instantânea filtrando contatos por nome ou e-mail com intervalo de 300ms para evitar sobrecarga no banco de dados em listas volumosas.
Controles Centrais de Seleção
Marque contatos individualmente ou use Selecionar Tudo para atingir todos os contatos que atendem ao filtro ativo com um só clique.
Grupos
Os contatos são organizados em grupos (um contato pode estar em vários; todo contato está em pelo menos um, General por padrão). Em Select Recipients escolha “Por grupo” para enviar a cada contato ativo dos grupos escolhidos — o grupo inteiro, não só a página exibida — ou “Escolher manualmente” para selecionar contatos individuais (com filtro opcional por um grupo).
Os grupos também podem ser escolhidos como público de um agendamento, como gatilho de uma regra de autoresponder, como destino de uma página de inscrição e para restringir um reenvio a quem não abriu. Excluir um grupo nunca exclui seus contatos; as regras de autoresponder que dependem dele são desativadas.
2.3 Compositor de Campaign e modos do editor dividido
Modo dividido
Edição simultânea de código à esquerda e visualização responsiva em iframe em tempo real à direita.
Modo somente código
Editor de código HTML em largura total e livre de distrações, com números de linha e abas de syntax.
Modo pré-visualização ao vivo
Renderização isolada com alternância de visualização para dispositivos Desktop (100%), Tablet (600px) e Celular (375px).
Variáveis de Placeholder e Motor de Substituição
Personalize mensagens dinamicamente com as tags {{name}}, {{email}}, {{unsubscribe_link}}, {{offer_url}} e {{track_pixel}}.
Viewports Responsivos em Sandbox
Avalie a renderização responsiva em telas móveis (375px), tablets (600px) e computadores (100%) dentro de um iframe isolado antes do envio.
2.4 Verificação automatizada de segurança preflight de 6 pontos
Para evitar erros graves (como envio de e-mails com placeholders quebrados, links de descadastro ausentes ou gatilhos de spam), o MarbleSend exige uma verificação preflight antes do disparo.
| Verificação de segurança | Gravidade | Regra e detecção | Consequência em caso de falha |
|---|---|---|---|
| 1. Link de cancelamento de inscrição | CRÍTICO | Verifica a presença do token {{unsubscribe_link}}. | O envio é BLOQUEADO. Obrigatório sob CAN-SPAM, GDPR e os requisitos de remetente do Google e Yahoo de 2024. |
| 2. Validade de placeholders | CRÍTICO | Detecta tags de placeholder desconhecidas (ex.: erros de digitação como {{first_nam}}). | Envio bloqueado até que tags desconhecidas sejam corrigidas ou removidas. |
| 3. Público de destinatários | CRÍTICO | Valida se > 0 destinatários ativos estão selecionados. | Não é possível transmitir para uma seleção vazia. |
| 4. Conectividade SMTP | CRÍTICO | Verifica o host e as credenciais do perfil SMTP selecionado. | Evita travamentos na fila causados por credenciais inválidas de relay. |
| 5. Palavras que acionam spam | AVISO | Analisa o assunto e o corpo em busca de termos que acionam spam ("100% free", "act now", "limited time"). | Banner de aviso exibido; o administrador pode revisar e prosseguir. |
| 6. Comprimento da linha de assunto | INFORMAÇÃO | Recomenda de 30 a 60 caracteres para truncamento ideal em dispositivos móveis. | Aviso informativo para alcançar taxas de abertura mais altas. |
Barreira de Verificação Preflight
Analisa 6 verificações automáticas de segurança antes da entrada na fila. Qualquer erro CRÍTICO desativa o botão de envio.
2.5 Diagnóstico de envio de teste e modal de confirmação
Antes de enviar milhares de e-mails para a fila, o botão Enviar e-mail de teste dispara uma mensagem de teste única diretamente para o administrador ou caixa de QA sem alterar a lista de destinatários no banco de dados. Todas as tags de placeholder ({{first_name}}, {{email}}, {{unsubscribe_link}}) são preenchidas com valores de simulação para você inspecionar a renderização no Gmail, Apple Mail e Outlook.
Interpolação com Dados de Teste
Preenche variáveis de assinante com valores de amostra (ex: Jane Doe, link de descadastramento de teste) para validação visual realista.
Modal de Confirmação Pré-Disparo
Confirmação em duas etapas apresentando total de destinatários, perfil do remetente e tags UTM ativas antes de iniciar a fila.
2.6 Injeção automatizada de rastreamento UTM
Todas as tags de link de saída (<a href="...">) são processadas por App\Services\TrackingInjector. Os parâmetros UTM (utm_source, utm_medium, utm_campaign, utm_content) são anexados automaticamente antes do encapsulamento de redirecionamento de clique. Links mailto, tel e de cancelamento são mantidos intactos.
Etapa 1: Injeção de Parâmetros UTM
Insere utm_source, utm_medium, utm_campaign e utm_content em cada link sem sobrescrever parâmetros de consulta já presentes.
Etapa 2: Inserção do Pixel de Rastreio
Adiciona uma imagem GIF transparente de 1x1 antes do fechamento de </body> para registrar aberturas quando o e-mail for carregado.
Etapa 3: Motor de Redirecionamento 302
Converte links externos para /track/click.php?h=... viabilizando redirecionamentos rápidos com coleta de métricas de clique no primeiro toque.
Isenções Rígidas de Conformidade
Links de desinscrição, protocolos mailto/tel e links de confirmação double opt-in são rigorosamente excluídos de UTM e rastreamento de cliques.
2.7 Histórico e portfólio de Campaigns (/campaigns/history)
O portfólio de histórico completo oferece filtragem multiatributo por origem (manual, recurring, rss, resend_unopened), status (completed, sending, failed, draft) e intervalo de datas. Os administradores podem selecionar múltiplas Campaigns para baixar logs agregados de entrega em CSV.
Canal de Rastreamento de Origem
Classifica disparos pela origem: Composer manual, Agendamentos periódicos, Gatilhos de blog RSS ou Clones de reenvio para não abridores.
Filtro Multi-Status e Exportação CSV
Filtre o arquivo por status concluído, enviando, com falha ou rascunho. Baixe relatórios de entrega completos com um clique.
Duplicação de Disparos em um Clique
Copie qualquer envio anterior de volta ao composer com layout HTML completo, subject e remetente preservados.
2.8 Relatórios analíticos e recurso "Reenviar para não abertos"
Opcional: escolha grupos para reenviar apenas a quem não abriu e pertence a eles. Um reenvio nunca vai além dos destinatários da Campaign original.
Em /campaigns/:id/report, o MarbleSend apresenta um relatório pós-Campaign abrangente:
4 Métricas de Desempenho Bento
Mede total Enviado (100%), Falhas de entrega, Aberturas únicas com taxa de abertura e Cliques únicos com CTR.
Curva de Engajamento por Hora
Exibe os picos de abertura hora a hora durante as primeiras 72 horas para determinar os melhores horários de envio aos assinantes.
Reenvio Focado em Não Abridores
Duplica a Campaign direcionando a assinantes com opened_at IS NULL, viabilizando novos subjects para resgatar 15–25% de aberturas extras sem impactar leitores que já interagiram.
Central de Contatos e Ferramentas de Crescimento (/contacts)
Gerenciamento do ciclo de vida do assinante, importação CSV, conformidade com GDPR, páginas de inscrição personalizadas e autoresponders.
Inspetor Interativo de UI de Contatos
Clique em qualquer componente para inspecionar o impacto no esquema e dicas operacionaisMáquina de 4 Estados
active/pending/unsub/suppMecanismo de Busca e Filtros
Tags, status e debounceGaveta de Auditoria e Consentimento
IP, carimbos e rejeiçõesImportador CSV RFC 4180
50 mil linhas e proteções dedupPáginas de Captura Hospedadas
Double opt-in e funisAutoresponders por Tag
Regras de envio por eventosHub de Gestão em Massa
Segmentação entre páginasPrivacidade e Supressão GDPR
Exportação JSON e exclusão total3.1 A máquina de estados de assinantes de 4 estados
O MarbleSend mantém uma máquina de estados unificada e rigorosa para todos os contatos. Não há flags booleanas paralelas. Cada pipeline de envio filtra WHERE status = 'active'.
Assinante ativo
Opt-in confirmado, e-mail válido. Elegível para receber Campaigns, agendamentos e autoresponders.
Double Opt-In pendente
Inscrito através de formulário de double opt-in, aguardando clique no e-mail de confirmação. Excluído de transmissões até ser confirmado.
Inscrição cancelada
Clicou no link de cancelamento de inscrição. Nunca mais receberá envios. Não pode ser reativado manualmente sem um novo opt-in explícito.
Hard Bounce / Reclamação
Permanentemente suprimido devido a caixa postal inválida (5xx SMTP), reclamação de spam ou supressão manual pelo administrador.
| Status | Gatilho de Transição | Status de Destino | Impacto no Disparo de Campaigns |
|---|---|---|---|
| active | O assinante clica no link de cancelamento ou no cabeçalho RFC 8058 | unsubscribed | Excluído imediatamente de todas as filas de broadcast e programações futuras. |
| active | Rejeição permanente SMTP 5xx ou 3ª rejeição suave consecutiva | suppressed | Colocado em quarentena permanente para resguardar a reputação do domínio remetente. |
| pending | O assinante clica no link com o token de confirmação de double opt-in | active | Promovido a active; habilitado a receber Campaigns e autoresponders. |
| suppressed | Cancelamento manual da supressão pelo administrador com confirmação | active | Contador de rejeições suaves zerado; restabelecido nas filas ativas de envio. |
Proteção Arquitetural: Zero Flags Booleanas Secundárias
O MarbleSend adota uma única coluna ENUM (cm_contacts.status). Outras plataformas costumam sofrer com corrupção de dados quando variáveis booleanas como is_active, is_unsubscribed e is_bounced entram em conflito. No MarbleSend, cada consulta de envio aplica WHERE status = 'active' com clareza absoluta.
3.2 Filtros em tempo real, busca e ações de linha
A tabela de Contatos oferece filtragem reativa instantânea com Alpine.js por tags, status do assinante (active, pending, unsubscribed, suppressed) e busca debounce de texto livre por e-mail e nome/sobrenome.
Todo contato pertence a pelo menos um grupo (General por padrão). Use o filtro Grupos para restringir a tabela e Gerenciar grupos para criar, renomear ou excluir grupos — excluir um grupo nunca exclui seus contatos.
Armazenamento e Normalização de Tags JSON
As tags ficam armazenadas como arrays JSON normalizados em cm_contacts.tags. Não diferenciam maiúsculas de minúsculas e são indexadas para filtragem imediata.
Busca Instantânea com Debounce de 300ms
As pesquisas filtram simultaneamente por e-mail, nome e sobrenome com um retardo de 300ms para reduzir sobrecargas no banco de dados.
Paginação no Servidor e Escala
Navegue facilmente por listas com mais de 50.000 assinantes utilizando consultas SQL com LIMIT e OFFSET altamente econômicas em memória.
Atualize nome, metadados personalizados e chips de tags inline sem recarregar.
Suprima um contato instantaneamente para desqualificá-lo de todas as filas de imediato.
Exclui permanentemente o perfil do contato, logs e itens de fila em conformidade com o Artigo 17 do GDPR.
3.3 Painel lateral de detalhes, trilha de auditoria GDPR e exportação JSON
Clicar em qualquer linha de contato abre o painel lateral de auditoria. Ele apresenta métricas do ciclo de vida (total de e-mails recebidos, taxa de abertura, contagem de cliques), endereço IP do opt-in, carimbo de data/hora do opt-in, slug do formulário de inscrição e um botão de um clique para Exportar JSON GDPR em conformidade com o Artigo 15 (Direito de acesso) e o Artigo 20 (Portabilidade de dados).
Carimbo de Data/Hora de Opt-in e Origem
Registra a data, hora exata e canal de captura (Manual, Importação de CSV, slug de Página de Inscrição ou API) para verificação jurídica.
Captura de Endereço IP Verificado
Registra o endereço IP do assinante no instante do envio do formulário, fornecendo comprovação indispensável sob a GDPR e CAN-SPAM.
Telemetria de Engajamento Vitalício
Acompanha o volume acumulado de envios juntamente com marcas de tempo de abertura comprovadas para separar assinantes ativos de inativos.
Escalação Automática de Rejeição Suave
Contabiliza falhas temporárias sucessivas de entrega (X / 3). Ao registrar a 3ª falha suave consecutiva, o status é alterado automaticamente para suppressed.
3.4 Importador CSV e mapeamento de colunas
O importador processa files CSV de até 50.000 linhas. Ele detecta delimitadores automaticamente (vírgula, ponto e vírgula, tabulação) e oferece menus suspensos visuais para mapear colunas para: E-mail, Nome, Sobrenome e Tags.
Escolha a quais grupos os contatos importados se juntam (General se nenhum). Os contatos existentes são adicionados a esses grupos; nunca são removidos dos grupos a que já pertencem.
Upload por Blocos Seguro para Memória
Processa arquivos de até 50.000 linhas em lotes transacionais, contendo o uso de memória abaixo de 32MB mesmo em planos de hospedagem compartilhada rígidos.
Autodetecção de Delimitador e Mapeamento Inteligente
Reconhece vírgulas, ponto e vírgulas e tabulações automaticamente, oferecendo mapeamento intuitivo para E-mail, Nome, Sobrenome e Tags.
Tags de Lote e Auditoria Pós-Importação
Aplica uma tag unificada a todos os contatos do lote e gera um relatório transparente sobre dados adicionados, atualizados ou ignorados.
Ignorar duplicados
Preserva os detalhes e tags existentes dos contatos. Apenas novas linhas são inseridas.
Atualizar campos vazios
Preenche nomes ausentes e anexa novas tags sem sobrescrever dados existentes.
Sobrescrever tudo
Atualiza nomes e tags completamente para corresponder ao file CSV importado.
3.5 Páginas públicas de inscrição (/s/:slug)
Localizado na Aba 2 de Contatos. Crie páginas de inscrição independentes com sua marca, com título, descrição, rótulos de campos e botões de envio personalizados. Os recursos incluem:
Escolha os grupos a que os inscritos desta página se juntam (General se nenhum). Grupos excluídos depois são descartados automaticamente.
Monitora o acumulado de impressões em todos os funis de captura ativos.
Calcula o percentual de envios em relação às visualizações em todos os formulários hospedados.
Mostra a quantidade de páginas de captura em funcionamento frente ao limite de 20 páginas.
Registra os novos contatos adquiridos dentro do intervalo móvel dos últimos 30 dias.
Integração Multicanal de Formulários
Incorpore formulários onde precisar via URL direta (/subscribe?slug=...), código HTML limpo, iframe responsivo ou modal popup em JavaScript.
Gera tokens de confirmação assinados com HMAC com disparo automatizado de e-mail de confirmação.
Atribui tags de assinante designadas no momento do cadastro para ativar sequências personalizadas.
Direciona novos assinantes para sua página de agradecimento ou URL de recompensa digital após o opt-in.
3.6 Autoresponders e sequências de envio programado
Fica na aba 3 de Contacts. Configure e-mails de boas-vindas automáticos que entram na fila assim que um novo inscrito fica ativo — logo após a inscrição ou após confirmar o double opt-in. Uma regra corresponde a uma tag ou a um grupo; não há configuração de atraso. Os e-mails são entregues pelo worker em segundo plano e respeitam automaticamente as regras de suppression.
Uma regra pode disparar por um grupo em vez de uma tag. As regras de grupo rodam quando um novo contato ativo é criado nesse grupo ou confirma por e-mail — não quando um contato existente é adicionado ao grupo depois (igual às regras de tag). Excluir o grupo desativa a regra.
Ouvinte de Eventos Baseado em Tag
Dispara quando um novo inscrito ativo tem a tag da regra ou pertence ao seu grupo — logo após uma página de inscrição, chamada de API ou cadastro manual (single opt-in), ou quando o double opt-in é confirmado. Não dispara em importações CSV, nem quando uma tag ou um grupo é adicionado depois a um contato existente.
Roteamento por SMTP Dedicado
Direciona e-mails transacionais de boas-vindas através de perfis SMTP dedicados com alta reputação, separados de envios em massa.
Processamento Assíncrono no Worker
Delega a renderização e o disparo ao worker.php, prevenindo lentidões no navegador e mantendo os formulários instantâneos.
Prevenção de Loops e Deduplicação
Evita disparos redundantes, garantindo que o assinante não receba e-mails repetidos se receber a mesma tag novamente.
3.7 Gerenciamento em lote e segmentação de listas (/contacts/list)
Em /contacts/list, gerencie listas de alto volume com operações em lote: selecione em várias páginas, aplique ou remova tags em massa, suprima milhares de leads inativos simultaneamente ou exporte segmentos selecionados para files CSV em UTF-8.
Adicionar ao grupo e Remover do grupo valem para todos os contatos selecionados. Remover um contato do seu último grupo o devolve ao General.
Adicionar Tags em Massa
Insere tags em todos os contatos selecionados em uma única query sem sobrepor as tags existentes.
Remover Tags em Massa
Remove tags específicas com pontualidade dos contatos selecionados em múltiplos grupos.
Exportação CSV Filtrada
Gera arquivos CSV em conformidade com a RFC 4180 contendo apenas os contatos filtrados e seus metadados integrais.
Supressão em Massa
Isola contatos inativos ou suspeitos instantaneamente para resguardar as métricas de reputação.
Cancelamento em Massa
Efetua pedidos de cancelamento de inscrição agrupados vindos de origens externas ou campanhas offline.
Exclusão Permanente GDPR
Elimina irreversivelmente os dados do assinante e seus registros de telemetria conforme o Artigo 17 da GDPR.
3.8 Privacidade GDPR, Exportação de Auditoria e Padrões de Exclusão
Mecanismos de privacidade embutidos em conformidade rígida com o Regulamento Geral sobre a Proteção de Dados (GDPR) da União Europeia, CCPA e CAN-SPAM.
A exportação GDPR (JSON) também lista os grupos a que o contato pertence.
Artigos 15 e 20: Exportação em JSON Estruturado
Produz um prontuário JSON legível por máquina com cadastro do assinante, IP de consentimento, histórico de opt-in e logs de disparo.
Artigo 17: Direito ao Esquecimento (Exclusão Irreversível)
A exclusão permanente propaga-se por cm_contacts, cm_email_logs e cm_email_queue, eliminando qualquer vestígio identificável.
Trava de Segurança na Reativação de Contatos
Exige aprovação administrativa expressa para desbloquear um contato suprimido, impedindo envios involuntários a caixas postais inválidas.
Estúdio de Modelos e Redator com IA (/templates)
8 layouts de e-mail baseados em tabelas, pré-visualização em iframe isolado com reset de CSS em miniatura, redator de IA focado em vendas e publicações de notícias em Markdown para newsletters.
Inspetor de UI do Templates Studio
Clique em qualquer componente abaixo para consultar queries de banco de dados, impacto no esquema e orientações operacionaisBiblioteca de Templates
Pesquisa instantânea e slugsLayouts Starter
8 layouts de email baseados em tabelasEditor de Código Puro
Indentação Tab e limpadorViewport Isolado
Moldura desktop e mobilePaleta de Tokens Dinâmicos
Inserção de placeholders em 1 cliqueRemetente de Teste
Janela de verificação SMTP em tempo realGaveta do AI Copywriter
Gerar e refinar templatesRevisor de Assuntos
Nota 1–100 e filtro antispamPublicações de notícias
Artigos em Markdown para newsletters4.1 Biblioteca de Templates, Slugs Personalizados e Gestão de Metadados
Repositório unificado para todos os templates de marketing, transacionais e autoresponders. Oferece busca rápida no navegador, slugs imutáveis e status de rascunho em tempo real.
Slugs de Templates Imutáveis
Os identificadores de slug (#monthly-newsletter) são travados após o salvamento, evitando falhas em Campaigns RSS automáticas e sequências programadas.
Busca Rápida com Debounce
Filtro Alpine instantâneo que consulta títulos, assuntos e slugs sem sobrecarregar a base de dados com requisições adicionais.
Sincronização de Estado de Rascunho
Um cartão tracejado específico destaca rascunhos abertos na memória contrapondo-os aos templates consolidados em produção.
Instantâneos Independentes de Campaigns
Alterar ou apagar templates não desconfigura broadcasts passados. Disparos anteriores mantêm cópias estáticas isoladas em cm_campaigns.
4.2 8 Layouts Starter Responsivos Baseados em Tabelas Testados
Aplicações de email convencionais (como o Microsoft Outlook sob o renderizador Word HTML) não aceitam CSS Grid ou Flexbox. O MarbleSend inclui 8 layouts estruturados em tabelas testados no Gmail, Outlook, Apple Mail e Yahoo:
Espaço limpo com rodapé obrigatório para cancelamento de inscrição.
Banner de destaque, proposta de valor e CTA marcante.
Editorial selecionado com destaques de artigos em 2 colunas.
Faixa de cabeçalho mais o bloco {{news_posts}} para agendamentos de Publicações de notícias.
Integração pessoal com guia de primeiros passos em 3 etapas.
Emblema de data/hora, biografia do palestrante e botão de confirmação.
Artigos numerados, tempo de leitura e tags de autor.
Cupom de desconto urgente e texto focado em aversão à perda.
Arquitetura de Tabelas Aninhadas e CSS Inline
Cada layout starter é elaborado com tags <table> aninhadas, larguras explícitas em pixels, espaçamentos zerados e CSS inline para estabilidade absoluta.
4.3 Editor de Código HTML Puro e Formatador Limpo
Um ambiente enxuto para criação de emails com controle de Tabulação, contagem de caracteres em tempo real e organizador automático de espaçamentos.
Indentação com Tecla Tab
O acionamento de Tab adiciona 2 espaços no código em vez de desviar o cursor, viabilizando a organização do markup na própria janela.
Formatador de Código em 1 Clique ("Clean")
Uniformiza recuos, remove quebras supérfluas e organiza as tabelas sem quebrar propriedades de estilo inline.
Prevenção contra Truncamento por Peso
Controle contínuo do tamanho. Preservar o HTML abaixo de 102 KB impede que o Gmail esconda o conteúdo sob o aviso "[Message clipped]".
Livre de Código Desnecessário de Editores Visuais
A manipulação direta do HTML evita classes extras, tipografias incompatíveis e tags span invisíveis que prejudicam o envio.
4.4 Viewports Responsivos Multidispositivo Isolados
Emula leitores de desktop e celulares em um iframe sandbox com proteção de isolamento, resguardando o painel de controle de estilos externos.
Segurança do Iframe e Isolamento de CSS
O parâmetro sandbox="allow-same-origin" impede que regras CSS do email vazem para a interface do MarbleSend.
Alternador entre Desktop e Celular 320px
Mude instantaneamente da exibição desktop larga para o formato de 320px com moldura de celular para atestar a leitura em coluna única.
Exibição de Assunto em Tempo Real
A barra superior mostra o assunto montado em tempo real, ilustrando como os tokens de personalização surgirão na caixa de entrada do contato.
Aviso Dinâmico de Syntax
Analisa o código e expõe um banner se encontrar placeholders incompletos ou tokens não reconhecidos.
4.5 Tokens Dinâmicos de Personalização e Conformidade RFC
No momento do envio, o motor de modelos substitui dinamicamente os tokens por atributos do destinatário, links de rastreamento seguros, resumos de artigos RSS e Publicações de notícias.
Nome completo do contato (adota "there" se estiver vazio)
Endereço de email do destinatário
Link obrigatório de cancelamento de inscrição em 1 clique segundo RFC 8058
URL de confirmação double opt-in para páginas de captura
Bloco de repetição de posts do blog para newsletters automáticas de RSS
Título do feed de conteúdo RSS/Atom conectado
Título da publicação mais recente no blog
Quantidade de novidades do feed incorporadas ao disparo
Bloco de Publicações de notícias para um agendamento de Newsletter (capa, título, subtítulo, corpo)
Número de Publicações de notícias incluídas neste envio
Título da Publicação de notícias mais recente deste envio
Obrigatoriedade Legal e Proteção de Reputação
Todas as mensagens promocionais devem trazer {{unsubscribe_link}}. Disparos sem desinscrição clara desrespeitam CAN-SPAM, GDPR e CASL, gerando bloqueio do domínio.
4.6 Diagnóstico de Envio de Teste Único e Pré-Visualização
Recurso prático para despachar mensagens de teste para qualquer endereço usando o perfil SMTP desejado antes do agendamento ou transmissão.
Roteamento por Perfis SMTP Distintos
Direcione testes por qualquer perfil SMTP ativo para conferir SPF, DKIM e entrega real em diferentes provedores de destino.
Preenchimento Sintético de Placeholders
Preenche os tokens com dados simulados autênticos (ex.: "John Doe") para possibilitar uma avaliação visual minuciosa do alinhamento.
Envio Síncrono sem Fila
Dispensa a fila de segundo plano (cm_email_queue) e aciona o MailerFactory de forma síncrona com retorno imediato de sucesso ou erro.
Conferência de Modo Escuro e Dispositivos
Mande testes para caixas do Gmail, Outlook e Apple Mail para checar o contraste dos botões e a inversão de cores em modo escuro.
4.7 Motor de Copywriting com AI Atrativo BYOK
Assistente de redação nativo operando diretamente via BYOK (Bring Your Own Key) para elaborar e aperfeiçoar templates de alta conversão sem intermediários.
Princípio Fundamental: A Qualidade Depende do Prompt e do Modelo
O MarbleSend não restringe você a um único modelo proprietário fechado. Como a geração roda através do provedor BYOK configurado, a qualidade visual do e-mail, o poder de persuasão, a precisão das tabelas HTML e a crítica de assuntos são regidos fundamentalmente por duas variáveis: a especificidade das instruções do seu prompt e a capacidade de raciocínio do modelo LLM selecionado.
1. Especificidade e Profundidade de Contexto do Prompt
O modelo de IA reflete a clareza e o contexto das instruções fornecidas. Um prompt genérico como "escreva um e-mail promocional" produzirá um texto comum. Para resultados excepcionais, forneça um contexto estruturado: público-alvo, dores principais, oferta central, tom de voz (urgente, conversacional, formal) e um Call-to-Action (CTA) claro. Na aba Editar template, dê instruções de ajuste direcionadas (ex.: "encurte o segundo parágrafo", "destaque 20% de desconto no botão CTA", "adicione um bloco com 3 benefícios") para refinar o template passo a passo.
2. Nível do Modelo LLM e Poder de Raciocínio
Em Settings → AI Providers, você pode conectar modelos líderes de raciocínio (como DeepSeek-V4.1-flash, Claude 5 Sonnet ou GPT-6) ou modelos leves locais (como 7B–8B parâmetros via Ollama ou Groq). Modelos de topo destacam-se no aninhamento complexo de tabelas HTML seguras para e-mail, inserção natural de token de personalização ({{name}}, {{email}}, {{unsubscribe_link}}) e copywriting persuasivo. Na aba Opções de assunto, a pontuação (1–100), o risco de spam e as sugestões são avaliados em tempo real pelo modelo ativo — modelos superiores oferecem análises muito mais precisas e variações de assunto superiores.
Salvaguardas do System Prompt Integradas ao MarbleSend
Independentemente do tamanho do prompt ou do modelo escolhido, o AiService.php injeta regras rígidas de segurança para e-mails: estrutura responsiva de tabela única (largura máx. 600px, tela limpa, cartões de alto contraste), botões CTA em tabela à prova de falhas compatíveis com Outlook e Gmail, zero imagens externas para blindar a entregabilidade e inclusão obrigatória do token {{unsubscribe_link}} no rodapé para cumprir as legislações globais.
Geração de Template Completo
Cria templates HTML responsivos baseados em tabelas sob medida para seu público-alvo, proposta principal, tom de voz e extensão.
Aprimoramento por Contexto
Lê o código presente no editor e realiza intervenções sob demanda (ex.: "adicione uma seção de 3 benefícios" ou "torne o botão de ação mais convincente").
Comparativo Visual Lado a Lado
Painéis com sandbox exibem as opções "Antes" e "Depois" conjuntamente para checagem antes da efetivação no código.
Como Obter API Keys nos Principais Provedores
Após obter a chave API e o ID do modelo desejado, realize a configuração no MarbleSend com estas etapas:
4.8 Pontuação de Assuntos com AI e Inspetor de Entregabilidade
Avalia os assuntos de toda a biblioteca, estimando índice de abertura, riscos de palavras-gatilho de spam e limites de caracteres com alternativas em 1 clique.
Carregamento de Assuntos da Biblioteca
Compila os assuntos gravados em cm_templates em uma listagem contínua, realçando o item pertencente ao template aberto no editor.
Avaliação Multifatorial de 1 a 100
O LLM em uso pondera curiosidade, clareza, relevância e urgência, formulando uma pontuação objetiva de 0 a 100.
Checagem de Espaço Mobile e Termos Críticos
Indica textos que ultrapassam o limite de telas compactas (recomendado <= 50 caracteres) e aponta termos como "GRÁTIS", "URGENTE $$$" ou excesso de pontuação.
Variações Otimizadas para Alta Conversão
Gera alternativas focadas em curiosidade, benefício direto ou aversão à perda, que podem ser adotadas no editor com um clique.
Publicações de notícias — artigos no estilo Substack para newsletters
Escreva artigos na aba Publicações de Modelos (Markdown com pré-visualização ao vivo). Um agendamento de Newsletter definido como “Publicações de notícias” envia cada publicação Pronta uma única vez, da mais antiga para a mais recente, preenchendo o marcador {{news_posts}} do seu modelo. As publicações existem apenas no seu e-mail — não há página pública.
Escreva e marque como Pronta
Use a barra de ferramentas ou Markdown simples. Uma publicação só é enviada depois de você mudá-la de Rascunho para Pronta.
Marcador do modelo
Coloque {{news_posts}} onde os artigos devem aparecer (o modelo inicial “Newsletter de publicações de notícias” já o contém). {{news_posts_count}} e {{news_latest_post_title}} funcionam no assunto.
Agende
Em Agendamentos escolha Newsletter e depois Origem do conteúdo: Publicações de notícias. Somente as publicações marcadas como Prontas a partir desse momento são enviadas, então o seu arquivo nunca é reenviado. Supressão Inteligente não é usado.
Seguro por design
O texto das publicações é escapado como HTML e somente links e imagens https são permitidos. Mantenha cada e-mail abaixo de cerca de 100 KB para o Gmail não cortar o link de cancelamento — o editor avisa você.
O espaço de trabalho de Publicações num relance
Abra Modelos e mude para a aba Publicações. A biblioteca fica à esquerda e o editor com a pré-visualização ao vivo à direita — o mesmo layout do estúdio de modelos.
| Parte | O que faz |
|---|---|
| Biblioteca | Lista cada publicação com um selo de Rascunho ou Pronta, quantas vezes foi enviada e quando mudou pela última vez. A caixa de busca filtra por título e subtítulo; o ícone da lixeira aparece ao passar o cursor. |
| Título, subtítulo, capa | O título é obrigatório (até 255 caracteres, uma linha). O subtítulo (até 500) aparece abaixo. A imagem de capa deve ser uma URL https — qualquer outra é recusada ao salvar. |
| Alternador de status | Publicações em Rascunho nunca são enviadas. Passar uma publicação para Pronta registra o momento em que ela ficou Pronta; esse momento decide quais agendamentos podem enviá-la. |
| Editor Markdown | Os botões da barra (título, negrito, itálico, link, listas, citação, divisor, imagem) inserem syntax em volta da sua seleção. Uma publicação pode ter até 100.000 caracteres. |
| Pré-visualização ao vivo | Renderiza a publicação não salva dentro do modelo escolhido, com o mesmo código de um envio real, e mostra o tamanho do e-mail em KB. Marcadores como {{name}} usam valores de exemplo. |
| Atalho do marcador | Um botão abaixo do editor copia {{news_posts}} para você colar em um modelo. |
Referência de Markdown
O texto da publicação é escrito em um subconjunto pequeno e seguro de Markdown. Tudo fora desta lista permanece como texto simples.
| Syntax | Resultado |
|---|---|
| ## Heading ### Smaller | Título (os níveis 1–3 viram títulos seguros para e-mail) |
| **bold** *italic* | Negrito e itálico |
| [text](https://example.com) | Link. Apenas endereços http, https e mailto são vinculados; qualquer outro esquema (como javascript:) fica como texto simples. |
| - item 1. item | Listas com marcadores e numeradas |
| > quote | Citação em bloco |
| --- | Linha divisória |
|  | Imagem. Somente https; sempre adicione uma descrição curta para leitores que bloqueiam imagens. |
| (blank line) | Parágrafos são separados por uma linha em branco; uma quebra de linha simples continua sendo quebra de linha dentro do parágrafo. |
| <script>alert(1)</script> | HTML bruto nunca é interpretado: uma tag <script> ou <img> digitada aparece como texto literal. |
A família de marcadores {{news_posts}}
Coloque-os em um modelo; um agendamento de Publicações de notícias os preenche no envio, antes de os tokens habituais por destinatário, como {{name}}, serem resolvidos.
| Marcador | Torna-se |
|---|---|
| {{news_posts}} | O bloco de publicações deste envio: capa, título, subtítulo e corpo de cada uma, da mais antiga para a mais recente. Obrigatório no corpo do modelo. |
| {{news_posts_count}} | O número de publicações deste envio, por exemplo 1. Funciona no assunto e no corpo. |
| {{news_latest_post_title}} | O título da publicação mais recente deste envio. Ideal para o assunto. |
Obrigatório no corpo
Um agendamento de Publicações de notícias é recusado ao salvar se o corpo do modelo não tiver {{news_posts}}, e uma execução falha com segurança (as publicações continuam pendentes) se o modelo for editado depois.
Nunca enviado como texto bruto
Usados em outro lugar — uma Campaign manual, um agendamento RSS ou um agendamento só de modelo —, os marcadores são substituídos por texto vazio, e a verificação prévia da Campaign avisa antes do envio.
Personalizado e rastreado
O texto da publicação passa pelo fluxo normal: {{name}} dentro de uma publicação é personalizado por destinatário, os links recebem parâmetros UTM e rastreamento de cliques, e o link de cancelamento do seu modelo permanece intacto.
Ciclo de vida da publicação
Cada publicação passa pelos mesmos estados simples; o selo na biblioteca sempre mostra o atual.
Rascunho
Ainda sendo escrita. Nunca enviada. Voltar uma publicação Pronta para Rascunho apaga a hora em que ficou Pronta.
Pronta
Na fila de envio. Um agendamento só a envia se ela ficou Pronta depois de o modo Publicações de notícias desse agendamento ser ativado. Salvar uma publicação já Pronta não muda seu lugar na fila.
Enviada
Registrada por agendamento e exibida como “Enviada 1×” na biblioteca. Um agendamento nunca envia a mesma publicação duas vezes, mesmo que você a edite depois.
Excluída
Remove a publicação e seu histórico de envio. E-mails já entregues não são afetados, e uma publicação excluída não pode ser recuperada.
Tamanho do e-mail e segurança
As publicações levam o texto completo dentro do e-mail — não há página pública —, então tamanho e segurança importam mais do que num digest só de links.
Escapar primeiro
Cada caractere digitado é escapado como HTML antes de qualquer formatação, de modo que scripts e tags nunca cheguem à caixa de entrada do destinatário.
Somente https
Imagens e capa devem ser https. Links aceitam http, https e mailto. Outros esquemas aparecem como texto simples.
Fique abaixo de cerca de 100 KB
O Gmail corta mensagens acima de cerca de 102 KB e oculta o rodapé, incluindo o link de cancelamento. A pré-visualização mostra o tamanho em KB e avisa acima de 80 KB; use poucas publicações por e-mail em artigos longos.
Sem arquivo público
As publicações existem apenas dentro dos e-mails que você envia. Sem páginas web, sem upload de imagens e sem chamadas automáticas de IA — as imagens são vinculadas por URL.
Solução rápida de problemas
| Sintoma | O que verificar |
|---|---|
| A pré-visualização não mostra artigos | O modelo selecionado não tem o marcador {{news_posts}} (aparece como “sem {{news_posts}}” na lista). Escolha outro modelo ou adicione o marcador. |
| Aviso “E-mail grande” | Encurte a publicação, remova formatação pesada ou reduza “Publicações por e-mail” no agendamento. |
| Um link não é clicável | Escreva como [text](https://…) com um endereço http, https ou mailto; outros esquemas ficam como texto. |
| Uma imagem não aparece | O endereço deve começar com https e ser acessível publicamente. Alguns apps de e-mail também bloqueiam imagens remotas até o leitor permitir. |
Schedules & Automação RSS (/schedules)
Envios recorrentes de newsletters (modelo ou Publicações de notícias), calendário mensal interativo de envios, motor de cadência, segmentação dinâmica de público e Campaigns automáticas de RSS/Atom do blog.
Inspetor de UI de Agendamentos, RSS e Publicações de notícias
Clique em qualquer componente abaixo para ver consultas de banco de dados, impacto no esquema e dicas operacionais
Calendário & Matriz mensal
Mapa visual de agendamentos & cadênciaMotor de recorrência
Diário, semanal, mensal & personalizadoPoller de blog automatizado
Deduplicação de hash & cacheAudiência dinâmica
Consulta de tags no segundo exato da execuçãoLogs de ocorrências
Auditoria de execução & prevenção de duplicadosExecução imediata Run Now
Disparo imediato sem alterar a cadênciaOtimização de hospedagem
8 diretrizes operacionais selecionadasHeartbeat Cron & Trava
Bloqueio de simultaneidade não-bloqueanteModo Publicações de notícias
Newsletters no estilo Substack5.1 Operações em modo duplo: Gerenciador interativo de agendamentos & Visualização de calendário
O MarbleSend oferece duas visualizações operacionais sincronizadas para diferentes fluxos de trabalho: um gerenciador compacto em grade Bento (/schedules) e um calendário mensal interativo amplo (/schedules/list).
Visualização densa tabular & Bento
Exibe todos os envios recorrentes com contagem regressiva para a próxima execução, seletores de status ativo, prévias dos templates selecionados e atalhos diretos.
Grade interativa de calendário com 7 colunas
Mapeia entregas futuras em um calendário mensal padrão de domingo a sábado, com destaque para o dia atual, alternador de mês e marcadores de eventos clicáveis.
Gaveta de detalhes do agendamento selecionado
Painel de inspeção instantâneo renderizando prévias em sandbox de templates, especificações de recorrência, regras de tags de destinatários e ações rápidas.
5.2 Motor de cadência, regras de recorrência & Normalização de fuso horário UTC
Os agendamentos recorrentes utilizam SchedulerService::computeNextRun(), substituindo cálculos manuais de timestamp por matemática precisa com DateTimeImmutable do PHP.
Armazenamento universal em UTC com apresentação localizada
Todos os valores next_run_at são armazenados em UTC na tabela cm_schedules. Ao serem exibidos no navegador, são convertidos para o fuso horário configurado pelo administrador, preservando as janelas de entrega.
Recorrência diária & semanal
Suporte a envios diários em horários específicos ou seleção de dias da semana pré-definidos (por exemplo, terças e quintas pela manhã) através de pastilhas interativas.
Ajuste mensal para dias do mês
Para envios mensais agendados para os dias 29 a 31, o MarbleSend ajusta automaticamente a execução para o último dia válido de meses mais curtos (ex.: 28 ou 29 de fevereiro).
Reconhecimento de fuso horário & horário de verão (DST)
Utiliza cálculos nativos de DateTimeZone do PHP para garantir que os disparos ocorram no horário local pretendido, mesmo durante as transições de horário de verão.
5.3 Pipeline do poller automatizado de feeds RSS & Atom
O MarbleSend conecta-se diretamente ao feed do seu blog usando SimpleXML e cURL nativos, convertendo novos posts em Campaign automatizadas sem ferramentas de integração externas.
Analisador de formato duplo (RSS 2.0 & Atom 1.0)
Inspeciona automaticamente o nó raiz do XML, extraindo títulos, resumos de conteúdo, permalinks e timestamps de publicação com zero dependências externas.
Diagnóstico em tempo real pré-envio do feed
O botão "Test Feed" conecta à URL do feed em tempo real, valida o esquema XML, verifica respostas HTTP 200 e gera prévias dos últimos 3 posts.
Deduplicação & Snapshot inicial
Registra last_rss_item_id e datas de publicação. Ao criar o agendamento, o MarbleSend salva o ID do post mais recente como linha de base para não enviar acervos históricos retroativamente.
5.4 Resolução dinâmica de público & Segmentação de destinatários na execução
O público de um agendamento também pode ser limitado a um grupo (com uma tag, ambos precisam corresponder). Se o grupo for excluído, o agendamento é desativado em vez de enviar em silêncio para ninguém.
Diferente de snapshots estáticos de Campaign, envios agendados resolvem suas listas de destinatários dinamicamente no segundo exato em que a ocorrência dispara.
Expansão de público em tempo real
Assinantes que se inscrevem ou recebem tags minutos antes do horário agendado são automaticamente integrados ao disparo sem necessidade de re-sync manual.
Filtro estrito de status de entregabilidade
A consulta de envio exige WHERE status = 'active', excluindo contatos pendentes, cancelados e suprimidos de filas recorrentes.
Isolamento de segmentos baseado em tags
Suporta envio para todos os contatos ativos ou filtragem de segmentos específicos via matrizes de tags JSON (ex.: #weekly-digest, #customers).
5.5 Logs de execução de ocorrências, auditoria & Política de recuperação única
Cada execução automatizada gera um registro imutável em cm_schedule_occurrences, detalhando horários, resultados, contagem de destinatários e telemetria de erros.
Telemetria de ocorrência em 3 estados
Distingue entre 'completed' (emails na fila), 'skipped' (nenhum artigo RSS novo) e 'failed' (desconexão SMTP, template inválido ou timeout de rede).
Idempotência com proteção de recuperação única
Caso o cron worker fique inativo durante vários horários previstos, o MarbleSend realiza no máximo UM disparo de recuperação ao retornar e avança next_run_at para o futuro.
Modal de histórico de ocorrências & auditoria
Clique em "View Execution History" na barra lateral para analisar execuções anteriores, volumes de destinatários e logs diagnósticos diretamente na interface.
5.6 Envios manuais sob demanda ("Run Now") & Disparos de emergência
Administradores podem contornar a contagem regressiva e disparar imediatamente um envio avulso de qualquer agendamento com a ação "Trigger Send Now".
Compilação imediata da fila
Compila instantaneamente o template, resolve os destinatários ativos e envia lotes para cm_email_queue para o próximo ciclo do worker.
Cronograma de recorrência preservado
O disparo de um envio imediato não altera nem adia o timestamp programado em next_run_at, mantendo a cadência original do calendário intacta.
Diagnóstico & Boletins de notícias urgentes
Ideal para testar a renderização do template com dados reais de assinantes ou para publicar comunicados urgentes fora do horário comercial comum.
5.7 Simultaneidade segura do worker, prevenção de sobreposição & Travas não-bloqueantes
O MarbleSend conta com um perímetro de simultaneidade empresarial desenvolvido para evitar envios duplicados em servidores de hospedagem compartilhada.
Bloqueio de concorrência não-bloqueante flock
worker.php obtém uma trava exclusiva flock em storage/worker.lock. Se uma execução prévia ainda estiver ativa em relays SMTP de alta latência, chamadas subsequentes encerram de forma silenciosa.
Paridade entre os dois modos de worker
Tanto o worker.php via CLI quanto o cron.php via HTTP compartilham caminhos de execução e lógica de bloqueio idênticos, garantindo coerência entre cron do cPanel e webhooks.
Reserva atômica de ocorrências
Agendamentos prontos para envio são reservados usando instruções preparadas PDO atômicas, prevenindo enfileiramento duplicado mesmo em ambientes conteinerizados multithread.
5.8 Ajuste de performance em hospedagem compartilhada & 8 dicas recomendadas
O card dinâmico Optimization Tip na tela Schedules apresenta 8 recomendações operacionais comprovadas em produção para envios confiáveis em hospedagem compartilhada:
Agende disparos nas terças ou quintas entre 09:00 e 10:30 no fuso horário local dos destinatários para obter maiores taxas de abertura e cliques.
Execute o worker.php a cada minuto (* * * * *) com trava flock para garantir pontualidade sem colisão de processos.
Consulte cm_email_queue com instruções preparadas indexadas e cláusulas LIMIT para eliminar condições de corrida durante picos de envio.
Agrupe contatos por tags regionais (#us-east, #apac, #emea) e use agendamentos escalonados para evitar disparos às 3h da madrugada.
Agende disparos RSS 1 a 2 horas após a postagem no CMS para que as bordas de CDN e caches de XML estejam completamente sincronizados.
Efetue a limpeza periódica de logs antigos em cm_schedule_occurrences para manter o tamanho das tabelas otimizado e as consultas rápidas em planos compartilhados.
Programe um envio de reforço 48–72 horas depois para contatos com opened_at IS NULL usando um novo assunto para recuperar de 15% a 25% de engajamento.
Utilize perfis SMTP separados para feeds RSS automáticos e para grandes volumes de marketing para proteger a reputação do seu domínio remetente.
5.9 Agendamentos de Publicações de notícias (newsletters no estilo Substack)
Um agendamento de Newsletter agora pode enviar artigos em vez de um modelo fixo. Defina Origem do conteúdo como “Publicações de notícias” e cada execução entrega as próximas Publicações Prontas de Modelos → Publicações, inseridas no modelo por {{news_posts}}. Nada é enviado quando nenhuma publicação está esperando.
Qual origem de conteúdo devo usar?
Somente modelo
O mesmo modelo em cada execução — para avisos ou lembretes recorrentes. Supressão Inteligente está disponível.
Digest RSS
Novas publicações de um feed de blog externo. A primeira execução apenas marca as publicações existentes como vistas; as seguintes enviam só as novas.
Publicações de notícias
Artigos que você escreve dentro do MarbleSend. Cada publicação Pronta é enviada uma vez, da mais antiga para a mais recente. Ideal para uma newsletter no estilo Substack.
Configure em seis passos
- 1Abra Modelos → Publicações e escreva seu artigo em Markdown.
- 2Crie ou abra um modelo e coloque {{news_posts}} onde os artigos devem aparecer (o modelo inicial “Newsletter de publicações de notícias” já o contém).
- 3Abra Agendamentos → Novo, mantenha o tipo em Newsletter e defina Origem do conteúdo como “Publicações de notícias”.
- 4Escolha o modelo, o público, o perfil SMTP, as publicações por e-mail (1–20) e a cadência.
- 5Salve. Somente publicações que ficarem Prontas depois deste momento podem ser enviadas por este agendamento.
- 6Marque a publicação como Pronta. A próxima ocorrência — ou Executar agora — a envia.
Quais publicações são enviadas a cada execução
A cada ocorrência, o agendamento escolhe publicações por quatro regras, nesta ordem.
Somente Prontas
Rascunhos são ignorados, por mais antigos que sejam.
Depois da data de corte
Uma publicação precisa ter ficado Pronta depois de o modo Publicações de notícias do agendamento ser ativado. Seu arquivo existente nunca é reenviado.
Ainda não enviada por este agendamento
A entrega é registrada por agendamento, então dois agendamentos podem enviar a mesma publicação uma vez cada, mas nunca duas.
As mais antigas primeiro, até o limite
“Publicações por e-mail” (padrão 1, máximo 20) limita quantas são combinadas. As demais esperam a próxima execução.
O que cada execução registra
Cada ocorrência aparece no histórico do agendamento. As publicações só são marcadas como entregues quando um lote de e-mails foi realmente colocado na fila.
Enviada
Uma Campaign foi criada e colocada na fila, por exemplo “1 post · 5 recipients queued”. As publicações são marcadas como enviadas por este agendamento.
Ignorada: sem publicações novas
Nenhuma publicação Pronta está esperando. Nada é enviado e o agendamento tenta de novo na próxima ocorrência.
Ignorada: sem destinatários
O público estava vazio. As publicações continuam pendentes e são enviadas assim que o público tiver contatos ativos.
Falhou
O modelo não existe ou não contém mais {{news_posts}}. As publicações continuam pendentes; corrija o modelo e execute de novo.
Executar agora e envios de teste
Executar agora
Uma ocorrência real, executada pelo worker em cerca de um minuto. Envia as publicações pendentes e as marca como entregues.
Enviar digest de teste
Envia as próximas publicações pendentes — ou, se não houver nenhuma, a publicação Pronta mais recente — para um endereço pelo perfil SMTP do próprio agendamento. Nunca marca nada como entregue e compartilha o limite de testes de 5 por minuto.
Editar e pausar
- Mudar um agendamento de Somente modelo para Publicações de notícias define uma nova data de corte nesse momento; voltar a apaga.
- Salvar o formulário do agendamento verifica de novo se o modelo contém {{news_posts}}. Pausar e Retomar apenas alternam o interruptor de ligado/desligado e nunca verificam, então você sempre pode pausar.
- Supressão Inteligente é desativada automaticamente no modo Publicações de notícias: ela excluiria todos que receberam uma edição anterior.
- Publicações de notícias só está disponível para agendamentos de Newsletter; os agendamentos RSS mantêm sua própria lógica de feed.
Lendo as telas de agendamentos
- A lista de agendamentos rotula estes agendamentos como “Publicações de notícias” em vez de “Newsletter”.
- O painel de detalhes mostra quantas publicações Prontas esperam por este agendamento.
- No formulário, modelos sem {{news_posts}} são sinalizados, e um aviso aparece se você escolher um.
Solução rápida de problemas
| Sintoma | O que verificar |
|---|---|
| Minha publicação Pronta não foi enviada | Verifique se ela ficou Pronta depois de o agendamento ser salvo (ou mudado para Publicações de notícias), se o agendamento está ativado, e veja a entrada do histórico: “no recipients” ou “failed”. |
| O agendamento diz “no new posts” logo depois de eu escrever uma | A publicação pode ainda estar em Rascunho, ou já ter sido enviada por este agendamento. Abra Modelos → Publicações e verifique o selo e “Enviada N×”. |
| Não consigo salvar: o modelo deve conter {{news_posts}} | Adicione o marcador ao corpo do modelo (não só ao assunto) ou escolha outro modelo. |
| Quero reenviar uma publicação antiga | Copie o texto dela para uma nova publicação e marque a nova como Pronta — um agendamento nunca envia a mesma publicação duas vezes. |
Settings e Infraestrutura (/settings)
Gerenciamento de múltiplos relays SMTP, heartbeat do cron, 23 idiomas, diagnóstico de entregabilidade e ativação de licenças.
UI Inspector de Settings e Infraestrutura
Clique em qualquer componente abaixo para visualizar o impacto no esquema de base de dados, processos em segundo plano e diretrizes operacionais
Perfis SMTP
BYO SMTP e Relay SES GerenciadoWorker e Cron
Cadência de execução de 1 minuto23 Idiomas e Tema
Espelho RTL e Modo Escuro/ClaroChaves REST API
Acesso de desenvolvedor com escopoWebhooks de Eventos
Push de eventos HMAC-SHA256Suite de Entregabilidade
SPF, DKIM, DMARC e BIMIProvedores de AI
BYOK e Créditos MarbleSendLicença Ed25519
Token de concessão criptográfica6.1 Arquitetura de entrega dupla: BYO SMTP e Relay Amazon SES Gerenciado
O MarbleSend desacopla a execução das campanhas dos relays de entrega por meio de dois modelos de transporte: (1) Bring Your Own (BYO) SMTP para conectar seus servidores de e-mail existentes, e (2) MarbleSend SMTP via Amazon SES para entrega corporativa em nuvem sem configurar contas AWS nem aquecer IPs. Campanhas vinculam-se dinamicamente com fallback padrão transparente e contabilidade atômica.
Conecte qualquer provedor SMTP padrão, como Postmark, Mailgun, Brevo, SendGrid, Resend ou a caixa cPanel da sua hospedagem. Suporta porta 587 com STARTTLS, porta 465 com SSL/TLS implícito e porta 25 local, com autenticação personalizada e cabeçalhos de remetente isolados.
6.1.1 Provedores de Servidor SMTP (Gratuitos, Comerciais e Hospedagem Compartilhada)
Diretório e Comparação SMTPConecte seu próprio transporte de e-mail com credenciais SMTP padrão. Escolha entre relays em nuvem dedicados ou caixas de hospedagem.
Caixas de hospedagem compartilhada impõem limites rígidos (geralmente 100–500 e-mails/dia). Para campanhas de marketing, migre para Business Email ou conecte um relay em nuvem.
Otimizados para envio em massa e alta entregabilidade na caixa de entrada.
| Provedor / Website | Cota Gratuita | Preços Comerciais | Host e Porta SMTP | Principais Regras e Limitações |
|---|---|---|---|---|
| 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. |
Caixas cPanel padrão são adequadas para correspondência leve, mas estritamente limitadas para e-mail marketing.
Business Email Plans (Per Mailbox)
1 GB storage, 1 forwarding rule, 1 alias, up to 100 mailboxes/domain. Standard webmail & antispam. Strict sending cap (~100-200/day).
5 GB storage, 5 forwarding rules, 5 aliases, expandable mailbox storage. No mailbox limit per domain.
20 GB storage, 20 forwarding rules, 10 aliases, AI Kodee mailbox assistant & smart replies.
50 GB storage, 50 forwarding rules, 30 aliases, full AI suite & priority deliverability.
Hostinger Reach (Email Marketing)
100 recipients, 200 emails / month. Suitable for basic transactional testing.
500 recipients, 500 emails / month, 10 AI credits, remove Reach branding, automations.
1,000 recipients, 7,000 emails / month, 20 AI credits, custom HTML code, send-time optimization.
• cPanel Shared: Max ~500 emails/hour per cPanel domain.
• Private Email: Starter (~$1.24/mo per mailbox, 5GB). Pro (~$2.82/mo, 30GB).
• SMTP Host: mail.privateemail.com (Port 465 SSL or 587 TLS).
• Shared cPanel: Default cap ~500 emails/hour. Internal mail system may defer large sudden bursts.
• Professional Email: Integrated with Microsoft 365 or Google Workspace ($2.99–$9.99/mo).
• SMTP Host: box###.bluehost.com or mail.yourdomain.com (Port 465 SSL).
• Site Tools Mail: Included in hosting (StartUp, GrowBig, GoGeek).
• Rate Limits: ~400 emails/hour on StartUp; up to ~800/hour on GoGeek. Strictly intended for transactional mail.
• SMTP Host: mail.yourdomain.com (Port 465 SSL).
• Paid Business Email: ~$1.99/mo per mailbox (25GB storage).
• Strict Outbound Policy: Maximum 100 recipients per hour. Mass marketing prohibited via shared SMTP.
• SMTP Host: smtp.dreamhost.com (Port 465 SSL or 587 TLS).
• cPanel Limit: Max 500 emails/hour per domain on shared plans.
• Workspace Option: Google Workspace addon ($6–$18/mo).
• SMTP Host: mail.yourdomain.com (Port 465 SSL or 587 TLS).
• M365 Reseller: Email Essentials from ~$1.99–$5.99/mo (10GB-50GB).
• SMTP Relay Note: Direct SMTP AUTH requires enabling Authenticated SMTP in the M365 Admin Portal.
• SMTP Host: smtp.office365.com (Port 587 TLS).
Selecione a porta e o protocolo de segurança adequados para sua rede.
The modern standard for email client-to-relay submission (RFC 6409). Starts in cleartext and immediately upgrades connection to TLS. Supported by almost all cloud relays.
Implicit TLS/SSL wrapper connection (RFC 8314). Required by Hostinger, Namecheap cPanel, and selected enterprise relays. Highly reliable when hosting firewalls restrict 587.
Server-to-server MTA routing. Almost universally blocked on cloud hosts (Hostinger, AWS, DigitalOcean, Hetzner, etc.) to combat spam. Do NOT use for outbound SMTP credentials.
6.1.1 Relay Amazon SES Gerenciado e Domínios de Remitente Personalizados
MANAGED SESInfraestrutura corporativa de entrega em nuvem gerenciada pela MarbleSend via api.marblesend.com. Elimina o bloqueio de portas SMTP, o gerenciamento de credenciais IAM e riscos de reputação de IP em hospedagem compartilhada. Possui dois modos de remetente (Friendly From e Easy DKIM), créditos iniciais gratuitos, auditoria de ledger atômica e escalabilidade dinâmica sob demanda.
Entrega corporativa em nuvem Amazon SES pré-configurada e gerenciada pelo MarbleSend. Zero configuração de conta AWS, sem gerenciamento de credenciais IAM e sem aquecimento de IP. Recarregue créditos via nosso prestador de pagamentos sob demanda com sincronização automática do medidor em tempo real.
Cada e-mail despachado via MarbleSend SES reserva 1 crédito atomicamente usando idempotência por UUID da fila (cm_addon_ledger.uq_addon_ledger_key). Se a transmissão falhar, a reserva é imediatamente liberada e reembolsada sem intervenção manual.
O modal Test Connection executa um handshake SMTP ao vivo e envio de teste via MailerFactory. Exibe a troca de mensagens de socket em tempo real para diagnosticar erros de autenticação (535 Auth Failed), negação de relay (550 Relay Denied) e timeouts de TLS.
Cada campanha de transmissão, agendamento recorrente ou autoresponder pode ser associado a um perfil SMTP dedicado via cm_campaigns.smtp_profile_id. Se não atribuído, o motor roteia automaticamente pelo perfil padrão (is_default = 1).
Quer use BYO SMTP ou MarbleSend SES, seu domínio de envio deve manter registros SPF, DKIM e DMARC válidos. O conjunto integrado de entregabilidade de 4 pilares audita seu DNS ativamente para garantir a chegada à caixa de entrada.
6.1.2 Regras de envio com o SES Relay
O Amazon SES só funciona para remetentes que mantêm suas listas limpas, por isso essas regras são aplicadas pelo próprio relay do MarbleSend, não apenas por este app. Elas não podem ser desativadas e valem para todo e-mail enviado pelo SES Relay.
Antes do primeiro envio, preencha Settings → SMTP → Identidade do remetente e uso aceitável: nome legal, endereço postal, país, telefone e aceite da Política de Uso Aceitável. O envio fica bloqueado até salvar. Seu nome e endereço aparecem no rodapé de todo e-mail; o telefone nunca é exibido.
O corpo de toda campanha deve conter a tag {{unsubscribe_link}}; caso contrário, o envio é recusado. Além disso, o relay adiciona os cabeçalhos List-Unsubscribe e de um clique e um rodapé com seu nome, endereço, um link de cancelamento e “Sent with MarbleSend”. O rodapé não pode ser removido.
Enquanto o SES Relay estiver em uso, páginas de inscrição e a API sempre usam double opt-in, a inscrição pública exige Cloudflare Turnstile e uma importação CSV exige marcar que todos deram permissão. Quem cancelou ou foi suprimido não pode se reinscrever por um formulário público.
Hard bounces e reclamações de spam chegam ao MarbleSend automaticamente e deixam o contato como suprimido. O relay também se recusa a enviar para um endereço suprimido, sem consumir crédito. Soft bounces são reenviados e só suprimem o contato após falhas repetidas.
Cada conta tem um limite diário de envio (2.000 e-mails por padrão). Se as taxas de bounce ou reclamação ficarem altas demais, o envio pausa automaticamente até o suporte revisar a conta, e também para se a licença estiver inativa. Um aviso em Settings → SMTP explica o motivo, e os e-mails na fila esperam em vez de se perder.
Os e-mails são assinados com DKIM para marblesend.com (ou para seu próprio domínio, depois de verificado). O return path usa mail.marblesend.com, então o SPF fica alinhado e o DMARC passa. As respostas vão para o endereço Reply-To que você definir.
Diretório de configuração 3 CNAME Easy DKIM (Multi-provedor)
Guia abrangente de configuração de DNS passo a passo para adicionar os 3 registros CNAME Easy DKIM da AWS SES nos principais provedores de hospedagem e registradores de domínio, prevenindo erros de sintaxe e garantindo verificação instantânea.
Arquitetura DNS universal e regras de ouro
O Easy DKIM delega a assinatura criptográfica à Amazon SES através de 3 registros CNAME. Como a AWS gerencia e rotaciona automaticamente as chaves RSA de 1024/2048 bits subjacentes sem exigir atualizações manuais no DNS, esses 3 registros CNAME devem permanecer ativos permanentemente.
| Tipo de registro | Host / Nome | Valor / Destino / Aponta para | 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) |
Regra 1: Cuidado com a armadilha do "Domínio Duplo"
A maioria dos registradores e painéis anexa automaticamente o domínio raiz ao campo Host/Nome. Se você colar "token._domainkey.seudominio.com", o servidor DNS resolverá "token._domainkey.seudominio.com.seudominio.com", causando falha imediata na verificação DKIM. Insira sempre apenas "token._domainkey".
Regra 2: CNAME, não TXT
Diferente do DKIM manual tradicional que utiliza um registro TXT com chave pública estática, o Amazon SES Easy DKIM utiliza 3 registros CNAME apontando para token.dkim.amazonses.com. Não selecione TXT.
Regra 3: Modo Proxy e Nuvem Cinza no Cloudflare
Caso use Cloudflare ou outro proxy HTTP, configure os 3 registros CNAME DKIM como Apenas DNS (Nuvem cinza / Sem proxy). O proxy HTTP mascara o destino CNAME e quebra a validação criptográfica dos emails.
# 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 no hPanel)
hPanel DNS| Tipo de registro | Host / Nome | Valor / Destino / Aponta para | TTL |
|---|---|---|---|
| CNAME | <token>._domainkey (hPanel auto-appends .yourdomain.com) | <token>.dkim.amazonses.com | 300 (or 14400) |
Faça login no painel hPanel da Hostinger e acesse Domínios.
Selecione seu domínio e clique em DNS / Nameservers na barra lateral esquerda.
Em Gerenciar registros DNS, escolha CNAME no menu suspenso Tipo.
No campo Nome, insira APENAS token._domainkey (o hPanel anexa .seudominio.com automaticamente).
No campo Alvo, insira token.dkim.amazonses.com e mantenha o TTL em 300 ou padrão (14400).
Clique em Adicionar registro. Repita o processo para os 3 tokens fornecidos no MarbleSend.
DreamHost (Painel Web DreamHost)
DreamHost Web Panel| Tipo de registro | Host / Nome | Valor / Destino / Aponta para | TTL |
|---|---|---|---|
| CNAME | <token>._domainkey (DreamHost appends .yourdomain.com) | <token>.dkim.amazonses.com | Default |
Faça login no painel web da DreamHost e vá para Sites > Gerenciar sites.
Localize seu domínio e clique em Configurações de DNS (ou Domínios > Gerenciar domínios > DNS).
Role até a seção "Adicionar um registro DNS personalizado" e clique em Adicionar registro.
No campo Nome, insira token._domainkey (a DreamHost mostra .seudominio.com automaticamente).
Defina Tipo como CNAME e insira token.dkim.amazonses.com no campo Valor.
Clique em Salvar / Adicionar registro. Repita para os 3 tokens.
Namecheap (DNS Avançado)
Advanced DNS| Tipo de registro | Host / Nome | Valor / Destino / Aponta para | TTL |
|---|---|---|---|
| CNAME Record | <token>._domainkey (never paste root domain here) | <token>.dkim.amazonses.com | Automatic (or 1 min) |
Faça login na Namecheap, abra Domain List e clique em Manage ao lado do seu domínio.
Mude para a aba Advanced DNS na parte superior da página.
Na seção Host Records, clique no botão vermelho ADD NEW RECORD.
Selecione CNAME Record no menu suspenso Type.
No campo Host, insira APENAS token._domainkey (nunca inclua seu nome de domínio).
Em Target, cole token.dkim.amazonses.com, defina TTL como Automatic (ou 1 min) e salve na marcação verde ✓. Repita para os 3 registros.
Bluehost (Gerenciador de contas / Zone Editor)
Bluehost DNS| Tipo de registro | Host / Nome | Valor / Destino / Aponta para | TTL |
|---|---|---|---|
| CNAME | <token>._domainkey (Bluehost handles suffix automatically) | <token>.dkim.amazonses.com | 4 Hours (or Default) |
Faça login no Bluehost Account Manager, clique em Domínios e escolha seu domínio.
Acesse a aba DNS (ou abra o cPanel Zone Editor caso utilize hospedagem cPanel tradicional).
Role até a seção CNAME (Alias) e clique em Add Record.
No campo Host Record, insira token._domainkey.
Em Points To, insira token.dkim.amazonses.com e selecione o TTL (4 Hours ou Default).
Clique em Save. Repita para os 2 tokens CNAME restantes.
SiteGround (Editor de zona DNS Site Tools)
Site Tools DNS| Tipo de registro | Host / Nome | Valor / Destino / Aponta para | TTL |
|---|---|---|---|
| CNAME | <token>._domainkey (Site Tools appends .yourdomain.com) | <token>.dkim.amazonses.com | 1 hour (3600) |
Acesse a Área de Clientes da SiteGround, vá em Sites e abra o Site Tools do seu domínio.
No menu lateral esquerdo, expanda Domínio e clique em Editor de zona DNS.
Selecione a aba CNAME em Criar novo registro.
No campo Nome, insira token._domainkey (o Site Tools fixa .seudominio.com à direita).
No campo Aponta para, insira token.dkim.amazonses.com e deixe o TTL em 1 hora (3600).
Clique em Criar. Repita para os 3 tokens.
HostGator (cPanel Zone Editor)
cPanel Zone Editor| Tipo de registro | Host / Nome | Valor / Destino / Aponta para | TTL |
|---|---|---|---|
| CNAME | <token>._domainkey (cPanel automatically appends dot) | <token>.dkim.amazonses.com | 14400 (or 3600) |
Faça login no Portal do Cliente da HostGator e abra o cPanel.
Na seção Domínios, clique em Zone Editor.
Localize seu domínio e clique em + CNAME Record (ou Gerenciar > Adicionar registro).
No campo Nome, insira token._domainkey (o cPanel preenche automaticamente com seu domínio e ponto final).
No campo CNAME / Record, insira token.dkim.amazonses.com.
Clique em Add a CNAME Record. Repita para os 3 tokens.
GoDaddy (Portfólio de domínios DNS)
GoDaddy DNS| Tipo de registro | Host / Nome | Valor / Destino / Aponta para | TTL |
|---|---|---|---|
| CNAME | <token>._domainkey (never include root domain in GoDaddy) | <token>.dkim.amazonses.com | 1/2 Hour (or Default) |
Faça login na sua conta GoDaddy e vá para Meus produtos.
Em Domínios, localize seu domínio e clique em DNS (ou nos três pontos > Gerenciar DNS).
Na seção Registros de DNS, clique em Adicionar novo registro.
Selecione CNAME no menu suspenso Tipo.
No campo Nome, insira APENAS token._domainkey (não inclua .seudominio.com!).
Em Valor, insira token.dkim.amazonses.com, escolha TTL 1/2 hora (ou Padrão) e salve. Repita para os 3 registros.
Após salvar os 3 registros CNAME, a propagação de DNS costuma levar de 5 a 30 minutos (até 24–48 horas dependendo do TTL). Retorne a MarbleSend Configurações > SMTP, abra o card do domínio remetente personalizado e clique em "Verificar DNS". Assim que validado pela Amazon SES, o status passará para Verificado.
6.2 Worker Heartbeat em Segundo Plano, Cron de 1 Minuto e Concurrency Guard
O MarbleSend envia e-mails em segundo plano. Uma cron job é um temporizador no painel da sua hospedagem que acorda o MarbleSend a cada minuto para que ele possa executar agendamentos e autoresponders, repetir envios falhados, recolher bounces e manter uma Campaign longa em andamento. Uma Campaign que enviar começa de imediato, mas tudo o que tem de acontecer mais tarde depende deste temporizador. Se Settings → Sistema mostrar Cron Não Detectado, o temporizador não existe, não corre a cada minuto ou aponta para o sítio errado. Os três passos abaixo resolvem isso.
Abra Settings → Sistema, encontre Comando Cron Job e clique em Copiar Comando. A linha já contém o folder certo e, quando o seu servidor nos indica, o PHP certo. Use-a exatamente como está; os exemplos mais abaixo nesta página mostram apenas a forma de uma linha. Se Settings indicar que não conseguiu detetar o PHP, pergunte ao seu fornecedor pelo caminho do PHP na linha de comandos e substitua a palavra php no início da linha.
Escolha abaixo o seu fornecedor. Os nomes dos menus mudam de vez em quando, por isso procure a correspondência mais próxima. Seja qual for o painel, a tarefa tem de correr a cada minuto (* * * * *) e o seu comando é a linha do Passo 1. Plesk, DirectAdmin e outros painéis chamam-lhe Scheduled Tasks ou Cron Jobs.
Hostinger (hPanel)
- Abra hPanel → Websites → Dashboard do seu site e clique em Cron Jobs na barra lateral.
- Defina Type como Custom. (O tipo PHP só aceita o caminho de um file .php; a sua linha também contém o comando PHP.)
- Cole a linha do Passo 1 em Command to run.
- Defina o agendamento para cada minuto, ou escreva * * * * *.
- Clique em Save. A tarefa aparece em List of Cron Jobs, onde também pode ler a sua última saída.
A Hostinger executa as cron jobs em UTC. O plano Single permite 2 cron jobs; os planos Premium e superiores não têm limite.
Namecheap
Abra o cPanel a partir da sua conta de hospedagem Namecheap e siga estes passos.
- Abra o cPanel e, na secção Advanced, clique em Cron Jobs.
- Em Add New Cron Job, escolha Once Per Minute (* * * * *) em Common Settings.
- Cole a linha do Passo 1 em Command.
- Clique em Add New Cron Job. A tarefa corre a cada minuto a partir de agora.
A Namecheap não permite, em servidores partilhados, cron jobs que corram com mais frequência do que a cada 5 minutos, nem mais de 5 cron jobs. Use o Web-Cron abaixo se precisar de cada minuto.
Bluehost
- Inicie sessão no Bluehost Portal, clique em Websites e depois em Manage Site para o seu site.
- Abra o separador Advanced, encontre Cron Jobs e clique em Manage e depois em Add Cron.
- Escolha uma frequência em Common Settings (ou preencha Minute, Hour, Day, Month e Weekday).
- Cole a linha do Passo 1 em Command e clique em Add.
A documentação da própria Bluehost indica que a hospedagem partilhada só executa cron jobs a cada 15 minutos ou menos vezes (uma página refere 5 minutos). Use o Web-Cron abaixo se precisar de cada minuto.
HostGator
No Customer Portal, abra Websites → Manage Site → Advanced e, em Cron Jobs, clique em Manage e Add Cron. O formulário tem os mesmos campos do cPanel, pelo que os passos abaixo se aplicam. Ou abra cPanel → Advanced → Cron Jobs.
- Abra o cPanel e, na secção Advanced, clique em Cron Jobs.
- Em Add New Cron Job, escolha Once Per Minute (* * * * *) em Common Settings.
- Cole a linha do Passo 1 em Command.
- Clique em Add New Cron Job. A tarefa corre a cada minuto a partir de agora.
As páginas de ajuda da HostGator não indicam o intervalo mais curto permitido na hospedagem partilhada. Se cada minuto for recusado, use o Web-Cron abaixo.
GoDaddy
Na página do seu produto GoDaddy, junto a Linux Hosting clique em Manage, depois em cPanel Admin e siga estes passos.
- Abra o cPanel e, na secção Advanced, clique em Cron Jobs.
- Em Add New Cron Job, escolha Once Per Minute (* * * * *) em Common Settings.
- Cole a linha do Passo 1 em Command.
- Clique em Add New Cron Job. A tarefa corre a cada minuto a partir de agora.
As páginas de ajuda da GoDaddy não indicam o intervalo mais curto permitido. Se cada minuto for recusado, use o Web-Cron abaixo.
DreamHost
- Abra o painel da DreamHost, vá a Cron Jobs e clique em Add New Cron Job.
- Escolha um utilizador (um utilizador SFTP ou shell existente), dê um título à tarefa e, opcionalmente, um endereço de e-mail para a sua saída.
- Cole a linha do Passo 1 em Command. A DreamHost mantém o PHP em caminhos como /usr/local/php83/bin/php (use a sua versão do PHP).
- Defina a hora e ative o locking para que duas execuções nunca se sobreponham, e guarde.
No horário personalizado, o painel permite escolher no máximo 12 minutos diferentes por hora, pelo que o agendamento regular mais curto que pode criar é a cada 5 minutos. As horas são em hora do Pacífico. Use o Web-Cron abaixo se precisar de cada minuto.
SiteGround
- Abra Site Tools → Devs → Cron Jobs.
- Escolha o intervalo na lista (ou defina minuto, hora, dia, mês e dia da semana).
- Cole a linha do Passo 1 em Command. Um endereço de e-mail para a saída é opcional.
- Clique em Create.
A documentação da SiteGround mostra predefinições como Twice Per Hour e não indica o intervalo mais curto. Se o seu plano não tiver a opção de cada minuto, use o Web-Cron abaixo.
- Abra Settings → Sistema e copie a Web-Cron URL. Mantenha-a privada: contém o seu token secreto.
- Crie uma conta gratuita num serviço de cron como o cron-job.org.
- Crie uma tarefa, cole o URL e configure-a para correr a cada minuto. Guarde e ative-a.
- Use o Web-Cron ou uma cron job do seu fornecedor, não ambos: um basta.
Aguarde um ou dois minutos e recarregue Settings → Sistema. O emblema deve indicar Ativo e Último Heartbeat deve mostrar uma hora do último minuto. Integridade do site na mesma página deve mostrar o worker como Aprovado. Se o seu fornecedor só permitir uma tarefa a cada 5 ou 15 minutos, o emblema pode alternar entre Ativo e Cron Não Detectado, porque espera uma execução nos últimos 5 minutos; o e-mail continua a sair sempre que o worker corre.
- O comando PHP está errado. Pergunte ao seu fornecedor pelo caminho do PHP na linha de comandos (por exemplo /opt/alt/php83/usr/bin/php na Hostinger ou /usr/local/bin/php em muitas hospedagens cPanel) e substitua php no início da linha.
- Só parte da linha foi colada. Cole a linha inteira, incluindo >/dev/null 2>&1 no fim.
- O folder está errado. worker.php está no folder que contém public, não dentro de public.
- Para ver o erro, execute a tarefa uma vez sem >/dev/null 2>&1 e leia a sua saída. Um worker a funcionar imprime uma linha como worker.php: processed=0.
- A tarefa é de outro site na mesma conta. Verifique o folder no comando.
- Dê-lhe até 5 minutos depois de guardar antes de verificar de novo.
Para utilizadores técnicos
A compilação de e-mails, resolução de destinatários, envio e acionamento de webhooks operam de forma assíncrona através de um worker em segundo plano de 1 minuto. MarbleSend utiliza uma arquitetura de ponto de entrada duplo (worker.php CLI nativo ou cron.php HTTP), protegida por bloqueios de file não-bloqueantes.
* * * * * php /home/USER/your-folder/worker.php >/dev/null 2>&1
Executado diretamente da shell do sistema (* * * * * php /caminho/para/worker.php >/dev/null 2>&1). Contorna totalmente limites de timeout HTTP e limites de gateway web.
GET https://your-domain.com/cron.php?token=SECURE_TOKEN
Para ambientes sem acesso à shell crontab, chamar GET /cron.php?token=SECURE_TOKEN via serviços de ping externos desencadeia o mesmo processamento de fila de forma segura.
O worker adquire um bloqueio em storage/worker.lock com flock(LOCK_EX | LOCK_NB) no início. Se uma execução anterior ainda estiver ativa, execuções subsequentes saem imediatamente sem race conditions.
Reivindica lotes de 50 itens da fila de forma atómica usando consultas de status indexadas. Envios com falha entram em backoff exponencial antes de atingir o status de falha definitiva.
6.3 23 Idiomas Nativos, Árabe RTL e Máquina de Segurança de Administrador
MarbleSend foi concebido como uma plataforma auto-hospedada acessível globalmente. Inclui 23 dicionários nativos com curadoria humana, espelhamento automático de layout RTL para árabe, personalização de tema persistente e segurança rigorosa de utilizador único.
Os files de idioma em app/lang/*.php são arrays PHP puros que carregam na memória em tempo sub-milissegundo, sem binários de servidor gettext ou APIs de tradução externas.
A seleção de árabe (ar) injeta automaticamente dir='rtl' no documento HTML, espelhando sidebars de navegação, colunas de tabelas, painéis e ícones em toda a interface.
Alterna perfeitamente entre tema escuro, tema claro e preferência do sistema operacional. A escolha é guardada em cookies (marblesend_theme) para evitar layout shifts.
Credenciais em cm_settings.admin_user são cifradas com bcrypt (fator de custo 12). Protegido contra fixação de sessão através de regeneração automática de ID de sessão no login.
6.3.1 Autenticação de dois fatores (TOTP) e configuração do código QR
A autenticação de dois fatores adiciona uma segunda trava à conta de administrador: depois da senha, o MarbleSend pede um código de 6 dígitos que muda a cada 30 segundos e que só o seu celular consegue gerar. É opcional, ativa-se em cerca de um minuto e funciona com qualquer aplicativo autenticador padrão, como Google Authenticator, Microsoft Authenticator, 1Password, Bitwarden, Authy ou Aegis. Você a encontra em Settings → Idioma e Conta → Autenticação de dois fatores (TOTP).
O MarbleSend usa o padrão aberto TOTP (RFC 6238: HMAC-SHA1, 6 dígitos, intervalos de 30 segundos). Ao ativar, é criado um segredo aleatório compartilhado uma única vez com o seu aplicativo. A partir daí, entrar exige a senha e depois um código atual. Um código já usado não pode ser reaproveitado e a segunda etapa expira após 5 minutos.
1) Abra Settings → Idioma e Conta e clique em Ativar. 2) No aplicativo autenticador, escolha “Digitalizar código QR” e aponte para o quadrado mostrado na tela. 3) Digite o código de 6 dígitos que o aplicativo mostra agora e clique em “Confirmar e ativar”. 4) Guarde os oito códigos de recuperação exibidos uma única vez: copie-os para um gerenciador de senhas ou imprima-os.
A imagem QR é desenhada pela sua própria instalação como um pequeno gráfico vetorial; o segredo nunca é enviado a um gerador de QR online nem a terceiros. Se não puder digitalizar (por exemplo, se o aplicativo estiver no mesmo celular), use a chave de configuração ou o link otpauth exibido abaixo do código QR. O segredo é armazenado criptografado (AES-256-GCM) com a sua ENCRYPTION_KEY, como qualquer outra credencial.
Depois da senha correta, o código de 6 dígitos é solicitado. Códigos errados têm limite de tentativas por conta, então adivinhar não é viável. Se códigos digitados corretamente forem recusados, verifique se a data e a hora do celular estão em modo automático; um relógio errado gera códigos errados.
Ao ativar a 2FA, são criados oito códigos de uso único. Cada um vale uma vez no campo do código, no lugar do código de 6 dígitos. Eles são guardados apenas como hashes, portanto não podem ser exibidos de novo; use “Novos códigos de recuperação” (exige um código atual) para substituir o conjunto inteiro, o que invalida os antigos.
O link enviado por e-mail para uma senha esquecida não contorna a 2FA, de propósito, por isso não ajuda aqui. No servidor, execute “php tools/reset-admin.php” (SSH ou o terminal da sua hospedagem): ele redefine a senha do administrador, limpa os bloqueios, encerra todas as sessões e desativa a 2FA; depois você pode ativá-la de novo com o novo dispositivo. Para desativá-la normalmente, use Desativar no mesmo cartão (senha mais um código atual ou de recuperação).
6.3.2 Proteção do cadastro (Cloudflare Turnstile): obtenha suas chaves gratuitas
O Turnstile é a alternativa gratuita e respeitosa com a privacidade da Cloudflare ao CAPTCHA. Quando ativado, suas páginas de inscrição públicas (os formulários /s/sua-pagina e /subscribe) verificam se o visitante é uma pessoa real antes de aceitar uma inscrição, o que impede que bots inundem sua lista e seus e-mails de confirmação. Ele funciona além do honeypot integrado e dos limites por IP e por endereço, e é opcional, exceto enquanto você envia pelo SES Relay (veja a última observação). Você precisa de duas chaves, uma Site key (pública) e uma Secret key (privada), da sua própria conta gratuita da Cloudflare; seu domínio não precisa usar a Cloudflare para DNS.
Acesse dash.cloudflare.com e cadastre-se (é grátis) ou entre. Você não precisa adicionar o seu site à Cloudflare nem alterar o seu DNS para usar o Turnstile.
No menu do painel, abra “Turnstile” (ou pesquise) e clique em “Add widget” (painéis antigos mostram “Add site”). Os nomes dos menus mudam de vez em quando; procure Turnstile em Application security.
Dê qualquer nome, por exemplo “MarbleSend signup”. Em Hostname, adicione o domínio onde o MarbleSend roda, sem https:// nem caminho, por exemplo app.seudominio.com. Se as suas páginas de cadastro aparecem em outro domínio, adicione-o também. Adicione localhost apenas enquanto testa no seu próprio computador.
Escolha Managed (recomendado): a maioria dos visitantes passa sem nenhum quebra-cabeça e a Cloudflare pede um clique rápido só quando uma visita parece suspeita. Non-interactive mostra uma breve barra de progresso sem cliques e Invisible não mostra nada. Deixe o pre-clearance desativado e clique em Create.
A Cloudflare mostra uma Site key (pública) e uma Secret key (privada). Copie as duas. O segredo é usado apenas pelo seu servidor para confirmar cada visitante com a Cloudflare, por isso nunca o cole em um lugar público. Você pode vê-lo ou renová-lo depois nas configurações do widget.
Abra Settings → Idioma e Conta → Proteção de inscrições (Cloudflare Turnstile), cole a Site key e a Secret key e clique em Salvar. O selo muda para “A proteção está ATIVA”. Para desativar depois, limpe os dois campos e salve. O segredo salvo é armazenado criptografado e nunca mais é exibido; deixe o campo em branco para mantê-lo.
Abra uma das suas páginas públicas de cadastro em uma janela privada do navegador: o widget do Turnstile aparece acima do botão. Inscreva-se com um endereço de teste e você deverá receber o e-mail de confirmação. Um envio que não passou na verificação é recusado.
Se o seu servidor não conseguir acessar o serviço de verificação da Cloudflare (uma queda ou uma conexão de saída bloqueada), o MarbleSend normalmente deixa a inscrição passar e registra o evento em vez de bloquear todos os visitantes; o honeypot e os limites por IP e por endereço continuam valendo. Enquanto você envia pelo SES Relay, ocorre o contrário e ele falha de forma fechada: as inscrições são recusadas até que a Cloudflare volte a ficar acessível.
A Cloudflare publica chaves fictícias para testes: a Site key 1x00000000000000000000AA com a Secret key 1x0000000000000000000000000000000AA sempre passa. Elas nunca protegem um site real, então troque-as pelas suas chaves antes de publicar.
O widget não aparece: confira se o hostname da página está listado no widget do Turnstile e se nenhuma extensão do navegador bloqueia challenges.cloudflare.com. “Invalid site key”: a Site key foi copiada com um espaço ou pertence a outro widget. Visitantes reais são recusados: cole a Secret key de novo; ela deve pertencer ao mesmo widget da Site key.
Se você envia pelo Managed Amazon SES Relay, o Turnstile é obrigatório nos formulários de inscrição públicos. Até que as duas chaves sejam salvas, a página de inscrição mostra “a inscrição está temporariamente indisponível” e Settings → Idioma e Conta mostra um aviso com um botão que leva você ao cartão certo. Nesse modo, cada novo inscrito também precisa confirmar por e-mail (double opt-in), mesmo que uma página de inscrição ou uma chamada de API peça single opt-in.
6.4 Chaves REST API com Escopo e Acesso Programático para Desenvolvedores
A REST API permite que websites externos, páginas de captura, aplicações móveis e o plugin oficial MarbleSend Forms interajam com segurança com a sua base de dados de contactos e motor de envio. As chaves de API utilizam prefixos criptográficos, armazenamento SHA-256 unilateral e escopos granulares.
As chaves são geradas com o prefixo ms_ seguido de 32 bytes criptograficamente aleatórios via random_bytes(24). O token original é exibido apenas uma vez na criação.
Apenas o hash SHA-256 (hash('sha256', $rawKey)) é persistido em cm_api_keys.key_hash. Mesmo com despejo direto da base de dados, tokens ativos não podem ser descriptografados.
Restrinja chaves a capacidades específicas: contacts:read, contacts:write, campaigns:read, campaigns:write, campaigns:send, schedules:read e schedules:write.
Pedidos recebidos autenticam-se através do cabeçalho Authorization: Bearer ms_..., comparados com hash_equals(). A telemetria regista o timestamp last_used_at a cada chamada.
6.5 Webhooks de Eventos de Saída e Envio Criptográfico HMAC-SHA256
Os eventos de contato (subscribed, confirmed, unsubscribed, suppressed) agora trazem um array groups de {id, name} junto de tags.
Os webhooks fornecem streaming de eventos HTTP em tempo real para endpoints externos, permitindo que CRMs, notificações do Slack ou automações personalizadas reajam imediatamente a novos subscritores, envios de Campaigns, cancelamentos e bounces.
Subscreva eventos essenciais: contact.created, contact.unsubscribed, campaign.sent, campaign.bounced e link.clicked com alternância de ativação individual.
Cada pedido POST de webhook inclui X-MarbleSend-Signature: sha256=..., gerado com hash_hmac('sha256', $payload, $secret), permitindo aos servidores de destino verificar a integridade.
Envios de webhooks com falha (HTTP 5xx ou timeouts) acionam repetições exponenciais. Endpoints com falhas consecutivas são pausados automaticamente para evitar sobrecarga.
O botão Test Webhook envia payloads simulados imediatamente. A gaveta de histórico de envios exibe códigos de status HTTP, latência em milissegundos e respostas de erro.
6.6 A Suite de Entregabilidade de 4 Pilares (SPF, DKIM, DMARC, BIMI)
A entregabilidade determina se as suas mensagens chegam à caixa de entrada ou à pasta de spam. MarbleSend possui um motor de inspeção DNS nativo que executa consultas sequenciais não-bloqueantes diretamente a servidores de nomes autoritativos sem APIs de terceiros.
Inspeciona records TXT raiz quanto à syntax v=spf1. Valida mecanismos de host SMTP autorizados, alerta sobre limites de consulta DNS (>10 lookups geram erro) e verifica qualificadores.
Consulta seletor._domainkey.dominio.com para validar chaves públicas RSA ou Ed25519. Garante que os cabeçalhos de envio possam ser verificados criptograficamente contra o domínio remetente.
Verifica _dmarc.dominio.com quanto a tags de política (p=none, p=quarantine ou p=reject). Em 2026, Gmail e Yahoo exigem records DMARC ativos com relatórios rua para remetentes em massa.
Consulta default._bimi.dominio.com para logos SVG Tiny P.S. e certificados VMC, permitindo que avatares verificados sejam exibidos nas caixas de entrada do Gmail, Yahoo e Apple Mail.
6.7 Motor de IA de modo duplo: Provedores BYOK e Créditos IA MarbleSend
O MarbleSend fornece um motor de IA de modo duplo flexível para redação, sugestão de assuntos e auditoria de spam: (1) Bring Your Own Key (BYOK) para conectar diretamente aos principais LLMs sem sobretaxas, e (2) Créditos de IA MarbleSend para acesso pré-pago a modelos selecionados de alta qualidade sem gerenciar chaves de API.
Conecte-se diretamente à OpenAI, Anthropic Claude, Google Gemini, DeepSeek, Moonshot, OpenRouter ou instâncias privadas do Ollama. As chaves de API são criptografadas em repouso com AES-256-GCM. As requisições fluem direto do seu servidor para o provedor sem intermediários.
Créditos pré-pagos gerenciados diretamente pelo MarbleSend. Oferece modelos selecionados de altíssima eficiência otimizados para conversão e entregabilidade em e-mail marketing. O servidor do fornecedor gerencia roteamento e atualizações de forma dinâmica, debitando 1 crédito por geração atomicamente.
Official add-on pricing is retrieved dynamically from admin.marblesend.com. Purchase top-up credit packs via global and local payment gateways with instant real-time balance activation.
All BYOK credentials are encrypted at rest with hardware-accelerated AES-256-GCM using your installation's unique APP_KEY. No prompt contents, contact lists, or recipient emails are ever stored or logged by the license server.
6.7.1 Seleção de Modelo Padrão e Roteamento de Execução
Define como o MarbleSend direciona redação por IA, sugestões de assuntos e auditorias de entregabilidade. Alterne entre relays curados do fornecedor e provedores BYOK diretos.
Acesso zero-configuração aos melhores modelos curados calibrados para conversão de e-mail. Sem necessidade de contas de desenvolvedor externas ou chaves de API.
Comunicação direta de servidor para provedor sem margens adicionais. Escolha qualquer provedor configurado e identificador de modelo como seu mecanismo padrão.
Templates Studio, o inspetor de pontuação de assunto e o assistente de IA operam com base na seleção ativa com fallback suave caso os créditos acabem.
A seleção ativa é persistida em cm_settings.ai_provider_default, garantindo execução sincronizada em todas as sessões de administrador e tarefas worker.
6.7.2 Créditos de IA MarbleSend e Hub de Relay Gerenciado
Os Créditos de IA MarbleSend oferecem infraestrutura pré-paga instantânea para redação de e-mails sem complexidades de faturamento ou limites de terceiros.
Cada licença ativada recebe créditos de IA iniciais gratuitos resgatados dinamicamente do servidor de licenças para testar o AI Assist imediatamente.
Gerações deduzem exatamente 1 crédito por requisição via cm_addon_ledger. UUIDs de transação exclusivos impedem débitos repetidos em tentativas de rede.
Pacotes de créditos (ex.: ai_100) são carregados dinamicamente do catálogo do fornecedor. Pagamentos processados com segurança pelo nosso prestador de pagamentos.
Eventos de webhook creditam sua conta imediatamente após o checkout. Um botão manual de atualização em 1 clique garante sincronização instantânea.
6.7.3 Provedores Configurados e Infraestrutura BYOK
Conecte e orquestre múltiplos provedores de LLM externos com cofre de chaves criptografado, protocolos de API duplos e diagnósticos de conexão instantâneos.
Mantenha conexões simultâneas com OpenAI, Anthropic Claude, Google Gemini, DeepSeek, Kimi/Moonshot, OpenRouter ou instâncias privadas do Ollama.
Suporta endpoints padrão compatíveis com OpenAI (/chat/completions) e formato de mensagens Anthropic (/v1/messages) com URLs proxy personalizadas.
Todas as chaves de API BYOK são criptografadas em repouso com aceleração de hardware AES-256-GCM. As chaves nunca aparecem no HTML ou nos logs.
O botão de teste de conexão envia uma sonda leve para verificar credenciais e medir latência de ida e volta (ms) antes de usar os modelos em produção.
Como Obter API Keys nos Principais Provedores
O MarbleSend se conecta diretamente aos provedores de IA via BYOK sem servidores proxy intermediários. Veja abaixo os links oficiais e passos para gerar sua chave:
Provedores Locais, Auto-Hospedados e Alternativos (Ollama, Groq, Mistral, GLM)
Para IA local sem custos, instale o Ollama (ollama.com), execute o modelo desejado (ex.: ollama run llama3.1), configure a Base URL para http://localhost:11434/v1, selecione o formato OpenAI e marque "No Auth". Para inferência rápida na nuvem, registre-se em console.groq.com.
Configurando AI Providers em Settings (/settings)
Após obter a chave API e o ID do modelo desejado, realize a configuração no MarbleSend com estas etapas:
Na barra lateral principal, clique em Settings e acesse a aba "AI Providers" (diretamente em /settings).
Clique em um dos botões de preset do Quick Add (OpenAI, DeepSeek, Gemini, Anthropic, etc.) para preenchimento automático ou em "+ Add Provider".
Selecione o formato de protocolo: "OpenAI format" ou "Anthropic format". Confirme a Base URL preenchida.
Cole sua chave secreta. O MarbleSend a armazena criptografada com AES-256-GCM via Crypto.php sem qualquer exposição em texto puro.
Informe o ID do modelo e o context window, e clique em "Test Connection" para validar o handshake em tempo real antes de salvar.
Em "Default AI Model" no topo da aba, selecione o provedor e o modelo recém-configurados e clique em "Save Default".
6.8 Motor de Token de Concessão de Licença Criptográfica Ed25519
MarbleSend verifica a autenticidade do produto usando criptografia assimétrica Ed25519 através da extensão nativa libsodium do PHP. Um License Grant Token assinado é emitido na ativação inicial e validado localmente sem necessidade de conexão persistente.
Valida a assinatura digital com sodium_crypto_sign_verify_detached(). Qualquer modificação manual em records da base de dados quebra imediatamente a assinatura matemática.
O token assinado incorpora o nome de host do domínio licenciado, o nível de licença (Regular ou Extended) e recursos ativos. Migrações de domínio podem ser iniciadas diretamente em Settings.
Quedas temporárias de rede ou manutenções do servidor de licenças nunca interrompem disparos de e-mail ou crons em andamento. MarbleSend oferece um período de tolerância de 7 dias.
Se uma licença expirar, MarbleSend aplica um bloqueio suave: dados de subscritores, Campaigns, relatórios e ferramentas de exportação permanecem 100% acessíveis, pausando apenas novos envios.
Uma vez por dia, o worker pergunta ao servidor de licenças se existe uma versão mais recente. Só são enviados o seu código de compra e a versão instalada, exatamente como na verificação manual. Desative com «Atualizações de versões» neste separador: não é feita nenhuma verificação nem é mostrado nenhum aviso de atualização. As instalações de desenvolvimento (APP_ENV=local) nunca fazem esta chamada. Nunca é enviado nada sobre os seus contactos ou Campaigns.
«Registo de alterações» (barra lateral, acima de Documentação) lista cada versão com o respetivo guia de atualização. Quando existe uma versão mais recente, vê um aviso no painel (uma atualização de segurança mostra um aviso vermelho em todas as páginas e não pode ser fechada), um ponto junto a «Registo de alterações» e, se ativado, um e-mail por versão para o endereço do administrador através do seu perfil SMTP predefinido. As notas de versão estão escritas em inglês.
Perguntas frequentes e diagnóstico
Soluções imediatas para os problemas mais comuns em hospedagem compartilhada.
7.1 Diagnóstico operacional do Dashboard
7.1.1 Por que o Dashboard apresenta o status "Worker Not Detected" ou Inativo?
O crontab do sistema operacional não está disparando, o caminho do PHP CLI está incorreto ou um file de lock residual impede a execução.
O worker atualiza cm_settings.worker_last_run com um timestamp UTC a cada pulso. O dashboard aponta inatividade se houver mais de 180 segundos decorridos.
Acesse Settings → System. Copie a linha exata do crontab. Se o crontab via CLI for restrito, configure a URL de Web-Cron no cron-job.org a cada 1 minuto. Se o lock persistir, verifique storage/worker.lock.
7.1.2 Por que as taxas de abertura e cliques divergem entre o Dashboard e os logs do provedor SMTP?
Pré-carregamento do Apple Mail Privacy Protection (MPP), cache de proxy, bloqueio de imagens por destinatários ou bloqueadores removendo parâmetros UTM.
O MarbleSend insere um GIF transparente 1x1 nos e-mails enviados para rastrear cm_email_logs.opened_at. Imagens bloqueadas impedem o registro; o Apple MPP realiza o pré-carregamento imediato nos servidores da Apple.
Adote cliques únicos (CTR) como o termômetro primordial de engajamento. O MarbleSend encaminha os links de templates via public/click.php para registrar cliques à prova de fraude.
7.2 Diagnóstico de envio de Campaign e Preflight
7.2.1 Por que o envio da minha campaign foi pausado ou interrompido no meio do processo?
Limites de tempo de execução do PHP CLI ou servidor web no shared hosting (max_execution_time 30s/60s) atingidos durante grandes volumes de disparo.
O MarbleSend processa a fila em lotes atômicos de 50 destinatários. Ao aproximar-se do limite de tempo, o worker finaliza suavemente e consolida o progresso em cm_email_queue.
Nenhuma ação manual necessária! O próximo ciclo cron de 1 minuto assume o lote seguinte de itens pending em cm_email_queue sem duplicar e-mails.
7.2.2 Por que o Preflight Check automatizado de 6 pontos bloqueia o lançamento da minha campaign?
Ausência do token mandatório {{unsubscribe_link}}, assunto inválido, zero destinatários ativos selecionados ou syntax de token aberta.
O motor de Preflight avalia 6 pilares cruciais de conformidade e deliverability antes de consentir a transição para queued ou sending.
Examine os alertas vermelhos na janela de preflight da campaign. Adicione {{unsubscribe_link}} (obrigatório por RFC 8058 e CAN-SPAM) e cheque se as tags abrangem contacts ativos.
7.2.3 Quando "Resend to Non-openers" fica disponível e como ele preserva os assinantes contra fadiga?
O botão no relatório da campaign permanece desativado enquanto o disparo está em andamento ou antes de decorrido um período de resfriamento prudente.
O MarbleSend estipula status campaign = completed e recomenda aguardar de 24 a 48 horas para oportunizar a leitura em diferentes fusos horários.
Após a conclusão, clique em "Resend to Non-openers". Uma campanha secundária será criada focada unicamente em contacts com opened_at IS NULL, viabilizando o teste de um novo assunto.
7.3 Gestão de Contacts, importação CSV e bounces
7.3.1 Por que o importador CSV ignorou linhas ou não importou determinados record de assinantes?
Syntax de e-mail inválida conforme RFC 5322, duplicatas com a opção "Skip Duplicates" ativa, codificação diferente de UTF-8 ou contacts suprimidos.
O MarbleSend inspeciona cada linha, avalia a syntax com filter_var(FILTER_VALIDATE_EMAIL) e cruza com cm_contacts para evitar a sobrescrita de status unsubscribed ou bounced.
Salve seu file CSV em UTF-8 sem BOM. Confirme o mapeamento das colunas (email, name, tags). Inspecione a janela de importação para verificar os números de linha desconsiderados.
7.3.2 Como o MarbleSend lida com Soft Bounces versus Hard Bounces?
Erros definitivos de entrega (códigos de erro SMTP 5xx: caixa postal inexistente) contra falhas temporárias (códigos de erro SMTP 4xx: caixa cheia, limite de taxa).
Respostas 5xx elevam de pronto o contact para status = bounced. Respostas 4xx marcam a tentativa em cm_email_logs e tentam até 3 vezes antes de classificar como bounced definitivo.
Nunca tente reativar contacts com hard bounce. Tal atitude prejudica drasticamente a reputação do domínio remetente junto a Gmail e Yahoo.
7.4 Renderização de Templates, Outlook e design email-safe
7.4.1 Por que meu template de e-mail desconfigura ou quebra no Microsoft Outlook para desktop?
O Microsoft Outlook no Windows depende do motor de renderização do Microsoft Word (MSO), incompatível com CSS Flexbox, Grid, margin auto e tags de layout HTML5.
O Word MSO acata exclusivamente layouts estruturados em tabelas convencionais (nested <table>, <tr>, <td>) com larguras em pixels e estilos inline.
Aproveite os 8 starter layouts email-safe inclusos no MarbleSend. Eles empregam tabelas HTML aninhadas e comentários condicionais MSO (<!--[if mso]>) para garantir renderização perfeita no Outlook.
7.4.2 Por que o Gmail exibe "[Message clipped] View entire message" no rodapé dos meus e-mails?
O peso do file HTML ultrapassa o teto intransponível de 102 KB (104.448 bytes) estabelecido pelo Gmail.
Ao superar 102 KB, o Gmail corta a mensagem, ocultando seções de conteúdo, o link de cancelamento no rodapé e o pixel de rastreio.
Hospede imagens em servidores HTTPS externos em vez de embutir strings base64 inline. Remova CSS supérfluo. No Templates Studio, acione o formatador "Clean HTML" antes do disparo.
7.4.3 Por que {{news_posts}} aparece vazio ou ausente no meu e-mail?
O marcador só é preenchido por um agendamento de Newsletter cuja Origem do conteúdo seja “Publicações de notícias”. Numa Campaign manual, num agendamento RSS ou num agendamento só de modelo ele é substituído por texto vazio.
A verificação prévia da Campaign mostra um aviso quando um modelo usa {{news_posts}} sem uma origem de publicações de notícias; a pré-visualização em Modelos → Publicações sempre mostra o bloco preenchido.
Envie o modelo por um agendamento de Newsletter definido como “Publicações de notícias”, ou remova o marcador dos modelos usados em outros lugares.
7.5 Schedules, feeds RSS e cadência do Worker
7.5.1 Por que meu schedule RSS automatizado não disparou e-mails após novas postagens no blog?
A URL do feed estava indisponível, a syntax XML continha erros ou o GUID da postagem coincidia com cm_schedules.last_rss_item_id.
O MarbleSend guarda o hash SHA-256 do item mais recente em last_rss_item_id. Sem novos nós <item> ou <entry>, o worker encerra a rotina sem gerar itens na fila.
Acesse o agendamento em /schedules e clique em "Test Feed" para validar a resposta XML ao vivo. Confira se o feed RSS emite tags <pubDate> válidas e <guid> exclusivos.
7.5.2 O que acontece com schedules recorrentes se o servidor ou o cron do worker ficar offline por dias?
Múltiplos intervalos agendados transcorreram enquanto o processo worker estava paralisado.
O MarbleSend segue uma rígida "Single Catch-Up Policy" no SchedulerService. Em vez de acumular todas as execuções perdidas (o que lotaria caixas postais), executa unicamente a última.
Ao restaurar o cron, exatamente 1 broadcast de compensação é compilado e despachado. O valor next_run_at é recalculado para a data futura regular do schedule.
7.5.3 Por que o agendamento de Publicações de notícias não enviou minha publicação Pronta?
A publicação ficou Pronta antes de o modo Publicações de notícias do agendamento ser ativado, já foi entregue por este agendamento, ou o público ou o modelo bloquearam a execução.
Abra o histórico do agendamento: “no new posts” significa que nada é elegível, “no recipients” que o público estava vazio, e “failed” que o modelo não existe ou não tem {{news_posts}}.
Marque uma cópia da publicação como Pronta depois que o agendamento existir, corrija o público ou o modelo e use Executar agora.
7.5.4 Dois agendamentos podem enviar a mesma publicação?
A entrega é rastreada por agendamento, não por publicação.
Cada agendamento de Publicações de notícias mantém seu próprio registro das publicações que entregou, por isso a biblioteca mostra o total “Enviada N×”.
Sim — uma publicação que está Pronta depois de ambos os agendamentos serem criados é enviada uma vez por cada um; nenhum a envia duas vezes.
7.6 Settings, Deliverability, Webhooks e licenciamento
7.6.1 Como diagnosticar os erros SMTP "535 Authentication Failed" ou "550 Relay Access Denied"?
Credenciais SMTP errôneas, conflito entre porta e criptografia (Porta 587 STARTTLS vs Porta 465 SSL) ou remetente não autorizado no relay.
Settings → SMTP disponibiliza um teste de socket em tempo real com o diálogo detalhado entre o PHPMailer e o servidor SMTP.
Configure a Porta 587 com TLS para a maior parte dos provedores. No Gmail/Google Workspace, crie um App Password. No Amazon SES, valide o domínio remetente. No cPanel, informe o e-mail completo como login.
7.6.2 Por que o Deliverability Suite indica inconformidades na checagem de SPF, DKIM ou DMARC?
Ausência de entradas DNS no domínio de envio, excesso do teto de 10 consultas no SPF ou discordância de seletor no DKIM.
O MarbleSend efetua buscas DNS diretas e não bloqueantes (dns_get_record) nos nameservers autoritativos para SPF (root TXT), DKIM (selector._domainkey) e DMARC (_dmarc).
Insira o include do seu relay SMTP no registro SPF. Garanta que o seletor DKIM coincida com as diretrizes do provedor. Assegure que o registro DMARC contenha uma caixa rua de relatório funcional.
7.6.3 Como opera o Circuit Breaker de Webhooks e de que modo reativar um endpoint pausado?
O endpoint de destino acusou erros HTTP 5xx consecutivos, timeouts (>10s) ou respostas 404 Not Found.
Para resguardar a fila do servidor, o MarbleSend monitora os envios e suspende o webhook (enabled = 0) automaticamente após falhas contínuas.
Abra a gaveta de histórico de envios para auditar os códigos HTTP e respostas de erro. Corrigida a API de destino, clique em "Test Webhook", confira a assinatura HMAC e reative.
7.6.4 Como ocorre a validação de licença Ed25519 e o que caracteriza o período de tolerância offline de 7 dias?
Oscilações de conectividade, indisponibilidade de DNS ou intervenções temporárias no servidor de licenciamento mestre.
A legitimidade da licença é atestada localmente na memória com libsodium sodium_crypto_sign_verify_detached(). Alterações manuais no banco invalidam de pronto a assinatura.
O MarbleSend reserva uma janela de tolerância offline de 7 dias (grace_until). Os disparos ativos seguem seu fluxo. Caso expire, assinantes e relatórios continuam 100% acessíveis sob soft-lock.
Integração com WordPress e Formulários de Terceiros
Colete inscritos em um site WordPress e envie-os ao MarbleSend. O plugin complementar tem seu próprio formulário de inscrição e conecta WPForms, Contact Form 7, Fluent Forms, Formidable Forms e Forminator.
Inspetor de integração de formulários
Selecione um componente para ver o hook, o que ele envia e uma dica de configuração.
Ponte REST API
Sem banco de dados compartilhadoFila de envio
Armazenamento transientMarbleSend Form
Shortcode, Block e WidgetHook do WPForms
wpforms_process_completeHook do Contact Form 7
wpcf7_mail_sentHook do Fluent Forms
submission_insertedFormidable Forms
frm_after_create_entryHook do Forminator
submit_before_set_fieldsAutoresponders por tag
Tags e emails de boas-vindasInstale primeiro o plugin complementar (marblesend-forms.zip)
O MarbleSend roda no próprio servidor, então o WordPress precisa de um plugin pequeno para enviar inscritos a ele. O plugin atende o formulário integrado do MarbleSend e conecta WPForms, Contact Form 7, Fluent Forms, Formidable Forms e Forminator. É gratuito, exige WordPress 6.3 ou superior e PHP 7.4 ou superior, e conversa com o MarbleSend apenas pela REST API.
Onde aparecem os menus de Settings?
Depois de ativar o plugin, o WordPress mostra duas páginas em Settings no wp-admin: MarbleSend Forms (URL de conexão, API key, tags padrão e o registro de falhas) e MarbleSend Integrations (mapeamento de campos de cada plugin de formulário). As duas ficam no WordPress. O painel do MarbleSend não as tem. Seus próprios formulários, com grupo, tags e proteção contra spam, são geridos em MarbleSend Forms, na barra lateral.
1. Baixe marblesend-forms.zip
Baixe o marblesend-forms.zip em Settings → Licença no MarbleSend, ou diretamente em https://marblesend.com/download/marblesend-forms.zip. É um zip de plugin do WordPress pronto para instalar: envie-o como está, sem descompactar.
2. Instale e ative no WordPress
No wp-admin vá em Plugins → Add New → Upload Plugin, escolha marblesend-forms.zip, clique em Install Now e depois em Activate Plugin. Para atualizar depois, envie o zip mais novo do mesmo jeito. O WordPress oferece substituir a versão instalada, e suas configurações continuam.
3. Conecte a API key (contacts:write)
No MarbleSend, abra Settings → API e Webhooks e crie uma API key com o scope contacts:write. No WordPress, abra Settings → MarbleSend Forms, informe a MarbleSend Site URL e a key, salve e clique em Test Connection. Deve aparecer Connected com o scope contacts:write. Depois escolha um Default Group e Default Tags nas listas carregadas do MarbleSend, ou crie ali um novo grupo.
4. Mapeie seus formulários
No wp-admin abra Settings → MarbleSend Integrations. Cada plugin de formulário ativo aparece com seus formulários. Marque Enabled, informe o campo de email e, se o formulário tiver, o campo de nome, adicione tags se quiser e salve. O formulário integrado não precisa de mapeamento.
8.1 Como o plugin conversa com o MarbleSend
O plugin chama a REST API do MarbleSend por HTTPS, então o WordPress e o MarbleSend podem rodar em servidores diferentes. Ele não tem acesso ao banco de dados do MarbleSend.
O WordPress nunca lê as tabelas do MarbleSend, e o MarbleSend nunca lê wp_posts nem wp_users. Os dois podem rodar em hosts separados, com bancos separados.
Toda requisição leva uma API key Bearer de Settings → API e Webhooks. O scope contacts:write basta, então a key não consegue enviar Campaigns nem alterar agendamentos.
Test Connection em Settings → MarbleSend Forms chama GET /api/verify-key e mostra os scopes da key, então uma URL ou key errada aparece na hora.
Cada envio vai para POST /api/contacts. Um email novo vira contato. Um existente mantém o status e recebe as tags novas somadas às atuais; o nome só muda quando o formulário envia um. Com double opt-in ativo, um contato novo fica pending até confirmar.
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: adicione "group_ids":[1,2] para colocar o contato em grupos específicos (liste-os com GET /api/groups; omitido = General). GET /api/contacts aceita group_id para filtrar por grupo.
8.2 Fila de envio e WP-Cron
Um MarbleSend lento ou inacessível não deve travar o formulário de um visitante nem perder um lead. Os envios dos plugins de formulário entram em fila e são enviados em segundo plano.
Quando um plugin de formulário envia, MarbleSend_Integration_Base::dispatch() limpa os campos e os guarda em um transient do WordPress (set_transient). Nenhuma requisição ao MarbleSend acontece enquanto o visitante espera.
Um evento do WP-Cron, marblesend_forms_process_queue, é agendado para cerca de um minuto depois e envia os envios da fila.
O WP-Cron envia cada item da fila uma vez. O formulário integrado chama o MarbleSend diretamente primeiro e só coloca o envio na fila, para uma tentativa do WP-Cron, se essa chamada falhar. Um item na fila é mantido por até uma hora.
Se o envio falha, ou um item expira antes de o WP-Cron conseguir enviá-lo, o plugin acrescenta uma linha a marblesend_forms_log (os últimos 50 records são mantidos) e mostra um aviso de administrador no wp-admin. Settings → MarbleSend Forms lista o registro e o número de itens pendentes.
// 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 O formulário de inscrição integrado
O plugin inclui um formulário de inscrição, então você não precisa de um construtor de formulários. Adicione-o com um shortcode, um bloco do Gutenberg ou um widget. Os três rodam o mesmo código.
Use [marblesend_form], o bloco do Gutenberg marblesend/subscribe-form ou o widget MarbleSend Subscribe Form. O shortcode aceita tags, show_name (1 ou 0) e consent (o texto de uma caixa de seleção obrigatória). O bloco e o widget oferecem as mesmas opções. Crie seus próprios formulários em MarbleSend Forms → Add New Form e incorpore um com [marblesend_form id="12"].
Um campo honeypot fora da tela (marblesend_hp), um nonce pedido quando o formulário é enviado, para que uma página em cache nunca sirva um expirado, e um limite de 5 envios por 60 segundos por IP (guardado com hash). Uma requisição que preenche o honeypot ou não tem nonce válido recebe uma mensagem de sucesso de aparência normal e é descartada. Requisições demais recebem uma mensagem curta de "aguarde um instante". Formulários criados no editor também podem usar Cloudflare Turnstile ou Google reCAPTCHA, definidos em Settings → MarbleSend Forms.
A página não recarrega. O plugin envia o contato ao MarbleSend na hora (tempo limite de 5 segundos). Se o MarbleSend não puder ser alcançado, ou o plugin ainda não estiver configurado, o envio vai para a fila para uma tentativa do WP-Cron e o visitante continua vendo a mensagem de sucesso. Se a própria requisição falhar, o formulário mostra um erro e pode ser enviado de novo.
Quando o visitante informa só o email, um contato novo recebe como nome a parte antes do @, porque a API exige um nome. Um contato existente mantém o nome. Todo contato recebe a tag source:wp-form mais as tags do formulário e de Settings → MarbleSend Forms. Com double opt-in ativo, o visitante vê uma mensagem pedindo que verifique o email. O contato entra no grupo do formulário, ou no Default Group de Settings → MarbleSend Forms.
[marblesend_form tags="newsletter,inbound" show_name="1" consent="I agree to receive email updates and accept the privacy policy."]
8.4 WPForms (Lite e Pro)
O WPForms é um dos construtores de formulário mais usados. O plugin lê o envio depois que o WPForms o valida, então você não precisa de nenhum complemento do WPForms.
O plugin detecta o WPForms com function_exists('wpforms') e escuta a ação wpforms_process_complete (prioridade 10), que recebe os campos já validados.
O WPForms identifica os campos por número. Selecione um campo no construtor e leia o ID no topo das opções do campo, por exemplo Field ID #2. Informe esse número no mapeamento. Um campo de nome com nome e sobrenome é unido em um só nome.
1. Anote o ID do campo Email e, se houver, do campo Nome. 2. Abra Settings → MarbleSend Integrations e encontre o WPForms. 3. Marque Enabled, informe os IDs e as tags que quiser. 4. Salve.
Todo contato do WPForms recebe a tag source:wpforms junto das suas próprias tags, e assim você pode enviar uma Campaign só para esse grupo.
add_action('wpforms_process_complete', function($fields, $entry, $form_data, $entry_id) {
$email = $fields[1]['value'] ?? ''; // Numeric Field ID #1
$name = $fields[0]['value'] ?? ''; // Numeric Field ID #0
MarbleSend_Integration_Base::dispatch('wpforms', $form_data['id'], $email, $name);
}, 10, 4);
8.5 Contact Form 7 (CF7)
O Contact Form 7 define seus campos como tags em um modelo de texto. O plugin entra depois que o email do formulário foi enviado.
O plugin detecta o CF7 com class_exists('WPCF7_ContactForm') e escuta wpcf7_mail_sent (prioridade 10). Um lead só é encaminhado depois que o formulário passou nas verificações de spam e validação e o Contact Form 7 enviou o próprio email. Se o envio de email falhar na sua hospedagem, nada é encaminhado.
O CF7 dá nome a um campo na tag do formulário, por exemplo [email* your-email] e [text your-name]. Informe o nome (your-email, your-name) nas caixas Email Field e Name Field.
O plugin lê os dados enviados com WPCF7_Submission::get_instance()->get_posted_data(), o que funciona com o envio AJAX do CF7.
1. Em Contact → Contact Forms abra o formulário e anote os nomes das tags. 2. Em Settings → MarbleSend Integrations encontre o Contact Form 7. 3. Marque Enabled, informe your-email e, se o formulário tiver, your-name, e adicione as tags que quiser. 4. Salve.
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 e Pro)
O plugin escuta a ação que o Fluent Forms dispara depois de salvar uma entrada.
O plugin detecta o Fluent Forms com function_exists('wpFluent') e escuta fluentform/submission_inserted (prioridade 10), que recebe $entry_id, $form_data e $form.
O Fluent Forms identifica os campos pelo Name Attribute, por exemplo email para Email e names para o campo de nome (nome e sobrenome são unidos). Encontre-o nas configurações do campo, em Advanced Options.
A página Integrations lista seus formulários lendo a tabela de formulários do próprio Fluent Forms, então você não precisa procurar IDs de formulário.
1. Confira o Name Attribute dos campos de email e nome. 2. Em Settings → MarbleSend Integrations, marque Enabled no formulário e informe os dois. 3. Adicione tags e salve. Os contatos novos recebem a tag source:fluentforms.
add_action('fluentform/submission_inserted', function($entryId, $formData, $form) {
$email = $formData['email'] ?? '';
$name = is_array($formData['names'] ?? null) ? implode(' ', $formData['names']) : ($formData['first_name'] ?? '');
MarbleSend_Integration_Base::dispatch('fluentforms', $form->id, $email, $name);
}, 10, 3);
8.7 Formidable Forms (Lite e Pro)
O plugin lê a entrada logo depois que o Formidable Forms a salva.
O plugin detecta o Formidable com class_exists('FrmForm') e escuta frm_after_create_entry (prioridade 30), que recebe $entry_id e $form_id.
O Formidable atribui um Field ID numérico (ex.: 12) a cada campo. Informe-o no mapeamento; chaves de campo não são compatíveis. Os dados são extraídos com FrmEntry::getOne($entry_id)->metas.
O plugin roda depois que a entrada é criada, então só os envios que passaram na validação do Formidable são encaminhados.
1. No construtor do Formidable, clique no campo de email e anote o Field ID. 2. Em Settings → MarbleSend Integrations, ative o formulário e informe o Field ID. 3. Salve o mapeamento. Os leads recebidos ganham a tag source:formidable.
add_action('frm_after_create_entry', function($entryId, $formId) {
$entry = FrmEntry::getOne($entryId, true);
$email = $entry->metas[12] ?? $entry->metas['email-address'] ?? '';
$name = $entry->metas[11] ?? $entry->metas['full-name'] ?? '';
MarbleSend_Integration_Base::dispatch('formidable', $formId, $email, $name);
}, 30, 2);
8.8 Forminator (Free e Pro)
O plugin escuta o hook que o Forminator dispara enquanto processa um envio.
O plugin detecta o Forminator com class_exists('Forminator_API') e escuta forminator_custom_form_submit_before_set_fields (prioridade 10), que recebe $entry, $form_id e $field_data.
O Forminator dá a cada campo um element ID como email-1, name-1 ou text-1. Informe esses IDs no mapeamento. O editor de formulários os mostra.
A página Integrations lista seus formulários do Forminator pelo nome, lidos com Forminator_API::get_forms().
1. Abra o Forminator e anote os element IDs (email-1, name-1). 2. Em Settings → MarbleSend Integrations, encontre o Forminator e informe os IDs. 3. Adicione tags e salve. 4. Faça um envio de teste e confira se o contato tem a tag source:forminator.
add_action('forminator_custom_form_submit_before_set_fields', function($formId, $response, $fieldData) {
$fields = array_column($fieldData, 'value', 'name');
$email = $fields['email-1'] ?? '';
$name = $fields['name-1'] ?? '';
MarbleSend_Integration_Base::dispatch('forminator', $formId, $email, $name);
}, 10, 3);
8.9 Tags, segmentos e autoresponders
Os contatos do plugin WordPress entram no grupo escolhido em Settings → MarbleSend Forms (Default Group) ou no formulário, e ficam em General quando nenhum é escolhido. Use tags para segmentá-los ou mova-os para grupos em Contacts.
Capturar um email é só o primeiro passo. As tags decidem o que acontece com o contato depois.
Além das suas próprias tags, todo contato recebe source:<slug>: source:wp-form, source:wpforms, source:cf7, source:fluentforms, source:formidable ou source:forminator. Use-as para enviar uma Campaign aos inscritos de um único plugin de formulário.
Em /contacts → Autoresponders, crie uma regra para a tag que você atribuiu ao seu formulário do WordPress. Quando o contato fica ativo (logo depois de enviar, ou depois de confirmar o double opt-in), o MarbleSend coloca na fila seu email de boas-vindas com o modelo e o perfil SMTP que você escolheu.
O plugin envia os leads direto para a sua própria instalação do MarbleSend. Um serviço como Zapier ou Make não faz parte do caminho.
Com double opt-in ativo, os contatos novos são guardados como pending com consent_source = 'api'. O MarbleSend envia por email um link de confirmação ({{confirm_link}}). Quando o contato clica nele, o status passa para active e o horário e o endereço IP são registrados para a LGPD.
{
"email": "lead@agency.com",
"name": "Jane Smith",
"tags": ["source:wpforms", "ebook-download", "vip-inbound"],
"consent_source": "api"
}
8.10 Solução de problemas
Problemas comuns ao conectar formulários do WordPress, com a causa, como verificar e como resolver.
Por que os envios aparecem atrasados, ou não aparecem, no MarbleSend?
O WP-Cron só roda quando alguém visita o site. Em um site com pouco tráfego ou de staging, os envios na fila esperam a próxima visita. Um envio na fila é mantido por uma hora. Se o WP-Cron não rodar nesse tempo, o envio se perde e o marblesend_forms_log registra que um expirou (ele não consegue nomear o visitante, porque os dados guardados também expiraram).
Abra Settings → MarbleSend Forms no wp-admin. O contador de pendentes mostra os itens que esperam por marblesend_forms_process_queue. Uma entrada no registro dizendo que um envio na fila expirou significa que o WP-Cron não rodou por mais de uma hora.
Abra https://your-site.com/wp-cron.php?doing_wp_cron para rodá-lo uma vez, ou configure um cron job de verdade no servidor (* * * * * wget -q -O - https://your-site.com/wp-cron.php >/dev/null 2>&1).
Por que o registro diz "Skipped: no valid email in form submission"?
O campo de email no mapeamento tem um erro de digitação, ou o visitante enviou um endereço vazio ou inválido que o sanitize_email() rejeitou.
MarbleSend_Integration_Base::log_skip() grava uma entrada em marblesend_forms_log sempre que um formulário ativado não produz um email válido.
Confira o identificador que seu construtor de formulários usa: um número no WPForms (por exemplo 2) e no Formidable Forms, o nome da tag no Contact Form 7 (your-email), o Name Attribute no Fluent Forms (email) e o element ID no Forminator (email-1).
Por que o WordPress informa uma API key inválida ou um scope ausente?
A key no WordPress foi revogada, expirou, foi apagada no MarbleSend ou foi criada sem o scope contacts:write.
Test Connection chama GET /api/verify-key. Uma resposta HTTP 401 ou 403 significa que a autenticação falhou.
No MarbleSend abra Settings → API e Webhooks e crie uma key nova com o scope contacts:write (ou admin). Copie o token que começa com ms_ para Settings → MarbleSend Forms no WordPress.
Por que leads do Contact Form 7 somem quando o formulário mostra um erro?
O plugin só encaminha um lead depois que o Contact Form 7 enviou o próprio email. Quando o email falha, o CF7 mostra a mensagem de erro e o lead não é encaminhado.
Envie o formulário você mesmo. Se aparecer "There was an error trying to send your message", o CF7 não conseguiu enviar o email.
Corrija o envio de email do seu site WordPress, por exemplo com um plugin SMTP. Assim que o CF7 conseguir enviar o email, o lead chega ao MarbleSend.
Por que um contato tem o próprio endereço de email como nome?
O formulário não tem campo de nome, ou nenhum campo de nome está mapeado. A API do MarbleSend exige um nome, então um contato novo recebe a parte do email antes do @.
Veja a linha do formulário em Settings → MarbleSend Integrations: a caixa Name Field está vazia. Um contato que já existia não é afetado, porque mantém o nome que tem.
Adicione um campo de nome ao formulário e informe-o no mapeamento. Contatos que já existem mantêm o nome atual; altere-o em /contacts se precisar.