EmailCheckerEmailChecker

Integração · ESP / Email Marketing

EmailChecker + Mailchimp

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

5 passos pra conectar

  1. 1

    Crie o merge field EMAIL_STATUS

    Em Audience > Settings > Audience fields and *|MERGE|* tags, crie a tag EMAIL_STATUS (texto, em maiúsculas). É onde o result vai ser gravado.

  2. 2

    Puxe a audiência pela API

    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.

  3. 3

    Envie o lote: POST /api/v1/batch

    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.

  4. 4

    Consulte até o status virar completed

    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.

  5. 5

    Grave o resultado e limpe a audiência

    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

Quando usar essa integração

Limpar audiência antes de um blast

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.

Reduzir custo por contato

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.

Proteger reputação de IP compartilhado

Nos planos free/standard você divide IP com outros remetentes. Bounces seus afetam todo mundo no IP — higienizar é responsabilidade compartilhada.

Troubleshooting

Problemas comuns

Os erros que mais aparecem ao conectar o Mailchimp — e como resolver cada um.

O Customer Journey manda o webhook mas nada volta validado

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.

API do Mailchimp retorna 401 mesmo com a key correta

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.

PATCH no subscriber retorna 404

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.

Mais integrações

Outras ferramentas suportadas

Comece agora

Pronto pra parar de mandar email pra endereço morto?

Comece grátis com 500 créditos. Sem cartão, sem compromisso.