Novo: campanhas, automações e e-mails do produto na mesma conta. Conheça a Postal
Entrar Criar conta

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 LoopsNa PostalComo funciona na Postal
Contact (contato)ContatoCada 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 dataPropriedades: texto, número, sim/não e dataOs 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 SubscribedE-mail, nome, sobrenome, ID externo e descadastradoSource, User Group e Notes viram propriedades que você cria. Subscribed vira o inverso: Descadastrado.
Subscribed = falseDescadastradoNã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ãoEndereços que não devem receber. Saem de todos os envios, inclusive os da API, e nunca viram contatos.
Mailing lists, públicas ou privadasTópicos, públicos ou privadosAssuntos que o contato escolhe receber ou não, na página de preferências que abre pelo link de descadastro.
Audience filters e saved segmentsSegmentos dinâmicosDefinidos 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çõesUm gatilho e passos, num editor de fluxo.
Transactional emails (transactionalId)Templates enviados por POST /emailsO template guarda o HTML e, se quiser, o remetente e o assunto padrão.
CampaignsCampanhasEnvio para um segmento, e se quiser só para quem está inscrito num tópico.
Preference CenterPágina de preferênciasAbre pelo link de descadastro e lista os tópicos públicos.
Email blocklist (padrões como *@exemplo.com)Sem equivalenteA lista de supressão guarda endereços, e não padrões.
1

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.

Os registros do Loops e da Postal lado a lado
No LoopsNa Postal
SubdomínioA documentação recomenda um subdomínio, como mail.suaempresa.com, em vez do domínio principalTambém recomendado: um subdomínio só para e-mail
SPF e MXNo subdomínio envelope (por exemplo, envelope.suaempresa.com)MX e TXT no subdomínio postal
DKIMRegistros da tela Settings, Domain, View records (os nomes não constam da documentação)TXT em postal._domainkey
DMARCO Loops fornece um registro, e você pode manter um só no domínio principalOpcional. O mesmo _dmarc vale para os dois
Como confirmarBotão Verify Records. A propagação leva até 72 horas, em geral até 24Sozinha, 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.updated quando o domínio vira verified. 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.
2

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.

Antes: Loops, POST /v1/transactional
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" }
}
200{ "success": true }
Depois: Postal, POST /emails
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" }
  }
}
200{ "id": "019a1b2c-4d5e-7f60-8a9b-0c1d2e3f4a5b" }
POST /v1/transactional e POST /emails
No LoopsNa PostalO que muda
POST /v1/transactionalPOST /emailsA chave vai em Authorization: Bearer nos dois. Na Postal ela começa com ps_.
email: um endereçoto: texto ou lista de até 50Uma 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.
transactionalIdtemplate.id: o ID ou o aliasO 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úmerotemplate.variables: texto ou númeroVariá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, dataattachments: 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.
addToAudienceSem campoCrie 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 409Idempotency-Key: de 1 a 256 caracteresNa 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 timePor plano: Grátis 5, Profissional 10, Escala 20 e Empresarial 50No lote, 100 e-mails contam como uma requisição. Veja Limites.
Sem campos para cc, bcc, reply_to, tags ou agendamentocc, bcc, reply_to, headers, tags e scheduled_atAcré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.
3

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.

O corpo que o Loops espera por SMTP
{
  "transactionalId": "clomzp89u635xl30px7wrl0ri",
  "email": "[email protected]",
  "dataVariables": { "loginUrl": "https://exemplo.com.br/entrar?code=482913" }
}
.env do Laravel
- 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
Configuração de SMTP nos dois lados
SMTP do LoopsSMTP da Postal
Servidor e portasmtp.loops.so, porta 587smtp.postal.so, porta 465 (TLS direto, recomendada) ou 587 (STARTTLS). Se a rede bloquear, 2465 ou 2587
Usuário e senhaloops e uma chave de API do Loopspostal e uma chave de API (ps_…). Uma chave só de envio basta
Corpo da mensagemO JSON acima, com o transactionalIdO e-mail de verdade, em HTML e texto
DestinatárioO campo email do JSONOs destinatários do envelope, até 50 por mensagem
ModeloO e-mail transacional escolhido pelo transactionalIdO 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 de Mail::to() passa a valer.
  • Na Postal, a autenticação (AUTH PLAIN ou AUTH 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.
4

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.

Antes: Loops, POST /v1/events/send
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"
}
200{ "success": true }
Depois: Postal, POST /events
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" }
}
Eventos e contatos pela API
No LoopsNa PostalO que muda
eventNamenameAté 100 caracteres: letras, números, ., _, : e -.
email ou userIdcontact: e-mail, ID ou external_id:<id>, ou um objetoA Postal procura o contato pelo ID, depois pelo external_id e depois pelo e-mail. Um e-mail novo cria o contato.
eventPropertiespropertiesAté 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 corpocontact_propertiesA propriedade precisa existir, nos dois lados.
mailingLists: {id: true} ou falseSem campoO 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 existirPOST /contacts/batch: cria ou atualiza, até 10.000 por chamadaProcura o contato pelo ID, pelo external_id e pelo e-mail. Para um só contato já existente, PATCH /contacts/{id}.
subscribedunsubscribedO inverso: subscribed: false vira unsubscribed: true.
  • Um evento sem contact fica registrado, mas não inicia automações. Com um e-mail novo, a Postal cria o contato, avisa o webhook contact.created e 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.
