Integração · ESP / Email Marketing
Mautic é a alternativa open-source ao HubSpot/Marketo. A integração real com o EmailChecker é higienização em lote: um script pagina os contatos pela API do Mautic, manda todos os emails de uma vez, espera o lote concluir e grava o resultado num campo customizado usado para segmentar as campanhas.
Como integrar
Em Configuration > Custom Fields > Contact, adicione o campo "email_status" do tipo Text. É nele que o resultado (deliverable, risky, undeliverable, unknown) vai ser gravado.
GET /api/contacts?limit=1000&start=... paginando a base e juntando os emails num array. Não existe validação dentro do formulário do Mautic — a API do EmailChecker é assíncrona e trabalha por lote.
POST https://app.emailchecker.email/api/v1/batch com {"emails": [...], "name": "mautic-higiene"} e o header Authorization: Bearer ec_live_... Guarde o data.id da resposta 201.
GET https://app.emailchecker.email/api/v1/batch/{id} a cada 30 segundos. O EmailChecker não chama nenhum webhook seu quando termina: o script é quem pergunta. Só quando status = "completed" o array data.emails vem preenchido.
PATCH /api/contacts/{id}/edit no Mautic gravando email_status com o result. Depois crie o segmento "email_status = deliverable" e aponte suas campanhas só pra ele.
Exemplo · JAVASCRIPT
// Higienização em lote: Mautic -> EmailChecker -> Mautic
const EC = 'https://app.emailchecker.email/api/v1';
const MAUTIC = 'https://seu-mautic.com';
const ecH = {
Authorization: `Bearer ${process.env.EC_API_KEY}`,
'Content-Type': 'application/json',
};
const mauticH = {
Authorization: `Bearer ${process.env.MAUTIC_TOKEN}`,
'Content-Type': 'application/json',
};
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
// 1) pagina os contatos do Mautic
const lista = await fetch(`${MAUTIC}/api/contacts?limit=1000`, { headers: mauticH }).then((r) => r.json());
const contatos = Object.values(lista.contacts); // { id, fields: { all: { email } } }
// 2) envia UM lote (1 a 100.000 emails por chamada)
const criado = await fetch(`${EC}/batch`, {
method: 'POST',
headers: ecH,
body: JSON.stringify({
emails: contatos.map((c) => c.fields.all.email),
name: 'mautic-higiene',
}),
}).then((r) => r.json());
// 3) polling: não há webhook de retorno do EmailChecker
let lote;
do {
await sleep(30_000);
lote = await fetch(`${EC}/batch/${criado.data.id}`, { headers: ecH }).then((r) => r.json());
} while (lote.data.status === 'pending' || lote.data.status === 'processing');
if (lote.data.status !== 'completed') throw new Error(`lote ${lote.data.status}`);
// 4) devolve o resultado pro Mautic
const porEmail = new Map(lote.data.emails.map((e) => [e.email, e.result]));
for (const c of contatos) {
const status = porEmail.get(c.fields.all.email);
if (!status) continue;
await fetch(`${MAUTIC}/api/contacts/${c.id}/edit`, {
method: 'PATCH',
headers: mauticH,
body: JSON.stringify({ email_status: status }),
});
}A API do EmailChecker é REST com Bearer auth (`Authorization: Bearer ec_live_...`) na base `https://app.emailchecker.email` e é assíncrona: você envia o lote em `POST /api/v1/batch` e busca o resultado em `GET /api/v1/batch/{id}` até o `status` virar `completed`. Não existe endpoint de validação unitária nem webhook de retorno — quem descobre que o lote terminou é o polling. Limites: 1 a 100.000 emails por lote, 300 requisições/minuto e 10.000/hora. A API é exclusiva do plano Gold.
Casos de uso
Segmento "email_status = deliverable" recebe os disparos; o resto fica de fora. Reduz hard bounce drasticamente e protege o domínio de envio.
Um único lote de até 100.000 endereços cobre bases inteiras — muito mais barato e rápido do que uma chamada por contato (que nem existe na API).
Cron a cada 3 meses reenvia os contatos cuja última verificação passou de 90 dias. Mantém a base fresca sem esperar o bounce acontecer.
Troubleshooting
Os erros que mais aparecem ao conectar o Mautic — e como resolver cada um.
Não existe callback: a plataforma nunca chama uma URL sua. O contact_post_save do Mautic serve só pra empilhar o email numa fila; quem descobre o resultado é o seu script consultando GET /api/v1/batch/{id}. Se você tentou POST /api/v1/validate/single, ele responde 404 — esse endpoint não existe.
O alias no PATCH precisa bater com o alias gerado (geralmente email_status), não com o label "Email Status". Veja o alias real em Custom Fields. Campos do tipo Select só aceitam valores pré-definidos — use Text pra aceitar deliverable, risky, undeliverable e unknown livremente.
A API REST vem desabilitada por padrão. Ative em Configuration > API Settings ("API enabled: Yes") e garanta permissão de edit em Contacts pro usuário/OAuth. O access_token OAuth2 expira — renove antes de assumir que a chave está errada. Do lado do EmailChecker, 401 costuma ser plano fora do Gold, que é o único com API.
Comece grátis com 500 créditos. Sem cartão, sem compromisso.