Guia técnico oficial Arquitetura Zero-Build PHP 8.2+ Otimizado para hospedagem compartilhada

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.

Filter:
Núcleo

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.

100% Prepared PDO

Zero injeções SQL

Cada consulta ao banco de dados utiliza prepared statements rigorosos sem a sobrecarga de um ORM.

AES-256-GCM

Criptografia em repouso

Credenciais SMTP, chaves API de IA e secrets de webhook criptografados em Crypto.php.

Atomic Queue

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.

IU Zero-Build

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.

IMMUNITY

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.

PERFORMANCE

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.

IDEMPOTENCY

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.

SINGLE-TENANT

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.

AES-256-GCM

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.

RANDOM_BYTES()

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.

SECRETS CATALOG

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.

MASTER KEY ISOLATION

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.

UNIFIED RUNNER

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.

CLI & WEB-CRON

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.

ATOMIC CLAIM

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 RECOVERY

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.

Módulo 01

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 backend
Cartão KPI 1

Total enviados

Agregação de logs e contador mensal
Cartão KPI 2

Aberturas / Taxa de abertura

Pixel de rastreamento 1x1 e nota sobre Apple MPP
Cartão KPI 3

Cliques / CTR

Injetor de redirecionamento de cliques
KPI 04

Público cancelado

Taxa de cancelamento e conformidade RFC
Cartão de operação 4

Heartbeat do worker

Status do cron e intervalo de 1 min
Visualizador

Gráfico de crescimento de volume

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

Tabela de transmissões recentes

Ciclo de status e trilha de auditoria
Banner de segurança

Saúde da entregabilidade

Prontidão do perfil SMTP

Impacto no banco de dados:

Dica profissional da equipe de suporte:

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

Intervalos selecionáveis (7d, 30d, 90d, YTD)

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

Barras flexíveis leves e sem dependências

Renderizado com CSS flexbox puro com base no pico de envios, garantindo carregamento ultrarrápido em celulares e hospedagens simples.

Telemetria de métricas duplas no cursor

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.

Completed

status = 'completed'

Sending

status = 'sending'

Failed

status = 'failed'

Draft

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.

Nome e origem da Campaign

Exibe o assunto da Campaign, a data de criação e a tag de origem (manual, recurring, rss ou resend_unopened).

Destinatários e proporção de entrega

Contagem instantânea de mensagens entregues versus falhas, além de porcentagens em tempo real de taxa de abertura e taxa de cliques.

Link do relatório de métricas

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.5 Banner de alerta de verificação de entregabilidade

Quando o domínio de envio não possui records SPF, DKIM ou DMARC verificados, o MarbleSend destaca um banner de atenção logo acima das métricas de KPI. Clicar em Verificar DNS do domínio abre o assistente de diagnóstico de 4 etapas em /settings?tab=deliverability, evitando que usuários prejudiquem a reputação do domínio com caixas postais não autenticadas.

Verificação de perfis SMTP ativos

Exibe a quantidade de relés SMTP ativos configurados nas Settings. O MarbleSend suporta rotação multi-SMTP para distribuição balanceada de envios.

Alerta de relé ausente e guarda Preflight

Se nenhum perfil SMTP ativo for identificado, um aviso vermelho bloqueia o envio de Campaigns para evitar falhas graves de fila.

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.

Módulo 02

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

Monitor de Envio Live

Estatísticas e eventos em tempo real
AUDIENCE

Seletor de Destinatários

Filtro de tags e seleção geral
COMPOSER

Editor de Visualização Tripla

Código, split e prévia
SAFETY

Motor de Verificação Preflight

Inspeção automatizada em 6 pontos
TESTING

Diagnóstico de Envio de Teste

Amostra direta sem fila
ATTRIBUTION

Reescritor de UTM e Links

Parâmetros UTM e rastreio 302
PORTFOLIO

Histórico de Disparos

Filtros de status e origem
ANALYTICS

Relatório Detalhado Pós-Envio

CTR, MPP e reenvio automático

Impacto no banco de dados:

Dica profissional da equipe de suporte:

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

Sending

74% complete

7,420 / 10,000 emails

Na Fila

2,528

Enviando

40

Sucesso

7,420

Com Falha

12

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

Motor de 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.

TELEMETRY NOTE

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.

PIPELINE 01

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.

PIPELINE 02

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.

PIPELINE 03

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:

KPI METRICS

4 Métricas de Desempenho Bento

Mede total Enviado (100%), Falhas de entrega, Aberturas únicas com taxa de abertura e Cliques únicos com CTR.

TEMPORAL CLUSTERS

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.

ENGAGEMENT RECOVERY

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.

Módulo 03

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

Máquina de 4 Estados

active/pending/unsub/supp
FILTRAGEM

Mecanismo de Busca e Filtros

Tags, status e debounce
TELEMETRIA

Gaveta de Auditoria e Consentimento

IP, carimbos e rejeições
INGESTÃO

Importador CSV RFC 4180

50 mil linhas e proteções dedup
FUNIS

Páginas de Captura Hospedadas

Double opt-in e funis
AUTOMAÇÃO

Autoresponders por Tag

Regras de envio por eventos
GESTÃO

Hub de Gestão em Massa

Segmentação entre páginas
CONFORMIDADE

Privacidade e Supressão GDPR

Exportação JSON e exclusão total

Impacto no banco de dados:

Dica profissional da equipe de suporte:

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

active

Assinante ativo

Opt-in confirmado, e-mail válido. Elegível para receber Campaigns, agendamentos e autoresponders.

