Reference · Tools
Sendy
Manage email campaigns and subscribers in a self-hosted Sendy email marketing platform
The Sendy node manages campaigns and subscribers on a self-hosted Sendy installation. A typical build is subscribing new customers to the right list and creating a draft campaign that a human reviews before it goes out.
- Node type
- Action
- Parameters
- 23
- Outputs
- Output, Error
- Credentials
- Sendy API
Sendy
Manage Sendy email campaigns and subscribers
Overview
Sendy is a self-hosted email newsletter application that lets you send trackable emails via Amazon SES. This tool supports creating campaigns, subscribing/unsubscribing users, checking subscription status, and counting active subscribers. All API calls use form-encoded POST requests with plain-text responses.
Category: Communication
Tool Name: sendy
Version: 1
Appearance: Icon: lucide-Mail | Color: #0F3B5F
Node Type
Action — processes input items and produces output
Input / Output
| Direction | Port(s) |
|---|---|
| Input | Input |
| Output | Output, Error |
Credentials
This tool requires Sendy API credentials. See the Credentials Guide for setup instructions.
Resources
| Resource | Value |
|---|---|
| Campaign | campaign |
| Subscriber | subscriber |
Operations
| Operation | Value | Description |
|---|---|---|
| Campaign: Create | create | Create a campaign |
| Subscriber: Add | add | Add a subscriber to a list |
| Subscriber: Count | count | Count subscribers |
| Subscriber: Delete | delete | Delete a subscriber from a list |
| Subscriber: Remove | remove | Unsubscribe user from a list |
| Subscriber: Status | status | Get the status of subscriber |
Parameters
Campaign: Create
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| From Name | string | No | — | The ‘From name’ of your campaign. Supports expressions. |
| From Email | string | No | — | The ‘From email’ of your campaign. Supports expressions. |
| Reply To | string | No | — | The ‘Reply to’ of your campaign. Supports expressions. |
| Title | string | No | — | The ‘Title’ of your campaign. Supports expressions. |
| Subject | string | No | — | The ‘Subject’ of your campaign. Supports expressions. |
| HTML Text | string | No | — | The ‘HTML version’ of your campaign. Supports expressions. |
| Send Campaign | boolean | No | false | Whether to send the campaign immediately. When false, saves as draft. |
| Brand ID | string | Yes | — | The brand ID to associate the draft campaign with. Required when not sending immediately. (shown when Send Campaign is false) |
| Additional Fields | collection | No | {} | Optional extra settings for the campaign. Expressions inside these fields are resolved per item. |
| — Exclude List IDs | string | No | — | Lists to exclude from your campaign. List IDs should be single or comma-separated. |
| — Exclude Segment IDs | string | No | — | Segments to exclude from your campaign. Segment IDs should be single or comma-separated. |
| — List IDs | string | No | — | List IDs should be single or comma-separated. |
| — Plain Text | string | No | — | The ‘Plain text version’ of your campaign. |
| — Querystring | string | No | — | Google Analytics tags. |
| — Segment IDs | string | No | — | Segment IDs should be single or comma-separated. |
| — Track Clicks | boolean | No | true | Whether to enable click tracking. |
| — Track Opens | boolean | No | true | Whether to enable open tracking. |
Subscriber: Add
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
string | No | — | Email address of the subscriber. Supports expressions. | |
| List ID | string | No | — | The list ID you want to subscribe a user to. This encrypted & hashed ID can be found under View all lists section named ID. Supports expressions. |
| Additional Fields | collection | No | {} | Optional extra details to record against the subscriber. Expressions inside these fields are resolved per item. |
| — Country | string | No | — | User’s 2 letter country code. |
| — GDPR | boolean | No | false | Whether you’re signing up EU users in a GDPR compliant manner. |
| — Honeypot | boolean | No | false | Include this honeypot field to prevent spambots from signing up via this API call. Supported in Sendy 3.0+. |
| — IP Address | string | No | — | User’s IP address. |
| — Name | string | No | — | User’s name. |
| — Referrer | string | No | — | The URL where the user signed up from. |
| — Silent | boolean | No | false | Set to true if your list is ‘Double opt-in’ but you want to bypass that and sign up the user as ‘Single Opt-in’ instead. |
Subscriber: Count
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| List ID | string | No | — | The list ID to count active subscribers for. This encrypted & hashed ID can be found under View all lists section named ID. Supports expressions. |
Subscriber: Delete
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
string | No | — | Email address of the subscriber. Supports expressions. | |
| List ID | string | No | — | The list ID to delete the subscriber from. This encrypted & hashed ID can be found under View all lists section named ID. Supports expressions. |
Subscriber: Remove
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
string | No | — | Email address of the subscriber. Supports expressions. | |
| List ID | string | No | — | The list ID to unsubscribe the user from. This encrypted & hashed ID can be found under View all lists section named ID. Supports expressions. |
Subscriber: Status
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
string | No | — | Email address of the subscriber. Supports expressions. | |
| List ID | string | No | — | The list ID to check the subscriber’s status on. This encrypted & hashed ID can be found under View all lists section named ID. Supports expressions. |
All Operations
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Max Concurrency | number | No | 10 | Maximum number of items to process concurrently. |
Output Data
One output item per input item. The result is merged onto the item JSON at the top level — the rest of the item passes through unchanged and binary data is forwarded — so downstream nodes read the result directly, for example {{ $json.status }}.
Sendy answers with a short plain-text status rather than JSON, and the node turns that text into a small result object:
| Operation | Added to the item |
|---|---|
Campaign: Create | message — Sendy’s confirmation text, either Campaign created or Campaign created and now sending |
Subscriber: Add | success: true |
Subscriber: Count | count — the active subscriber count, as the string Sendy returned |
Subscriber: Delete | success: true |
Subscriber: Remove | success: true |
Subscriber: Status | status — one of Subscribed, Unsubscribed, Unconfirmed, Bounced, Soft bounced, Complained |
Any reply the node does not recognise as a success is raised as an item error carrying Sendy’s own text, so a rejected sign-up or a bad list ID reaches the Error port with _error rather than passing silently.
Usage Examples
- Create a new email campaign in Sendy
- Subscribe a user to a Sendy mailing list
- Unsubscribe a user from a Sendy list
- Get the subscription status of an email
- Count active subscribers in a list
- Delete a subscriber from a list
Example Configuration
Create a campaign and send it straight away to one list:
{
"type": "sendy",
"parameters": {
"resource": "campaign",
"operation": "create",
"fromName": "Acme News",
"fromEmail": "news@example.com",
"replyTo": "support@example.com",
"title": "Monthly Newsletter",
"subject": "Welcome to Our Newsletter!",
"htmlText": "<html><body><h1>Hello World!</h1></body></html>",
"sendCampaign": true,
"additionalFields": {
"listIds": "abc123def456",
"plainText": "Hello World!",
"trackOpens": true,
"trackClicks": true
}
}
}
Save the same campaign as a draft instead — a draft needs a Brand ID:
{
"type": "sendy",
"parameters": {
"resource": "campaign",
"operation": "create",
"fromName": "Marketing Team",
"fromEmail": "marketing@example.com",
"replyTo": "noreply@example.com",
"title": "Product Launch Campaign",
"subject": "Exciting New Product Launch!",
"htmlText": "<html><body><h2>Check out our new product!</h2></body></html>",
"sendCampaign": false,
"brandId": "brand789xyz",
"additionalFields": {
"listIds": "list123,list456",
"segmentIds": "segment789",
"excludeListIds": "list999",
"trackOpens": true,
"trackClicks": false
}
}
}
Subscribe each incoming item to a list, taking the address and name from the item:
{
"type": "sendy",
"parameters": {
"resource": "subscriber",
"operation": "add",
"email": "{{ $json.email }}",
"listId": "abc123def456",
"additionalFields": {
"name": "{{ $json.fullName }}",
"country": "US",
"ipaddress": "{{ $json.signupIp }}",
"referrer": "{{ $json.sourceUrl }}",
"gdpr": true,
"silent": false
}
}
}
Check whether an address is still subscribed before mailing it:
{
"type": "sendy",
"parameters": {
"resource": "subscriber",
"operation": "status",
"email": "{{ $json.email }}",
"listId": "{{ $json.listId }}"
}
}
Unsubscribe someone who asked to opt out:
{
"type": "sendy",
"parameters": {
"resource": "subscriber",
"operation": "remove",
"email": "{{ $json.email }}",
"listId": "abc123def456"
}
}
Delete a subscriber record outright rather than unsubscribing it:
{
"type": "sendy",
"parameters": {
"resource": "subscriber",
"operation": "delete",
"email": "{{ $json.email }}",
"listId": "abc123def456"
}
}
Count the active subscribers on a list:
{
"type": "sendy",
"parameters": {
"resource": "subscriber",
"operation": "count",
"listId": "abc123def456"
}
}
Error Handling
| Mode | Behavior |
|---|---|
| stop | Halts workflow on first error |
| continue | Skips failed items, passes successful ones through |
| errorPort | Routes failed items to Error output port |
Tips
Use Sendy to manage email campaigns and subscribers on a self-hosted Sendy email marketing installation via its API.
Notes
- Remove vs Delete.
removeunsubscribes the address but keeps the record on the list;deleteremoves the subscriber from the list entirely. - Brand ID is only for drafts. It appears once Send Campaign is off, and a draft campaign will not be created without it.
- List IDs are the hashed IDs, not list names — copy them from the ID column under View all lists. Campaign
List IDs,Segment IDsand their exclude counterparts take one ID or a comma-separated set. - Count returns a string. Compare or sort on it with care; convert it downstream if you need a number.
Frequently asked questions
What is the difference between remove and delete?
Remove unsubscribes the address but keeps the record on the list, so you retain the suppression. Delete removes the subscriber from the list entirely, losing that history.
Why can I not see Brand ID?
It appears only once Send Campaign is off, because it applies to drafts — and a draft campaign will not be created without it.
What form do list IDs take?
The hashed IDs Sendy shows, not sequential numbers. Copy them from the Sendy interface rather than guessing.
Which credential does it need?
A Sendy API credential pointing at your own installation.
Build with the Sendy node
Drop it into a workflow, wire it to an agent, or call it on a schedule. You'll need Sendy API credentials first.
Open BusyBotLast updated . Spotted something wrong? Tell us.