Integração · ESP / Email Marketing
Mailchimp é a referência em email marketing e cobra por contato ativo — o que faz da higienização em lote um corte direto de custo. O fluxo: puxar a audiência pela API, mandar tudo num lote pro EmailChecker, aguardar a conclusão, gravar o resultado num merge field e arquivar quem não existe mais.
Como integrar
Em Audience > Settings > Audience fields and *|MERGE|* tags, crie a tag EMAIL_STATUS (texto, em maiúsculas). É onde o result vai ser gravado.
GET https://{dc}.api.mailchimp.com/3.0/lists/{list_id}/members?count=1000&offset=... paginando e juntando os emails. O {dc} é o sufixo da sua API key (ex: us21). Não tente validar dentro do Customer Journey: a API do EmailChecker é assíncrona.
POST https://app.emailchecker.email/api/v1/batch com {"emails": [...], "name": "mailchimp-<audiencia>"} e Authorization: Bearer ec_live_... A resposta 201 traz data.id e data.size.
GET https://app.emailchecker.email/api/v1/batch/{id} a cada 30 segundos. Enquanto o status for pending ou processing o array data.emails vem vazio — e não existe webhook avisando o fim.
PATCH /lists/{id}/members/{subscriber_hash} com merge_fields.EMAIL_STATUS. Para os undeliverable, aplique uma tag de quarentena ou arquive o contato com DELETE em /members/{hash} — o Mailchimp arquiva sem apagar o histórico e para de cobrar por ele.
Exemplo · JAVASCRIPT
// Higienização em lote: Mailchimp -> EmailChecker -> Mailchimp
import { createHash } from 'node:crypto';
const DC = 'us21'; // sufixo da sua API key do Mailchimp
const AUDIENCE = 'abc123';
const EC = 'https://app.emailchecker.email/api/v1';
const ecH = {
Authorization: `Bearer ${process.env.EC_API_KEY}`,
'Content-Type': 'application/json',
};
const mcH = {
Authorization: `Basic ${Buffer.from(`anystring:${process.env.MC_API_KEY}`).toString('base64')}`,
'Content-Type': 'application/json',
};
const hash = (email) => createHash('md5').update(email.toLowerCase()).digest('hex');
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
// 1) puxa a audiência inteira
const emails = [];
for (let offset = 0; ; offset += 1000) {
const url = `https://${DC}.api.mailchimp.com/3.0/lists/${AUDIENCE}/members?count=1000&offset=${offset}&fields=members.email_address`;
const pagina = await fetch(url, { headers: mcH }).then((r) => r.json());
if (!pagina.members || pagina.members.length === 0) break;
emails.push(...pagina.members.map((m) => m.email_address));
}
// 2) um POST por lote (até 100.000 emails) — não existe chamada por contato
const criado = await fetch(`${EC}/batch`, {
method: 'POST',
headers: ecH,
body: JSON.stringify({ emails, name: `mailchimp-${AUDIENCE}` }),
}).then((r) => r.json());
// 3) polling até completed
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) marca o resultado e arquiva quem não existe mais
for (const e of lote.data.emails) {
const url = `https://${DC}.api.mailchimp.com/3.0/lists/${AUDIENCE}/members/${hash(e.email)}`;
await fetch(url, {
method: 'PATCH',
headers: mcH,
body: JSON.stringify({ merge_fields: { EMAIL_STATUS: e.result } }),
});
if (e.result === 'undeliverable') {
await fetch(url, { method: 'DELETE', headers: mcH }); // arquiva, não apaga
}
}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
Um lote na véspera da campanha grande e os undeliverable saem da lista. Bounce rate cai de patamar antes do envio, não depois.
Mailchimp cobra por subscriber ativo. Arquivar quem não existe mais encolhe a base e a fatura mensal — a validação em lote se paga na primeira rodada.
Nos planos free/standard você divide IP com outros remetentes. Bounces seus afetam todo mundo no IP — higienizar é responsabilidade compartilhada.
Troubleshooting
Os erros que mais aparecem ao conectar o Mailchimp — e como resolver cada um.
Nunca vai voltar: o EmailChecker não envia webhooks nem callbacks. O Journey serve, no máximo, pra empilhar o email numa fila; a validação acontece no script em lote que consulta GET /api/v1/batch/{id}. Chamadas a /api/v1/validate/single respondem 404 — esse endpoint não existe.
A API key do Mailchimp termina com o datacenter (ex: -us21) e o host precisa bater: chame https://us21.api.mailchimp.com, não us1. No Basic auth o usuário pode ser qualquer string e a senha é a key — inverter isso também dá 401. Já um 401 vindo de app.emailchecker.email costuma ser conta fora do plano Gold, o único com API.
O subscriber_hash é o MD5 do email em minúsculas, não o email puro — gere md5(email.toLowerCase()) antes de montar /lists/{id}/members/{hash}. Compare sempre com o campo email do retorno do lote, que é o endereço original enviado. Em base grande, espace as chamadas: o Mailchimp devolve 429 sob rajada e o PATCH falha em silêncio.
Comece grátis com 500 créditos. Sem cartão, sem compromisso.