pending

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.

unsubscribed

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.

suppressed

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.

Edição direta

Atualize nome, metadados personalizados e chips de tags inline sem recarregar.

Supressão manual

Suprima um contato instantaneamente para desqualificá-lo de todas as filas de imediato.

Exclusão permanente GDPR

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.

Total de Visualizações

Monitora o acumulado de impressões em todos os funis de captura ativos.

Taxa Média de Conversão

Calcula o percentual de envios em relação às visualizações em todos os formulários hospedados.

Páginas Ativas / Limite

Mostra a quantidade de páginas de captura em funcionamento frente ao limite de 20 páginas.

Inscrições em 30 Dias

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.

Motor de Double Opt-in

Gera tokens de confirmação assinados com HMAC com disparo automatizado de e-mail de confirmação.

Marcação automática por tags

Atribui tags de assinante designadas no momento do cadastro para ativar sequências personalizadas.

Redirecionamento personalizado

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.

Módulo 04

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

Biblioteca de Templates

Pesquisa instantânea e slugs
PRESETS

Layouts Starter

8 layouts de email baseados em tabelas
EDITOR

Editor de Código Puro

Indentação Tab e limpador
PRÉVIA

Viewport Isolado

Moldura desktop e mobile
TOKENS

Paleta de Tokens Dinâmicos

Inserção de placeholders em 1 clique
DIAGNÓSTICO

Remetente de Teste

Janela de verificação SMTP em tempo real
AI COPY

Gaveta do AI Copywriter

Gerar e refinar templates
AUDITORIA AI

Revisor de Assuntos

Nota 1–100 e filtro antispam
PUBLICAÇÕES

Publicações de notícias

Artigos em Markdown para newsletters

Impacto no banco de dados:

Dica profissional da equipe de suporte:

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

1. Em branco minimalista

Espaço limpo com rodapé obrigatório para cancelamento de inscrição.

2. Lançamento de produto

Banner de destaque, proposta de valor e CTA marcante.

3. Newsletter mensal

Editorial selecionado com destaques de artigos em 2 colunas.

4. Newsletter de publicações de notícias

Faixa de cabeçalho mais o bloco {{news_posts}} para agendamentos de Publicações de notícias.

5. Série de boas-vindas

Integração pessoal com guia de primeiros passos em 3 etapas.

6. Convite para webinar

Emblema de data/hora, biografia do palestrante e botão de confirmação.

7. Resumo do blog

Artigos numerados, tempo de leitura e tags de autor.

8. Oferta de reativação

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.

{{name}}

Nome completo do contato (adota "there" se estiver vazio)

{{email}}

Endereço de email do destinatário

{{unsubscribe_link}}

Link obrigatório de cancelamento de inscrição em 1 clique segundo RFC 8058

{{confirm_link}}

URL de confirmação double opt-in para páginas de captura

{{posts}}

Bloco de repetição de posts do blog para newsletters automáticas de RSS

{{feed_title}}

Título do feed de conteúdo RSS/Atom conectado

{{latest_post_title}}

Título da publicação mais recente no blog

{{posts_count}}

Quantidade de novidades do feed incorporadas ao disparo

{{news_posts}}

Bloco de Publicações de notícias para um agendamento de Newsletter (capa, título, subtítulo, corpo)

{{news_posts_count}}

Número de Publicações de notícias incluídas neste envio

{{news_latest_post_title}}

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:

6.7 Motor de IA de modo duplo: Provedores BYOK e Créditos IA MarbleSend

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.

ParteO que faz
BibliotecaLista 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, capaO 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 statusPublicaçõ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 MarkdownOs 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 vivoRenderiza 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 marcadorUm 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.

