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
| Property | Value |
|---|---|
| Category | Action |
| Node IDs | ds.emailSend.perItem.in1.success1.error1 (per-item)ds.emailSend.batch.in1.success1.error1 (batch) |
| Input Ports | 1 |
| Success Outputs | 1 |
| Error Outputs | 1 |
| Execution Mode | Per-item or Batch |
| Timeout | 30 seconds |
| Retry Strategy | Exponential, 3 attempts |
| Side-Effecting | Yes |
Configuration
| Parameter | Type | Required | Description |
|---|---|---|---|
to | CEL Expression | Yes | Recipient email address |
subject | Liquid Template | Yes | Email subject line |
body | Liquid Template | Yes | Email body content |
To Parameter
Specify recipient using CEL expression:
From trigger/upstream data:
json.attendee.email
Static recipient:
"team@example.com"
From trigger:
trigger.contactEmail
Subject Parameter
Email subject using Liquid template:
Meeting Follow-up: {{ json.meeting.title }}
Body Parameter
Email body using Liquid template:
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
{
"success": true,
"messageId": "msg_abc123def456",
"to": "john@example.com",
"subject": "Meeting Follow-up: Q1 Planning",
"sentAt": "2024-01-15T14:30:00Z"
}
Error Output
{
"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:
Thanks for meeting with us!
Body:
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:
Meeting Summary: {{ json.meeting.title }} - {{ json.meeting.startTime | date: "%B %d" }}
Body:
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:
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:
[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:
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
Hi {{ json.attendee.name | split: " " | first }},
This extracts the first name for a more personal touch.
2. Clear Subject Lines
✅ Good:
Meeting Summary: {{ json.meeting.title }} - {{ json.meeting.startTime | date: "%b %d" }}
❌ Bad:
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:
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:
- Validate email format before sending
- Handle missing data with conditionals
- Check upstream node output
Email not received
Causes:
- Spam filters
- Invalid email address
- Delivery delays
Solutions:
- Check recipient's spam folder
- Verify email address is correct
- 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:
{% if json.summary %}
{{ json.summary }}
{% else %}
No summary available for this meeting.
{% endif %}
Related Nodes
- If - Validate before sending
- AI Prompt - Generate email content
- Slack Post - Alternative notification
- Select Many - Send to multiple recipients
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.