<!-- BusyBot node reference — https://busybot.net/tools/sendy/ -->

> Node: Sendy (`sendy`) · Action · v1
> Category: Communication · Credentials: Sendy API (`sendyApi`)
> Updated: 2026-08-16

# 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](https://busybot.net/credentials/sendy-api/) 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 |
|-----------|------|----------|---------|-------------|
| Email | `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 |
|-----------|------|----------|---------|-------------|
| Email | `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 |
|-----------|------|----------|---------|-------------|
| Email | `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 |
|-----------|------|----------|---------|-------------|
| Email | `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:

```json
{
  "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:

```json
{
  "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:

```json
{
  "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:

```json
{
  "type": "sendy",
  "parameters": {
    "resource": "subscriber",
    "operation": "status",
    "email": "{{ $json.email }}",
    "listId": "{{ $json.listId }}"
  }
}
```

Unsubscribe someone who asked to opt out:

```json
{
  "type": "sendy",
  "parameters": {
    "resource": "subscriber",
    "operation": "remove",
    "email": "{{ $json.email }}",
    "listId": "abc123def456"
  }
}
```

Delete a subscriber record outright rather than unsubscribing it:

```json
{
  "type": "sendy",
  "parameters": {
    "resource": "subscriber",
    "operation": "delete",
    "email": "{{ $json.email }}",
    "listId": "abc123def456"
  }
}
```

Count the active subscribers on a list:

```json
{
  "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.** `remove` unsubscribes the address but keeps the record on the list; `delete` removes 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 IDs` and 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.