SyntaxResultado
## 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
> quoteCitação em bloco
---Linha divisória
![alt](https://example.com/a.png)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.

MarcadorTorna-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

SintomaO que verificar
A pré-visualização não mostra artigosO 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ávelEscreva como [text](https://…) com um endereço http, https ou mailto; outros esquemas ficam como texto.
Uma imagem não apareceO 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.
Module 05

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

Interactive Inspector
CALENDÁRIO

Calendário & Matriz mensal

Mapa visual de agendamentos & cadência
CADÊNCIA

Motor de recorrência

Diário, semanal, mensal & personalizado
RSS / ATOM

Poller de blog automatizado

Deduplicação de hash & cache
AUDIÊNCIA

Audiência dinâmica

Consulta de tags no segundo exato da execução
AUDITORIA

Logs de ocorrências

Auditoria de execução & prevenção de duplicados
EXECUÇÃO

Execução imediata Run Now

Disparo imediato sem alterar a cadência
OTIMIZAÇÃO

Otimização de hospedagem

8 diretrizes operacionais selecionadas
WORKER

Heartbeat Cron & Trava

Bloqueio de simultaneidade não-bloqueante
PUBLICAÇÕES

Modo Publicações de notícias

Newsletters no estilo Substack

Impacto no banco de dados:

Dica profissional da equipe de suporte:

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

1. Janelas ideais de envio matinal

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.

2. Precisão de 1 minuto do cron worker

Execute o worker.php a cada minuto (* * * * *) com trava flock para garantir pontualidade sem colisão de processos.

3. Reserva atômica de lotes na fila

Consulte cm_email_queue com instruções preparadas indexadas e cláusulas LIMIT para eliminar condições de corrida durante picos de envio.

4. Segmentação de assinantes por tag de fuso horário

Agrupe contatos por tags regionais (#us-east, #apac, #emea) e use agendamentos escalonados para evitar disparos às 3h da madrugada.

5. Intervalo de segurança para publicação de RSS

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.

6. Limpeza periódica do histórico de ocorrências

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.

7. Reenvio após 48h para quem não abriu

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.

8. Roteamento e isolamento com perfis SMTP dedicados

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

  1. 1Abra Modelos → Publicações e escreva seu artigo em Markdown.
  2. 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).
  3. 3Abra Agendamentos → Novo, mantenha o tipo em Newsletter e defina Origem do conteúdo como “Publicações de notícias”.
  4. 4Escolha o modelo, o público, o perfil SMTP, as publicações por e-mail (1–20) e a cadência.
  5. 5Salve. Somente publicações que ficarem Prontas depois deste momento podem ser enviadas por este agendamento.
  6. 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.

Exemplo: você salva o agendamento na segunda. Uma publicação que ficou Pronta na sexta é ignorada; uma que fica Pronta na terça é enviada na próxima ocorrência e depois nunca mais por este agendamento.

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

SintomaO que verificar
Minha publicação Pronta não foi enviadaVerifique 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 umaA 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 antigaCopie o texto dela para uma nova publicação e marque a nova como Pronta — um agendamento nunca envia a mesma publicação duas vezes.
Módulo 06

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

Interactive Inspector
SMTP

Perfis SMTP

BYO SMTP e Relay SES Gerenciado
WORKER

Worker e Cron

Cadência de execução de 1 minuto
LOCALES

23 Idiomas e Tema

Espelho RTL e Modo Escuro/Claro
API KEYS

Chaves REST API

Acesso de desenvolvedor com escopo
WEBHOOKS

Webhooks de Eventos

Push de eventos HMAC-SHA256
DELIVERABILITY

Suite de Entregabilidade

SPF, DKIM, DMARC e BIMI
AI BYOK

Provedores de AI

BYOK e Créditos MarbleSend
LICENSE

Licença Ed25519

Token de concessão criptográfica

Impacto no banco de dados:

Dica profissional da equipe de suporte:

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

Opção 1: BYO SMTP (Infraestrutura de relay própria)

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 SMTP

Conecte seu próprio transporte de e-mail com credenciais SMTP padrão. Escolha entre relays em nuvem dedicados ou caixas de hospedagem.

Aviso Importante de Transparência: Limites de Envio da Hospedagem Compartilhada

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.

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

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

Starter Business Email Rp7.900 / mo

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

Standard Business Email Rp10.900 / mo

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

Premium Business Email Rp19.900 / mo

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

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

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

Grow Marketing Rp36.900 / mo

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

Pro Marketing Rp54.900 / mo

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

Namecheap Jellyfish / cPanel

• cPanel Shared: Max ~500 emails/hour per cPanel domain.
• Private Email: Starter (~$1.24/mo per mailbox, 5GB). Pro (~$2.82/mo, 30GB).
• SMTP Host: mail.privateemail.com (Port 465 SSL or 587 TLS).

View Namecheap Email
Bluehost cPanel / M365

• Shared cPanel: Default cap ~500 emails/hour. Internal mail system may defer large sudden bursts.
• Professional Email: Integrated with Microsoft 365 or Google Workspace ($2.99–$9.99/mo).
• SMTP Host: box###.bluehost.com or mail.yourdomain.com (Port 465 SSL).

View Bluehost Email
SiteGround Site Tools

• Site Tools Mail: Included in hosting (StartUp, GrowBig, GoGeek).
• Rate Limits: ~400 emails/hour on StartUp; up to ~800/hour on GoGeek. Strictly intended for transactional mail.
• SMTP Host: mail.yourdomain.com (Port 465 SSL).

View SiteGround Email
DreamHost Custom Panel

• Paid Business Email: ~$1.99/mo per mailbox (25GB storage).
• Strict Outbound Policy: Maximum 100 recipients per hour. Mass marketing prohibited via shared SMTP.
• SMTP Host: smtp.dreamhost.com (Port 465 SSL or 587 TLS).

View DreamHost Email
HostGator cPanel

• cPanel Limit: Max 500 emails/hour per domain on shared plans.
• Workspace Option: Google Workspace addon ($6–$18/mo).
• SMTP Host: mail.yourdomain.com (Port 465 SSL or 587 TLS).

View HostGator Email
GoDaddy Microsoft 365

• M365 Reseller: Email Essentials from ~$1.99–$5.99/mo (10GB-50GB).
• SMTP Relay Note: Direct SMTP AUTH requires enabling Authenticated SMTP in the M365 Admin Portal.
• SMTP Host: smtp.office365.com (Port 587 TLS).

View GoDaddy Email

Selecione a porta e o protocolo de segurança adequados para sua rede.

Port 587 (STARTTLS) STANDARD

The modern standard for email client-to-relay submission (RFC 6409). Starts in cleartext and immediately upgrades connection to TLS. Supported by almost all cloud relays.

Port 465 (SSL / SMTPS) ENCRYPTED

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

Port 25 (Plain / MTA) BLOCKED

Server-to-server MTA routing. Almost universally blocked on cloud hosts (Hostinger, AWS, DigitalOcean, Hetzner, etc.) to combat spam. Do NOT use for outbound SMTP credentials.

6.1.1 Relay Amazon SES Gerenciado e Domínios de Remitente Personalizados

MANAGED SES

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

Opção 2: MarbleSend SMTP via Amazon SES (Relay Gerenciado)

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.

Livro-razão de créditos atômico, idempotência e reembolso automático

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.

Diagnóstico de socket TLS em tempo real e logs detalhados
Easy DKIM

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.

Roteamento por campanha e fallback padrão contínuo

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

Verificação de domínio do remetente (SPF, DKIM, DMARC)

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.

Identidade do remetente

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.

Cancelamento em todo e-mail

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.

Listas baseadas em permissão

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.

Bounces e reclamações

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.

Limites e pausa automática

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.

Envio autenticado

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.

Manual Easy DKIM por provedor

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

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

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

Comandos de verificação via terminal (CLI)
# Check resolution via dig (macOS / Linux):
dig CNAME <token1>._domainkey.yourdomain.com +short

# Check resolution via nslookup (Windows / PowerShell):
nslookup -type=CNAME <token1>._domainkey.yourdomain.com
Hostinger (Zona DNS no hPanel)
hPanel DNS
Hostinger hPanel → Domínios → Selecionar domínio → DNS / Nameservers
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)
1

Faça login no painel hPanel da Hostinger e acesse Domínios.

2

Selecione seu domínio e clique em DNS / Nameservers na barra lateral esquerda.

3

Em Gerenciar registros DNS, escolha CNAME no menu suspenso Tipo.

4

No campo Nome, insira APENAS token._domainkey (o hPanel anexa .seudominio.com automaticamente).

5

No campo Alvo, insira token.dkim.amazonses.com e mantenha o TTL em 300 ou padrão (14400).

6

Clique em Adicionar registro. Repita o processo para os 3 tokens fornecidos no MarbleSend.

O hPanel da Hostinger exibe seu domínio em cinza ao lado do campo. Não insira seu nome de domínio nem pontos adicionais no campo Nome.
DreamHost (Painel Web DreamHost)
DreamHost Web Panel
Painel DreamHost → Sites → Gerenciar sites → Configurações de DNS (ou Domínios → Gerenciar domínios → DNS)
Tipo de registro Host / Nome Valor / Destino / Aponta para TTL
CNAME <token>._domainkey (DreamHost appends .yourdomain.com) <token>.dkim.amazonses.com Default
1

Faça login no painel web da DreamHost e vá para Sites > Gerenciar sites.

2

Localize seu domínio e clique em Configurações de DNS (ou Domínios > Gerenciar domínios > DNS).

3

Role até a seção "Adicionar um registro DNS personalizado" e clique em Adicionar registro.

4

No campo Nome, insira token._domainkey (a DreamHost mostra .seudominio.com automaticamente).

5

Defina Tipo como CNAME e insira token.dkim.amazonses.com no campo Valor.

6

Clique em Salvar / Adicionar registro. Repita para os 3 tokens.

As atualizações de DNS na DreamHost podem levar de 1 a 2 horas para sincronizar completamente em todos os servidores.
Namecheap (DNS Avançado)
Advanced DNS
Painel Namecheap → Domain List → Manage → Aba 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)
1

