Skip to main content
Resend Docs
current

Search documentation

Type to search this documentation.

On this pageOverview

Steps

Steps and their properties in Automation workflows.

Steps are the building blocks of Automation workflows. They define the actions that will be executed when the Automation runs.

Learn more about each available step in its dedicated guide:

Every step in an automation has common base properties: key, type, and a config object whose shape depends on the type of the step.

  • key (string, required) — A unique identifier for the step. Used in connection definitions to connect steps.
  • type (string, required) — The type of step. Possible values:

    • trigger
    • condition
    • delay
    • wait_for_event
    • send_email
    • add_to_segment
    • contact_update
    • contact_delete

Below is a list of all the possible step types and their configurations.

The trigger step starts the automation when a matching event is received.

  • config.event_name (string, required) — The name of the event that triggers the automation.
JSON
{
  "key": "start",
  "type": "trigger",
  "config": {
    "event_name": "user.created"
  }
}

Branches the workflow based on rules. Condition configs can be a single rule or a logical group (and/or) of rules.

  • config.type (string, required) — The type of condition node. Possible values:

    • rule
    • and
    • or

For rule type:

  • config.field (string, required) — The field to evaluate on a condition step. Use event. for the event that triggered the Automation, contact. for the contact, or wait_events. for an event received by a preceding wait for event step (for example, event.amount, contact.email, or wait_events.order.shipped.order_id). A wait for event filter_rule cannot use wait_events..

  • config.operator (string, required) — The comparison operator. Possible values:

    • eq: equals
    • neq: not equals
    • gt: greater than
    • gte: greater than or equal to
    • lt: less than
    • lte: less than or equal to
    • contains: contains a given value
    • starts_with: starts with a given value
    • ends_with: ends with a given value
    • exists: field exists
    • is_empty: field is empty
  • config.value (string | number | boolean | null | object) — The value to compare against on a condition step. Either a fixed value or a variable reference such as { "var": "event.order_id" }, using the condition namespaces: event. (the triggering event), contact., or wait_events. (a preceding wait for event). Not required for exists and is_empty operators.

For and / or types:

  • config.rules (object[], required) — An array of nested condition config objects. Must contain at least one item.

Single rule example:

JSON
{
  "key": "check_plan",
  "type": "condition",
  "config": {
    "type": "rule",
    "field": "event.plan",
    "operator": "eq",
    "value": "pro"
  }
}

Use and or or to combine multiple rules into a single branch:

JSON
{  "key": "check_plan_and_amount",  "type": "condition",  "config": {    "type": "and",    "rules": [      {        "type": "rule",        "field": "event.plan",        "operator": "eq",        "value": "pro"      },      {        "type": "rule",        "field": "event.amount",        "operator": "gte",        "value": 100      }    ]  }}

Pauses execution for a specified duration.

  • config.duration (string, required) — The delay duration in natural language (e.g. "1 hour", "3 days"). Maximum: 30 days.
Example
{
  "key": "wait_1_hour",
  "type": "delay",
  "config": {
    "duration": "1 hour"
  }
}

Pauses execution until a specific event is received or a timeout is reached.

  • config.event_name (string, required) — The name of the event to wait for.

  • config.timeout (string) — The maximum time to wait before timing out (e.g. "3 days", "1 hour"). Maximum: 30 days.

  • config.filter_rule (object) — An optional rule that filters which incoming events resume the step. wait_events. is not available.

    properties
    • type (string, required) — The type of filter rule. Possible values:
      • rule
      • and
      • or
    • field (string) — Required when type is rule. The payload field to evaluate. Use event. for the incoming event or contact. for the Automation's contact (for example, event.status or contact.email).
    • operator (string) — Required when type is rule. The comparison operator. Possible values:
      • eq: equals
      • neq: not equals
      • gt: greater than
      • gte: greater than or equal to
      • lt: less than
      • lte: less than or equal to
      • contains: contains a given value
      • starts_with: starts with a given value
      • ends_with: ends with a given value
      • exists: field exists
      • is_empty: field is empty
    • value (string | number | boolean | null | object) — Used when type is rule. The value to compare against. A fixed value, or a variable reference such as { "var": "event.order_id" }. event. is the event that triggered the Automation. contact. is the Automation's contact. Not required for exists and is_empty.
    • rules (object[]) — Required when type is and or or. An array of nested filter rules. Must contain at least one item.

This waits for order.paid only when it is the order that started the Automation. field reads order_id on the incoming event. value reads order_id on the triggering event.

Example
{  "key": "wait_for_payment",  "type": "wait_for_event",  "config": {    "event_name": "order.paid",    "timeout": "3 days",    "filter_rule": {      "type": "rule",      "field": "event.order_id",      "operator": "eq",      "value": { "var": "event.order_id" }    }  }}

Sends an email using a template.

  • config.template (object, required) — The published template to send. Provide id and optionally variables.

    properties
    • config.template.id (string, required) — The ID or alias of the template to send.
    • config.template.variables (object) — A key-value map of template variables. Each value can be a static string or a variable reference object ({ "var": "event.fieldName" }) that resolves dynamically from the event.*, contact.*, or wait_events.* namespaces.
  • config.from (string) — The sender email address.

    If provided, this value will override the template's default value.

  • config.subject (string) — The email subject line.

    If provided, this value will override the template's default value.

  • config.reply_to (string) — Reply-to email address.

    If provided, this value will override the template's default value.

JSON
{
  "key": "welcome",
  "type": "send_email",
  "config": {
    "template": {
      "id": "062f8ef4-fbfa-44f1-b5e0-ff8e1e8ffa96",
      "variables": {
        "name": { "var": "event.firstName" }
      }
    },
    "from": "hello@example.com",
    "subject": "Welcome!",
    "reply_to": "support@example.com"
  }
}

Adds the contact to a segment.

  • config.segment_id (string, required) — The ID of the segment to add the contact to.
Example
{
  "key": "add_to_vip",
  "type": "add_to_segment",
  "config": {
    "segment_id": "83a1e324-26dc-47eb-9b28-ba8b6d1fe808"
  }
}

Updates a contact's fields. Each field value can be either a hardcoded value or a dynamic variable reference using the { var: '...' } syntax.

Variable references use dot-notation with one of these scopes:

  • event.*: references a field from the triggering event payload (e.g., event.firstName).
  • contact.*: references a field from the current contact (e.g., contact.last_name, contact.properties.company).
  • config.first_name (string | object) — The contact's first name. Accepts a hardcoded string or a variable reference.

  • config.last_name (string | object) — The contact's last name. Accepts a hardcoded string or a variable reference.

  • config.unsubscribed (boolean | object) — The contact's unsubscribed status. Accepts a boolean or a variable reference.

  • config.properties (object) — A map of custom contact properties to update. Keys correspond to your Contact Custom Properties. Each value can be a hardcoded value (string, number, boolean) or a variable reference.

Example
{
  "key": "update_contact",
  "type": "contact_update",
  "config": {
    "properties": {
      "company": { "var": "event.company" },
      "vip": true
    }
  }
}

Deletes the contact from the audience. This step does not require any configuration fields. Pass an empty object {} as the config.

Example
{
  "key": "remove_contact",
  "type": "contact_delete",
  "config": {}
}
Suggest an edit

Propose a replacement for this page. The site team reviews it before applying any changes.

Export
Documentation menu