5

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.

Evento signUpEsperar 3 diasCondição: pagou = nãoEnviar e-mail
Gatilhos e nós
No LoopsNa PostalObservação
Gatilho Contact addedcontact.createdContatos de importação de CSV só disparam quando a importação pede (trigger_automations). Também no Loops é preciso pedir.
Gatilho Contact updatedcontact.property_changedCom a propriedade e, se quiser, o valor de antes (from) e o de depois (to).
Gatilho Contact added to listtopic.subscribed ou segment.addedDepende de a lista ter virado um tópico ou um segmento.
Gatilho Event receivedeventCom até 10 filtros sobre as propriedades do evento.
Nó EmailPasso send_emailEnvia um template publicado. Com detect_replies, a Postal detecta as respostas.
Nó TimerPasso waitEspera de minutos a semanas, ou até um dia e horário, com fuso.
Nó Audience filterPasso conditionA 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ó BranchPasso conditionA Postal divide em Sim e Não; para mais caminhos, encadeie condições.
Nó ExperimentPasso experimentTeste A/B entre 2 e 4 variantes, nos planos que incluem.
Sem equivalente no Loopswait_for, update_contact e webhookPassos 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, use every_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.
6

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.

Criar o template na Postal
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" }]
}
201Publique com POST /templates/{id}/publish
Variáveis dos e-mails
No LoopsNa PostalObservaçã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 itensSem equivalenteCada 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 MJMLHTMLCompile o MJML para HTML antes de colar.
  • Os nomes das variáveis aceitam letras, números e _, até 50 caracteres. Declare em variables as 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.
7

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.

Eventos: o que corresponde a quê
Evento do LoopsEvento da PostalObservação
email.deliveredemail.delivered
email.softBouncedemail.bounceddata.bounce.type é Transient.
email.hardBouncedemail.bounceddata.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.spamReportedemail.complainedO endereço entra na lista de supressão.
email.opened, email.clickedemail.opened, email.clickedSó com o rastreamento ligado no domínio. No Loops, não existem para e-mails transacionais.
email.unsubscribed, email.resubscribedcontact.updatedO descadastro de um contato de marketing gera contact.updated.
contact.created, contact.deletedcontact.created, contact.deletedVêm com o contato e a origem da mudança (source).
contact.unsubscribedcontact.updatedCom unsubscribed verdadeiro no contato.
contact.mailingList.subscribed, .unsubscribedSem evento próprio documentadoOs tópicos da Postal não têm um evento com esse nome.
campaign.email.sent, loop.email.sent, transactional.email.sentemail.sentAproximado: um por e-mail. Se ele saiu de uma campanha, data.broadcast_id diz qual.
testing.testEventEvento de teste do painelMande um antes de virar o tráfego.
Webhooks: formato, assinatura e tentativas
No LoopsNa PostalObservação
Um endpoint por contaVários endpoints, conforme o planoCada 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-SignatureOs 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 segundosAté 8 tentativas em cerca de 27 horas, resposta 2xx em até 15 segundosTodas 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 diasDesativa o endpoint depois de falhas seguidas (disabled_reason: "failing")Olhe o status do webhook nos primeiros dias.
Histórico de 30 diasHistórico de 30 diasPainel e GET /webhooks/{id}/events.
  • Crie o endpoint em Webhooks (painel ou POST /webhooks), escolha os eventos e guarde o signing_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.
8

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.

InscritosImportar

Subscribed igual a verdadeiro.

Importe como contatos.

DescadastradosImportar com “sim”

Subscribed igual a falso. No Loops, um hard bounce também descadastra.

Importe como descadastrados. Antes, separe os suprimidos.

SuprimidosSuprimir

Quem deu hard bounce ou reclamou: o Loops bloqueia o envio.

Coloque na lista de supressão.

Bloqueados por padrãoSem equivalente

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 sim onde Subscribed for falso e não onde for verdadeiro. Ou baixe dois arquivos, filtrando por Subscribed, e importe o dos descadastrados com sim em 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 com POST /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-28 funcionam.
  • 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.
9

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.

Domínio verificadoTeste em [email protected]Um fluxo pela PostalTodo o tráfegoDesligar o Loops
O que muda de jeito, e como contornar
No LoopsO 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 dataVariablesMonte o HTML da lista no seu sistema.
addToAudience no envioCrie o contato à parte ou envie um evento com o contato.
Anexos liberados pelo suporteDependem do plano: até 40 MB no total.
E-mails em MJMLCompile para HTML.
Um só endpoint de webhookNa 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 id de 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 /events e 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.

Quer testar a Postal?

Crie a sua conta e comece no plano Grátis.