Faça login na Namecheap, abra Domain List e clique em Manage ao lado do seu domínio.

2

Mude para a aba Advanced DNS na parte superior da página.

3

Na seção Host Records, clique no botão vermelho ADD NEW RECORD.

4

Selecione CNAME Record no menu suspenso Type.

5

No campo Host, insira APENAS token._domainkey (nunca inclua seu nome de domínio).

6

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.

Se o seu domínio usar Custom DNS externos, essa aba estará desativada; adicione os registros no seu provedor de DNS ativo.
Bluehost (Gerenciador de contas / Zone Editor)
Bluehost DNS
Portal Bluehost → Domínios → DNS (ou cPanel → Zone Editor)
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)
1

Faça login no Bluehost Account Manager, clique em Domínios e escolha seu domínio.

2

Acesse a aba DNS (ou abra o cPanel Zone Editor caso utilize hospedagem cPanel tradicional).

3

Role até a seção CNAME (Alias) e clique em Add Record.

4

No campo Host Record, insira token._domainkey.

5

Em Points To, insira token.dkim.amazonses.com e selecione o TTL (4 Hours ou Default).

6

Clique em Save. Repita para os 2 tokens CNAME restantes.

A Bluehost gerencia o sufixo de domínio automaticamente em segundo plano. Nunca digite o domínio raiz no campo Host Record.
SiteGround (Editor de zona DNS Site Tools)
Site Tools DNS
Área de clientes SiteGround → Sites → Site Tools → Domínio → Editor de zona 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)
1

Acesse a Área de Clientes da SiteGround, vá em Sites e abra o Site Tools do seu domínio.

2

No menu lateral esquerdo, expanda Domínio e clique em Editor de zona DNS.

3

Selecione a aba CNAME em Criar novo registro.

4

No campo Nome, insira token._domainkey (o Site Tools fixa .seudominio.com à direita).

5

No campo Aponta para, insira token.dkim.amazonses.com e deixe o TTL em 1 hora (3600).

6

Clique em Criar. Repita para os 3 tokens.

Os servidores de nomes da SiteGround propagam alterações em segundos. Certifique-se de que não existam registros TXT conflitantes no mesmo subdomínio de seletor.
HostGator (cPanel Zone Editor)
cPanel Zone Editor
Portal HostGator → cPanel → Domínios → 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)
1

Faça login no Portal do Cliente da HostGator e abra o cPanel.

2

Na seção Domínios, clique em Zone Editor.

3

Localize seu domínio e clique em + CNAME Record (ou Gerenciar > Adicionar registro).

4

