Search documentation

Search for pages in the documentation

Email Send

Send emails to recipients

The Email Send node sends emails to specified recipients. Use it for follow-up emails, notifications, reports, and any communication that should reach people via email.

Overview

PropertyValue
CategoryAction
Node IDsds.emailSend.perItem.in1.success1.error1 (per-item)
ds.emailSend.batch.in1.success1.error1 (batch)
Input Ports1
Success Outputs1
Error Outputs1
Execution ModePer-item or Batch
Timeout30 seconds
Retry StrategyExponential, 3 attempts
Side-EffectingYes

Configuration

ParameterTypeRequiredDescription
toCEL ExpressionYesRecipient email address
subjectLiquid TemplateYesEmail subject line
bodyLiquid TemplateYesEmail body content

To Parameter

Specify recipient using CEL expression:

From trigger/upstream data:

cel
json.attendee.email

Static recipient:

cel
"team@example.com"

From trigger:

cel
trigger.contactEmail

Subject Parameter

Email subject using Liquid template:

liquid
Meeting Follow-up: {{ json.meeting.title }}

Body Parameter

Email body using Liquid template:

liquid
Hi {{ json.attendee.name }},

Thank you for joining our meeting: {{ json.meeting.title }}.

Here's a summary of what we discussed:

{{ json.summary }}

Best regards,
{{ author.name }}

Input Schema

Accepts any data from upstream. Access it via json in templates.

Output Schema

Success Output

json
{
  "success": true,
  "messageId": "msg_abc123def456",
  "to": "john@example.com",
  "subject": "Meeting Follow-up: Q1 Planning",
  "sentAt": "2024-01-15T14:30:00Z"
}

Error Output

json
{
  "error": "INVALID_RECIPIENT",
  "message": "Invalid email address format",
  "to": "not-an-email"
}

Examples

Basic Example: Simple Follow-up

Send a simple follow-up after a meeting.

Configuration:

To: json.attendee.email

Subject:

liquid
Thanks for meeting with us!

Body:

liquid
Hi {{ json.attendee.name }},

Thank you for taking the time to meet with us today.

Best regards,
{{ author.name }}

Example: Meeting Summary Email

Send a comprehensive meeting summary.

To: json.attendee.email

Subject:

liquid
Meeting Summary: {{ json.meeting.title }} - {{ json.meeting.startTime | date: "%B %d" }}

Body:

liquid
Hi {{ json.attendee.name }},

Thank you for joining "{{ json.meeting.title }}" on {{ json.meeting.startTime | date: "%B %d, %Y" }}.

## Summary
{{ json.summary }}

{% if json.actionItems.size > 0 %}
## Action Items
{% for item in json.actionItems %}
- {{ item.task }}{% if item.owner %} ({{ item.owner }}){% endif %}
{% endfor %}
{% endif %}

{% if json.nextSteps %}
## Next Steps
{{ json.nextSteps }}
{% endif %}

Please let me know if you have any questions or if I missed anything.

Best regards,
{{ author.name }}
{{ author.email }}

Example: Conditional Content

Include different content based on meeting outcome.

Body:

liquid
Hi {{ json.attendee.name }},

Thank you for the meeting about {{ json.meeting.title }}.

{% if json.sentiment == "positive" %}
It was great to hear about your interest in our solution. Based on our discussion, I think we're well-aligned on the key requirements.

{% elsif json.sentiment == "needs_attention" %}
I appreciated your candid feedback during our call. I'd like to address some of the concerns you raised:

{{ json.concerns }}

{% else %}
I've summarized the key points from our discussion below.
{% endif %}

{{ json.summary }}

Best regards,
{{ author.name }}

Example: Send to Multiple Recipients

For multiple recipients, use per-item mode with upstream iteration.

Workflow:

text
[Load Meeting]
       │
       ▼
[Select Many: json.meeting.attendees]  ← Expands attendees to individual items
       │
       ▼
[Email Send] ← Runs once per attendee
   to: json.email

Example: HTML-style Formatting

Structure content with clear sections.

Body:

liquid
Hi {{ json.attendee.name }},

## Meeting: {{ json.meeting.title }}
**Date:** {{ json.meeting.startTime | date: "%B %d, %Y" }}
**Duration:** {{ json.duration }} minutes

---

### Key Discussion Points
{{ json.keyPoints }}

---

### Agreed Next Steps
{% for step in json.nextSteps %}
{{ forloop.index }}. {{ step }}
{% endfor %}

---

I'll follow up {{ json.followUpDate | date: "%A, %B %d" }} to continue our discussion.

Best,
{{ author.name }}

Best Practices

1. Personalize the Greeting

liquid
Hi {{ json.attendee.name | split: " " | first }},

This extracts the first name for a more personal touch.

2. Clear Subject Lines

Good:

liquid
Meeting Summary: {{ json.meeting.title }} - {{ json.meeting.startTime | date: "%b %d" }}

Bad:

liquid
Update

3. Include Context

Recipients should understand the email without opening attachments:

  • What meeting this relates to
  • When it happened
  • Key takeaways

4. Validate Email Addresses

Use If node to check before sending:

cel
json.attendee.email contains "@" && json.attendee.email contains "."

5. Appropriate Timing

Consider adding a Wait node for better timing:

  • Don't send immediately after meeting (seems automated)
  • Business hours are better
  • Allow time for transcript processing

Common Issues

"Invalid recipient" error

Causes:

  • Malformed email address
  • Empty email field
  • Missing data from upstream

Solutions:

  1. Validate email format before sending
  2. Handle missing data with conditionals
  3. Check upstream node output

Email not received

Causes:

  • Spam filters
  • Invalid email address
  • Delivery delays

Solutions:

  1. Check recipient's spam folder
  2. Verify email address is correct
  3. Check success output for message ID

Formatting issues

Cause: Email clients render plain text differently

Solutions:

  • Keep formatting simple
  • Test with common email clients
  • Avoid complex layouts

Empty fields in email

Cause: Data not available from upstream

Solution: Use conditionals:

liquid
{% if json.summary %}
{{ json.summary }}
{% else %}
No summary available for this meeting.
{% endif %}

Technical Details

Sending Configuration

Emails are sent from your organization's configured email domain:

  • From address is configured at workspace level
  • Reply-to can be customized
  • Proper SPF/DKIM authentication for deliverability

Email Size Limits

  • Subject: ~1,000 characters
  • Body: ~100KB recommended
  • Keep content focused and scannable

Delivery Tracking

The success output includes a messageId for tracking. Delivery status (bounces, opens) may be available in your email provider's dashboard.

Idempotency

The Email Send node uses idempotency keys to prevent duplicate sends during retries. The same email won't be sent twice for the same execution attempt.