Do Loops para a Postal, com os mesmos blocos
O Loops e a Postal se parecem: contatos, eventos que iniciam fluxos, e-mails transacionais com modelo e campanhas. Muda o formato das chamadas, e os fluxos você recria. Este guia compara um a um e diz o que não tem par.
- Os dois envios
- API e SMTP
- Eventos, fluxos e tópicos
- Mesmo desenho
- O formato da base
- CSV
- Workflows e campanhas
- Recriar
Visão geral
O que vem junto e o que você refaz
Os contatos vêm por arquivo CSV. As chamadas você reescreve, e os fluxos você recria no editor da Postal. Nada acontece sozinho: você exporta, converte e confere.
Vem por arquivo
Contatos, propriedades e quem se descadastrou (a coluna Subscribed do Loops, que na Postal vira o inverso).
Você reescreve
A chamada transacional, o envio de eventos, a conexão SMTP e os webhooks. O desenho é parecido, o formato não.
Você recria
Workflows, campanhas e modelos. O que você leva é o conteúdo e a ideia de cada fluxo.
Equivalência
Os mesmos conceitos, outros nomes
O Loops e a Postal têm quase o mesmo desenho: contatos, eventos que iniciam fluxos e e-mails transacionais com modelo. Use esta tabela como dicionário.
| No Loops | Na Postal | Como funciona na Postal |
|---|---|---|
| Contact (contato) | Contato | Cada e-mail aparece uma vez por time. O external_id (apelido user_id) é o ID da pessoa no seu sistema. |
| Contact properties: texto, número, booleano e data | Propriedades: texto, número, sim/não e data | Os tipos são os mesmos. Crie a propriedade antes de usar, nos dois lados. |
| Propriedades padrão: Email, First Name, Last Name, User Id, Source, User Group, Notes e Subscribed | E-mail, nome, sobrenome, ID externo e descadastrado | Source, User Group e Notes viram propriedades que você cria. Subscribed vira o inverso: Descadastrado. |
| Subscribed = false | Descadastrado | Não recebe campanhas nem e-mails de automações. Os e-mails enviados pela API continuam saindo, como no Loops. |
| Suppression (bounce e reclamação) | Lista de supressão | Endereços que não devem receber. Saem de todos os envios, inclusive os da API, e nunca viram contatos. |
| Mailing lists, públicas ou privadas | Tópicos, públicos ou privados | Assuntos que o contato escolhe receber ou não, na página de preferências que abre pelo link de descadastro. |
| Audience filters e saved segments | Segmentos dinâmicos | Definidos por filtros e atualizados sozinhos. Os filtros você refaz. |
Events (POST /v1/events/send) | Eventos (POST /events) | Cada evento pode ter um contato e inicia as automações com o gatilho daquele nome. |
| Workflows (antes chamados de loops) | Automações | Um gatilho e passos, num editor de fluxo. |
Transactional emails (transactionalId) | Templates enviados por POST /emails | O template guarda o HTML e, se quiser, o remetente e o assunto padrão. |
| Campaigns | Campanhas | Envio para um segmento, e se quiser só para quem está inscrito num tópico. |
| Preference Center | Página de preferências | Abre pelo link de descadastro e lista os tópicos públicos. |
Email blocklist (padrões como *@exemplo.com) | Sem equivalente | A lista de supressão guarda endereços, e não padrões. |
Verifique o domínio na Postal
Em Domínios, a Postal mostra poucos registros para quem cuida do DNS copiar e confere sozinha por até 72 horas. O domínio pode continuar verificado no Loops ao mesmo tempo.
| No Loops | Na Postal | |
|---|---|---|
| Subdomínio | A documentação recomenda um subdomínio, como mail.suaempresa.com, em vez do domínio principal | Também recomendado: um subdomínio só para e-mail |
| SPF e MX | No subdomínio envelope (por exemplo, envelope.suaempresa.com) | MX e TXT no subdomínio postal |
| DKIM | Registros da tela Settings, Domain, View records (os nomes não constam da documentação) | TXT em postal._domainkey |
| DMARC | O Loops fornece um registro, e você pode manter um só no domínio principal | Opcional. O mesmo _dmarc vale para os dois |
| Como confirmar | Botão Verify Records. A propagação leva até 72 horas, em geral até 24 | Sozinha, por até 72 horas, com o status de cada registro |
- Pelos nomes, os registros da Postal não colidem com os do Loops. Copie os valores da tela do seu Loops e confira se algum nome é igual antes de publicar.
- A Postal avisa pelo webhook
domain.updatedquando o domínio viraverified. Veja Domínios e DNS. - Crie uma chave de API (ela começa com
ps_). Para sistemas que só enviam, use uma chave só de envio, restrita ao domínio.
Reescreva o envio transacional
No Loops, a chamada diz só para quem enviar e qual e-mail transacional usar: o remetente, o assunto e o corpo ficam no e-mail cadastrado lá. Na Postal o desenho é parecido, com o template no lugar do e-mail transacional, mas a chamada é outra.
POST https://app.loops.so/api/v1/transactional
Authorization: Bearer <chave do Loops>
Idempotency-Key: pedido-10482-saiu
Content-Type: application/json
{
"email": "[email protected]",
"transactionalId": "clomzp89u635xl30px7wrl0ri",
"dataVariables": { "nome": "Ana", "pedido": "10482" }
}POST https://api.postal.so/emails
Authorization: Bearer ps_sua_chave
Idempotency-Key: pedido-10482-saiu
Content-Type: application/json
{
"from": "Aurora Cosméticos <[email protected]>",
"to": "[email protected]",
"template": {
"id": "pedido-enviado",
"variables": { "nome": "Ana", "pedido": "10482" }
}
}| No Loops | Na Postal | O que muda |
|---|---|---|
POST /v1/transactional | POST /emails | A chave vai em Authorization: Bearer nos dois. Na Postal ela começa com ps_. |
email: um endereço | to: texto ou lista de até 50 | Uma lista na Postal é um único e-mail, em que todos se veem. Para uma pessoa por e-mail, use o lote (até 100). Também dá para mandar user_id no lugar de to, e a Postal usa o e-mail do contato. |
transactionalId | template.id: o ID ou o alias | O e-mail do Loops precisa estar publicado; o template da Postal também. Os envios usam sempre a última versão publicada. from é obrigatório se o template não tiver um remetente padrão. |
dataVariables: texto ou número | template.variables: texto ou número | Variáveis opcionais podem ficar vazias no Loops. Na Postal, uma variável sem valor e sem valor padrão devolve 422: declare fallback_value. Listas e blocos repetidos não passam: monte o HTML da lista no seu sistema. |
attachments: filename, contentType, data | attachments: filename, content_type, content (Base64) ou path (URL) | No Loops, o suporte precisa liberar anexos na conta. Na Postal, dependem do plano: até 40 MB no total. |
addToAudience | Sem campo | Crie o contato à parte (POST /contacts ou o lote), ou envie um evento com o contato. |
Resposta {"success": true} | Resposta com {"id"} | Guarde o id: é ele que aparece nos webhooks (data.email_id) e em GET /emails/{id}. |
Erros: {success, message} | Erros: {statusCode, name, message} | Veja Erros. |
Idempotency-Key: até 100 caracteres; repetida em 24 horas, devolve 409 | Idempotency-Key: de 1 a 256 caracteres | Na Postal, repetir a chave com o mesmo corpo, em até 24 horas, devolve a resposta da primeira e não envia de novo. Só um corpo diferente, ou uma requisição ainda em andamento, dá 409. |
| Até 10 requisições por segundo por time | Por plano: Grátis 5, Profissional 10, Escala 20 e Empresarial 50 | No lote, 100 e-mails contam como uma requisição. Veja Limites. |
Sem campos para cc, bcc, reply_to, tags ou agendamento | cc, bcc, reply_to, headers, tags e scheduled_at | Acréscimos da Postal. O agendamento vai até 30 dias e depende do plano. |
- No Loops, quem se descadastrou continua recebendo os e-mails transacionais. Na Postal é igual: só a lista de supressão bloqueia um envio pela API.
- Prefere um SDK? Os da Postal (Node.js, PHP e Laravel) usam esta mesma API. Veja SDKs e CLI e a referência de e-mails.
Se você envia por SMTP, o e-mail passa a ser de verdade
Por SMTP, o Loops não recebe um e-mail comum: o corpo da mensagem é um JSON com o transactionalId, o endereço do destinatário e os dados do modelo (no exemplo do Laravel da documentação, o endereço de Mail::to() não é usado na entrega). O SMTP da Postal entrega a mensagem como ela chega, com assunto, HTML e os destinatários do próprio e-mail.
{
"transactionalId": "clomzp89u635xl30px7wrl0ri",
"email": "[email protected]",
"dataVariables": { "loginUrl": "https://exemplo.com.br/entrar?code=482913" }
}- MAIL_HOST=smtp.loops.so- MAIL_PORT=587- MAIL_USERNAME=loops- MAIL_PASSWORD=<chave de API do Loops>- MAIL_ENCRYPTION=tls+ MAIL_SCHEME=smtps+ MAIL_HOST=smtp.postal.so+ MAIL_PORT=465+ MAIL_USERNAME=postal+ MAIL_PASSWORD=ps_sua_chave| SMTP do Loops | SMTP da Postal | |
|---|---|---|
| Servidor e porta | smtp.loops.so, porta 587 | smtp.postal.so, porta 465 (TLS direto, recomendada) ou 587 (STARTTLS). Se a rede bloquear, 2465 ou 2587 |
| Usuário e senha | loops e uma chave de API do Loops | postal e uma chave de API (ps_…). Uma chave só de envio basta |
| Corpo da mensagem | O JSON acima, com o transactionalId | O e-mail de verdade, em HTML e texto |
| Destinatário | O campo email do JSON | Os destinatários do envelope, até 50 por mensagem |
| Modelo | O e-mail transacional escolhido pelo transactionalId | O SMTP da Postal não tem templates: envie o HTML pronto, ou use a API |
- No Laravel, isso quer dizer trocar a visão em texto que montava o JSON por uma visão com o HTML do e-mail, e passar o assunto no
Envelope. O endereço deMail::to()passa a valer. - Na Postal, a autenticação (
AUTH PLAINouAUTH LOGIN) vem sempre depois do TLS. O SMTP não tem tags nem agendamento. - Os envios por SMTP seguem as mesmas regras da API (domínio verificado, cotas e supressão) e aparecem em E-mails e Logs. Veja o guia de SMTP.
Troque o envio de eventos e a criação de contatos
Os eventos têm o mesmo papel nos dois: contam à plataforma o que aconteceu no seu produto e iniciam os fluxos. Na Postal, um só POST /events também cadastra ou atualiza a pessoa antes de iniciar as automações.
POST https://app.loops.so/api/v1/events/send
Authorization: Bearer <chave do Loops>
Idempotency-Key: pedido-10482-pago
Content-Type: application/json
{
"email": "[email protected]",
"eventName": "pedido_pago",
"eventProperties": { "total": 289.9 },
"plano": "pro"
}POST https://api.postal.so/events
Authorization: Bearer ps_sua_chave
Idempotency-Key: pedido-10482-pago
Content-Type: application/json
{
"name": "pedido_pago",
"contact": { "email": "[email protected]" },
"properties": { "total": 289.9 },
"contact_properties": { "plano": "pro" }
}| No Loops | Na Postal | O que muda |
|---|---|---|
eventName | name | Até 100 caracteres: letras, números, ., _, : e -. |
email ou userId | contact: e-mail, ID ou external_id:<id>, ou um objeto | A Postal procura o contato pelo ID, depois pelo external_id e depois pelo e-mail. Um e-mail novo cria o contato. |
eventProperties | properties | Até 16 KB. Ficam disponíveis nos filtros e nas condições das automações e como variáveis nos e-mails ({{event.plano}}). |
| Propriedades do contato soltas na raiz do corpo | contact_properties | A propriedade precisa existir, nos dois lados. |
mailingLists: {id: true} ou false | Sem campo | O evento da Postal não mexe em tópicos. Use PATCH /contacts/{id}/topics ou o passo de atualizar contato de uma automação. |
POST /v1/contacts/create (409 se já existe) | POST /contacts (422 se já está cadastrado) | Os campos mudam para first_name, last_name, external_id e properties. |
PUT /v1/contacts/update: cria se não existir | POST /contacts/batch: cria ou atualiza, até 10.000 por chamada | Procura o contato pelo ID, pelo external_id e pelo e-mail. Para um só contato já existente, PATCH /contacts/{id}. |
subscribed | unsubscribed | O inverso: subscribed: false vira unsubscribed: true. |
- Um evento sem
contactfica registrado, mas não inicia automações. Com um e-mail novo, a Postal cria o contato, avisa o webhookcontact.createde inicia as automações de contato criado. - Um endereço da lista de supressão nunca vira contato: a resposta é
422 email_suppressed. - Os SDKs de Node.js e PHP (
events.send) e a CLI (postal events send) enviam eventos. Veja a referência de eventos.
Recrie os workflows e as campanhas
Os fluxos não passam sozinhos. A boa notícia é que os blocos são quase os mesmos, então a conversão é de nome: abra cada workflow do Loops e monte o equivalente em Automações.
| No Loops | Na Postal | Observação |
|---|---|---|
| Gatilho Contact added | contact.created | Contatos de importação de CSV só disparam quando a importação pede (trigger_automations). Também no Loops é preciso pedir. |
| Gatilho Contact updated | contact.property_changed | Com a propriedade e, se quiser, o valor de antes (from) e o de depois (to). |
| Gatilho Contact added to list | topic.subscribed ou segment.added | Depende de a lista ter virado um tópico ou um segmento. |
| Gatilho Event received | event | Com até 10 filtros sobre as propriedades do evento. |
| Nó Email | Passo send_email | Envia um template publicado. Com detect_replies, a Postal detecta as respostas. |
| Nó Timer | Passo wait | Espera de minutos a semanas, ou até um dia e horário, com fuso. |
| Nó Audience filter | Passo condition | A condição tem dois caminhos, Sim e Não. Deixe o Não vazio para encerrar a execução de quem não passa no filtro. |
| Nó Branch | Passo condition | A Postal divide em Sim e Não; para mais caminhos, encadeie condições. |
| Nó Experiment | Passo experiment | Teste A/B entre 2 e 4 variantes, nos planos que incluem. |
| Sem equivalente no Loops | wait_for, update_contact e webhook | Passos que a página de workflows do Loops não lista: esperar o contato abrir, clicar ou responder, mudar o contato e avisar o seu sistema. |
- Cada contato entra uma vez por padrão (
reentry: "once"). Para entrar a cada gatilho, useevery_time. - Campanhas e segmentos salvos (saved segments) também são refeitos: campanhas em Campanhas e os segmentos como segmentos dinâmicos. Campanhas já enviadas não são importadas.
- Importações não iniciam automações, a menos que você ligue essa opção. Revise quem entraria antes de ativar. Veja Automações.
Recrie os e-mails e as variáveis
A Postal não converte e-mails de outra plataforma. Cole o HTML no editor ou envie por POST /templates. O que muda é a forma de escrever as variáveis.
POST https://api.postal.so/templates
Authorization: Bearer ps_sua_chave
Content-Type: application/json
{
"name": "Código de acesso",
"alias": "codigo-de-acesso",
"subject": "Seu código de acesso",
"html": "<p>Para entrar, <a href=\"{{{loginUrl}}}\">clique aqui</a>.</p>",
"variables": [{ "key": "loginUrl" }]
}| No Loops | Na Postal | Observação |
|---|---|---|
{DATA_VARIABLE:loginUrl} | {{{loginUrl}}} | O valor vem em template.variables. No HTML, os valores são escapados. |
| Propriedades do contato nos e-mails de campanha e de fluxo | {{{FIRST_NAME}}}, {{{EMAIL}}} ou {{{contact.chave}}} | Só em campanhas e automações. A propriedade precisa existir. |
| Dados de um evento | {{event.chave}} | Nos e-mails das automações iniciadas por um evento. |
| Blocos repetidos (arrays), até 100 itens | Sem equivalente | Cada variável da Postal é texto ou número. Monte o HTML da lista no seu sistema. |
{unsubscribe_link} (e-mails em MJML) | {{{POSTAL_UNSUBSCRIBE_URL}}} | Sem a variável, a Postal acrescenta um rodapé de descadastro nas campanhas. |
| E-mail escrito em MJML | HTML | Compile o MJML para HTML antes de colar. |
- Os nomes das variáveis aceitam letras, números e
_, até 50 caracteres. Declare emvariablesas que têm valor padrão. - O template guarda também o remetente e o assunto padrão (
from,subject), que valem quando o envio não manda os seus. - Veja a referência de templates; o plano define quantos templates o time tem.
Recrie o webhook
A verificação da assinatura é a mesma nos dois: as documentações descrevem os cabeçalhos webhook-id, webhook-timestamp e webhook-signature e um HMAC-SHA256, em Base64, de id.timestamp.corpo, com o segredo whsec_…. O seu código de verificação deve continuar servindo, só com o segredo do endpoint novo. O que muda são os nomes e o corpo dos eventos.
| Evento do Loops | Evento da Postal | Observação |
|---|---|---|
email.delivered | email.delivered | |
email.softBounced | email.bounced | data.bounce.type é Transient. |
email.hardBounced | email.bounced | data.bounce.type é Permanent, e o endereço entra na lista de supressão (evento suppression.added). No Loops, o hard bounce também dispara contact.unsubscribed. |
email.spamReported | email.complained | O endereço entra na lista de supressão. |
email.opened, email.clicked | email.opened, email.clicked | Só com o rastreamento ligado no domínio. No Loops, não existem para e-mails transacionais. |
email.unsubscribed, email.resubscribed | contact.updated | O descadastro de um contato de marketing gera contact.updated. |
contact.created, contact.deleted | contact.created, contact.deleted | Vêm com o contato e a origem da mudança (source). |
contact.unsubscribed | contact.updated | Com unsubscribed verdadeiro no contato. |
contact.mailingList.subscribed, .unsubscribed | Sem evento próprio documentado | Os tópicos da Postal não têm um evento com esse nome. |
campaign.email.sent, loop.email.sent, transactional.email.sent | email.sent | Aproximado: um por e-mail. Se ele saiu de uma campanha, data.broadcast_id diz qual. |
testing.testEvent | Evento de teste do painel | Mande um antes de virar o tráfego. |
| No Loops | Na Postal | Observação |
|---|---|---|
| Um endpoint por conta | Vários endpoints, conforme o plano | Cada endpoint escolhe os seus eventos, e a URL precisa ser HTTPS e pública. |
eventName, eventTime (Unix), webhookSchemaVersion e blocos como email e contactIdentity | {type, created_at, data} | created_at vem em ISO 8601. O e-mail fica em data, com email_id, to, subject e tags. |
Cabeçalhos Webhook-Id, Webhook-Timestamp e Webhook-Signature | Os mesmos, mais os equivalentes svix-* | Os nomes de cabeçalho não diferenciam maiúsculas. Recuse timestamps com mais de 5 minutos de diferença, como nos dois. |
| Até 8 tentativas em cerca de 28 horas, resposta 2xx em até 15 segundos | Até 8 tentativas em cerca de 27 horas, resposta 2xx em até 15 segundos | Todas com o mesmo webhook-id: use para descartar duplicatas. Reenvio pelo painel ou por POST /webhooks/{id}/events/{event_id}/replay. |
| Desativa o endpoint se todas as tentativas falharem por 5 dias | Desativa o endpoint depois de falhas seguidas (disabled_reason: "failing") | Olhe o status do webhook nos primeiros dias. |
| Histórico de 30 dias | Histórico de 30 dias | Painel e GET /webhooks/{id}/events. |
- Crie o endpoint em Webhooks (painel ou
POST /webhooks), escolha os eventos e guarde osigning_secret. Veja a verificação da assinatura. - Tire o webhook do Loops só depois de virar todo o tráfego: os e-mails que ainda saem por lá continuam gerando eventos.
Exporte a audiência do Loops e importe na Postal
Na Audiência do Loops, abra o menu ••• no canto da caixa de filtros e escolha Download. Para exportar só um grupo, aplique os filtros antes. O CSV tem uma coluna por propriedade de contato, as padrão e as suas. Na Postal, a importação fica em Audiência, Importar CSV.
Subscribed igual a verdadeiro.
Importe como contatos.
Subscribed igual a falso. No Loops, um hard bounce também descadastra.
Importe como descadastrados. Antes, separe os suprimidos.
Quem deu hard bounce ou reclamou: o Loops bloqueia o envio.
Coloque na lista de supressão.
Endereços e domínios que o Loops recusa na entrada (blocklist).
Sem equivalente: recuse na origem.
- Subscribed é o inverso de Descadastrado. Crie uma coluna Descadastrado com
simonde Subscribed for falso enãoonde for verdadeiro. Ou baixe dois arquivos, filtrando por Subscribed, e importe o dos descadastrados comsimem todas as linhas. - Suprimidos: a documentação do Loops só descreve a consulta de um endereço por vez (
GET /v1/contacts/suppression?email=). Para separar os suprimidos dos descadastrados por escolha, consulte cada endereço do arquivo dos descadastrados (o limite é de 10 requisições por segundo) e ponha os suprimidos na lista de supressão comPOST /suppressions/batch/add, 100 por requisição, antes de importar contatos. - Listas: o Loops não documenta se o CSV traz a participação em listas. Se não trouxer, exporte uma lista por arquivo. As listas viram tópicos (públicos ou privados, como lá): importe cada arquivo marcando o tópico em Inscrever nos tópicos. Esse campo inscreve todos os contatos do arquivo.
- Propriedades: os tipos são os mesmos (texto, número, sim/não e data). Source, User Group e Notes viram propriedades que você cria antes, porque a importação não cria propriedades novas. Datas no formato
2026-10-28funcionam. - Limite do plano: no Loops, descadastrados não contam no plano. Na Postal, contatos descadastrados ocupam um lugar no limite de contatos (no Grátis são 1.000; no Profissional, 5.000; no Escala, 50.000). Endereços na lista de supressão não ocupam. Veja Preços.
- Deixe desligada a opção Disparar automações. Contatos que já existem são atualizados pelo e-mail, células vazias não apagam valores, e cada arquivo pode ter até 20 MB.
- Antes de enviar, passe a lista pela Validação de e-mails.
Confira o que não tem equivalente e vire o tráfego
Vire um fluxo de cada vez, com o Loops ainda ligado. Comece pelos endereços de teste e por você mesmo, compare entregas e bounces nos primeiros dias e só então passe o resto.
| No Loops | O que fazer na Postal |
|---|---|
Blocklist de endereços e domínios (*@exemplo.com) | Sem equivalente. Em formulários, a opção de validar o e-mail recusa endereços descartáveis e domínios que não recebem e-mail. |
Blocos repetidos em dataVariables | Monte o HTML da lista no seu sistema. |
addToAudience no envio | Crie o contato à parte ou envie um evento com o contato. |
| Anexos liberados pelo suporte | Dependem do plano: até 40 MB no total. |
| E-mails em MJML | Compile para HTML. |
| Um só endpoint de webhook | Na Postal pode haver vários, conforme o plano. |
Antes de virar a chave
- O domínio está verificado na Postal e a chave de API foi criada (só envio e restrita ao domínio, nos sistemas que apenas enviam).
- O envio transacional foi reescrito e testado com um endereço de teste, e o seu código guarda o
idde cada e-mail. - Os e-mails transacionais viraram templates publicados, com as variáveis no formato
{{{nome}}}. - Quem envia por SMTP agora manda o e-mail de verdade, e não o JSON do Loops.
- Os eventos vão para
POST /eventse as automações com o gatilho de evento estão ativas. - O webhook foi criado, a assinatura é conferida com o segredo novo e um evento de teste chegou.
- A coluna Subscribed foi invertida em Descadastrado, e os suprimidos estão na lista de supressão antes da importação.
- A importação ficou sem disparar automações, e os fluxos foram revisados antes de ativar.
- O seu código guarda de qual provedor cada e-mail saiu, e os bounces foram conferidos nos primeiros dias.
Perguntas frequentes
Posso continuar usando o SDK do Loops?
Não para enviar pela Postal: a Postal não aceita o formato do Loops. Troque as chamadas pelo SDK da Postal (Node.js, PHP e Laravel) ou por HTTP, a POST /emails e POST /events.
Os meus workflows migram sozinhos?
Não. Os gatilhos e os nós têm correspondente na Postal, mas cada fluxo é montado de novo no editor de Automações. Aproveite para revisar o que ainda faz sentido.
O código que verifica a assinatura dos webhooks muda?
Em geral, só o segredo. As duas documentações descrevem os mesmos cabeçalhos e o mesmo HMAC-SHA256 de id.timestamp.corpo. Teste com o evento de teste do painel antes de virar o tráfego. O que muda são os nomes e o corpo dos eventos.
Posso manter o domínio nos dois ao mesmo tempo?
Pode. O Loops usa o subdomínio envelope para o SPF e o MX, e a Postal usa o subdomínio postal e o seletor postal no DKIM. Confira na tela de registros do Loops se algum nome da sua conta é igual antes de publicar.