No campo Nome, insira token._domainkey (o cPanel preenche automaticamente com seu domínio e ponto final).

5

No campo CNAME / Record, insira token.dkim.amazonses.com.

6

Clique em Add a CNAME Record. Repita para os 3 tokens.

No cPanel Zone Editor, verifique na lista se o registro consta como token._domainkey.seudominio.com. sem repetições indevidas.
GoDaddy (Portfólio de domínios DNS)
GoDaddy DNS
Conta GoDaddy → Meus produtos → Domínios → DNS (ou Gerenciar 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)
1

Faça login na sua conta GoDaddy e vá para Meus produtos.

2

Em Domínios, localize seu domínio e clique em DNS (ou nos três pontos > Gerenciar DNS).

3

Na seção Registros de DNS, clique em Adicionar novo registro.

4

Selecione CNAME no menu suspenso Tipo.

5

No campo Nome, insira APENAS token._domainkey (não inclua .seudominio.com!).

6

Em Valor, insira token.dkim.amazonses.com, escolha TTL 1/2 hora (ou Padrão) e salve. Repita para os 3 registros.

A GoDaddy acrescenta seu domínio automaticamente. Digitar o domínio completo causará erro de sintaxe DNS ou criará um registro duplicado inválido.
Verificação e propagação de DNS

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.

Passo 1: Copie a sua linha de cron

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.

Passo 2: Adicione-a no painel da sua hospedagem

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)
  1. Abra hPanel → Websites → Dashboard do seu site e clique em Cron Jobs na barra lateral.
  2. 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.)
  3. Cole a linha do Passo 1 em Command to run.
  4. Defina o agendamento para cada minuto, ou escreva * * * * *.
  5. 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.

  1. Abra o cPanel e, na secção Advanced, clique em Cron Jobs.
  2. Em Add New Cron Job, escolha Once Per Minute (* * * * *) em Common Settings.
  3. Cole a linha do Passo 1 em Command.
  4. 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
  1. Inicie sessão no Bluehost Portal, clique em Websites e depois em Manage Site para o seu site.
  2. Abra o separador Advanced, encontre Cron Jobs e clique em Manage e depois em Add Cron.
  3. Escolha uma frequência em Common Settings (ou preencha Minute, Hour, Day, Month e Weekday).
  4. 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.

  1. Abra o cPanel e, na secção Advanced, clique em Cron Jobs.
  2. Em Add New Cron Job, escolha Once Per Minute (* * * * *) em Common Settings.
  3. Cole a linha do Passo 1 em Command.
  4. 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.

  1. Abra o cPanel e, na secção Advanced, clique em Cron Jobs.
  2. Em Add New Cron Job, escolha Once Per Minute (* * * * *) em Common Settings.
  3. Cole a linha do Passo 1 em Command.
  4. 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
  1. Abra o painel da DreamHost, vá a Cron Jobs e clique em Add New Cron Job.
  2. 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.
  3. 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).
  4. 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
  1. Abra Site Tools → Devs → Cron Jobs.
  2. Escolha o intervalo na lista (ou defina minuto, hora, dia, mês e dia da semana).
  3. Cole a linha do Passo 1 em Command. Um endereço de e-mail para a saída é opcional.
  4. 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.

Sem acesso ao cron, ou o seu fornecedor limita-o? Use o Web-Cron
  1. Abra Settings → Sistema e copie a Web-Cron URL. Mantenha-a privada: contém o seu token secreto.
  2. Crie uma conta gratuita num serviço de cron como o cron-job.org.
  3. Crie uma tarefa, cole o URL e configure-a para correr a cada minuto. Guarde e ative-a.
  4. Use o Web-Cron ou uma cron job do seu fornecedor, não ambos: um basta.
Passo 3: Verifique se funciona

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.

Continua a mostrar Cron Não Detectado?
  • 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.

Crontab CLI Nativo (Opção A)
* * * * * 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.

Fallback Web Cron HTTP (Opção B)
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.

Concurrency Guard flock Não-Bloqueante

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ção Atómica de Lotes de Fila

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.

23 Idiomas Nativos Sem Dependências

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.

Espelhamento Bidirecional RTL

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.

Motor de Tema Tri-State Persistente

Alterna perfeitamente entre tema escuro, tema claro e preferência do sistema operacional. A escolha é guardada em cookies (marblesend_theme) para evitar layout shifts.

Segurança Reforçada de Administrador Único

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

Como funciona

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.

Ative passo a passo

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.

O código QR fica no seu servidor

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.

Entrar com um código

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.

Códigos de recuperação

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.

Celular perdido e sem códigos de recuperação

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.

1 Crie ou entre em uma conta Cloudflare

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.

2 Abra o Turnstile e adicione um widget

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.

3 Dê um nome ao widget e liste os hostnames

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.

4 Escolha o modo do widget

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.

5 Copie as duas chaves

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.

6 Cole-as no MarbleSend

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.

7 Teste

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.

Quando a Cloudflare está inacessível

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.

Chaves de teste para desenvolvimento

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.

Solução de problemas

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.

Obrigatório enquanto você usa o SES Relay

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.

Geração de Token e Exibição Única

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.

Armazenamento Hash Unilateral SHA-256

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.

Escopos de Permissão Granulares

Restrinja chaves a capacidades específicas: contacts:read, contacts:write, campaigns:read, campaigns:write, campaigns:send, schedules:read e schedules:write.

Autenticação Bearer e Logs de Auditoria

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.

Subscrições de Eventos de Ciclo de Vida

