Reference · Tools

Sendy

Manage email campaigns and subscribers in a self-hosted Sendy email marketing platform

Action Communication v1

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

DirectionPort(s)
InputInput
OutputOutput, Error

Credentials

This tool requires Sendy API credentials. See the Credentials Guide for setup instructions.

Resources

ResourceValue
Campaigncampaign
Subscribersubscriber

Operations

OperationValueDescription
Campaign: CreatecreateCreate a campaign
Subscriber: AddaddAdd a subscriber to a list
Subscriber: CountcountCount subscribers
Subscriber: DeletedeleteDelete a subscriber from a list
Subscriber: RemoveremoveUnsubscribe user from a list
Subscriber: StatusstatusGet the status of subscriber

Parameters

Campaign: Create

ParameterTypeRequiredDefaultDescription
From NamestringNoThe ‘From name’ of your campaign. Supports expressions.
From EmailstringNoThe ‘From email’ of your campaign. Supports expressions.
Reply TostringNoThe ‘Reply to’ of your campaign. Supports expressions.
TitlestringNoThe ‘Title’ of your campaign. Supports expressions.
SubjectstringNoThe ‘Subject’ of your campaign. Supports expressions.
HTML TextstringNoThe ‘HTML version’ of your campaign. Supports expressions.
Send CampaignbooleanNofalseWhether to send the campaign immediately. When false, saves as draft.
Brand IDstringYesThe brand ID to associate the draft campaign with. Required when not sending immediately. (shown when Send Campaign is false)
Additional FieldscollectionNo{}Optional extra settings for the campaign. Expressions inside these fields are resolved per item.
— Exclude List IDsstringNoLists to exclude from your campaign. List IDs should be single or comma-separated.
— Exclude Segment IDsstringNoSegments to exclude from your campaign. Segment IDs should be single or comma-separated.
— List IDsstringNoList IDs should be single or comma-separated.
— Plain TextstringNoThe ‘Plain text version’ of your campaign.
— QuerystringstringNoGoogle Analytics tags.
— Segment IDsstringNoSegment IDs should be single or comma-separated.
— Track ClicksbooleanNotrueWhether to enable click tracking.
— Track OpensbooleanNotrueWhether to enable open tracking.

Subscriber: Add

ParameterTypeRequiredDefaultDescription
EmailstringNoEmail address of the subscriber. Supports expressions.
List IDstringNoThe 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 FieldscollectionNo{}Optional extra details to record against the subscriber. Expressions inside these fields are resolved per item.
— CountrystringNoUser’s 2 letter country code.
— GDPRbooleanNofalseWhether you’re signing up EU users in a GDPR compliant manner.
— HoneypotbooleanNofalseInclude this honeypot field to prevent spambots from signing up via this API call. Supported in Sendy 3.0+.
— IP AddressstringNoUser’s IP address.
— NamestringNoUser’s name.
— ReferrerstringNoThe URL where the user signed up from.
— SilentbooleanNofalseSet 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

ParameterTypeRequiredDefaultDescription
List IDstringNoThe 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

ParameterTypeRequiredDefaultDescription
EmailstringNoEmail address of the subscriber. Supports expressions.
List IDstringNoThe 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

ParameterTypeRequiredDefaultDescription
EmailstringNoEmail address of the subscriber. Supports expressions.
List IDstringNoThe 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

ParameterTypeRequiredDefaultDescription
EmailstringNoEmail address of the subscriber. Supports expressions.
List IDstringNoThe 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

ParameterTypeRequiredDefaultDescription
Max ConcurrencynumberNo10Maximum 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:

OperationAdded to the item
Campaign: Createmessage — Sendy’s confirmation text, either Campaign created or Campaign created and now sending
Subscriber: Addsuccess: true
Subscriber: Countcount — the active subscriber count, as the string Sendy returned
Subscriber: Deletesuccess: true
Subscriber: Removesuccess: true
Subscriber: Statusstatus — 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

ModeBehavior
stopHalts workflow on first error
continueSkips failed items, passes successful ones through
errorPortRoutes 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.

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 BusyBot

Last updated . Spotted something wrong? Tell us.