This is reference content about building functions and workflows. Learn more if you're not yet familiar with this new Slack platform paradigm.


Send a message


Schema ID


Schema reference


Related methods

Input parameters

Required parameters
The conversation ID for the channel you are sending the message to
  • C123456
  • D1A2BC3ZF
The textual message to send to channel
Optional parameters
Additional metadata about the message, which can then be used an workflow event trigger.
Buttons to send with the message. Must be wrapped in a block. Accepts either button or workflow_button elements only.

Output parameters

Required parameters
An individual instance of the message you sent
The channel-specific unique identifier for this message, also serves as a confirmation that the message was sent.
Permalink URL of the message that was sent
Optional parameters
If interactive_blocks was provided, the action object contains the button properties (see action payload below)
If interactive_blocks is provided as an input parameter, the interactivity context becomes available

Usage guide

Sends a message to a specific channel. This does not allow for direct messages to users.

If you include a button in the message, the function execution will not continue until a user clicks on that button.

This function returns a timestamp of the new message, which also serves as a confirmation that the message was sent.

The message input only supports non-interactive rich text blocks such as headers, dividers, and sections.

The interactive_blocks input only supports the button and workflow_button interactive blocks.

Ensure that you do not send interactive elements via the message input, or non-interactive elements via the interactive_blocks input, as this could cause unintended behavior.


To collect a formatted message from your end users and send it as-is, you can use a form to collect the formatted text, and a Slack function to send it:

import { DefineWorkflow, Schema } from "deno-slack-sdk/mod.ts";

export const RichTextWorkflow = DefineWorkflow({
  callback_id: "rich_text_workflow",
  title: "rich-text input workflow",
  input_parameters: {
    properties: {
      interactivity: { type: Schema.slack.types.interactivity },
      channel: { type: Schema.slack.types.channel_id },
    required: ["interactivity", "channel"],

const inputForm = RichTextWorkflow.addStep(
    title: "Send formatted message",
    interactivity: RichTextWorkflow.inputs.interactivity,
    submit_label: "Send formatted message",
    fields: {
      elements: [
          name: "formattedInput",
          title: "Formatted input",
          type: Schema.slack.types.rich_text,
          name: "channel",
          title: "Post in:",
          type: Schema.slack.types.channel_id,
      required: ["channel", "formattedInput"],

RichTextWorkflow.addStep(Schema.slack.functions.SendMessage, {
  message: inputForm.outputs.fields.formattedInput,
  interactive_blocks: [{
    "type": "actions",
    "elements": [
        "type": "button",
        "text": { "type": "plain_text", "text": "Approve" },
        "style": "primary",
        "value": "approve",
        "action_id": "approve_button",

Here's an example with just regular text:

import { DefineWorkflow, Schema } from "deno-slack-sdk/mod.ts";

export const createAnnouncement = DefineWorkflow({
  callback_id: "create-announcement",
  title: "Workflow for creating announcements",
  input_parameters: { properties: {}, required: [] },

const sendPreview = createAnnouncement.addStep(
    channel_id: "CTLC2K3JS",
    message: "Good to see you here!",

Action payload

Example action payload:

  "action_id": "WaXA",
  "block_id": "=qXel",
  "text": {
    "type": "plain_text",
    "text": "View",
    "emoji": true
  "value": "click_me_123",
  "type": "button",
  "action_ts": "1548426417.840180"