Subscreva eventos essenciais: contact.created, contact.unsubscribed, campaign.sent, campaign.bounced e link.clicked com alternância de ativação individual.

Cabeçalho de Assinatura HMAC-SHA256

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.

Circuit Breaker e Mecanismo de Repetição

Envios de webhooks com falha (HTTP 5xx ou timeouts) acionam repetições exponenciais. Endpoints com falhas consecutivas são pausados automaticamente para evitar sobrecarga.

Histórico de Auditoria e Ping de Teste

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.

1. SPF (Sender Policy Framework)

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.

2. DKIM (DomainKeys Identified Mail)

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.

3. Política DMARC e Alinhamento

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.

4. Avatar de Marca BIMI e VMC

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.

BYOK Modo 1: BYOK (Bring Your Own Key)

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.

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

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.

DYNAMIC Dynamic Edge Pricing & Instant Checkout

Official add-on pricing is retrieved dynamically from admin.marblesend.com. Purchase top-up credit packs via global and local payment gateways with instant real-time balance activation.

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

All BYOK credentials are encrypted at rest with hardware-accelerated AES-256-GCM using your installation's unique APP_KEY. No prompt contents, contact lists, or recipient emails are ever stored or logged by the license server.

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

MarbleSend AI (Relay Gerenciado)

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.

BYOK (Traga sua própria chave)

Comunicação direta de servidor para provedor sem margens adicionais. Escolha qualquer provedor configurado e identificador de modelo como seu mecanismo padrão.

Pipeline de Geração Unificado

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.

Persistência do Estado do Sistema

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.

Alocação de Créditos Iniciais Gratuitos

Cada licença ativada recebe créditos de IA iniciais gratuitos resgatados dinamicamente do servidor de licenças para testar o AI Assist imediatamente.

Livro-Razão Atômico e Idempotência

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.

Catálogo de Preços Dinâmico na Edge e Recarga

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.

Saldo em Tempo Real e Sincronização em 1 Clique

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.

Registro Multi-Provedores

Mantenha conexões simultâneas com OpenAI, Anthropic Claude, Google Gemini, DeepSeek, Kimi/Moonshot, OpenRouter ou instâncias privadas do Ollama.

Protocolos Duplos e URLs Base Personalizadas

Suporta endpoints padrão compatíveis com OpenAI (/chat/completions) e formato de mensagens Anthropic (/v1/messages) com URLs proxy personalizadas.

Cofre Criptográfico AES-256-GCM

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.

Diagnóstico Prévio em Tempo Real

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:

OpenAI GPT-4o / o-series
Format: openai
Base URL: https://api.openai.com/v1
Steps: Faça login em platform.openai.com → abra o Dashboard → selecione "API keys" na barra lateral → clique em "+ Create new secret key" → nomeie como "MarbleSend" → copie sua chave (inicia com sk-...). Veja platform.openai.com/docs/models para modelos atualizados.
Anthropic Claude Claude 3.5 / 3.7 Sonnet
Format: anthropic
Base URL: https://api.anthropic.com/v1
Steps: Acesse console.anthropic.com → vá em Settings → "API Keys" → clique em "Create Key" → identifique como "MarbleSend" → copie a chave secreta (inicia com sk-ant-...). Acesse docs.anthropic.com/en/docs/about-claude/models para IDs do Claude.
Google Gemini Gemini 2.0 / 2.5 Flash
Format: gemini
Base URL: https://generativelanguage.googleapis.com/v1beta
Steps: Faça login com sua conta Google em aistudio.google.com → clique em "Get API key" no menu → clique em "Create API key" → copie a chave (inicia com AIzaSy...). Visite ai.google.dev/gemini-api/docs/models/gemini para catálogo de modelos Gemini.
DeepSeek DeepSeek-V3 / R1
Format: openai
Base URL: https://api.deepseek.com
Steps: Acesse platform.deepseek.com → selecione "API keys" no menu lateral → clique em "Create API key" → insira o nome "MarbleSend" → copie a chave (inicia com sk-...). Acesse api-docs.deepseek.com para ver os IDs disponíveis.
Kimi (Moonshot AI) Kimi k1.5 / Moonshot v1
Format: openai
Base URL: https://api.moonshot.cn/v1
Steps: Acesse platform.moonshot.cn → abra o Console → selecione "API Key Management" (API Key 管理) → clique em "Create" (新建) → copie seu token secreto. Visite platform.moonshot.cn/docs para modelos Moonshot/Kimi.
OpenRouter Aggregator (200+ Models)
Format: openai
Base URL: https://openrouter.ai/api/v1
Steps: Acesse openrouter.ai → navegue até Account → "Keys" → clique em "Create Key" → defina limites opcionais → copie sua chave (inicia com sk-or-v1-...). Navegue por openrouter.ai/models para acessar mais de 100 modelos com roteamento unificado.
Ollama & Local / Groq Local LLM / Ultra-Fast LPU
Format: openai
Base URL: http://localhost:11434/v1 / https://api.groq.com/openai/v1
Steps:
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:

1 1. Abra Settings ➔ Aba AI Providers

Na barra lateral principal, clique em Settings e acesse a aba "AI Providers" (diretamente em /settings).

2 2. Utilize o Quick Add ou "+ Add Provider"

Clique em um dos botões de preset do Quick Add (OpenAI, DeepSeek, Gemini, Anthropic, etc.) para preenchimento automático ou em "+ Add Provider".

3 3. Verifique o Formato e a Base URL

