Automatizaciones
Configure secuencias de correo electrónico basadas en disparadores que se ejecutan automáticamente según el comportamiento del suscriptor
Las automatizaciones le permiten crear secuencias de correo electrónico de múltiples pasos disparadas por eventos de suscriptores. Defina un disparador, construya una secuencia de pasos y MailLand ejecuta el flujo automáticamente cada vez que se activa el disparador.
Disparadores de automatización
Cada automatización comienza con un único disparador:
| Disparador | Valor | Descripción |
|---|---|---|
SubscriberJoins | 0 | El suscriptor se agrega a una lista de correo |
SubscriberUpdated | 1 | Se actualiza el perfil del suscriptor |
CampaignOpened | 2 | El suscriptor abre una campaña específica |
CampaignClicked | 3 | El suscriptor hace clic en un enlace de una campaña |
DateBased | 4 | Disparador solo de cumpleaños: evalúa Subscriber.Birthday (vea el aviso abajo) |
DateBased solo evalúa Subscriber.Birthday, no un campo de fecha recurrente arbitrario. Birthday se puede establecer mediante POST/PUT /v1/marketing/subscribers (vea la página de Suscriptores) y también mediante la importación CSV, que acepta una columna birthday opcional, así que una automatización DateBased inscribe a cualquier suscriptor cuyo cumpleaños se haya establecido por cualquiera de las dos vías.
| Manual | 5 | Disparado manualmente vía API |
Estados de automatización
| Estado | Valor | Descripción |
|---|---|---|
Draft | 0 | Editable, no está en ejecución |
Active | 1 | En ejecución: los nuevos suscriptores se inscriben al activarse el disparador |
Paused | 2 | Pausada: sin nuevas inscripciones, y los pasos posteriores se detienen para los suscriptores ya inscritos. Reactivarla (Active) reanuda cada inscripción exactamente donde se detuvo, y entrega todo lo que venció mientras estaba pausada |
Archived | 3 | Archivada: oculta de las vistas predeterminadas. Al igual que Paused, esto detiene nuevas inscripciones; los pasos posteriores también se detienen para los suscriptores ya inscritos. No existe un endpoint para desarchivar, así que esta detención es permanente para esas inscripciones |
Tipos de pasos
Cada automatización contiene una secuencia ordenada de pasos:
| Tipo de paso | Valor | Descripción |
|---|---|---|
SendEmail | 0 | Enviar un correo electrónico al suscriptor |
Wait | 1 | Esperar una duración antes de continuar |
Condition | 2 | Evalúa un campo del suscriptor; una puerta que continúa si es verdadero y termina la inscripción si es falso (vea el paso Condition más abajo) |
AddToList | 3 | Agregar al suscriptor a una lista de correo |
RemoveFromList | 4 | Eliminar al suscriptor de una lista de correo |
UpdateSubscriber | 5 | Actualizar campos del suscriptor |
Webhook | 6 | Enviar un webhook a una URL externa |
Personalización
Los pasos de correo de automatización admiten etiquetas de fusión {{variable}}, sustituidas por destinatario a partir del propio registro del suscriptor inscrito.
| Etiqueta | Valor |
|---|---|
{{firstName}} | Nombre del suscriptor |
{{lastName}} | Apellido del suscriptor |
{{fullName}} | Nombre y apellido unidos |
{{email}} | Dirección de correo del suscriptor |
{{subscriberId}} | Identificador opaco del suscriptor |
{{custom_<field>}} | Cualquier campo personalizado del suscriptor, también disponible como {{<field>}} |
<p>Hi {{firstName}}, here's what's new this month.</p>Una etiqueta sin valor se deja exactamente como está escrita: {{firstName}} para un suscriptor sin nombre permanece como {{firstName}} en el correo entregado. Escriba contenido que se lea correctamente en ambos casos. Use un saludo alternativo cuando no esté seguro de que todos los suscriptores tengan el campo.
Los valores se escapan según la parte en la que caen: el contenido HTML se escapa como HTML, mientras que el asunto y el cuerpo en texto plano nunca se escapan, Ben & Jerry's permanece exactamente así.
Las grafías antiguas en snake_case ({{first_name}}, {{last_name}}, {{full_name}}, {{subscriber_id}}) siguen funcionando como alias.
Crear una automatización
POST https://api.mail.land/v1/marketing/automations{
"name": "Welcome Series",
"description": "3-email welcome sequence for new subscribers",
"trigger": 0,
"mailingListId": "7h3n5k8w2q9m1t",
"campaignId": null,
"steps": [
{
"type": 0,
"order": 1,
"templateId": "2p9x4k7m3q8n1z",
"subject": "Welcome to our newsletter!"
},
{
"type": 1,
"order": 2,
"delayMinutes": 1440
},
{
"type": 0,
"order": 3,
"templateId": "9k4p2x7m1q3n8z"
}
]
}| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
name | string | Sí | Nombre de la automatización (único por espacio de trabajo) |
description | string | No | Descripción de la automatización |
trigger | int | Sí | Tipo de disparador (consulte la tabla de disparadores) |
mailingListId | string | No | Lista de correo objetivo para el disparador |
campaignId | string | No | Opcional para disparadores CampaignOpened / CampaignClicked: si se omite, el disparador se activa en cualquier campaña, no solo en una |
steps | array | Sí | Secuencia ordenada de pasos |
No existe un campo segmentId en una automatización: ese campo no existe aquí (los segmentos se usan en otro lugar, por ejemplo en las campañas). El contenido de un paso SendEmail proviene de templateId, no de htmlContent/textContent/fromName/fromEmail en línea.
campaignId es opcional para los disparadores de apertura/clic, no obligatorio como indicaban versiones anteriores de esta página. También se activa con aperturas automáticas (precarga de Apple Mail Privacy Protection, escáneres de seguridad de enlaces) que MailLand no filtra hoy.
Campos de los pasos
Cada paso tiene en realidad la forma { order, type, delayMinutes, templateId, subject, settings: {} }: no existe un segmentId a nivel de automatización, y los pasos no tienen los campos específicos de cada tipo mostrados en versiones anteriores de esta página (conditionField, targetMailingListId, updateField, webhookUrl, fromName, fromEmail, replyTo no son campos de nivel superior de un paso). Las tablas siguientes reflejan la forma real.
Paso SendEmail (type: 0):
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
type | int | Sí | 0 |
order | int | Sí | Posición del paso en la secuencia |
delayMinutes | int | No | Minutos a esperar antes de ejecutar este paso: incluso cuando es el primer paso: el retraso antes del primer envío ahora se respeta al inscribir (antes se ignoraba) |
templateId | string | Sí | Plantilla que aporta el contenido del correo: el contenido proviene únicamente de la plantilla |
subject | string | No | Sobrescribe el asunto de la plantilla si se establece |
No existe htmlContent/textContent/fromName/fromEmail/replyTo en línea en un paso. El remitente está fijado a noreply@<primer dominio totalmente verificado>, mostrado con el nombre del espacio de trabajo, no es configurable por paso.
templateId es obligatorio en todo paso SendEmail. Las solicitudes de creación/actualización sin él se rechazan con 400 VALIDATION_FAILED; un templateId que no resuelve a una plantilla de su tenant se rechaza con 400 TEMPLATE_NOT_FOUND: ambos antes de que se escriba nada. Si una plantilla se elimina después de guardar la automatización, la siguiente inscripción que llegue a ese paso se marca como Failed en lugar de omitir el paso silenciosamente, y cuenta para el totalFailed de la automatización (vea Obtener detalles de la automatización).
Paso Wait (type: 1):
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
type | int | Sí | 1 |
order | int | Sí | Posición del paso |
delayMinutes | int | Sí | Minutos a esperar antes del siguiente paso |
Paso Condition (type: 2):
Un paso Condition es una puerta, no una bifurcación: una lista de pasos lineal no tiene un
segundo camino. Cuando evalúa verdadero, la inscripción continúa al siguiente paso. Cuando evalúa
falso, la inscripción termina ahí (Completed) y ningún paso posterior se ejecuta para ese
suscriptor.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
type | int | Sí | 2 |
order | int | Sí | Posición del paso |
settings.conditionField | string | Sí | El campo del suscriptor a evaluar: email, firstName, lastName, phone, company, source, o custom_<name> para un campo personalizado |
settings.conditionOperator | string | Sí | equals, notEquals, contains, notContains, startsWith, endsWith, isEmpty, isNotEmpty (sin distinguir mayúsculas/minúsculas) |
settings.conditionValue | string | Obligatorio salvo con isEmpty/isNotEmpty | El valor a comparar |
Las comparaciones son comparaciones de cadenas sin distinguir mayúsculas/minúsculas, los mismos
operadores que ya ofrecen los segmentos. Se devuelve 400 VALIDATION_FAILED al crear/actualizar
cuando conditionField es desconocido, conditionOperator no es uno de los valores anteriores, o
falta conditionValue para un operador que lo requiere.
Un paso Condition guardado antes de que existiera esta validación (cuyos settings por tanto
no se pueden evaluar) sigue pasando sin cambios, por continuidad: solo se validan las nuevas
solicitudes de creación/actualización.
Pasos AddToList / RemoveFromList (type: 3, 4):
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
type | int | Sí | 3 o 4 |
order | int | Sí | Posición del paso |
settings.mailingListId | string | Sí | Lista de correo para agregar/eliminar al suscriptor, leída de settings |
Paso UpdateSubscriber (type: 5):
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
type | int | Sí | 5 |
order | int | Sí | Posición del paso |
settings | object | Sí | Cada clave en settings se escribe como un campo personalizado en el suscriptor |
Paso Webhook (type: 6):
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
type | int | Sí | 6 |
order | int | Sí | Posición del paso |
settings.url | string | Sí | URL a la que enviar la solicitud POST, leída de settings |
Las solicitudes de los pasos Webhook se firman con un secreto del receptor del paso (X-MLND-Signature, se verifica como un webhook de cliente): cada URL de paso distinta tiene su propio secreto, así que ningún receptor puede firmar por otro. Léalos con GET /v1/marketing/automations/{id}/webhook-signing-secrets y renuévelos con POST /v1/marketing/automations/{id}/webhook-signing-secrets/regenerate, vea Versionado. Envíe { "webhookUrl": "…" } para renovar un solo receptor.
curl -X POST https://api.mail.land/v1/marketing/automations \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"name": "Welcome Series",
"trigger": 0,
"mailingListId": "7h3n5k8w2q9m1t",
"steps": [
{
"type": 0, "order": 1,
"subject": "Welcome!",
"templateId": "2p9x4k7m3q8n1z"
},
{ "type": 1, "order": 2, "delayMinutes": 1440 },
{
"type": 0, "order": 3,
"subject": "Getting started",
"templateId": "9k4p2x7m1q3n8z"
}
]
}'Respuesta
{
"id": "4f8k2m9p1q6z3s",
"name": "Welcome Series",
"description": "3-email welcome sequence for new subscribers",
"trigger": "subscriberJoins",
"triggerName": "SubscriberJoins",
"status": "draft",
"statusName": "Draft",
"mailingListId": "7h3n5k8w2q9m1t",
"mailingListName": "Product Updates",
"campaignId": null,
"campaignName": null,
"stepsCount": 3,
"totalEnrolled": 0,
"totalCompleted": 0,
"activatedAt": null,
"createdAt": "2026-02-17T12:00:00Z",
"updatedAt": "2026-02-17T12:00:00Z"
}No existe un campo segmentId/segmentName en una automatización, y los contadores de inscripción son totalEnrolled/totalCompleted (no totalEnrollments/activeEnrollments/completedEnrollments). La respuesta de detalle también agrega steps (la lista completa de pasos), completionRate y totalFailed: inscripciones que llegaron a un paso SendEmail sin plantilla en el tenant (ausente o eliminada desde entonces).
Listar automatizaciones
GET https://api.mail.land/v1/marketing/automations| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
cursor | string | - | Cursor opaco del nextCursor de la página anterior. Omitir para la primera página. |
limit | int | 20 | Elementos por página |
search | string | - | Buscar por nombre |
status | int | - | Filtrar por estado de la automatización |
trigger | int | - | Filtrar por tipo de disparador |
mailingListId | string | - | Filtrar por lista de correo |
sortBy | string | - | Campo de ordenamiento |
sortDesc | bool | false | Orden descendente |
curl https://api.mail.land/v1/marketing/automations \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Obtener detalles de la automatización
GET https://api.mail.land/v1/marketing/automations/{id}Devuelve la automatización completa incluyendo todos los pasos:
curl https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"id": "4f8k2m9p1q6z3s",
"name": "Welcome Series",
"description": "3-email welcome sequence for new subscribers",
"trigger": "subscriberJoins",
"triggerName": "SubscriberJoins",
"status": "active",
"statusName": "Active",
"mailingListId": "7h3n5k8w2q9m1t",
"mailingListName": "Product Updates",
"campaignId": null,
"campaignName": null,
"stepsCount": 3,
"totalEnrolled": 230,
"totalCompleted": 200,
"totalFailed": 4,
"activatedAt": "2026-01-10T08:05:00Z",
"steps": [
{
"order": 1,
"type": "sendEmail",
"typeName": "SendEmail",
"delayMinutes": null,
"templateId": "2p9x4k7m3q8n1z",
"subject": "Welcome to our newsletter!",
"settings": null
},
{
"order": 2,
"type": "wait",
"typeName": "Wait",
"delayMinutes": 1440,
"templateId": null,
"subject": null,
"settings": null
},
{
"order": 3,
"type": "sendEmail",
"typeName": "SendEmail",
"delayMinutes": null,
"templateId": "9k4p2x7m1q3n8z",
"subject": "Getting started with MailLand",
"settings": null
}
],
"completionRate": 86.96,
"createdAt": "2026-01-10T08:00:00Z",
"updatedAt": "2026-02-17T12:00:00Z"
}Actualizar una automatización
PUT https://api.mail.land/v1/marketing/automations/{id}Se puede actualizar cualquier estado excepto Active (no solo Draft/Paused). El cuerpo de la solicitud es el mismo que el de creación.
curl -X PUT https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{
"name": "Welcome Series",
"trigger": 0,
"mailingListId": "7h3n5k8w2q9m1t",
"steps": [
{
"type": 0, "order": 1,
"subject": "Welcome!",
"templateId": "2p9x4k7m3q8n1z"
},
{ "type": 1, "order": 2, "delayMinutes": 1440 },
{
"type": 0, "order": 3,
"subject": "Getting started",
"templateId": "9k4p2x7m1q3n8z"
}
]
}'Activar una automatización
POST https://api.mail.land/v1/marketing/automations/{id}/activateCambia el estado de la automatización de Draft o Paused a Active. Una vez activa, la automatización comienza a inscribir suscriptores cuando se activa el disparador.
La activación en sí no se verifica contra la verificación de dominio. Un paso SendEmail alcanzado sin ningún dominio completamente verificado se retiene, no se omite: se vuelve a comprobar en un intervalo creciente (15 minutos, luego hasta cada 6 horas) y se envía en cuanto un dominio se verifica. Si ningún dominio se verifica dentro de los 7 días desde que el paso venció por primera vez, la inscripción se marca Failed (se cuenta en totalFailed) en lugar de quedar retenida para siempre: así que activar sin ningún dominio verificado tiene éxito, pero nada se entrega hasta que verifique uno, y las inscripciones que sigan esperando después de una semana terminan en lugar de retenerse indefinidamente.
curl -X POST https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s/activate \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Pausar una automatización
POST https://api.mail.land/v1/marketing/automations/{id}/pausePausa la automatización. No se inscriben nuevos suscriptores, y los suscriptores que ya están en la secuencia dejan de avanzar: cada inscripción se detiene en su paso actual. Volver a activar la automatización reanuda cada inscripción detenida desde donde quedó, entregando todo lo que venció mientras estaba pausada.
curl -X POST https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s/pause \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Archivar una automatización
POST https://api.mail.land/v1/marketing/automations/{id}/archiveArchiva la automatización, lo cual se puede hacer desde cualquier estado, incluido Active. Las automatizaciones archivadas se ocultan de las vistas de lista predeterminadas.
Archivar detiene tanto las nuevas inscripciones como los pasos posteriores para los suscriptores ya inscritos: cada inscripción se detiene en su paso actual, igual que al pausar. A diferencia de pausar, no existe un endpoint que reactive una automatización Archived, así que esta detención no se resuelve por sí sola.
curl -X POST https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s/archive \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Duplicar una automatización
POST https://api.mail.land/v1/marketing/automations/{id}/duplicate?name=Copy%20of%20Welcome%20SeriesCrea una nueva automatización en Draft con los pasos y configuraciones clonados. El parámetro de consulta name es opcional.
curl -X POST "https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s/duplicate?name=Copy%20of%20Welcome%20Series" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Disparar manualmente
POST https://api.mail.land/v1/marketing/automations/{id}/trigger{
"subscriberIds": ["3m8k1p9x4q7n2z", "6q2n9k4x1p8m3z", "1x7m3q8k2n9p4z"]
}Inscriba manualmente suscriptores específicos en la automatización. La automatización debe estar en estado Active y su tipo de disparador debe ser Manual (5).
curl -X POST https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s/trigger \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{"subscriberIds": ["3m8k1p9x4q7n2z", "6q2n9k4x1p8m3z", "1x7m3q8k2n9p4z"]}'Seguimiento de inscripciones
El progreso de cada suscriptor a través de la automatización se rastrea como una inscripción:
| Estado | Valor | Descripción |
|---|---|---|
Active | 0 | Avanzando actualmente a través de los pasos |
Paused | 1 | Inscripción pausada |
Completed | 2 | Finalizó todos los pasos |
Failed | 3 | Un paso SendEmail no tiene plantilla en este tenant: ausente desde el inicio o eliminada después. Se cuenta en el totalFailed de la automatización |
Unsubscribed | 4 | El suscriptor se desuscribió durante la secuencia |
No existe un estado de inscripción Cancelled. La respuesta de detalle de la automatización incluye conteos agregados de inscripciones como totalEnrolled y totalCompleted (no totalEnrollments/activeEnrollments/completedEnrollments/failedEnrollments).
Eliminar una automatización
DELETE https://api.mail.land/v1/marketing/automations/{id}Elimina permanentemente la automatización, sus pasos y los datos de inscripción.
Actualizar y eliminar están permitidos para cualquier estado excepto Active: no solo Draft/Paused (actualizar) o Draft/Archived (eliminar) como indicaban versiones anteriores de esta página.
curl -X DELETE https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Respuestas de error
| Estado | Código | Descripción |
|---|---|---|
400 | VALIDATION_FAILED | Campos obligatorios faltantes o configuración de paso inválida: incluido un paso SendEmail sin templateId o un paso Condition con settings no evaluables |
400 | TEMPLATE_NOT_FOUND | El templateId de un paso SendEmail no resuelve a una plantilla de su tenant |
400 | INVALID_REQUEST | El nombre de la automatización ya existe o transición de estado inválida |
403 | FORBIDDEN | Permisos insuficientes |
404 | RESOURCE_NOT_FOUND | Automatización no encontrada, o la transición de estado no es válida (actualización/activación/pausa en el estado incorrecto, eliminación de una automatización Active) |
Los endpoints de automatizaciones nunca devuelven 422.
Próximos pasos
- Campañas: envíe campañas de una sola vez
- Suscriptores: administre los contactos a los que se dirigen las automatizaciones
- Listas: organice suscriptores en listas para los disparadores