Skip to content

Notify ​

Sends a message to a Slack, Teams or generic webhook. The shortcut for "tell the team".

Posts a short message to a Slack channel, a Microsoft Teams channel or any endpoint that accepts JSON. It is the shortcut for "tell the team": you write a title and a message, and the node builds the payload each destination expects and sets the Content-Type. For anything else — another method, custom headers, authentication, files — use HTTP request.

The webhook URL works like a password: anyone who has it can post. It is never written to the step data, the step summary or the logs, and it cannot be computed from an expression.

At a glance ​

  • Type: notify.send · version 1
  • Category: Actions
  • Kind: Step — one stage of a run
  • Effect: Writes outside (external_write) — writes outside Mankomail; described instead of performed during a test run
  • Needs a carrier email: No
  • Connection: None
  • Inputs: main
  • Outputs: main

Parameters ​

target ​

Destination

  • Type: One choice (options)
  • Required: Yes
  • Default: slack
  • Options:
    • slack — Slack: A Slack incoming webhook URL. The message lands in the channel picked when the webhook was created.
    • teams — Microsoft Teams: A Teams connector URL. The message is posted as a simple card.
    • generic — Generic webhook: A { title, message, execution } JSON payload to any endpoint.

webhookUrl ​

Webhook URL — The URL given by Slack, Teams or your tool. It is as good as a password: it appears neither in the step data nor in the logs.

  • Type: Text (string)
  • Required: Yes
  • Default: "" (empty)
  • 2000 characters at most
  • Example: https://hooks.slack.com/services/…
  • Expressions: {{ }} not accepted

title ​

Title — Optional. The first line, highlighted. Accepts {{ }} expressions.

  • Type: Text (string)
  • Required: No
  • Default: "" (empty)
  • 200 characters at most
  • Example: New request from {{ email.from.name }}
  • Expressions: {{ }} accepted

message ​

Message — The body of the notification. Accepts {{ }} expressions — name the subject, the sender, what the AI understood.

  • Type: Long text (text)
  • Required: Yes
  • Default: "" (empty)
  • 4000 characters at most
  • Example: {{ email.from.email }}: {{ email.subject }}
  • Expressions: {{ }} accepted

Outputs ​

  • main — Taken once the webhook has accepted the message (status below 400).

Data produced ​

What this node adds to the run data, and how to read it in an expression. <step> stands for the step key: the node name turned into an identifier (see Data and expressions).

  • {{ data.<step>.target }} — string. The destination used: slack, teams or generic.
  • {{ data.<step>.status }} — number. The HTTP status returned by the webhook.
  • {{ data.<step>.ok }} — boolean. true when the status is below 400 (always true when the step succeeds).
  • {{ data.<step>.simulated }} — boolean. true in a test run: nothing was posted.
  • {{ data.<step>.hasTitle }} — boolean. true when a title was sent.
  • {{ data.<step>.messageChars }} — number. The length of the message sent, in characters.
  • {{ data.<step>.summary }} — string. A one-line summary, for example Slack: notification sent (HTTP 200).

Example ​

A support workflow warns the #support channel when the AI marks a request as urgent.

text
target      slack
webhookUrl  https://hooks.slack.com/services/…
title       Urgent request from {{ email.from.name }}
message     {{ email.from.email }}: {{ email.subject }}

The message lands in the channel picked when the Slack incoming webhook was created, and the step summary reads Slack: notification sent (HTTP 200).

Payload sent to each destination ​

The node always sends a POST with Content-Type: application/json. Title and message are trimmed first.

Slack — the title becomes a first line in bold:

json
{ "text": "*New request from Ada*\nada@example.com: Invoice 4812" }

Without a title, text is the message alone.

Microsoft Teams — a minimal MessageCard:

json
{
  "@type": "MessageCard",
  "@context": "https://schema.org/extensions",
  "summary": "New request from Ada",
  "title": "New request from Ada",
  "text": "ada@example.com: Invoice 4812"
}

Without a title, title is left out and summary is the first line of the message (cut at 200 characters).

Generic webhook — the message plus identifiers of the run, so the receiving system can trace it back:

json
{
  "title": "New request from Ada",
  "message": "ada@example.com: Invoice 4812",
  "execution": { "id": "<execution id>", "workflowId": "<workflow id>" }
}

Without a title, title is left out. Only identifiers are sent, never email content beyond what you wrote in the message.

Tips ​

  • Empty message. If the message is empty once expressions are resolved, the step fails with node_nothing_to_do rather than posting a blank notification. An empty webhook URL fails with node_invalid_param.
  • Errors. A status of 400 or more always fails the step with http_error_status. 429 and 5xx are retried automatically; other 4xx (a revoked Slack webhook answers 404) are final. Network errors and timeouts are retried.
  • Duplicates on retry. Incoming webhooks have no idempotency key: a retry after an incident can post the same message twice.
  • Limits. Title up to 200 characters, message up to 4,000. The webhook has 10 seconds to answer.
  • Allowed addresses. The webhook URL goes through the same guard as HTTP request: http or https on ports 80 and 443 only, no private or internal addresses.
  • Test runs. Nothing is posted. The step succeeds with status 200, simulated: true and the summary Slack: would have sent the notification. The simulated-effect line of the run detail describes the request it would have sent, target URL included. See Test runs.