Selecione o formato de protocolo: "OpenAI format" ou "Anthropic format". Confirme a Base URL preenchida.

4 4. Cole a API Key com Segurança

Cole sua chave secreta. O MarbleSend a armazena criptografada com AES-256-GCM via Crypto.php sem qualquer exposição em texto puro.

5 5. Defina o Model ID e Teste a Conexão

Informe o ID do modelo e o context window, e clique em "Test Connection" para validar o handshake em tempo real antes de salvar.

6 6. Defina o Modelo Ativo Padrão

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ção de Assinatura Ed25519

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.

Vinculação de Domínio e Nível

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.

Período de Carência Offline de 7 Dias

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.

Política de Soft-Lock

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.

Verificação automática de atualizações

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 e e-mails de atualização

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

Playbook de redução de suporte

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?

Causa principal:

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.

Diagnóstico e mecanismo:

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.

Solução prática e playbook:

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?

Causa principal:

Pré-carregamento do Apple Mail Privacy Protection (MPP), cache de proxy, bloqueio de imagens por destinatários ou bloqueadores removendo parâmetros UTM.

Diagnóstico e mecanismo:

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.

Solução prática e playbook:

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?

Causa principal:

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.

Diagnóstico e mecanismo:

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.

Solução prática e playbook:

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?

Causa principal:

Ausência do token mandatório {{unsubscribe_link}}, assunto inválido, zero destinatários ativos selecionados ou syntax de token aberta.

Diagnóstico e mecanismo:

O motor de Preflight avalia 6 pilares cruciais de conformidade e deliverability antes de consentir a transição para queued ou sending.

Solução prática e playbook:

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?

Causa principal:

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.

Diagnóstico e mecanismo:

O MarbleSend estipula status campaign = completed e recomenda aguardar de 24 a 48 horas para oportunizar a leitura em diferentes fusos horários.

Solução prática e playbook:

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?

Causa principal:

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.

Diagnóstico e mecanismo:

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.

Solução prática e playbook:

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?

Causa principal:

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

Diagnóstico e mecanismo:

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.

Solução prática e playbook:

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?

Causa principal:

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.

Diagnóstico e mecanismo:

O Word MSO acata exclusivamente layouts estruturados em tabelas convencionais (nested <table>, <tr>, <td>) com larguras em pixels e estilos inline.

Solução prática e playbook:

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?

Causa principal:

O peso do file HTML ultrapassa o teto intransponível de 102 KB (104.448 bytes) estabelecido pelo Gmail.

Diagnóstico e mecanismo:

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.

Solução prática e playbook:

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?

Causa principal:

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.

Diagnóstico e mecanismo:

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.

Solução prática e playbook:

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?

Causa principal:

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.

Diagnóstico e mecanismo:

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.

Solução prática e playbook:

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?

Causa principal:

Múltiplos intervalos agendados transcorreram enquanto o processo worker estava paralisado.

Diagnóstico e mecanismo:

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.

Solução prática e playbook:

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?

Causa principal:

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.

Diagnóstico e mecanismo:

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

Solução prática e playbook:

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?

Causa principal:

A entrega é rastreada por agendamento, não por publicação.

Diagnóstico e mecanismo:

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

Solução prática e playbook:

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

Causa principal:

Credenciais SMTP errôneas, conflito entre porta e criptografia (Porta 587 STARTTLS vs Porta 465 SSL) ou remetente não autorizado no relay.

Diagnóstico e mecanismo:

Settings → SMTP disponibiliza um teste de socket em tempo real com o diálogo detalhado entre o PHPMailer e o servidor SMTP.

Solução prática e playbook:

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?

Causa principal:

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.

Diagnóstico e mecanismo:

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

Solução prática e playbook:

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?

Causa principal:

O endpoint de destino acusou erros HTTP 5xx consecutivos, timeouts (>10s) ou respostas 404 Not Found.

Diagnóstico e mecanismo:

Para resguardar a fila do servidor, o MarbleSend monitora os envios e suspende o webhook (enabled = 0) automaticamente após falhas contínuas.

Solução prática e playbook:

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?

Causa principal:

Oscilações de conectividade, indisponibilidade de DNS ou intervenções temporárias no servidor de licenciamento mestre.

Diagnóstico e mecanismo:

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.

Solução prática e playbook:

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.

Plugin do WordPress e REST API

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.

Interactive Inspector
REST API

Ponte REST API

Sem banco de dados compartilhado
WP-CRON

Fila de envio

Armazenamento transient
NATIVE

MarbleSend Form

Shortcode, Block e Widget
WPFORMS

Hook do WPForms

wpforms_process_complete
CF7

Hook do Contact Form 7

wpcf7_mail_sent
FLUENT

Hook do Fluent Forms

submission_inserted
FORMIDABLE

Formidable Forms

frm_after_create_entry
FORMINATOR

Hook do Forminator

submit_before_set_fields
AUTOMATION

Autoresponders por tag

Tags e emails de boas-vindas

Impacto no banco de dados:

Dica profissional da equipe de suporte:

PRÉ-REQUISITO

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

Sem o plugin não existe a página MarbleSend Integrations no wp-admin, e seus formulários do WordPress não conseguem enviar os envios ao MarbleSend.

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.

Sem banco de dados compartilhado

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.

API key com scope limitado

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.

Teste de conexão

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.

Upsert e mesclagem de tags

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.

API Ingestion Endpoint (cURL Example)
curl -X POST https://your-domain.com/api/contacts \
  -H "Authorization: Bearer ms_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{"email":"visitor@example.com","name":"John Doe","tags":["newsletter","source:wpforms"]}'

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

