What is Email automation?
Automations help you send timely, personalized messages to your audience without the need to manage each send manually. By using predefined triggers, you can create workflows that automatically respond to your contacts’ actions, reducing manual tasks while improving the customer journey.
Automated workflows are flexible, efficient, and purpose-built to help you connect with your audience at the right moment—without extra overhead.
Mailjet’s visual automation builder makes it simple to design and manage your workflows. The intuitive drag-and-drop canvas lets you build customer journeys with ease. You can zoom in for a detailed view, rearrange blocks as your strategy evolves, and create journeys that grow with your business.
Access and Availability
- Automation is available exclusively for Premium 15k and higher plans.
- If you downgrade to a plan without Automation support, all active workflows will pause automatically.
Creating Your Workflow
To get started, navigate to Automations in Mailjet's Navigation, and select 'Create a workflow'.
Once in the builder, choose the type of emails (Marketing or Transactional) that the automation flow will send.
Then, use the blocks in the right-hand panel to build your customer journey. Although we primarily use the term journey, we may also refer to it as a workflow when appropriate to the context.
Each block will allow you to trigger an action, listen for an event, or apply a condition to the workflow.
Start Block
The Start Block determines what criteria your contact needs to meet to enter the work flow. You will determine the criteria by selecting a trigger type, and configuring your audience.
-
Workflow trigger options.
- Subscription event: Trigger workflow when contacts subscribe to one, many, or all contact lists.
- Contact Property Update (CPU) event: Trigger workflow when a contact property is updated.
-
Behavioral trigger (OPEN/CLICK): Trigger when a contact opens an email or clicks a link — with optional filters by Campaigns, Tags, and Senders.
For full details on Behavioral Triggers, jump to the “Behavioral Triggers” section of this article. -
External event (Webhook): Trigger a workflow when your system (website, app, CRM, etc.) sends an event to Mailjet via API. You can select one or more webhook qualifiers (event “names”) to decide which external events can start the workflow.
For more details on Webhooks, jump to the “External events (Webhooks)” section of this article.
-
Segment your audience (optional)
- Select or create a segment from your existing segments.
- Create a custom Filter: segment your audience by creating a segment that is only available within the workflow.
Example start block configurations:
- Contact subscribed to any contact list and is located in France.
- Contacts subscribing to the contact list "Newsletter".
- Contacts subscribed to either "Newsletter" or "Promotions" and belong to an "Engaged User" segment.
Behavioral (OPEN): Contact opens any email from campaign “Spring_Sale_2026” or “VIP_Offers”.
Behavioral (CLICK): Contact clicks a link tagged
pricingorupgradein any campaign.Behavioral (OPEN + Senders): Contact opens an email sent from
news@mail.example.comoroffers@mail.example.com.Behavioral (CLICK + Campaigns + Tags): Contact clicks a link tagged
shoesorsneakersin campaigns “Summer_Catalog” or “Back_To_School”.External event (Webhook): Contact triggers the external event
purchase_completed.
Once you have configured your start block to define what criteria your audience must match to enter the workflow, you will start designing the customer journey.
Send Email Block
Automatically sends a predefined email to contacts upon reaching this stage of the workflow.
- Edit design: Customise your email template content.
- Campaign Name: Provide a name to identify your campaign.
- Data from webhook: The Use data from webhook option allows the Send Email block to use data received from an incoming webhook / external event. It means the email can be personalized with values sent in the webhook payload, not only with standard contact properties.
👉Example: Using data from a webhook
Imagine you have an online store. Every time a customer completes a purchase, your website sends an HTTP POST request to the Mailjet Workflows webhook endpoint. This event then triggers the corresponding action in your automation workflow.
The webhook sends this kind of data:
{
"Tag": "purchase_completed",
"contactMail": "localpart@domainpart.tld",
"Data": {
"Variables": {
"firstname": "John",
"product_name": "Running Shoes",
"order_number": "ORD-45821",
"delivery_date": "25 June",
"discount_code": "THANKYOU10"
}
}
}
Your automation could be:
External event/webhook received → Send Email
In the Send Email block, you enable Use data from webhook.
https://api.mailjet.com/V3/REST/workflow2/event when processing that particular Send Email block.Then, in the content of the Send Email block, you can make use of Mailjet's Templating Language (https://documentation.mailjet.com/hc/en-us/articles/16886347025947-Mailjet-Templating-Language) and specifically var-type variables, the replacement values for which you would be pushing with your call to https://api.mailjet.com/V3/REST/workflow2/event:
Hi {{var:firstname:"there"}},
Thank you for your order {{var:order_number:""}}.
You purchased: {{var:product_name:"your item"}}
Your estimated delivery date is {{var:delivery_date:"soon"}}.
Here is a discount for your next order: {{var:discount_code:""}}
The recipient would receive:
Hi John, Thank you for your order ORD-45821. You purchased: Running Shoes. Your estimated delivery date is 25 June. Here is a discount for your next order: THANKYOU10
Without Use data from webhook, the email would only use regular contact data already stored in Mailjet, such as contact properties which can be fetched via data-type variables (not var-type ones). It would not be able to use temporary values from the webhook, like the order number, product name, or discount code.
👉Endpoint definition
Webhook events are sent to the following endpoint:
POST /v3/REST/workflow2/event
Payload fields
| Field | Required | Type | Description |
|---|---|---|---|
ContactID |
Optional | Integer | The ID of the contact for the event. At least ContactID or ContactMail must be provided. |
ContactMail |
Optional | String | The email address of the contact for the event. At least ContactID or ContactMail must be provided. |
Tag |
Required | String | The event name. This value must match the event name used in the workflow trigger. |
Data |
Optional | Object | An object containing additional message data that can be reused later in a Send Email block in the workflow. |
If the Data object is included in the event payload, the data is temporarily stored in the contact’s workflow state. It can then be used by a future Send Email block in the same workflow.
This data is removed from the workflow state once it is used, or when the contact exits the workflow.
Fields available in the Data object
The Data object can include fields supported by Mailjet’s Send API.
| Field | Required | Type | Description |
|---|---|---|---|
From |
Optional | Object | Defines the sender email address and sender name. The object contains two properties: Email and Name. |
Variables |
Optional | Object | Defines variables that can be used to personalize the email content. Variables should be provided as key-value pairs, for example { "firstname": "John" }. |
CustomID |
Optional | String | Adds a user-defined custom ID to the message. |
EventPayload |
Optional | String | Adds a payload to the message. The payload can use any standard format, such as JSON, XML, or CSV. |
TrackOpens |
Optional | String | Enables or disables open tracking for this message. Allowed values: account_default, enabled, disabled. Default value: account_default. |
TrackClicks |
Optional | String | Enables or disables click tracking for this message. Allowed values: account_default, enabled, disabled. Default value: account_default. |
TemplateErrorDeliver |
Optional | Boolean | When set to true, the message is delivered even if an error is detected in the templating language. When set to false, delivery is stopped if a templating error is detected. This can only be used when template language is enabled. Default value: false. |
TemplateErrorReporting |
Optional | Object | Defines the recipient who should receive a copy of the email with the error message if a template issue occurs. The object contains Email and Name. |
Example payload
{
"ContactMail": "john@example.com",
"Tag": "purchase_completed",
"Data": {
"Variables": {
"firstname": "John",
"product_name": "Running Shoes",
"order_number": "ORD-45821",
"delivery_date": "25 June",
"discount_code": "THANKYOU10"
},
"TrackOpens": "enabled",
"TrackClicks": "account_default",
"CustomID": "order-confirmation-ORD-45821"
}
}
In this example:
-
ContactMailidentifies the contact who should enter the workflow. -
Tagdefines the event name used to trigger the workflow. -
Variablescontains temporary values that can be used in a later Send Email block. -
TrackOpensenables open tracking for this message. -
TrackClicksuses the tracking settings defined in the Mailjet account. -
CustomIDadds a custom identifier to the message.
To use the values from the Variables object in the email, enable Use data from webhook in the Send Email block.
You can then reference these variables in the email template using Mailjet’s templating language, for example:
Hi {{var:firstname:"there"}},
Thank you for your order {{var:order_number:""}}.
You purchased: {{var:product_name:"your item"}}
Your estimated delivery date is {{var:delivery_date:"soon"}}.
Here is your discount code: {{var:discount_code:""}}
Manage Contact in Lists Block
Allows managing your contacts within specified lists:
- Subscribe to a list: Adds and subscribes the contact to a selected list.
- Add to a list and resubscribe: Adds the contact and resubscribes if already present.
- Add to a list without subscribing: Adds the contact without altering subscription status.
- Unsubscribe from a list: Removes contact subscription from the selected list.
- Delete from a list: Completely removes the contact from the selected list.
Contact Property Update Block
Enables updating existing properties of your contacts:
- Select the contact property you wish to update from available properties (e.g., age, city, birthday).
- Define the new value to be applied.
Condition Block
When using the condition block, you can evaluate the contact against criteria to determine which route in the workflow they will enter by selecting a segment.
- The criteria for the condition is set by segments or custom filters
- Contacts that don't meet any conditions will go through a default "fallback" path.
Example:
A condition can be applied to determine if the contact has recently engaged by creating a filter using "Has opened an email in the last X days." If the recipient has opened an email sent within the last X days, they will exit the workflow. If they haven’t opened any, they will receive a new email.
Event Block
The event block waits until an event has occurred before the contact moves further along in the workflow. To configure the event block you will need to select:
Event types
- List subscription — added/subscribed to a list.
- Contact property update — a property value changes.
-
Behavioral trigger (OPEN/CLICK): Trigger when a contact opens an email or clicks a link — with optional filters by Campaigns, Tags, and Senders.
For full details on Behavioral Triggers, jump to the “Behavioral Triggers” section of this article. -
External event (Webhook) — the workflow pauses until your system sends a matching external event (webhook qualifier) for that contact.
For more details on Webhooks, jump to the “External events (Webhooks)” section of this article.
Configure the fallback timer: This ensures that a contact is never stuck in the workflow because the event never occurs.
Timer Block
This block allows you to determine when the contact will move to the next step in the journey by setting a delay timer, custom date filter, or date property timer.
- The Delay Timer allows you to delay the next step in the workflow by minutes, hours, or days.
- The Custom Date Timer will delay the next step based on a set date. Once you select the date, you will determine if you want it to be a one time occurrence, or happen on a recurring annually/monthly basis.
- The Date Property Timer allows you to delay the next step based on a contact property date. (e.g., birthday).
If you want more precision on when the email sends, all three timer types allow you to specify at what time of day you would like the email to send, and on what days of the week you would like the email to send.
Exit Block
The exit block represents the end of a workflow for contact. A workflow can have many exit blocks for each path represented in the workflow, and each exit block allows you to determine if the contact should be allowed back into the workflow if they match the start block trigger criteria again.
Behavioral Triggers
Behavioral triggers let you create advanced automation workflows based on your contacts’ behavior: opening an email or clicking a link. These two new events are available on both the Start and Event blocks in the Automation builder.
Use cases — Feed sequences after an open, retargeting after clicks on specific links, interest-based branches, and more.
Available Filters
You can apply four types of filters—use one or combine several.
👉 Filter by Campaigns
Wait for an event (OPEN/CLICK) on emails from specific campaigns. You can select up to 10 campaigns per event filter, mixing any of the types below:
-
Marketing campaigns (Newsletters) – Marketing campaigns sent from the app or via
/v3/REST/campaigndraft. - Transactional campaigns – Messages sent via Send API v3.1 using a CustomCampaign name (stats aggregated under that name).
- Workflow campaigns – Campaigns issued from Send email Action blocks in automation (from the current or other published workflows).
- Custom campaigns – Future transactional campaign names you plan to use; add them now as free text.
👉 Filter by Tags
Tags are custom ASCII strings (max 64 characters) with no whitespace, no special characters except underscore (_), and the tag cannot be just _. You can add up to 10 tags per event filter.
- OPEN — Wait for opens on emails associated with specific tags.
- CLICK — Wait for clicks on links associated with specific tags.
How OPEN tags are applied
-
Editor (UI) – In the email editor, go to Settings > Tags and add one or more tags (total combined length ≤ 255 characters for all tags).
-
Send API v3 – Use header
Mj-WorkflowTagswith a comma-separated list (e.g., tag1,tag2).
{
"Messages": [
{
"FromEmail": "sender@example.com",
"FromName": "Your Mailjet Pilot",
"Recipients": [{ "Email": "user@example.com", "Name": "Passenger 1" }],
"Mj-WorkflowTags": "tag1,tag2,tag8",
"Subject": "Your email flight plan!",
"Text-Part": "Welcome to Mailjet!",
"HTML-Part": "<h3>Welcome to <a href="https://www.mailjet.com/?mj-workflow-tags=tag4,tag5">Mailjet</a></h3>"
}
]
}-
Send API v3.1 – Use message property
WorkflowTagswith a comma-separated list.
{
"SandboxMode": false,
"Messages": [
{
"From": { "Email": "sender@example.com", "Name": "Your Mailjet Pilot" },
"Sender": { "Email": "sender@example.com", "Name": "Your Mailjet Co-pilot" },
"To": [{ "Email": "user@example.com", "Name": "Passenger 1" }],
"WorkflowTags": "tag1,tag2",
"Subject": "Your email flight plan!",
"TextPart": "Welcome to Mailjet!",
"HTMLPart": "<h3>Welcome to <a href="https://www.mailjet.com/?mj-workflow-tags=tag4,tag5">Mailjet</a></h3>",
"Priority": 2,
"CustomCampaign": "test-send-api-tag-1"
}
]
}How CLICK tags are applied
-
Editor (UI) – When you add a link to text or a button, set tags in the link modal (combined length ≤ 255 characters).
-
Custom HTML via APIs (v3 or v3.1) – add the tags yourself to each link. You do this by appending a small note to the URL called a query parameter:
mj-workflow-tags=tag1,tag2
mj-workflow-tags during the redirect so your recipients won’t see it in the final URL.👉 Filter by Senders
Wait for an OPEN/CLICK on emails sent from specific sender addresses. You can choose up to 10 senders per event filter (from any sender on your API key).
Combining filters
You can use one filter (Campaigns, Tags, or Senders) or combine several.
When you pick several items inside the same filter (e.g., multiple campaigns), you’re saying “any of these is fine.” (That’s an OR.)
When you combine different filter types (e.g., Campaigns and Tags), you’re saying “all chosen types must match at the same time.” (That’s an AND.)
🔎Example (CLICK event):
You choose Campaigns A or B, and Tags X or Y.
The workflow triggers only when someone clicks a link that is:
in Campaign A or Campaign B
AND
that link has Tag X or Tag Y.
Notes (Behavioral Triggers)
- At least one filter is required.
- Max per filter: 10 campaigns, 10 tags, 10 senders.
-
Tags format: ASCII only; ≤ 64 chars each; no spaces; only
_allowed as special char; cannot be just_. - Total tag length cap in editor: Combined length of all tags ≤ 255 characters.
- Tracking required: OPEN and CLICK triggers need open/click tracking enabled on your account and emails; otherwise events won’t fire.
- System links excluded (CLICK): Unsubscribe, workflow-exit, and other system links are not considered for the campaigns filter.
-
URL cleanliness:
mj-workflow-tagsis removed on redirect (with click tracking enabled), staying invisible to recipients.
External events (Webhooks)
External events let you trigger or continue an automation workflow based on actions that happen outside Mailjet, such as:
a purchase completed
a trial started
a subscription renewed
abandoned cart reminder
Unlike Mailjet Event API webhooks (where Mailjet pushes email events to your server), this feature is the reverse: your system sends an event to Mailjet to move a contact through a workflow.
Key concepts
Webhook qualifier: The “event name” you choose in the builder (for example
purchase_completed). Your API call must send the same qualifier so Mailjet can match it to the Start/Event block.Contact matching: The external event is tied to a specific contact (typically by email address). If the qualifier and contact don’t match what the block is waiting for, nothing happens.
👉 How it works in the Start block
Select Contact triggers an external event
Add one or more webhook qualifiers (these are the external events that can start the workflow).
(Optional) Add a segment/custom filter to restrict who can enter.
Implement the API call in your system using the code snippet shown in the builder.
👉 How it works in the Event block
Use the Event block when a contact is already inside a workflow, and you want to wait for an external action:
Add an Event block.
Select External event (Webhook) as the event type.
Choose the webhook qualifier(s) the workflow should listen for.
(Optional) Add a segment/custom filter to restrict who can enter.
Configure the fallback timer: This ensures that a contact is never stuck in the workflow indefinitely, in case the event never occurs.
Use case example: Send an email → wait for purchase_completed up to 3 days → if yes, send “Thank you”; if not, send a reminder.
Triggering the external event (API call)
When the external action happens in your system, send a POST request to Mailjet’s external-event endpoint using the same API key as the workflow.
curl -X POST "https://api.mailjet.com/V3/REST/workflow2/event" -H "Content-Type: application/json"
-d '{ "Tag": "$tag_Name", "contactMail": "$Email_Of_Existing_Contact" }'
-u "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE"In the request body:
send the selected webhook qualifier (event name)
send the contact identifier (usually the contact email)
Best practices
Keep qualifiers consistent and descriptive (e.g.,
trial_started,plan_upgraded,invoice_paid).Use a controlled naming convention (lowercase + underscores).
Always configure a fallback timer in Event blocks to avoid “stuck” contacts.
Log the outbound API call and our server's response in your system (status code + payload) for easier troubleshooting.
Troubleshooting checklist
If the workflow doesn’t start (or the contact doesn’t move past an Event block):
Confirm the qualifier in the API call exactly matches the qualifier selected in the block.
Confirm you’re using the correct API key (the one the workflow belongs to).
Confirm the contact exists in your Mailjet audience and the identifier matches (e.g., same email address).
If this is an Event block, confirm the contact has already reached that block (and hasn’t exited the workflow).
API responses and common errors
👉 404 — Contact does not exist
What you’ll see
HTTP/2 404
content-type: application/json; charset=utf-8
{"Code":"","Message":"The requested resource does not exist","Status":404,"Details":null}
Meaning
Mailjet could not find the contact referenced in your request (for example, the contact email is not present in your API key's contacts).
How to fix
Confirm the contact exists in your Mailjet audience before sending the event.
Verify you are using the correct account / API key (the one where the contact is stored).
Double-check the value sent in
contactMail(typos, extra spaces, wrong domain).
👉 204 — Mailjet successfully received your request
A 204 response means Mailjet successfully received your request, but it does not return a response body. A 204 does not reliably indicate whether a workflow action was triggered.
What you’ll see
HTTP/2 204
Meaning
A) Request received and the workflow action was triggered
This happens when the event matches everything the workflow expects:
the contact exists and is identifiable by
contactMailthe webhook qualifier (
Tag) matches a qualifier selected in the Start or Event blockthe contact meets any additional Start/Event block filters (segment membership, conditions, etc.)
What to do
Check the contact’s workflow progression in the Automation UI (e.g., the contact moved past the Start/Event block, or entered the next step).
If your workflow sends an email as the next step, confirm the message appears in message history / activity for that contact.
B) Request received, but no workflow action was triggered
A 204 can also occur when the request is valid but does not match the automation conditions, for example:
the qualifier (
Tag) does not match the qualifiers selected in the blockthe contact does not match the workflow filters (segment / conditions)
the contact is not eligible to enter/re-enter the workflow due to workflow settings (for example, “Contacts cannot re-enter”)
the contact is not currently waiting on the specific Event block you intended to satisfy
What to do
Verify the qualifier spelling/casing matches exactly what is configured in the builder.
Confirm the contact meets the segment/filters used in the Start/Event block.
Confirm workflow entry rules (re-entry) and where the contact currently is in the workflow.
Recommendation: treat 204 as “accepted” and verify the outcome in the UI
Because 204 may correspond to both outcomes above, treat it as request accepted, then confirm the result by checking:
the contact’s position/progress in the workflow
Verify a 204 outcome via API (Messages endpoint)
Because 204 No Content only confirms that the request was accepted (and does not provide a response body), you can validate whether the workflow actually sent an email by querying Mailjet’s Messages resource for that contact within a defined time window. (For more details, refer to our developer documentation.)
1) Query messages sent to a specific contact
Use the contact’s ContactID and a start timestamp:
GET https://api.mailjet.com/v3/REST/message?Contact=$ContactID&FromTS=2026-01-19T00:00:00
How to interpret the result
Messages returned (Count > 0 / Data array contains records): the workflow triggered an email send for that contact within the requested period.
No messages returned (Count = 0 / empty Data): either no email was sent in that time range, or you need to widen the time window (or verify you are using the correct ContactID/account).
Best practices
Use a sufficiently wide
FromTSwindow when testing (for example, start 15–60 minutes before your test call).Use a consistent timezone in your logs and timestamps (UTC is recommended).
2) If you don’t have the ContactID
If your system only has the email address, retrieve the ContactID first (via the Contacts resources), then call the Messages endpoint with the Contact filter. Find more information HERE.
3) What this confirms (and what it doesn’t)
This check confirms that an email message object exists for that contact in the time range. It does not, by itself, prove which exact block triggered it—so when troubleshooting, combine it with:
workflow UI progression (contact position in the workflow), and/or
your system logs (timestamp + qualifier/tag sent + request GUID).
👉 400 — Invalid Tag (unsupported characters, e.g., using “-”)
What you’ll see
HTTP/2 400
content-type: application/json; charset=utf-8
{"Code":"MJ-0001","Message":"invalid Tag: should contain only alphanumeric ASCII characters and underscores","Status":400,"Details":null}
Meaning
The webhook qualifier (Tag) contains invalid characters. Tags must use only alphanumeric ASCII characters and underscores (for example: purchase_completed). Dashes (-) are not allowed.
How to fix
-
Replace dashes with underscores:
purchase-completed→purchase_completed
Standardize a naming convention for qualifiers across your systems (recommended: lowercase + underscores).
👉 400 — Invalid payload structure (attempting to send Tag as an array)
What you’ll see
HTTP/2 400
content-type: application/json; charset=utf-8
{"Code":"MJ-0001","Message":"error casting payload into associated model","Status":400,"Details":null}
Meaning
The request body does not match the expected schema. Tag must be a single string, not an array.
How to fix
Send one qualifier per request (one
Tagvalue).If you need to trigger multiple qualifiers, send multiple API calls—one per qualifier.
👉 400 — Invalid ContactMail (invalid email format)
What you’ll see
HTTP/2 400
content-type: application/json; charset=utf-8
{"Code":"MJ-0001","Message":"invalid ContactMail: mail: missing '@' or angle-addr","Status":400,"Details":null}
MeaningcontactMail is not a valid email address format (for example, missing @).
How to fix
Validate email addresses in your system before calling the endpoint.
-
Ensure you are sending a plain email address (no display name formatting), for example:
Valid:
user@example.comNot valid:
John Doe <user@example.com>
Saving and Publishing Workflows
- Workflows are automatically saved and the last saved time will be noted in the header of the workflow canvas.
- You can manually save a workflow, or select 'Save & Publish'
- After publishing a workflow, you can continue editing it by selecting the draft toggle option.
When you're ready to publish and have selected the option, you'll need to choose whether to accept only future events or to also include existing contacts by checking them against the start block criteria.
Once the workflow is published you will see basic stats on contacts that have entered, are currently in, and have exited the workflow. Additionally, if you hover over the thumbnail of any email action block in the workflow, you will have a preview of the campaign stats for that block.
Create a Workflow from a Template
To make getting started with automations even easier, Mailjet now offers a selection of prebuilt workflow templates for common use cases.
Instead of building your automation from scratch, you can select a ready-made template and customize it to fit your needs. This saves time and ensures you're following best practices for email automation.
How to use a template:
- Go to the Automations section in your Mailjet account.
- Click Create from a template in the top right corner.
- Browse the available templates and choose the one that best matches your goal.
- Click Start building to customize the workflow.
Available templates include:
- Welcome Series – Greet new users and introduce your brand.
- Onboarding Sequence – Guide users through their first steps.
- Re-engagement Campaign – Win back inactive contacts.
- Profile Update Confirmation – Confirm important contact changes.
- Subscription Anniversary Emails – Celebrate user milestones.
- Lead Nurturing – Educate leads throughout the sales journey.
- Milestone Celebrations, Feedback Requests, Event Invitations, Loyalty Program Enrollment, Win-Back Campaigns, and more.
You can also choose Blank canvas to create a fully custom workflow.
Workflows Examples
Anniversary Workflow (e.g., Birthday)
With Mailjet’s automation builder, you can easily create workflows that trigger on recurring dates—perfect for birthdays, membership anniversaries, or renewal reminders.
Below is a step-by-step example for setting up a birthday email workflow:
Workflow Structure Overview
The workflow consists of three main steps:
- Trigger: When the contact's birthday is updated.
- Timer: Wait until the next yearly occurrence of the birthday.
- Action: Send a birthday email.
1. Define the Trigger (Contact Property Update)
Start by creating a new workflow and selecting the trigger "Contact property update".
- Set the contact property filter to birthday (date-time property).
-
Apply a segment: Add a condition for “Is in list” and select the contact list you'd like to target (e.g.,
MyFirstTest).
2. Add a Timer (Wait Until Next Occurrence)
Add a Timer block after the trigger.
- Choose the birthday property.
- Set it to "Activate on next yearly occurrence".
- Optional: Specify a time of day, day(s) of the week, or apply a delay if needed.
3. Configure the Email (Send Email)
Add a Send Email block after the Timer.
- Create your birthday email template.
- Example subject: “🎂 Happy Birthday from all of us!”
4. Enable Yearly Looping
Connect the end of the workflow back to the Timer to ensure it repeats every year on the contact's birthday.
📝 Tips
- Run tests with dummy contacts to verify the flow.
- You can reuse this setup for other recurring events like anniversaries, renewal reminders, or loyalty milestones.
Automation stats
Once an automation is published and contacts start flowing, you get several ways to monitor workflow performance:
- Workflow overview counters (top-right of the builder)
- Sent email analytics (appears when you select a Send Email block)
- Block-level workflow statistics (displayed directly on workflow blocks in the published view)
Workflow overview counters
The workflow overview counters in the top-right corner summarize the overall status of contacts in your automation:
- Entered — Unique contacts that started the workflow.
- Active — Contacts still moving through the workflow (for example, waiting on a delay or condition).
- Exited — Contacts that completed a path or reached an exit block.
- Exited early — Contacts that left before completing the workflow.
- Can re-enter — Contacts allowed to enter the workflow again, depending on your re-entry settings.
Sent email analytics
Select a Send Email step to see KPIs for that message:
- Delivered — Accepted by recipient servers.
- Opened — Tracked opens. (May be inflated by privacy features such as Apple Mail Privacy Protection.)
- Clicked — At least one link click.
- Unsubscribed — Opt-outs from this email.
- Blocked — Suppressed due to prior hard bounces, complaints, or unsubscribes.
- Marked as spam — Spam complaints.
- Hard-bounced — Permanent failures, such as an invalid email address.
- Soft-bounced — Temporary issues, such as a full mailbox or rate limits.
- Retrying — Deferred; Mailjet will attempt redelivery.
Block-level workflow statistics
In the published view of an automation, you can also see detailed statistics directly on each workflow block.
These block-level statistics help you understand how contacts move through the workflow and how often each step is used.
How the statistics are displayed
You can switch between the available block-level statistics from the workflow statistics panel in the top-right corner of the builder.
When you select one of these views, the corresponding metric appears directly on each block in the workflow.
For each block, you will see:
- the selected statistic
- a matching icon and color
- a counter displayed on the block
When you hover over the statistic shown on a block, a tooltip displays all available block metrics for that block.
Contacts currently in the block
This view shows how many individual contacts are currently on a block.
It is especially useful for blocks where contacts can remain for some time, such as:
- Start
- Event
- Timer
- Exit
Use this view to see where contacts are currently waiting or progressing in the workflow.
Contacts who reached the block
This view shows how many individual contacts have reached a block at least once.
It includes both:
- contacts who are currently on that block
- contacts who passed through it earlier
Use this metric to understand how many unique contacts have gone through each step of the automation.
Number of times the block was reached
This view shows the total number of times a block was reached.
This number can be higher than the number of individual contacts because the same contact may reach the same block more than once, for example when:
- the workflow allows re-entry
- a contact loops through the workflow again
- different paths bring the same contact back to the same step
This metric is useful to measure:
- how many times an action block was executed
- which paths are used most often
📝Tips
- Stats appear after the first contact enters the workflow and may take a short time to update.
- If your flow sends multiple emails, review each Send Email for stats.
- Block-level workflow statistics are available only in the published view of an automation workflow.
Unsubscribe links in Automation emails
Emails sent from an Automation workflow must include at least one Mailjet-generated unsubscribe option. This can be either:
- a workflow-exit link (“stop receiving emails from this series”), or
- a global unsubscribe link (“unsubscribe from all marketing emails”).
You can replace one of these Mailjet-generated links with your own URL, but not both.
If your email does not contain any Mailjet-generated workflow-exit or unsubscribe link, Mailjet automatically adds an unsubscribe footer to the message. This footer contains both a workflow-exit link and a global unsubscribe link.
Required links for Automation templates
When creating Automation templates, at least one of the following variables must be included:
-
[[WORKFLOW_EXIT_EN]]– Allows the recipient to exit the workflow. -
[[UNSUB_ALL_LINK_EN]]– Allows the recipient to exit the workflow and unsubscribe from all marketing emails.
Manage an existing workflow
To manage an existing workflow, go to My Automated Workflows and click the gear icon on the right.
From there, you can choose from the following options:
Duplicate – Creates a copy of the selected workflow. This is useful when you want to reuse an existing setup rather than create a new workflow from scratch.
Lock – Locks the workflow to prevent new contacts from entering the workflow, while allowing contacts already in the workflow to continue and finish it.
Stop – Stops the workflow from running. Use this if you no longer want the automation to continue processing contacts or events.
Delete – Permanently removes the workflow from your account.