De Brevo a Postal, sin llevarte lo que no es correo electrónico
Brevo, antes llamado Sendinblue, reúne varias herramientas. El envío por API y SMTP, las plantillas, los contactos y los webhooks pasan a Postal, con otros formatos. SMS, WhatsApp, CRM y el resto quedan fuera: esta guía muestra qué migra, qué rehaces y qué no tiene par.
- Los dos envíos
- API y SMTP
- Para exportar la base
- CSV o API
- SMS y WhatsApp se quedan en Brevo
- Solo correo electrónico
- Campañas y automatizaciones
- Rehacer
Visión general
Lo que viene incluido y lo que rehaces
El envío, las plantillas, los contactos y los webhooks pasan a Postal, pero nada ocurre solo: exportas, conviertes y verificas. Los demás productos de Brevo no tienen par en Postal.
Viene por API o archivo
Contactos con los atributos y las listas, quién se dio de baja o está bloqueado, y el HTML de las plantillas transaccionales.
Lo reescribes
La llamada de envío, la configuración de SMTP, las plantillas (los params pasan a ser variables) y los webhooks, que cambian de formato.
Se queda en Brevo
SMS, WhatsApp, CRM de ventas, reuniones y teléfono, notificaciones push, pagos, fidelización y cupones. Postal es una plataforma de correo electrónico.
Equivalencia
Los mismos conceptos, otros nombres
Brevo reúne varias herramientas en una cuenta. Postal se ocupa del correo electrónico: envío, contactos, campañas y automatizaciones. Usa esta tabla como diccionario.
| En Brevo | En Postal | Cómo funciona en Postal |
|---|---|---|
Correo transaccional (POST /v3/smtp/email) | POST /emails | Envío por API, con clave ps_… en el encabezado Authorization. |
| SMTP relay | SMTP de Postal | smtp.postal.so, usuario postal y una clave de API como contraseña. |
Plantillas transaccionales (templateId, params) | Plantillas (template.id, variables) | Variables {{{NOME}}} que solo aceptan texto o números. Editas un borrador y lo publicas. |
| Senders y dominios | Dominios | Basta con que el dominio esté verificado: cualquier dirección de él puede ser el remitente. |
| Contactos y atributos | Contactos y propiedades | Cada correo electrónico aparece una vez por equipo. Las propiedades tienen tipo: texto, número, sí/no o fecha. |
| Listas | Segmentos estáticos | Una lista armada a mano o por importación. Para elecciones de tema del contacto, usa temas. |
| Carpetas de listas | Sin equivalente | Los segmentos no se organizan en carpetas. |
| Segmentos | Segmentos dinámicos | Definidos por filtros y actualizados solos. Los filtros los rehaces tú. |
| Contacto en la lista de bloqueo (blocklist) | Dado de baja o lista de supresión | Quien se da de baja no recibe campañas ni automatizaciones. En la supresión, la dirección queda fuera de todos los envíos. |
| Campañas de correo electrónico | Campañas | Envío a un segmento y, si quieres, solo a quienes están suscritos a un tema. |
| Automatizaciones | Automatizaciones | Un disparador y pasos: esperar, enviar correo electrónico, condición, cambiar el contacto y llamar a un webhook. |
| Webhooks transaccionales y de marketing | Webhooks | Un endpoint por URL, con los eventos que elijas y firma en cada entrega. |
Haz el inventario en Brevo
Antes de cambiar cualquier cosa, enumera lo que tu sistema usa en Brevo. Cada elemento tiene un lugar en Postal, o no lo tiene, y es mejor descubrirlo ahora.
| En Brevo | Qué anotar | Dónde queda en Postal |
|---|---|---|
| Senders y dominios | Dominios autenticados y los remitentes que usa tu sistema | Dominios |
| Claves de API y credenciales SMTP | Quién llama a la API (encabezado api-key) y quién usa el SMTP | Claves de API |
| Plantillas transaccionales | El ID, el nombre y los params de cada una | Plantillas |
| Webhooks | La URL, los eventos y la forma de autenticar (Brevo acepta hasta 40, sumando marketing y transaccionales) | Webhooks |
| Contactos | Listas, segmentos, atributos y quién se dio de baja o está en la blocklist | Audiencia |
| Campañas, automatizaciones y formularios | Lo que está activo y lo que aún tiene sentido | Campañas, Automatizaciones y Formularios |
| SMS, WhatsApp, CRM, reuniones, push, pagos y fidelización | Qué depende de cada uno | Sin equivalente: decide dónde queda esto |
Verifica el dominio en Postal
En Dominios, Postal muestra pocos registros para que quien se ocupa del DNS los copie, y los verifica sola hasta por 72 horas. El dominio puede seguir autenticado en Brevo al mismo tiempo: los nombres de los registros son diferentes.
| En Brevo (ejemplos de la documentación) | En Postal | |
|---|---|---|
| Código de verificación | TXT en el propio dominio, con valor brevo-code:… | No hay: basta con publicar los registros de Postal |
| DKIM | TXT en mail._domainkey, con un valor que empieza por k=rsa;p= | TXT en postal._domainkey |
| DMARC | TXT en _dmarc, por ejemplo v=DMARC1; p=none; rua=mailto:… | Opcional. El mismo _dmarc sirve para los dos |
| Return-Path y SPF | La documentación de Brevo que consultamos no los menciona | MX y TXT en postal |
| Cómo confirmar | Por el panel o por la API (/v3/senders/domains/{domínio}); también existe la opción de alojar un archivo o de enviar un correo electrónico con código | Sola, hasta por 72 horas, con el estado de cada registro |
- Copia los valores de la pantalla de tu Brevo: los de la tabla son ejemplos de la documentación, y tu código de verificación es único.
- Como los nombres son diferentes (
mail._domainkeyen el ejemplo de Brevo,postal._domainkeyen Postal), los dos siguen siendo válidos durante el cambio. Verifica si algún nombre de tu cuenta es igual antes de publicar. - Postal avisa por el webhook
domain.updatedcuando el dominio pasa averified. Consulta Dominios y DNS.
Reescribe la llamada de envío
Postal no acepta el formato de Brevo. La llamada pasa a ser POST /emails, con la clave en Authorization: Bearer en lugar del encabezado api-key, y los campos cambian de nombre. Abajo, el mismo correo electrónico en los dos formatos.
POST https://api.brevo.com/v3/smtp/email
api-key: <clave de Brevo>
Content-Type: application/json
{
"sender": { "name": "Aurora Cosméticos", "email": "[email protected]" },
"to": [{ "email": "[email protected]", "name": "Ana" }],
"subject": "Tu pedido #10482 salió para la entrega",
"htmlContent": "<p>El pedido <b>#10482</b> está en camino.</p>",
"textContent": "El pedido #10482 está en camino.",
"tags": ["entrega"]
}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": ["Ana <[email protected]>"],
"subject": "Tu pedido #10482 salió para la entrega",
"html": "<p>El pedido <b>#10482</b> está en camino.</p>",
"text": "El pedido #10482 está en camino.",
"tags": [{ "name": "entrega" }]
}| Campo en Brevo | En Postal | Qué cambia |
|---|---|---|
sender: {email, name} o {id} | from: texto Nome <email> | No hay ID de remitente. El dominio debe estar verificado (y ser el de la clave, si esta es restringida). |
to: lista de {email, name}, hasta 2.000 por solicitud | to: texto o lista de hasta 50, en el formato Nome <email> | Una lista en Postal es un único correo electrónico, en el que todos se ven. Para un correo por persona, usa el lote. |
messageVersions (hasta 99 destinatarios por versión) | POST /emails/batch: lista de hasta 100 correos electrónicos, cada uno con su propio to | Cada elemento tiene su asunto, contenido o plantilla. El lote se valida antes: o entran todos en la cola, o ninguno. No acepta adjuntos ni scheduled_at y depende del plan. |
cc, bcc | cc, bcc | Texto o lista. |
replyTo: {email, name} | reply_to: texto o lista | |
subject, htmlContent, textContent | subject, html, text | Sin text, el html es obligatorio. Manda los dos cuando puedas. |
templateId y params | template: {id, variables} | El ID numérico pasa a ser el ID o el alias de la plantilla. No mandes html junto. Consulta el paso de las plantillas. |
headers | headers | Brevo acepta solo encabezados fuera del estándar. En Postal, algunos nombres no se pueden cambiar: From, To, Cc, Bcc, Subject, Reply-To, Sender, Date, Message-ID, Return-Path, MIME-Version, Content-Type, Content-Transfer-Encoding y DKIM-Signature. |
tags: lista de textos | tags: lista de {name, value} (hasta 50) | El nombre y el valor solo aceptan letras ASCII, números, _ y -: “Promoção de Natal” pasa a ser promocao-de-natal. El valor es opcional. |
attachment: {url} o {content, name} | attachments: {path} o {content, filename} | url pasa a path y name pasa a filename. Hasta 40 MB en total, no vale en el lote y depende del plan. |
scheduledAt, en UTC (la entrega puede retrasarse hasta 5 minutos) | scheduled_at, en ISO 8601 | En el futuro y a un máximo de 30 días. Se puede reprogramar (PATCH /emails/{id}) y cancelar (POST /emails/{id}/cancel). Depende del plan. |
batchId | Sin equivalente | Cancela cada correo electrónico programado, uno por uno. |
Respuesta 201 con messageId | Respuesta 200 con id | Guarda el id: es el que aparece en los webhooks (data.email_id) y en GET /emails/{id}. |
Errores: {code, message} | Errores: {statusCode, name, message} | Consulta Errores. |
| Hasta 1.000 solicitudes por segundo (rango general de los planes) | Por plan: Gratis 5, Profesional 10, Escala 20 y Empresarial 50 | En el lote, 100 correos electrónicos cuentan como una solicitud. Consulta Límites. |
- Sin
templateId, Brevo exigesender,subjectyhtmlContent. Postal exigefrom,subjectyhtmlotext. - Postal añade el encabezado
Idempotency-Key: repetir la llamada con la misma clave y el mismo cuerpo, en un plazo de 24 horas, devuelve la respuesta de la primera y no envía de nuevo. Consulta Idempotencia. - La documentación de Postal no trata la IP dedicada. Si usas el campo
sender.ipen Brevo, habla con nosotros por el formulario de contacto antes de migrar. - ¿Prefieres un SDK? Los de Postal (Node.js, PHP y Laravel) usan esta misma API. Consulta SDKs y CLI y la referencia de correos.
Si envías por SMTP, cambia solo la conexión
Los sistemas que hablan SMTP, como WordPress, los ERP y las plataformas de tienda, cambian cuatro campos: servidor, puerto, usuario y contraseña. En Brevo la contraseña es una clave SMTP, y no la clave de API. En Postal es una clave de API.
- MAIL_HOST=smtp-relay.brevo.com- MAIL_PORT=587- MAIL_USERNAME=<login SMTP do Brevo>- MAIL_PASSWORD=<chave SMTP do Brevo>+ MAIL_SCHEME=smtps+ MAIL_HOST=smtp.postal.so+ MAIL_PORT=465+ MAIL_USERNAME=postal+ MAIL_PASSWORD=ps_sua_chave| SMTP de Brevo | SMTP de Postal | |
|---|---|---|
| Servidor | smtp-relay.brevo.com | smtp.postal.so |
| Puertos | 587 o 2525 (la documentación indica dejar el cifrado vacío) y 465 (SSL/TLS) | 465 (TLS directo, recomendado) o 587 (STARTTLS). Si la red bloquea, 2465 (TLS) o 2587 (STARTTLS) |
| Usuario | El login SMTP de la pestaña SMTP, en SMTP y API | postal |
| Contraseña | La clave SMTP (la documentación avisa que no es la clave de API) | Una clave de API (ps_…). Basta una clave de solo envío |
| Envío en lote | El relay no hace lotes: la documentación indica usar la API | Hasta 50 destinatarios por mensaje. Para lotes, la API |
- En Postal, la autenticación (
AUTH PLAINoAUTH LOGIN) viene siempre después de TLS. - El SMTP de Postal no tiene etiquetas, programación ni plantillas: para eso, usa la API. Si tu sistema manda encabezados propios de Brevo para esas funciones, Postal no los interpreta y siguen como encabezados comunes.
- Los envíos por SMTP siguen las mismas reglas de la API (dominio verificado, cuotas y supresión) y aparecen en Correos y Registros. Consulta la guía de SMTP.
Recrea las plantillas transaccionales
Postal no convierte plantillas de otra plataforma, pero el HTML viene por la API de Brevo. El script de abajo lista las plantillas activas, cambia {{params.nome}} por {{{nome}}} y crea cada una como plantilla, con el alias brevo-<id>. Es un punto de partida: revisa el resultado antes de publicar la tuya.
const brevoHeaders = { 'api-key': process.env.BREVO_API_KEY }
const postalHeaders = {
Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
'Content-Type': 'application/json',
}
// {{params.nome}} de Brevo pasa a ser {{{nome}}} en Postal
const convert = (text) => text.replace(/\{\{\s*params\.(\w+)\s*\}\}/g, '{{{$1}}}')
const url = 'https://api.brevo.com/v3/smtp/templates?templateStatus=true&limit=100'
const response = await fetch(url, { headers: brevoHeaders })
const { templates } = await response.json()
for (const template of templates) {
const created = await fetch('https://api.postal.so/templates', {
method: 'POST',
headers: postalHeaders,
body: JSON.stringify({
name: template.name,
alias: `brevo-${template.id}`,
subject: convert(template.subject),
html: convert(template.htmlContent),
}),
})
if (!created.ok) throw new Error(await created.text())
const { id } = await created.json()
await fetch(`https://api.postal.so/templates/${id}/publish`, { method: 'POST', headers: postalHeaders })
}| En Brevo | En Postal | Observación |
|---|---|---|
{{params.codigo}} | {{{codigo}}} | El valor viene en template.variables. En el HTML, los valores se escapan. |
{{ contact.FIRSTNAME }} (dato del contacto) | {{{FIRST_NAME}}} o {{{contact.chave}}}, solo en campañas y automatizaciones | En un envío por POST /emails, manda el valor en variables. |
{% if … %} e {% for … %} | Sin equivalente | Las plantillas de Postal solo sustituyen variables. Resuelve las condiciones y las listas en tu sistema y manda el resultado ya listo. |
| Enlace de baja de Brevo | {{{POSTAL_UNSUBSCRIBE_URL}}} | En campañas, sin la variable Postal añade un pie de baja al final del correo electrónico. |
- Brevo solo acepta
paramsen las plantillas del “nuevo lenguaje de plantillas” (New Template Language). Las plantillas más antiguas deben revisarse a mano. - Los valores de
paramsque son listas u objetos no pasan: en Postal, cada variable es texto o número, y una variable sin valor y sin valor predeterminado devuelve422. Declara las opcionales confallback_value. - La respuesta de Brevo trae el remitente (
sender) de cada plantilla. En Postal, viene defromen el envío, o del remitente predeterminado que guardes en la plantilla. - El envío usa siempre la última versión publicada. Consulta la referencia de plantillas; el plan define cuántas plantillas tiene el equipo.
Recrea los webhooks y cambia la autenticación
Los eventos principales existen en ambos lados, con otros nombres y otro cuerpo. En Brevo, la documentación que consultamos no describe firma: autentica con usuario y contraseña en la URL, token Bearer, encabezados propios o lista de IP. En Postal, cada entrega viene firmada con el secreto del endpoint.
Evento de Brevo (event) | Evento de Postal | Observación |
|---|---|---|
request | email.sent | Aproximado: Postal avisa cuando entregó el correo electrónico al proveedor de envío. |
delivered | email.delivered | El servidor del destinatario aceptó el mensaje. |
deferred | email.delivery_delayed | Los reintentos ocurren solos. |
soft_bounce | email.bounced | data.bounce.type es Transient. |
hard_bounce | email.bounced | data.bounce.type es Permanent, y la dirección entra en la lista de supresión. |
invalid_email, error | email.failed | Aproximado: failed.reason trae el motivo. |
blocked | email.suppressed | Aproximado: Postal lo usa cuando el destinatario estaba en la lista de supresión. Compruébalo con un envío de prueba. |
spam | email.complained | La dirección entra en la lista de supresión. |
opened, unique_opened | email.opened | Solo con el seguimiento de aperturas activado en el dominio. La documentación de Postal no separa la primera apertura de las siguientes: si necesitas eso, cuenta por el email_id. |
click | email.clicked | data.click trae link, ipAddress, userAgent y timestamp. Solo con el seguimiento de clics activado. |
unsubscribed | contact.updated | La baja de un contacto de marketing genera contact.updated. |
proxy_open, unique_proxy_open | Sin equivalente | Postal no tiene un evento para la apertura por proxy. |
Marketing: contact_updated, contact_deleted | contact.updated, contact.deleted | |
Marketing: list_addition | Sin evento propio | Los segmentos estáticos no generan evento. |
| En Brevo | En Postal | Observación |
|---|---|---|
Campos sueltos en el cuerpo: event, email, message-id, ts_event… | {type, created_at, data}, con el correo electrónico dentro de data | Si activaste webhooks por lotes (batched, hasta 500 eventos por envío, cada 5 minutos), tu código recibe varios por solicitud. Postal manda un evento por solicitud. |
message-id, el identificador del correo electrónico en el evento | data.email_id | Es el id devuelto por POST /emails: guárdalo para vincular el evento con el envío. |
email: una dirección | data.to: una lista | |
ts_event en UTC; date en CET/CEST | created_at en ISO 8601 | |
tags y tag | data.tags: objeto {nome: valor} | |
reason | data.bounce.message y data.failed.reason | |
X-Mailin-custom, devuelto en el evento | Sin equivalente | Guarda tus datos en la base de datos, junto con el id del correo electrónico, o usa etiquetas. |
| Sin firma documentada: usuario y contraseña en la URL, token Bearer, encabezados propios o lista de IP | Estándar Standard Webhooks, HMAC-SHA256: webhook-id, webhook-timestamp y webhook-signature | El secreto (whsec_…) es de cada endpoint. Consulta la verificación de la firma. |
| 4 reintentos (tras 10 minutos, 1 hora, 2 horas y 8 horas). Una respuesta 4xx (salvo 429) o 5xx termina y descarta el evento | 8 intentos en unas 27 horas. Cualquier respuesta que no sea 2xx cuenta como fallo y genera un nuevo intento | Todos con el mismo webhook-id: úsalo para descartar duplicados. Reenvío manual por el panel o por POST /webhooks/{id}/events/{event_id}/replay. |
| Hasta 40 webhooks, sumando marketing y transaccionales | El número de endpoints depende del plan | La URL debe ser HTTPS y pública. Eliges los eventos de cada endpoint. |
- Crea el endpoint en Webhooks (panel o
POST /webhooks) y guarda elsigning_secret. Manda un evento de prueba desde el panel antes de pasar el tráfico. - Las direcciones de prueba (
[email protected],[email protected]y otras) generan webhooks reales, sin usar la cuota. Dependen del plan. - Quita los webhooks de Brevo solo después de pasar todo el tráfico: los correos electrónicos que aún salen por allí siguen generando eventos.
Lleva a quienes están bloqueados o pidieron salir
Haz esto antes de importar contactos: una dirección que está en la lista de supresión nunca se convierte en contacto. Brevo lista, por API, los contactos bloqueados o dados de baja de los correos electrónicos transaccionales, con el motivo de cada uno.
Motivos hardBounce y contactFlaggedAsSpam en la lista de bloqueados.
Ponlos en la lista de supresión.
Motivos unsubscribedViaMA, unsubscribedViaEmail, unsubscribedViaApi y adminBlocked.
Suprime, si la persona no debe recibir ni los correos electrónicos del sistema. Si solo se detuvo el marketing, impórtala como dada de baja.
Contactos que aceptaron recibir.
Impórtalos como contactos, en el paso siguiente.
Contactos que tienen número y no tienen correo electrónico.
Déjalos fuera: Postal no tiene esos canales.
const reasonsToSuppress = new Set(['hardBounce', 'contactFlaggedAsSpam'])
const emails = []
for (let offset = 0; ; offset += 100) {
const url = `https://api.brevo.com/v3/smtp/blockedContacts?limit=100&offset=${offset}`
const response = await fetch(url, { headers: { 'api-key': process.env.BREVO_API_KEY } })
const { contacts = [] } = await response.json()
if (contacts.length === 0) break
for (const contact of contacts) {
if (reasonsToSuppress.has(contact.reason?.code)) emails.push(contact.email.toLowerCase())
}
}
for (let i = 0; i < emails.length; i += 100) {
const response = await fetch('https://api.postal.so/suppressions/batch/add', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ emails: emails.slice(i, i + 100) }),
})
if (!response.ok) throw new Error(await response.text())
await new Promise((resolve) => setTimeout(resolve, 250)) // respeita o limite do plano
}- La ruta es
GET /v3/smtp/blockedContacts, con hasta 100 por página. Cada elemento traeemail,blockedAtyreason.code. El script lleva solo los dos motivos de entrega y deja los demás para que tú decidas. - En Postal, las direcciones entran con el origen
manual: la diferencia entre rebote y queja no se guarda. La clave debe ser de acceso total. Consulta la referencia de supresiones. - Brevo también tiene una lista de dominios bloqueados. La lista de supresión de Postal guarda direcciones, y no dominios enteros: si necesitas eso, rechaza el dominio en tu formulario o en tu sistema.
Exporta la base de Brevo e impórtala en Postal
El panel de Brevo exporta contactos en CSV, y la API también. En CRM, Contacts, selecciona los contactos y usa More actions, Export, eligiendo los atributos. Por la API, la solicitud de abajo genera el archivo y avisa a tu notifyUrl cuando esté listo.
POST https://api.brevo.com/v3/contacts/export
api-key: <chave do Brevo>
Content-Type: application/json
{
"customContactFilter": { "actionForContacts": "subscribed", "listId": 12 },
"exportAttributes": ["FIRSTNAME", "LASTNAME"],
"notifyUrl": "https://exemplo.com.br/hooks/brevo-export"
}- En
actionForContacts, la API aceptaallContacts,subscribed,unsubscribedyunsubscribedPerList. También hay que indicarlistId,segmentId,modifiedSinceocreatedSince(fecha completa, con zona horaria). Exporta suscritos y dados de baja en archivos separados. - Sin CSV,
GET /v3/contacts(hasta 1.000 por página) yGET /v3/contacts/lists/{id}/contacts(hasta 500) devuelven JSON conattributes,listIds,listUnsubscribedyemailBlacklisted. - Dados de baja: en su archivo, deja una columna Dado de baja con
simen todas las filas y apunta esa columna al campo Dado de baja (sí/no). Quien teníaemailBlacklistedverdadero entra aquí, y nunca como suscrito. - Listas: exporta una lista por archivo e importa cada uno eligiendo el segmento. Solo los segmentos estáticos reciben contactos importados. Quien salió de una sola lista (
listUnsubscribed) merece cuidado: si la lista pasó a ser un tema, registra la elecciónopt_outde esas personas conPATCH /contacts/{id}/topics. - Crea antes las Propiedades de los atributos que quieres mantener: la importación no crea propiedades nuevas. Si usas un ID propio (
ext_id) y viene en el archivo, apúntalo al campo de ID externo. - Deja desactivada la opción Disparar automatizaciones. Los contactos que ya existen se actualizan por el correo electrónico, y cada archivo puede tener hasta 20 MB. El límite de contactos del plan está en Precios: en Gratis son 1.000, en Profesional 5.000 y en Escala 50.000.
- Antes de enviar, pasa la lista por la Verificación de correos.
Rehaz campañas, automatizaciones y formularios
Las campañas y automatizaciones no pasan solas. No encontramos en la documentación de Brevo una exportación de ellas a otra plataforma, así que trata cada una como nueva y aprovecha para revisar lo que aún tiene sentido.
| En Brevo | En Postal | Qué hacer |
|---|---|---|
| Campañas de correo electrónico | Campañas | Copia el HTML a una plantilla o pégalo en la campaña. Elige el segmento (y, si quieres, el tema), el remitente de un dominio verificado y el asunto. Las campañas ya enviadas no se importan. |
| Automatizaciones | Automatizaciones | Vuelve a armarla en el editor de flujos: un disparador y pasos de esperar, enviar correo electrónico, condición, cambiar el contacto y llamar a un webhook. Consulta Automatizaciones. |
| Segmentos | Segmentos dinámicos | Rehaz los filtros. En el archivo vienen solo los contactos. |
| Formularios de suscripción | Formularios | Recréalo, activa la confirmación por correo electrónico (double opt-in) y cambia la dirección o el código en tu sitio. Consulta Formularios. |
| Informes e historial | No viene | Exporta lo que quieras conservar antes de cerrar la cuenta. Postal guarda correos electrónicos, eventos y registros por 30 días. |
- Las importaciones no inician automatizaciones, a menos que actives esa opción. Revisa quién entraría antes de activar.
- Cada plan tiene un límite de ejecuciones de automatizaciones por mes.
Revisa lo que no tiene equivalente y pasa el tráfico
Pasa un flujo a la vez, con Brevo aún activo. Empieza por las direcciones de prueba y por ti mismo, compara entregas y rebotes en los primeros días y solo entonces pasa el resto.
| En Brevo | Qué hacer en Postal |
|---|---|
| SMS y WhatsApp | Sin equivalente. Postal es una plataforma de correo electrónico. |
| CRM de ventas, reuniones y teléfono, notificaciones push, pagos, fidelización y cupones | Sin equivalente. Sigue en Brevo o usa otra herramienta. |
| Plantillas con condiciones y bucles | Resuélvelo en tu sistema y manda el HTML ya listo, o variables simples. |
IP dedicada (sender.ip) | La documentación de Postal no trata este tema. |
batchId | Cancela cada correo electrónico programado con POST /emails/{id}/cancel. |
| Lista de dominios bloqueados | Sin equivalente: la supresión guarda direcciones. |
| Webhooks autenticados por usuario y contraseña en la URL, token Bearer o encabezados propios | La protección es la firma de cada entrega. |
| Eventos de apertura por proxy | Sin evento propio. |
Antes de cambiar la clave
- El dominio está verificado en Postal y la clave de API está creada (solo envío y restringida al dominio, en los sistemas que solo envían).
- La llamada de envío fue reescrita y probada con una dirección de prueba, y tu código guarda el
idde cada correo electrónico. - Las plantillas fueron recreadas y publicadas, y las que usaban condiciones o bucles se resolvieron en el sistema.
- El SMTP apunta a
smtp.postal.socon una clave de API como contraseña. - El webhook fue creado, la firma se verifica y llegó un evento de prueba.
- Los bloqueados por rebote y spam están en la lista de supresión, antes de la importación de contactos.
- Quienes estaban dados de baja entraron como dados de baja, y las automatizaciones quedaron desactivadas en la importación.
- Tu código guarda de qué proveedor salió cada correo electrónico, y los rebotes se revisaron en los primeros días.
- Decidiste dónde quedan SMS, WhatsApp y el CRM, si los usabas.
Preguntas frecuentes
¿Necesito mantener Brevo durante la migración?
Sí, hasta terminar: cambiar el envío, llevar los contactos, recrear campañas y automatizaciones y ver llegar los eventos de los últimos correos electrónicos que salieron por allí. Si usas SMS, WhatsApp o el CRM, se quedan en Brevo, porque Postal no tiene esos productos.
¿Puedo mantener el dominio autenticado en los dos?
Sí. Los registros tienen nombres diferentes (Postal usa el selector postal en el DKIM y el subdominio postal en el Return-Path), así que los dos quedan verificados durante el cambio.
¿Mis plantillas con condiciones y listas funcionan en Postal?
No del mismo modo. Las plantillas de Postal solo sustituyen variables de texto o número. Resuelve las condiciones y las listas en tu sistema, arma el HTML final y mándalo en html, o pasa solo los valores ya listos en variables.
Brevo era Sendinblue. ¿Esta guía me sirve?
Sí. La guía usa los nombres y las rutas de la documentación actual de Brevo (api.brevo.com/v3). Si tu código aún usa el nombre antiguo, comprueba en la documentación de Brevo a qué dirección llama.
Sigue por aquí
Audiencia y segmentos
Contactos, etiquetas, temas y propiedades organizados.
Más informaciónLista de supresión
Quien no debe recibir queda protegido, por equipo.
Más informaciónWebhooks y eventos
Cada evento de correo electrónico en tu servidor, con firma y reintentos.
Más informaciónOtras guías de migración