Nada lento na requisição do visitante

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.

O WP-Cron envia a fila

Um evento do WP-Cron, marblesend_forms_process_queue, é agendado para cerca de um minuto depois e envia os envios da fila.

Uma tentativa por item 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.

As falhas são registradas

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.

Transient Queue Enqueuing Snippet
// Non-blocking submission buffer in WordPress
set_transient('marblesend_forms_queue_' . wp_generate_uuid4(), $payload, 3600);
if (!wp_next_scheduled('marblesend_forms_process_queue')) {
    wp_schedule_single_event(time() + 5, 'marblesend_forms_process_queue');
}

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

Shortcode, bloco ou widget

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

Proteção contra bots

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.

Enviado assim que o visitante envia

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.

Nomes, tags e confirmação

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.

Shortcode & Gutenberg Block Embed Syntax

[marblesend_form tags="newsletter,inbound" show_name="1" consent="I agree to receive email updates and accept the privacy policy."]




8.4 WPForms (Lite 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.

Detecção e hook

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.

IDs de campo

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.

Configuração

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.

Tag de origem

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.

WPForms Complete Hook Architecture
add_action('wpforms_process_complete', function($fields, $entry, $form_data, $entry_id) {
    $email = $fields[1]['value'] ?? ''; // Numeric Field ID #1
    $name  = $fields[0]['value'] ?? ''; // Numeric Field ID #0
    MarbleSend_Integration_Base::dispatch('wpforms', $form_data['id'], $email, $name);
}, 10, 4);

8.5 Contact Form 7 (CF7)

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.

Detecção e hook

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.

Nomes de tag

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.

Leitura do envio

O plugin lê os dados enviados com WPCF7_Submission::get_instance()->get_posted_data(), o que funciona com o envio AJAX do CF7.

Configuração

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.

Contact Form 7 Mail Sent Hook
add_action('wpcf7_mail_sent', function($contact_form) {
    $submission = WPCF7_Submission::get_instance();
    $data = $submission ? $submission->get_posted_data() : [];
    $email = $data['your-email'] ?? '';
    $name  = $data['your-name'] ?? '';
    MarbleSend_Integration_Base::dispatch('cf7', $contact_form->id(), $email, $name);
}, 10, 1);

8.6 Fluent Forms (Free e Pro)

O plugin escuta a ação que o Fluent Forms dispara depois de salvar uma entrada.

Detecção e hook

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.

Name Attribute

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.

Lista de formulários

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.

Configuração

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.

Fluent Forms Insertion Action
add_action('fluentform/submission_inserted', function($entryId, $formData, $form) {
    $email = $formData['email'] ?? '';
    $name  = is_array($formData['names'] ?? null) ? implode(' ', $formData['names']) : ($formData['first_name'] ?? '');
    MarbleSend_Integration_Base::dispatch('fluentforms', $form->id, $email, $name);
}, 10, 3);

8.7 Formidable Forms (Lite e Pro)

O plugin lê a entrada logo depois que o Formidable Forms a salva.

Detecção e hook

O plugin detecta o Formidable com class_exists('FrmForm') e escuta frm_after_create_entry (prioridade 30), que recebe $entry_id e $form_id.

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

Apenas entradas salvas

O plugin roda depois que a entrada é criada, então só os envios que passaram na validação do Formidable são encaminhados.

Passo a Passo de Configuração

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.

Formidable Metas Extraction Hook
add_action('frm_after_create_entry', function($entryId, $formId) {
    $entry = FrmEntry::getOne($entryId, true);
    $email = $entry->metas[12] ?? $entry->metas['email-address'] ?? '';
    $name  = $entry->metas[11] ?? $entry->metas['full-name'] ?? '';
    MarbleSend_Integration_Base::dispatch('formidable', $formId, $email, $name);
}, 30, 2);

8.8 Forminator (Free e Pro)

O plugin escuta o hook que o Forminator dispara enquanto processa um envio.

Detecção e hook

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.

Element ID

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.

Lista de formulários

A página Integrations lista seus formulários do Forminator pelo nome, lidos com Forminator_API::get_forms().

Configuração

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.

Forminator Submission Pre-Field Hook
add_action('forminator_custom_form_submit_before_set_fields', function($formId, $response, $fieldData) {
    $fields = array_column($fieldData, 'value', 'name');
    $email  = $fields['email-1'] ?? '';
    $name   = $fields['name-1'] ?? '';
    MarbleSend_Integration_Base::dispatch('forminator', $formId, $email, $name);
}, 10, 3);

8.9 Tags, segmentos 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.

Tags de origem

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.

Email de boas-vindas

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.

Sem serviço de automação no meio

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.

Double opt-in e consent record

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.

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

Causa principal:

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

Diagnóstico e mecanismo:

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.

Solução prática e playbook:

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

Causa principal:

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.

Diagnóstico e mecanismo:

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.

Solução prática e playbook:

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?

Causa principal:

A key no WordPress foi revogada, expirou, foi apagada no MarbleSend ou foi criada sem o scope contacts:write.

Diagnóstico e mecanismo:

Test Connection chama GET /api/verify-key. Uma resposta HTTP 401 ou 403 significa que a autenticação falhou.

Solução prática e playbook:

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?

Causa principal:

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.

Diagnóstico e mecanismo:

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.

Solução prática e playbook:

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?

Causa principal:

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

Diagnóstico e mecanismo:

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.

Solução prática e playbook:

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.