Actions
Nodes that take actions in external systems
Action nodes perform operations in external systems—sending messages, creating records, and updating data. They're the "do something" nodes that make your workflows impactful.
Available Actions
Communication
| Node | Description | Integration |
|---|---|---|
| Slack Post | Send messages to Slack channels | Slack |
| Email Send | Send emails to recipients | None (built-in) |
| SMS Send | Send text messages | None (built-in) |
CRM
| Node | Description | Integration |
|---|---|---|
| Create HubSpot Task | Create tasks in HubSpot | HubSpot |
| Create Salesforce Task | Create tasks in Salesforce | Salesforce |
| CRM Update Opportunity | Update deal/opportunity records | HubSpot/Salesforce |
Side Effects and Idempotency
Action nodes are side-effecting—they modify external systems. This has important implications:
What "Side-Effecting" Means
- Action nodes change state outside the workflow
- A Slack message, once sent, cannot be unsent
- CRM records are created/modified permanently
Idempotency Protection
To prevent duplicate actions during retries, action nodes use idempotency keys:
Key = hash(executionId + nodeId + attempt)
If a retry occurs, the same key ensures:
- Slack messages aren't sent twice
- CRM tasks aren't created twice
- Emails aren't duplicated
When Idempotency Doesn't Help
- If you run the workflow multiple times (different executions)
- If you have multiple action nodes doing similar things
- Manual workflow runs always create new executions
Common Configuration
All action nodes share these characteristics:
| Setting | Value |
|---|---|
| Timeout | 30 seconds |
| Retry Strategy | Exponential, 3 attempts |
| Error Output | Yes (handle failures gracefully) |
Dynamic Content with Liquid
Action nodes use Liquid templates for dynamic content:
Hello {{ json.attendee.name }},
Thank you for joining {{ json.meeting.title }}.
Best,
{{ author.name }}
Expressions with CEL
Configuration parameters often use CEL expressions:
trigger.dealRoomId // Access trigger data
json.contact.email // Access upstream data
json.attendees[0].email // Array access
Execution Modes
Action nodes support both execution modes:
Per-Item Mode
Sends one message/creates one record per input item.
Example: If 3 attendees flow through, sends 3 separate Slack messages.
Batch Mode
Processes all items together (but typically still creates one action).
Example: Send one Slack message summarizing all 3 attendees.
Error Handling
Action nodes have error outputs for handling failures:
[Slack Post]
├── Success ──▶ [Continue workflow]
└── Error ────▶ [Log failure] ──▶ [Sink]
Common Error Scenarios
| Error | Cause | Handling |
|---|---|---|
| Authentication | Token expired, permissions changed | Reconnect integration |
| Rate limit | Too many requests | Add delays, reduce frequency |
| Invalid recipient | Bad email/channel/phone | Validate upstream |
| Timeout | External service slow | Retry handles this |
Best Practices
1. Always Handle Errors
Never leave error outputs disconnected for critical actions:
[Email Send]
├── Success ──▶ [Continue]
└── Error ────▶ [Slack Alert: "Email failed"] ──▶ [Sink]
2. Validate Recipients
Use If nodes to validate before sending:
[If: email is valid?]
├── Yes ──▶ [Email Send]
└── No ───▶ [Log: "Invalid email"] ──▶ [Sink]
3. Be Mindful of Volume
Consider the impact:
- Don't spam channels with high-frequency messages
- Batch related updates when possible
- Use appropriate urgency (not everything needs SMS)
4. Include Context in Messages
Recipients should understand without digging:
✅ Good:
📋 Meeting Summary: {{ json.meeting.title }}
Date: {{ json.meeting.startTime | date: "%B %d" }}
Attendees: {% for a in json.meeting.attendees %}{{ a.name }}{% unless forloop.last %}, {% endunless %}{% endfor %}
Key Points:
{{ json.summary }}
❌ Bad:
{{ json.summary }}
5. Test Before Releasing
Use MANUAL trigger to test actions:
- Verify recipients are correct
- Check message formatting
- Confirm CRM records look right
Integration Requirements
Before using action nodes, ensure integrations are connected:
| Node | Requires |
|---|---|
| Slack Post | Slack integration + bot in channel |
| Email Send | None (zero config) |
| SMS Send | None (zero config) |
| HubSpot Task | HubSpot integration |
| Salesforce Task | Salesforce integration |
| CRM Update | HubSpot or Salesforce integration |
See Setup Guide for integration configuration.
Common Patterns
Pattern: Notify on Completion
[Process Data] ──▶ [Slack Post: "Processing complete"]
Pattern: Multi-Channel Notification
┌──▶ [Email Send]
[AI Analysis] ──▶ [Broadcast] ──▶ [Slack Post]
└──▶ [SMS Send] (for urgent)
Pattern: CRM Sync
[Load Meeting] ──▶ [AI: Extract insights] ──▶ [CRM Update Opportunity]
──▶ [Create HubSpot Task]
Pattern: Conditional Actions
[AI: Classify urgency]
│
▼
[If: urgent?]
├── Yes ──▶ [SMS Send] + [Slack Post]
└── No ───▶ [Email Send]