Resources

n8n Community Node

n8n-nodes-mailneo adds two nodes to n8n: Mailneo, an actions node over the v2 API, and Mailneo Trigger, which starts workflows on Mailneo webhook events and verifies every delivery before your workflow sees it.

Install

On self-hosted n8n (version 1.x or later), install from the UI: Settings → Community Nodes → Install and enter the package name.

n8n-nodes-mailneo
The current release (0.1.2) passes n8n's official community-package security scan. A verified listing for n8n Cloud has not been submitted yet, so on n8n Cloud the node is not installable today — self-hosted installs work without it.

Credentials

Two credential types; every node instance has an Authentication switch to pick between them.

Mailneo API (API key)

  1. In Mailneo: Settings → API Keys → Create key (mk_live_...).
  2. In n8n: create a Mailneo API credential and paste the key. It is sent as the x-api-key header. Leave the Base URL alone unless you self-host Mailneo.

Mailneo OAuth2 API (OAuth 2.1 + PKCE)

Authorization-code with PKCE (S256) against https://api.mailneo.co — the endpoints are the ones published by the /.well-known/oauth-authorization-server discovery document: authorize at /oauth/authorize, token at /oauth/token, dynamic client registration at /oauth/register.

  • With Use Dynamic Client Registration on (the default, supported by recent n8n versions), n8n registers itself — no client ID needed.
  • On older n8n versions, turn it off and paste a client ID created in Mailneo. It is a public client; there is no client secret.
  • Trim the requested scopes to what the workflow needs — the default asks for every live scope.

What the Mailneo node covers

Subscribers, lists, segments, contacts, campaigns, newsletters, templates, suppressions, analytics, email accounts, webhook endpoints, and the credential's own identity and usage. Cursor pagination is handled for you: choose Return Allor set a limit — limits above the API's 100-per-page maximum fetch multiple pages transparently.

The current release has no send operations — it was built against the API spec from before the send scopes shipped. Send operations are coming in 0.2.0, with the spec refresh. The two-step preview → confirm send flow is documented in the sending concepts page.

The Mailneo Trigger

The trigger registers its own webhook endpoint through the API when the workflow is activated and deletes it on deactivation — no manual endpoint management. Every delivery's X-Mailneo-Signature HMAC is verified automatically (timestamped, ±300 s tolerance, constant-time comparison); unverifiable deliveries are rejected with 401 and never reach the workflow.

  • The endpoint's signing secret is returned by the API once, at creation, and kept in the workflow's static data. Deactivating and reactivating the workflow creates a fresh endpoint and secret.
  • Delivery is at-least-once and unordered. The output includes eventId (stable across retries and replays — deduplicate on it), event, deliveryId and isReplay.

Example workflow

Fetch enabled subscribers, keep the ones tagged vip, add them to a list. Paste it into a new n8n workflow, then replace the credential and list-ID placeholders.

{
  "name": "Mailneo: VIPs onto the launch list",
  "nodes": [
    {
      "parameters": {},
      "id": "b1f0f6a0-0000-4000-8000-000000000001",
      "name": "When clicking ‘Execute workflow’",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [0, 0]
    },
    {
      "parameters": {
        "authentication": "apiKey",
        "resource": "subscriber",
        "operation": "getAll",
        "returnAll": true,
        "filters": { "status": "ENABLED" }
      },
      "id": "b1f0f6a0-0000-4000-8000-000000000002",
      "name": "Get Subscribers",
      "type": "n8n-nodes-mailneo.mailneo",
      "typeVersion": 1,
      "position": [220, 0],
      "credentials": {
        "mailneoApi": { "id": "REPLACE_ME", "name": "Mailneo API" }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": { "caseSensitive": true, "typeValidation": "strict", "version": 2 },
          "conditions": [
            {
              "leftValue": "={{ $json.tags }}",
              "rightValue": "vip",
              "operator": { "type": "array", "operation": "contains", "rightType": "any" }
            }
          ],
          "combinator": "and"
        }
      },
      "id": "b1f0f6a0-0000-4000-8000-000000000003",
      "name": "Keep VIPs",
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [440, 0]
    },
    {
      "parameters": {
        "authentication": "apiKey",
        "resource": "list",
        "operation": "addSubscribers",
        "listId": "REPLACE_WITH_LIST_ID",
        "subscriberIds": "={{ $json.id }}"
      },
      "id": "b1f0f6a0-0000-4000-8000-000000000004",
      "name": "Add to Launch List",
      "type": "n8n-nodes-mailneo.mailneo",
      "typeVersion": 1,
      "position": [660, 0],
      "credentials": {
        "mailneoApi": { "id": "REPLACE_ME", "name": "Mailneo API" }
      }
    }
  ],
  "connections": {
    "When clicking ‘Execute workflow’": {
      "main": [[{ "node": "Get Subscribers", "type": "main", "index": 0 }]]
    },
    "Get Subscribers": {
      "main": [[{ "node": "Keep VIPs", "type": "main", "index": 0 }]]
    },
    "Keep VIPs": {
      "main": [[{ "node": "Add to Launch List", "type": "main", "index": 0 }]]
    }
  },
  "settings": {}
}
The API refuses to re-subscribe someone who unsubscribed from a list — that membership row is the opt-out record. This is by design, not an error to work around.

Links