Automatisations
Configurez des séquences d'e-mails automatiques basées sur des déclencheurs et le comportement des abonnés
Les automatisations vous permettent de créer des séquences d'e-mails en plusieurs étapes déclenchées par des événements d'abonnés. Définissez un déclencheur, construisez une séquence d'étapes, et MailLand exécute le flux automatiquement chaque fois que le déclencheur se déclenche.
Déclencheurs d'automatisation
Chaque automatisation commence par un seul déclencheur :
| Déclencheur | Valeur | Description |
|---|---|---|
SubscriberJoins | 0 | Un abonné est ajouté à une liste de diffusion |
SubscriberUpdated | 1 | Le profil d'un abonné est mis à jour |
CampaignOpened | 2 | Un abonné ouvre une campagne spécifique |
CampaignClicked | 3 | Un abonné clique sur un lien dans une campagne |
DateBased | 4 | Déclencheur uniquement basé sur l'anniversaire, évalue Subscriber.Birthday (voir l'encadré ci-dessous) |
DateBased n'évalue que Subscriber.Birthday, pas un champ de date récurrent arbitraire. Birthday peut être défini via POST/PUT /v1/marketing/subscribers (voir la page Abonnés) ainsi que via l'import CSV, qui accepte une colonne birthday optionnelle, donc une automatisation DateBased inscrit tout abonné dont l'anniversaire a été défini par l'une ou l'autre de ces voies.
| Manual | 5 | Déclenché manuellement via l'API |
Statuts d'automatisation
| Statut | Valeur | Description |
|---|---|---|
Draft | 0 | Modifiable, non exécutée |
Active | 1 | En cours d'exécution : les nouveaux abonnés sont inscrits au déclenchement |
Paused | 2 | En pause : aucune nouvelle inscription, et les étapes suivantes s'arrêtent pour les abonnés déjà inscrits. La réactiver (Active) reprend chaque inscription exactement là où elle s'est arrêtée, et livre tout ce qui était dû pendant la pause |
Archived | 3 | Archivée : masquée des vues par défaut. Comme Paused, cela arrête les nouvelles inscriptions ; les étapes suivantes s'arrêtent aussi pour les abonnés déjà inscrits. Il n'existe aucun point de terminaison pour désarchiver, donc cet arrêt est permanent pour ces inscriptions |
Types d'étapes
Chaque automatisation contient une séquence ordonnée d'étapes :
| Type d'étape | Valeur | Description |
|---|---|---|
SendEmail | 0 | Envoyer un e-mail à l'abonné |
Wait | 1 | Attendre une durée avant de continuer |
Condition | 2 | Évalue un champ de l'abonné ; une porte qui continue si vrai et termine l'inscription si faux (voir l'étape Condition ci-dessous) |
AddToList | 3 | Ajouter l'abonné à une liste de diffusion |
RemoveFromList | 4 | Retirer l'abonné d'une liste de diffusion |
UpdateSubscriber | 5 | Mettre à jour les champs de l'abonné |
Webhook | 6 | Envoyer un webhook à une URL externe |
Personnalisation
Les étapes d'e-mail d'automatisation prennent en charge les balises de fusion {{variable}}, substituées par destinataire à partir du propre enregistrement de l'abonné inscrit.
| Balise | Valeur |
|---|---|
{{firstName}} | Prénom de l'abonné |
{{lastName}} | Nom de famille de l'abonné |
{{fullName}} | Prénom et nom réunis |
{{email}} | Adresse e-mail de l'abonné |
{{subscriberId}} | Identifiant opaque de l'abonné |
{{custom_<field>}} | Tout champ personnalisé de l'abonné : également disponible sous la forme {{<field>}} |
<p>Hi {{firstName}}, here's what's new this month.</p>Une balise sans valeur est laissée exactement telle qu'écrite : {{firstName}} pour un abonné sans prénom reste {{firstName}} dans l'e-mail livré. Rédigez un contenu qui se lit correctement dans les deux cas. Utilisez une salutation de repli lorsque vous n'êtes pas sûr que chaque abonné possède le champ.
Les valeurs sont échappées selon l'endroit où elles atterrissent : le contenu HTML est échappé en HTML, tandis que la ligne d'objet et le corps en texte brut ne sont jamais échappés, Ben & Jerry's reste exactement tel quel.
Les anciennes orthographes en snake_case ({{first_name}}, {{last_name}}, {{full_name}}, {{subscriber_id}}) continuent de fonctionner comme alias.
Créer une automatisation
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"
}
]
}| Champ | Type | Obligatoire | Description |
|---|---|---|---|
name | string | Oui | Nom de l'automatisation (unique par espace de travail) |
description | string | Non | Description de l'automatisation |
trigger | int | Oui | Type de déclencheur (voir le tableau des déclencheurs) |
mailingListId | string | Non | Liste de diffusion cible pour le déclencheur |
campaignId | string | Non | Optionnel pour les déclencheurs CampaignOpened / CampaignClicked : si omis, le déclencheur se déclenche pour n'importe quelle campagne, pas seulement une seule |
steps | array | Oui | Séquence ordonnée d'étapes |
Il n'existe pas de champ segmentId sur une automatisation : ce champ n'existe pas ici (les segments sont utilisés ailleurs, par exemple dans les campagnes). Le contenu d'une étape SendEmail provient de templateId, et non d'un htmlContent/textContent/fromName/fromEmail en ligne.
campaignId est optionnel pour les déclencheurs d'ouverture/de clic, et non obligatoire comme l'indiquaient les versions précédentes de cette page. Il se déclenche aussi sur des ouvertures automatiques (préchargement Apple Mail Privacy Protection, scanners de sécurité de liens) que MailLand ne filtre pas aujourd'hui.
Champs des étapes
Chaque étape a en réalité la forme { order, type, delayMinutes, templateId, subject, settings: {} } : il n'existe pas de segmentId au niveau de l'automatisation, et les étapes n'ont pas les champs spécifiques à chaque type montrés dans les versions précédentes de cette page (conditionField, targetMailingListId, updateField, webhookUrl, fromName, fromEmail, replyTo ne sont pas des champs de premier niveau d'une étape). Les tableaux ci-dessous reflètent la forme réelle.
Étape SendEmail (type : 0) :
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
type | int | Oui | 0 |
order | int | Oui | Position de l'étape dans la séquence |
delayMinutes | int | Non | Minutes d'attente avant l'exécution de cette étape, y compris lorsqu'il s'agit de la première étape : le délai avant le tout premier envoi est désormais respecté à l'inscription (il était auparavant ignoré) |
templateId | string | Oui | Modèle fournissant le contenu de l'e-mail : le contenu provient uniquement du modèle |
subject | string | Non | Remplace l'objet du modèle si défini |
Il n'existe pas de htmlContent/textContent/fromName/fromEmail/replyTo en ligne sur une étape. L'expéditeur est fixé à noreply@<premier domaine entièrement vérifié>, affiché avec le nom de l'espace de travail, non configurable par étape.
templateId est obligatoire sur chaque étape SendEmail. Les requêtes de création/mise à jour sans ce champ sont refusées avec 400 VALIDATION_FAILED ; un templateId qui ne correspond à aucun modèle de votre tenant est refusé avec 400 TEMPLATE_NOT_FOUND : les deux avant que quoi que ce soit ne soit écrit. Si un modèle est supprimé après l'enregistrement de l'automatisation, l'inscription du prochain abonné qui atteint cette étape est marquée Failed au lieu que l'étape soit silencieusement ignorée, et elle compte dans le totalFailed de l'automatisation (voir Obtenir les détails d'une automatisation).
Étape Wait (type : 1) :
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
type | int | Oui | 1 |
order | int | Oui | Position de l'étape |
delayMinutes | int | Oui | Minutes d'attente avant l'étape suivante |
Étape Condition (type : 2) :
Une étape Condition est une porte, pas un embranchement : une liste d'étapes linéaire n'a pas de
second chemin. Quand elle évalue vrai, l'inscription continue vers l'étape suivante. Quand elle
évalue faux, l'inscription se termine là (Completed) et aucune étape ultérieure ne s'exécute
pour cet abonné.
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
type | int | Oui | 2 |
order | int | Oui | Position de l'étape |
settings.conditionField | string | Oui | Le champ de l'abonné à évaluer : email, firstName, lastName, phone, company, source, ou custom_<name> pour un champ personnalisé |
settings.conditionOperator | string | Oui | equals, notEquals, contains, notContains, startsWith, endsWith, isEmpty, isNotEmpty (insensible à la casse) |
settings.conditionValue | string | Obligatoire sauf avec isEmpty/isNotEmpty | La valeur à comparer |
Les comparaisons sont des comparaisons de chaînes insensibles à la casse, les mêmes opérateurs déjà
proposés par les segments. 400 VALIDATION_FAILED est renvoyé à la création/mise à jour lorsque
conditionField est inconnu, que conditionOperator n'est pas l'une des valeurs ci-dessus, ou que
conditionValue manque pour un opérateur qui en a besoin.
Une étape Condition enregistrée avant l'existence de cette validation (dont les settings ne
sont donc pas évaluables) continue de passer sans changement, par continuité : seules les nouvelles
requêtes de création/mise à jour sont validées.
Étapes AddToList / RemoveFromList (type : 3, 4) :
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
type | int | Oui | 3 ou 4 |
order | int | Oui | Position de l'étape |
settings.mailingListId | string | Oui | Liste de diffusion pour ajouter/retirer l'abonné, lue depuis settings |
Étape UpdateSubscriber (type : 5) :
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
type | int | Oui | 5 |
order | int | Oui | Position de l'étape |
settings | object | Oui | Chaque clé de settings est écrite comme un champ personnalisé sur l'abonné |
Étape Webhook (type : 6) :
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
type | int | Oui | 6 |
order | int | Oui | Position de l'étape |
settings.url | string | Oui | URL à laquelle envoyer la requête POST, lue depuis settings |
Les requêtes des étapes Webhook sont signées avec un secret du récepteur de l’étape (X-MLND-Signature, vérifié comme un webhook client) : chaque URL d’étape distincte a son propre secret, si bien qu’aucun récepteur ne peut signer pour un autre. Lisez-les avec GET /v1/marketing/automations/{id}/webhook-signing-secrets et renouvelez-les avec POST /v1/marketing/automations/{id}/webhook-signing-secrets/regenerate, voir Versionnage. Envoyez { "webhookUrl": "…" } pour ne renouveler qu’un seul récepteur.
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"
}
]
}'Réponse
{
"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"
}Il n'existe pas de champ segmentId/segmentName sur une automatisation, et les compteurs d'inscription sont totalEnrolled/totalCompleted (et non totalEnrollments/activeEnrollments/completedEnrollments). La réponse détaillée ajoute aussi steps (la liste complète des étapes), completionRate et totalFailed : les inscriptions ayant atteint une étape SendEmail sans modèle dans le tenant (absent ou supprimé depuis).
Lister les automatisations
GET https://api.mail.land/v1/marketing/automations| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
cursor | string | - | Curseur opaque issu du nextCursor de la page précédente. À omettre pour la première page. |
limit | int | 20 | Éléments par page |
search | string | - | Rechercher par nom |
status | int | - | Filtrer par statut d'automatisation |
trigger | int | - | Filtrer par type de déclencheur |
mailingListId | string | - | Filtrer par liste de diffusion |
sortBy | string | - | Champ de tri |
sortDesc | bool | false | Tri décroissant |
curl https://api.mail.land/v1/marketing/automations \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Détails d'une automatisation
GET https://api.mail.land/v1/marketing/automations/{id}Retourne l'automatisation complète incluant toutes les étapes :
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"
}Mettre à jour une automatisation
PUT https://api.mail.land/v1/marketing/automations/{id}N'importe quel statut sauf Active peut être mis à jour (pas seulement Draft/Paused). Le corps de la requête est identique à celui de la création.
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"
}
]
}'Activer une automatisation
POST https://api.mail.land/v1/marketing/automations/{id}/activateFait passer l'automatisation de Draft ou Paused à Active. Une fois active, l'automatisation commence à inscrire les abonnés lorsque le déclencheur se déclenche.
L'activation elle-même n'est pas vérifiée par rapport à la vérification de domaine. Une étape SendEmail atteinte sans aucun domaine entièrement vérifié est retenue, pas ignorée : elle est revérifiée selon un intervalle croissant (15 minutes, puis jusqu'à toutes les 6 heures) et est envoyée dès qu'un domaine est vérifié. Si aucun domaine n'est vérifié dans les 7 jours suivant le moment où l'étape est devenue due pour la première fois, l'inscription est marquée Failed (comptée dans totalFailed) plutôt que retenue indéfiniment : l'activation sans domaine vérifié réussit donc, mais rien n'est livré tant que vous n'avez pas vérifié un domaine, et les inscriptions encore en attente après une semaine se terminent au lieu de rester bloquées indéfiniment.
curl -X POST https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s/activate \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Mettre en pause une automatisation
POST https://api.mail.land/v1/marketing/automations/{id}/pauseMet l'automatisation en pause. Aucun nouvel abonné n'est inscrit, et les abonnés déjà dans la séquence n'avancent plus : chaque inscription s'arrête à son étape actuelle. Réactiver l'automatisation reprend chaque inscription arrêtée là où elle en était, en livrant tout ce qui était dû pendant la pause.
curl -X POST https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s/pause \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Archiver une automatisation
POST https://api.mail.land/v1/marketing/automations/{id}/archiveArchive l'automatisation, ce qui peut être fait depuis n'importe quel statut, y compris Active. Les automatisations archivées sont masquées des vues de liste par défaut.
L'archivage arrête à la fois les nouvelles inscriptions et les étapes suivantes pour les abonnés déjà inscrits : chaque inscription s'arrête à son étape actuelle, comme la mise en pause. Contrairement à la pause, aucun point de terminaison ne permet de réactiver une automatisation Archived, donc cet arrêt ne se résout pas de lui-même.
curl -X POST https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s/archive \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Dupliquer une automatisation
POST https://api.mail.land/v1/marketing/automations/{id}/duplicate?name=Copy%20of%20Welcome%20SeriesCrée une nouvelle automatisation en Draft avec les étapes et paramètres clonés. Le paramètre de requête name est optionnel.
curl -X POST "https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s/duplicate?name=Copy%20of%20Welcome%20Series" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Déclencher manuellement
POST https://api.mail.land/v1/marketing/automations/{id}/trigger{
"subscriberIds": ["3m8k1p9x4q7n2z", "6q2n9k4x1p8m3z", "1x7m3q8k2n9p4z"]
}Inscrit manuellement des abonnés spécifiques dans l'automatisation. L'automatisation doit être Active et son type de déclencheur doit être 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"]}'Suivi des inscriptions
La progression de chaque abonné à travers l'automatisation est suivie comme une inscription :
| Statut | Valeur | Description |
|---|---|---|
Active | 0 | En cours de progression à travers les étapes |
Paused | 1 | Inscription mise en pause |
Completed | 2 | Toutes les étapes terminées |
Failed | 3 | Une étape SendEmail n'a pas de modèle dans ce tenant : absent depuis le début ou supprimé depuis. Compté dans le totalFailed de l'automatisation |
Unsubscribed | 4 | L'abonné s'est désabonné pendant la séquence |
Il n'existe pas de statut d'inscription Cancelled. La réponse des détails de l'automatisation inclut les compteurs agrégés d'inscriptions sous forme de totalEnrolled et totalCompleted (et non totalEnrollments/activeEnrollments/completedEnrollments/failedEnrollments).
Supprimer une automatisation
DELETE https://api.mail.land/v1/marketing/automations/{id}Supprime définitivement l'automatisation, ses étapes et les données d'inscription.
La mise à jour et la suppression sont autorisées pour n'importe quel statut sauf Active : pas seulement Draft/Paused (mise à jour) ou Draft/Archived (suppression) comme l'indiquaient les versions précédentes de cette page.
curl -X DELETE https://api.mail.land/v1/marketing/automations/4f8k2m9p1q6z3s \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Réponses d'erreur
| Statut | Code | Description |
|---|---|---|
400 | VALIDATION_FAILED | Champs obligatoires manquants ou configuration d'étape invalide, y compris une étape SendEmail sans templateId ou une étape Condition avec des settings non évaluables |
400 | TEMPLATE_NOT_FOUND | Le templateId d'une étape SendEmail ne correspond à aucun modèle de votre tenant |
400 | INVALID_REQUEST | Le nom de l'automatisation existe déjà ou transition de statut invalide |
403 | FORBIDDEN | Permissions insuffisantes |
404 | RESOURCE_NOT_FOUND | Automatisation non trouvée, ou la transition de statut est invalide (mise à jour/activation/pause dans le mauvais statut, suppression d'une automatisation Active) |
Les endpoints d'automatisations ne renvoient jamais 422.