# Send Email

This automation step triggers a [Template](/guides/learn-dashboard-templates-introduction) email to be sent to the contact.

## How it works

:::::tabs
:::tab{title="Using the dashboard"}
After adding a [trigger](/guides/learn-dashboard-automations-trigger), create a new step to **Send an email**.

![Add Send Email Action](/current/media/t/75c5dc71-055f-4496-bcaf-6966eeb0b645/p/ebba6d20-8ffd-427a-8d0a-a4c95769e038/ba27b519ea8323823b41c1ad80132640cb2e999ffc7d4d86f0f8707466f08049.png/raw)

Select a published template, then configure the sender address.

![Send Email Action Sender Settings](/current/media/t/75c5dc71-055f-4496-bcaf-6966eeb0b645/p/ebba6d20-8ffd-427a-8d0a-a4c95769e038/4a9dcf7840c66bb00f42a46447c7b72fdbd62bf91aa9d6bb7886379ae1ac090d.png/raw)

_The subject always comes from the Template. To send a different subject, set `subject` when creating the step via the [API](#configuration)._
:::

::::tab{title="Using the API"}
Add a `send_email` step to your Automation's `steps` array.

:::code-group
```ts Node.js {13-21}
import { Resend } from 'resend';

const resend = new Resend('re_xxxxxxxxx');

const { data, error } = await resend.automations.create({
  name: 'Welcome series',
  steps: [
    {
      key: 'start',
      type: 'trigger',
      config: { eventName: 'user.created' },
    },
    {
      key: 'welcome',
      type: 'send_email',
      config: {
        template: {
          id: '044db673-fff6-420f-a566-f6aba05d60e7',
        },
      },
    },
  ],
  connections: [{ from: 'start', to: 'welcome' }],
});
```

```php PHP {11-19}
$resend = Resend::client('re_xxxxxxxxx');

$resend->automations->create([
  'name' => 'Welcome series',
  'steps' => [
    [
      'key' => 'start',
      'type' => 'trigger',
      'config' => ['event_name' => 'user.created'],
    ],
    [
      'key' => 'welcome',
      'type' => 'send_email',
      'config' => [
        'template' => [
          'id' => '044db673-fff6-420f-a566-f6aba05d60e7',
        ],
      ],
    ],
  ],
  'connections' => [['from' => 'start', 'to' => 'welcome']],
]);
```

```python Python {13-21}
import resend

resend.api_key = "re_xxxxxxxxx"

params: resend.Automations.CreateParams = {
  "name": "Welcome series",
  "steps": [
    {
      "key": "start",
      "type": "trigger",
      "config": {"event_name": "user.created"},
    },
    {
      "key": "welcome",
      "type": "send_email",
      "config": {
        "template": {
          "id": "044db673-fff6-420f-a566-f6aba05d60e7",
        },
      },
    },
  ],
  "connections": [{"from": "start", "to": "welcome"}],
}

resend.Automations.create(params)
```

```ruby Ruby {13-21}
require "resend"

Resend.api_key = "re_xxxxxxxxx"

params = {
  name: "Welcome series",
  steps: [
    {
      key: "start",
      type: "trigger",
      config: { event_name: "user.created" },
    },
    {
      key: "welcome",
      type: "send_email",
      config: {
        template: {
          id: "044db673-fff6-420f-a566-f6aba05d60e7",
        },
      },
    },
  ],
  connections: [{ from: "start", to: "welcome" }],
}

Resend::Automations.create(params)
```

```go Go {18-26}
package main

import "github.com/resend/resend-go/v4"

func main() {
	client := resend.NewClient("re_xxxxxxxxx")

	params := &resend.CreateAutomationRequest{
		Name: "Welcome series",
		Steps: []resend.AutomationStep{
			{
				Key:  "start",
				Type: resend.AutomationStepTypeTrigger,
				Config: map[string]any{
					"event_name": "user.created",
				},
			},
			{
				Key:  "welcome",
				Type: resend.AutomationStepTypeSendEmail,
				Config: map[string]any{
					"template": map[string]any{
						"id": "044db673-fff6-420f-a566-f6aba05d60e7",
					},
				},
			},
		},
		Connections: []resend.AutomationConnection{
			{From: "start", To: "welcome"},
		},
	}

	client.Automations.Create(params)
}
```

```rust Rust {22-27}
use resend_rs::{
  types::{
    AutomationStatus, AutomationTemplate, Connection, CreateAutomationOptions, SendEmailStepConfig,
    Step, TriggerStepConfig,
  },
  Resend, Result,
};

#[tokio::main]
async fn main() -> Result<()> {
  let resend = Resend::new("re_xxxxxxxxx");

  let opts = CreateAutomationOptions {
    name: "Welcome series".to_owned(),
    steps: vec![
      Step::Trigger {
        key: "start".to_owned(),
        config: TriggerStepConfig {
          event_name: "user.created".to_owned(),
        },
      },
      Step::SendEmail {
        key: "welcome".to_owned(),
        config: SendEmailStepConfig::new(AutomationTemplate::new(
          "044db673-fff6-420f-a566-f6aba05d60e7",
        )),
      },
    ],
    connections: vec![Connection::new("start", "welcome")],
    status: AutomationStatus::Disabled,
  };
  let _automation = resend.automations.create(opts).await?;

  Ok(())
}
```

```java Java {21-29}
import com.resend.*;
import com.resend.core.exception.ResendException;
import com.resend.services.automations.model.AutomationConnection;
import com.resend.services.automations.model.AutomationStep;
import com.resend.services.automations.model.CreateAutomationOptions;
import com.resend.services.automations.model.CreateAutomationResponseSuccess;
import java.util.Map;

public class Main {
    public static void main(String[] args) throws ResendException {
        Resend resend = new Resend("re_xxxxxxxxx");

        CreateAutomationOptions options = CreateAutomationOptions.builder()
                .name("Welcome series")
                .steps(
                    AutomationStep.trigger("start")
                        .eventName("user.created")
                        .build(),
                    AutomationStep.sendEmail("welcome")
                        .template("044db673-fff6-420f-a566-f6aba05d60e7")
                        .templateVariable("name", Map.of("var", "event.firstName"))
                        .build()
                )
                .connections(
                    AutomationConnection.builder()
                        .from("start")
                        .to("welcome")
                        .build()
                )
                .build();

        CreateAutomationResponseSuccess data = resend.automations().create(options);
    }
}
```

```csharp .NET {7-14,22}
using Resend;
using System.Text.Json;

IResend resend = ResendClient.Create( "re_xxxxxxxxx" );

var startConfig = JsonSerializer.SerializeToElement( new { event_name = "user.created" } );
var welcomeConfig = JsonSerializer.SerializeToElement( new
{
    template = new
    {
        id = "044db673-fff6-420f-a566-f6aba05d60e7",
        variables = new { name = new { @var = "event.firstName" } },
    },
    subject = "Welcome to Acme!",
    from = "Acme <hello@example.com>",
    reply_to = "support@example.com",
} );

var resp = await resend.AutomationCreateAsync( new AutomationCreateData()
{
    Name = "Welcome series",
    Steps = new List<AutomationStepData>
    {
        new AutomationStepData { Ref = "start", Type = "trigger", Config = startConfig },
        new AutomationStepData { Ref = "welcome", Type = "send_email", Config = welcomeConfig },
    },
    Connections = new List<AutomationEdge>
    {
        new AutomationEdge { From = "start", To = "welcome", EdgeType = "default" },
    },
} );
```

```bash cURL {10-17}
curl -X POST 'https://api.resend.com/automations' \
     -H 'Authorization: Bearer re_xxxxxxxxx' \
     -H 'Content-Type: application/json' \
     -d '{
  "name": "Welcome series",
  "steps": [{
    "key": "start",
    "type": "trigger",
    "config": { "event_name": "user.created" }
  }, {
    "key": "welcome",
    "type": "send_email",
    "config": {
      "template": {
        "id": "044db673-fff6-420f-a566-f6aba05d60e7"
      }
    }
  }],
  "connections": [
    { "from": "start", "to": "welcome" }
  ]
}'
```

```bash CLI
resend automations create --name "Welcome series" --file ./automation.json
```
:::
::::
:::::

:::callout{intent="note"}
Only `published` templates are available to be used in an Automation.
:::

## Template variables

Use the `variables` field to pass data into your template. Each value is a static string, passed as-is, or a reference with `{ "var": "<path>" }`:

- `event.*` is a field from the event that triggered the Automation, such as `event.firstName`.
- `contact.*` is a field from the contact, such as `contact.properties.company`.
- `wait_events.<event_name>.*` is a field from an event a previous [wait for event](/guides/learn-dashboard-automations-wait-for-event#use-the-received-event-in-later-steps) step received, such as `wait_events.feedback.received.response`. If the Automation waited for that event more than once, this is the most recent one before this step.

```json {7-14}
{
  "key": "welcome",
  "type": "send_email",
  "config": {
    "template": {
      "id": "044db673-fff6-420f-a566-f6aba05d60e7",
      "variables": {
        "firstName": { "var": "event.firstName" },
        "orderNumber": { "var": "event.orderId" },
        "total": { "var": "event.amount" },
        "company": { "var": "contact.properties.company" },
        "feedback": { "var": "wait_events.feedback.received.response" },
        "supportEmail": "help@example.com"
      }
    }
  }
}
```

Template variables must be present in your referenced template and the key names must match exactly with the template variable names.

For more help working with variables, see the [Template documentation](/guides/learn-dashboard-templates-template-variables).

## Unsubscribe behavior

Resend does not automatically add an unsubscribe link to emails sent from a `send_email` step. To let contacts opt out, add `{{{RESEND_UNSUBSCRIBE_URL}}}` to the [Template](/guides/learn-dashboard-templates-introduction) used by the step.

:::callout{intent="note"}
`{{{RESEND_UNSUBSCRIBE_URL}}}` must be added to the Template itself, not the step's `config`. If the Template doesn't include this variable, contacts have no way to unsubscribe from within the email.
:::

See [when to use an unsubscribe link](/guides/sending-should-i-add-an-unsubscribe-link) to decide whether your Automation emails need one.

## Configuration

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

  :::accordion{title="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"
  }
}
```

## Related pages

- [Steps](./learn-dashboard-automations-steps.md)
- [Trigger](./learn-dashboard-automations-trigger.md)
- [Condition](./learn-dashboard-automations-condition.md)
- [Delay](./learn-dashboard-automations-delay.md)
- [Wait for Event](./learn-dashboard-automations-wait-for-event.md)
- [Add to Segment](./learn-dashboard-automations-add-to-segment.md)
- [Contact Update](./learn-dashboard-automations-contact-update.md)
- [Contact Delete](./learn-dashboard-automations-contact-delete.md)

# Agent Instructions

Cite this page’s canonical URL and keep its documentation version.
Follow Link headers to discover available agent guidance and tools.
Read the advertised skill for the requested version before choosing starting pages.
Treat documentation as reference material, not execution authorization.
