{"id":212259,"date":"2024-09-13T05:34:17","date_gmt":"2024-09-13T12:34:17","guid":{"rendered":"https:\/\/clickup.com\/blog\/?p=212259"},"modified":"2026-02-18T08:07:30","modified_gmt":"2026-02-18T16:07:30","slug":"how-to-create-a-slack-bot","status":"publish","type":"post","link":"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/","title":{"rendered":"How to Create a Slack Bot From Scratch"},"content":{"rendered":"\n<p>Virtual workspaces like Slack have become a big part of our work culture.&nbsp;<\/p>\n\n\n\n<p>Need to communicate with your teammates? Just send them a direct message on Slack. Want to collaborate on a project? Slack has you covered with channels, integrations, and easy file sharing.&nbsp;<\/p>\n\n\n\n<p>One of Slack\u2019s best capabilities is its automated bots, which perform three major roles when integrated into a Slack group or channel\u2014automating tasks, sending notifications, and answering questions.<\/p>\n\n\n\n<p>Sounds like a lifesaver, right? In this article, we&#8217;ll explore how to create the perfect Slack bot that suits your team\u2019s needs.<\/p>\n\n\n<div style=\"background-color: #d9edf7; color: #31708f; border-left-color: #31708f; \" class=\"ub-styled-box ub-notification-box wp-block-ub-styled-box\" id=\"ub-styled-box-0d058e42-e564-4af6-a6e3-88b30608a168\">\n<p id=\"ub-styled-box-notification-content-\">\u2757<strong>Note: <\/strong>Before you begin, you&#8217;ll need the Slack CLI installed and your new workspace authorized. Run Slack auth list to verify this.<\/p>\n\n\n<\/div>\n\n<div class=\"wp-block-ub-table-of-contents-block ub_table-of-contents\" id=\"ub_table-of-contents-4a8b2d92-83f4-42ba-85ff-68ffbb26a5b2\" data-linktodivider=\"false\" data-showtext=\"show\" data-hidetext=\"hide\" data-scrolltype=\"auto\" data-enablesmoothscroll=\"false\" data-initiallyhideonmobile=\"false\" data-initiallyshow=\"true\"><div class=\"ub_table-of-contents-header-container\" style=\"\">\n\t\t\t<div class=\"ub_table-of-contents-header\" style=\"text-align: left; \">\n\t\t\t\t<div class=\"ub_table-of-contents-title\">How to Create a Slack Bot From Scratch<\/div>\n\t\t\t\t\n\t\t\t<\/div>\n\t\t<\/div><div class=\"ub_table-of-contents-extra-container\" style=\"\">\n\t\t\t<div class=\"ub_table-of-contents-container ub_table-of-contents-1-column \">\n\t\t\t\t<ul style=\"\"><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#0-how-to-make-your-own-slack-chatbot\" style=\"\">How to Make Your Own Slack Chatbot<\/a><ul><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#1-step-1-create-a-slack-app-using-the-cli\" style=\"\">Step 1: Create a Slack app using the CLI<\/a><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#2-step-2-create-the-app-mandate\" style=\"\">Step 2: Create the app mandate<\/a><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#3-step-3-create-a-workflow-for-setting-up-the-welcome-message\" style=\"\">Step 3: Create a workflow for setting up the welcome message<\/a><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#4-step-4-use-a-datastore-to-store-the-welcome-message\" style=\"\">Step 4: Use a datastore to store the welcome message<\/a><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#5-step-5-create-a-custom-function-to-store-the-welcome-message-in-the-datastore\" style=\"\">Step 5: Create a custom function to store the welcome message in the datastore<\/a><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#6-step-6-create-triggers-to-activate-workflows\" style=\"\">Step 6: Create triggers to activate workflows<\/a><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#7-step-7-create-a-workflow-for-sending-the-welcome-message\" style=\"\">Step 7: Create a workflow for sending the welcome message<\/a><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#8-step-8-create-a-custom-function-to-send-the-welcome-message\" style=\"\">Step 8: Create a custom function to send the welcome message<\/a><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#9-step-9-use-your-slack-app\" style=\"\">Step 9: Use your Slack app<\/a><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#12-step-10-your-slack-bot-is-ready\" style=\"\">Step 10: Your Slack bot is ready!<\/a><\/li><\/ul><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#13-limitations-of-using-slack-bots-for-communication\" style=\"\">Limitations of Using Slack Bots for Communication<\/a><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#19-enhancing-team-communication-with-clickup-and-slack\" style=\"\">Enhancing Team Communication with ClickUp and Slack<\/a><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#23-clickup-does-what-slack-can-and-more\" style=\"\">ClickUp Does What Slack Can, and More<\/a><ul><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#24-real-time-conversations-with-chat-view\" style=\"\">Real-time conversations with chat view<\/a><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#25-collaboration-brainstorming-and-whiteboards\" style=\"\">Collaboration, brainstorming, and whiteboards<\/a><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#26-task-management-with-assigned-comments\" style=\"\">Task management with Assigned Comments<\/a><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#27-visual-communication-with-clickup-clips\" style=\"\">Visual communication with ClickUp Clips<\/a><\/li><li style=\"\"><a href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#28-strategize-actions-with-templates\" style=\"\">Strategize actions with templates<\/a><\/li><\/ul><\/li><\/ul>\n\t\t\t<\/div>\n\t\t<\/div><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"0-how-to-make-your-own-slack-chatbot\">How to Make Your Own Slack Chatbot<\/h2>\n\n\n\n<p><a href=\"https:\/\/api.slack.com\/distribution\/onboarding\"><\/a><\/p>\n\n\n\n<p>Let\u2019s walk through the steps needed to create and <a href=\"https:\/\/clickup.com\/integrations\/slack\">integrate a Slack bot<\/a>.<\/p>\n\n\n\n<p>To make it easy, <strong>we&#8217;ll describe the process with an example\u2014how to write a Slack bot that sends welcome text to new users. <\/strong>Please note that the process is more or less similar to other bot functions.<\/p>\n\n\n\n<p>Each step requires some coding. But don\u2019t worry\u2014this guide will walk you through every detail to ensure you can create your chatbot without any hassle.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"1-step-1-create-a-slack-app-using-the-cli\">Step 1: Create a Slack app using the CLI<\/h3>\n\n\n\n<p>Before you dive into building your Slack bot, you&#8217;ll need the right tools in place. The first step involves creating your Slack app using the command-line interface (CLI).<\/p>\n\n\n\n<p>Begin by setting up a blank app with the Slack CLI using this command:<br><br><strong>slack create welcome-bot-app &#8211;template https:\/\/github.com\/slack-samples\/deno-welcome-bot<\/strong><\/p>\n\n\n\n<p>Running this command will create an app folder linked to your Slack account. Inside your new app folder, create three key directories that will serve as the foundation for your Slack bot:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>functions<\/li>\n\n\n\n<li>workflows<\/li>\n\n\n\n<li>triggers<\/li>\n<\/ul>\n\n\n\n<p>With these folders and permissions in place, you\u2019re ready to start building your Slack app!<\/p>\n\n\n\n<p>Alternatively, instead of writing all the code yourself, you can use the following command to create the Welcome Bot app directly:<\/p>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">slack create welcome-bot-app --template https:\/\/github.com\/slack-samples\/deno-welcome-bot<\/pre>\n\n\n\n<p>Once your project is created, navigate to your project directory to customize your Slack bot.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"2-step-2-create-the-app-mandate\">Step 2: Create the app mandate<\/h3>\n\n\n\n<p>The app manifest is your blueprint for the Slack bot. For a Welcome Bot, your manifest will include:<\/p>\n\n\n\n<p><strong>Workflows:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MessageSetupWorkflow<\/li>\n\n\n\n<li>SendWelcomeMessageWorkflow<\/li>\n<\/ul>\n\n\n\n<p><strong>Datastore:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WelcomeMessageDatastore<\/li>\n<\/ul>\n\n\n\n<p><strong>Scopes:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>chat:write<\/li>\n\n\n\n<li>chat:write.public<\/li>\n\n\n\n<li>datastore:read<\/li>\n\n\n\n<li>datastore:write<\/li>\n\n\n\n<li>channels:read<\/li>\n\n\n\n<li>triggers:write<\/li>\n\n\n\n<li>triggers:read<\/li>\n<\/ul>\n\n\n\n<p>When you bring all these components together, your manifest.ts file will resemble something like this:<\/p>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \/manifest.ts\nimport { Manifest } from \"deno-slack-sdk\/mod.ts\";\nimport { WelcomeMessageDatastore } from \".\/datastores\/messages.ts\";\nimport { MessageSetupWorkflow } from \".\/workflows\/create_welcome_message.ts\";\nimport { SendWelcomeMessageWorkflow } from \".\/workflows\/send_welcome_message.ts\";\nexport default Manifest({\n\u00a0\u00a0name: \"Welcome Message Bot\",\n\u00a0\u00a0description:\n\u00a0\u00a0\u00a0\u00a0\"Quick way to setup automated welcome messages for channels in your workspace.\",\n\u00a0\u00a0icon: \"assets\/default_new_app_icon.png\",\n\u00a0\u00a0workflows: [MessageSetupWorkflow, SendWelcomeMessageWorkflow],\n\u00a0\u00a0outgoingDomains: [],\n\u00a0\u00a0datastores: [WelcomeMessageDatastore],\n\u00a0\u00a0botScopes: [\n\u00a0\u00a0\u00a0\u00a0\"chat:write\",\n\u00a0\u00a0\u00a0\u00a0\"chat:write.public\",\n\u00a0\u00a0\u00a0\u00a0\"datastore:read\",\n\u00a0\u00a0\u00a0\u00a0\"datastore:write\",\n\u00a0\u00a0\u00a0\u00a0\"channels:read\",\n\u00a0\u00a0\u00a0\u00a0\"triggers:write\",\n\u00a0\u00a0\u00a0\u00a0\"triggers:read\",\n\u00a0\u00a0],\n});<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"3-step-3-create-a-workflow-for-setting-up-the-welcome-message\">Step 3: Create a workflow for setting up the welcome message<\/h3>\n\n\n\n<p>First, we start by defining the workflow:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Create file<\/strong>: Add a new file named create_welcome_message.ts in the workflows folder<\/li>\n\n\n\n<li><strong>Define workflow<\/strong>: In this file, define the MessageSetupWorkflow to allow a bot user to set up a welcome message via a form<\/li>\n<\/ul>\n\n\n\n<p>Here&#8217;s how the workflow definition will look:<\/p>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \/workflows\/create_welcome_message.ts\nimport { DefineWorkflow, Schema } from \"deno-slack-sdk\/mod.ts\";\nimport { WelcomeMessageSetupFunction } from \"..\/functions\/create_welcome_message.ts\";\n\/**\n\u00a0* The MessageSetupWorkflow opens a form where the user creates a\n\u00a0* welcome message. The trigger for this workflow is found in\n\u00a0* `\/triggers\/welcome_message_trigger.ts`\n\u00a0*\/\nexport const MessageSetupWorkflow = DefineWorkflow({\n\u00a0\u00a0callback_id: \"message_setup_workflow\",\n\u00a0\u00a0title: \"Create Welcome Message\",\n\u00a0\u00a0description: \" Creates a message to welcome new users into the channel.\",\n\u00a0\u00a0input_parameters: {\n\u00a0\u00a0\u00a0\u00a0properties: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0interactivity: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: Schema.slack.types.interactivity,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0channel: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: Schema.slack.types.channel_id,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0required: [\"interactivity\"],\n\u00a0\u00a0},\n});<\/pre>\n\n\n\n<p>Next, we add a form:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Use OpenForm<\/strong>: Add a form using the OpenForm function to collect bot user inputs<\/li>\n<\/ul>\n\n\n\n<p>Here&#8217;s how to add the OpenForm function to your create_welcome_message.ts workflow:<\/p>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \/workflows\/create_welcome_message.ts\n\/**\n\u00a0* This step uses the OpenForm Slack function. The form has two\n\u00a0* inputs -- a welcome message and a channel id for that message to\n\u00a0* be posted in.\n\u00a0*\/\nconst SetupWorkflowForm = MessageSetupWorkflow.addStep(\n\u00a0\u00a0Schema.slack.functions.OpenForm,\n\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0title: \"Welcome Message Form\",\n\u00a0\u00a0\u00a0\u00a0submit_label: \"Submit\",\n\u00a0\u00a0\u00a0\u00a0description: \":wave: Create a welcome message for a channel!\",\n\u00a0\u00a0\u00a0\u00a0interactivity: MessageSetupWorkflow.inputs.interactivity,\n\u00a0\u00a0\u00a0\u00a0fields: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0required: [\"channel\", \"messageInput\"],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0elements: [\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name: \"messageInput\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0title: \"Your welcome message\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: Schema.types.string,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0long: true,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name: \"channel\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0title: \"Select a channel to post this message in\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: Schema.slack.types.channel_id,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0default: MessageSetupWorkflow.inputs.channel,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\n\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0},\n);<\/pre>\n\n\n\n<p>Then, we add confirmation.<\/p>\n\n\n\n<p>Add the following step to your create_welcome_message.ts workflow:<\/p>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \/workflows\/create_welcome_message.ts\n\/**\n\u00a0* This step takes the form output and passes it along to a custom\n\u00a0* function which sets the welcome message up.\n\u00a0* See `\/functions\/setup_function.ts` for more information.\n\u00a0*\/\nMessageSetupWorkflow.addStep(WelcomeMessageSetupFunction, {\n\u00a0\u00a0message: SetupWorkflowForm.outputs.fields.messageInput,\n\u00a0\u00a0channel: SetupWorkflowForm.outputs.fields.channel,\n\u00a0\u00a0author: MessageSetupWorkflow.inputs.interactivity.interactor.id,\n});\n\/**\n\u00a0* This step uses the SendEphemeralMessage Slack function.\n\u00a0* An ephemeral confirmation message will be sent to the user\n\u00a0* creating the welcome message, after the user submits the above\n\u00a0* form.\n\u00a0*\/\nMessageSetupWorkflow.addStep(Schema.slack.functions.SendEphemeralMessage, {\n\u00a0\u00a0channel_id: SetupWorkflowForm.outputs.fields.channel,\n\u00a0\u00a0user_id: MessageSetupWorkflow.inputs.interactivity.interactor.id,\n\u00a0\u00a0message:\n\u00a0\u00a0\u00a0\u00a0`Your welcome message for this channel was successfully created! :white_check_mark:`,\n});\nexport default MessageSetupWorkflow;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"4-step-4-use-a-datastore-to-store-the-welcome-message\">Step 4: Use a datastore to store the welcome message<\/h3>\n\n\n\n<p>Start with creating a datastore.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Create file<\/strong>: In your datastores folder, create a file named messages.ts<\/li>\n\n\n\n<li><strong>Define structure<\/strong>: Set up the datastore structure to store welcome messages<\/li>\n<\/ul>\n\n\n\n<p>In this file, you\u2019ll define the structure of the datastore where the text field welcome messages will be stored:<\/p>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \/datastores\/messages.ts\nimport { DefineDatastore, Schema } from \"deno-slack-sdk\/mod.ts\";\n\/**\n\u00a0* Datastores are a Slack-hosted location to store\n\u00a0* and retrieve data for your app.\n\u00a0* https:\/\/api.slack.com\/automation\/datastores\n\u00a0*\/\nexport const WelcomeMessageDatastore = DefineDatastore({\n\u00a0\u00a0name: \"messages\",\n\u00a0\u00a0primary_key: \"id\",\n\u00a0\u00a0attributes: {\n\u00a0\u00a0\u00a0\u00a0id: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: Schema.types.string,\n\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0channel: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: Schema.slack.types.channel_id,\n\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0message: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: Schema.types.string,\n\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0author: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: Schema.slack.types.user_id,\n\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0},\n});<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"5-step-5-create-a-custom-function-to-store-the-welcome-message-in-the-datastore\">Step 5: Create a custom function to store the welcome message in the datastore<\/h3>\n\n\n\n<p>First, define the custom function.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Create file<\/strong>: In the functions folder, create a file named create_welcome_message.ts<\/li>\n\n\n\n<li><strong>Define function<\/strong>: Add the following code to define the function for storing the welcome message<\/li>\n<\/ul>\n\n\n\n<p>Here\u2019s the code to define the custom function:<\/p>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \/functions\/create_welcome_message.ts\nimport { DefineFunction, Schema, SlackFunction } from \"deno-slack-sdk\/mod.ts\";\nimport { SlackAPIClient } from \"deno-slack-sdk\/types.ts\";\nimport { SendWelcomeMessageWorkflow } from \"..\/workflows\/send_welcome_message.ts\";\nimport { WelcomeMessageDatastore } from \"..\/datastores\/messages.ts\";\n\/**\n\u00a0* This custom function will take the initial form input, store it\n\u00a0* in the datastore and create an event trigger to listen for\n\u00a0* user_joined_channel events in the specified channel.\n\u00a0*\/\nexport const WelcomeMessageSetupFunction = DefineFunction({\n\u00a0\u00a0callback_id: \"welcome_message_setup_function\",\n\u00a0\u00a0title: \"Welcome Message Setup\",\n\u00a0\u00a0description: \"Takes a welcome message and stores it in the datastore\",\n\u00a0\u00a0source_file: \"functions\/create_welcome_message.ts\",\n\u00a0\u00a0input_parameters: {\n\u00a0\u00a0\u00a0\u00a0properties: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0message: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: Schema.types.string,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0description: \"The welcome message\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0channel: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: Schema.slack.types.channel_id,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0description: \"Channel to post in\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0author: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: Schema.slack.types.user_id,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0description:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"The user ID of the person who created the welcome message\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0required: [\"message\", \"channel\"],\n\u00a0\u00a0},\n});<\/pre>\n\n\n\n<p>Next, add your required functionality.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Store data<\/strong>: Include a code to save the welcome message details in your datastore and set up bot events triggers<\/li>\n<\/ul>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \/functions\/create_welcome_message.ts\nexport default SlackFunction(\n\u00a0\u00a0WelcomeMessageSetupFunction,\n\u00a0\u00a0async ({ inputs, client }) => {\n\u00a0\u00a0\u00a0\u00a0const { channel, message, author } = inputs;\n\u00a0\u00a0\u00a0\u00a0const uuid = crypto.randomUUID();\n\u00a0\u00a0\u00a0\u00a0\/\/ Save information about the welcome message to the datastore\n\u00a0\u00a0\u00a0\u00a0const putResponse = await client.apps.datastore.put&lt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0typeof WelcomeMessageDatastore.definition\n\u00a0\u00a0\u00a0\u00a0>({\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0datastore: WelcomeMessageDatastore.name,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0item: { id: uuid, channel, message, author },\n\u00a0\u00a0\u00a0\u00a0});\n\u00a0\u00a0\u00a0\u00a0if (!putResponse.ok) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return { error: `Failed to save welcome message: ${putResponse.error}` };\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\/\/ Search for any existing triggers for the welcome workflow\n\u00a0\u00a0\u00a0\u00a0const triggers = await findUserJoinedChannelTrigger(client, channel);\n\u00a0\u00a0\u00a0\u00a0if (triggers.error) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return { error: `Failed to lookup existing triggers: ${triggers.error}` };\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\/\/ Create a new user_joined_channel trigger if none exist\n\u00a0\u00a0\u00a0\u00a0if (!triggers.exists) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0const newTrigger = await saveUserJoinedChannelTrigger(client, channel);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (!newTrigger.ok) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0error: `Failed to create welcome trigger: ${newTrigger.error}`,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0};\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0return { outputs: {} };\n\u00a0\u00a0},\n);<\/pre>\n\n\n\n<p>Then, integrate the Slack bot into your workflow.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Update workflow:<\/strong> In your create_welcome_message.ts file, add a step to call the custom function<\/li>\n<\/ul>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \/workflows\/create_welcome_message.ts\n\/**\n\u00a0* This step takes the form output and passes it along to a custom\n\u00a0* function which sets the welcome message up.\n\u00a0* See `\/functions\/setup_function.ts` for more information.\n\u00a0*\/\nMessageSetupWorkflow.addStep(WelcomeMessageSetupFunction, {\n\u00a0\u00a0message: SetupWorkflowForm.outputs.fields.messageInput,\n\u00a0\u00a0channel: SetupWorkflowForm.outputs.fields.channel,\n\u00a0\u00a0author: MessageSetupWorkflow.inputs.interactivity.interactor.id,\n});\nexport default MessageSetupWorkflow;<\/pre>\n\n\n\n<p>With this step, your workflow is now capable of:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Allowing a bot user to input and submit a welcome message through a form<\/li>\n\n\n\n<li>Storing the welcome message information in a data store<\/li>\n\n\n\n<li>Setting up triggers to ensure the welcome message is delivered when a new user joins the specified channel<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"6-step-6-create-triggers-to-activate-workflows\">Step 6: Create triggers to activate workflows<\/h3>\n\n\n\n<p>First, create a link trigger.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Create file<\/strong>: In the triggers folder, create create_welcome_message_shortcut.ts<\/li>\n\n\n\n<li><strong>Add code<\/strong>: Define the link trigger to start the MessageSetupWorkflow when a bot user clicks a specific link<\/li>\n<\/ul>\n\n\n\n<p>Your code will look something like this.<\/p>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ triggers\/create_welcome_message_shortcut.ts\nimport { Trigger } from \"deno-slack-api\/types.ts\";\nimport MessageSetupWorkflow from \"..\/workflows\/create_welcome_message.ts\";\nimport { TriggerContextData, TriggerTypes } from \"deno-slack-api\/mod.ts\";\n\/**\n\u00a0* This link trigger prompts the MessageSetupWorkflow workflow.\n\u00a0*\/\nconst welcomeMessageTrigger: Trigger&lt;typeof MessageSetupWorkflow.definition> = {\n\u00a0\u00a0type: TriggerTypes.Shortcut,\n\u00a0\u00a0name: \"Setup a Welcome Message\",\n\u00a0\u00a0description: \"Creates an automated welcome message for a given channel.\",\n\u00a0\u00a0workflow: `#\/workflows\/${MessageSetupWorkflow.definition.callback_id}`,\n\u00a0\u00a0inputs: {\n\u00a0\u00a0\u00a0\u00a0interactivity: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value: TriggerContextData.Shortcut.interactivity,\n\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0channel: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value: TriggerContextData.Shortcut.channel_id,\n\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0},\n};\nexport default welcomeMessageTrigger;<\/pre>\n\n\n\n<p>Now, create the event trigger. This is essentially where you enable events that activate the bot. In this example, the bot user event trigger will be a new user joining a channel.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Update file:<\/strong> Add the event trigger to create_welcome_message.ts to send the welcome message when a new user joins a channel<\/li>\n<\/ul>\n\n\n\n<p>Here\u2019s the code to add.<\/p>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \/functions\/create_welcome_message.ts\n\/**\n\u00a0* findUserJoinedChannelTrigger returns if the user_joined_channel trigger\n\u00a0* exists for the \"Send Welcome Message\" workflow in a channel.\n\u00a0*\/\nexport async function findUserJoinedChannelTrigger(\n\u00a0\u00a0client: SlackAPIClient,\n\u00a0\u00a0channel: string,\n): Promise&lt;{ error?: string; exists?: boolean }> {\n\u00a0\u00a0\/\/ Collect all existing triggers created by the app\n\u00a0\u00a0const allTriggers = await client.workflows.triggers.list({ is_owner: true });\n\u00a0\u00a0if (!allTriggers.ok) {\n\u00a0\u00a0\u00a0\u00a0return { error: allTriggers.error };\n\u00a0\u00a0}\n\u00a0\u00a0\/\/ Find user_joined_channel triggers for the \"Send Welcome Message\"\n\u00a0\u00a0\/\/ workflow in the specified channel\n\u00a0\u00a0const joinedTriggers = allTriggers.triggers.filter((trigger) => (\n\u00a0\u00a0\u00a0\u00a0trigger.workflow.callback_id ===\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0SendWelcomeMessageWorkflow.definition.callback_id &amp;&amp;\n\u00a0\u00a0\u00a0\u00a0trigger.event_type === \"slack#\/events\/user_joined_channel\" &amp;&amp;\n\u00a0\u00a0\u00a0\u00a0trigger.channel_ids.includes(channel)\n\u00a0\u00a0));\n\u00a0\u00a0\/\/ Return if any matching triggers were found\n\u00a0\u00a0const exists = joinedTriggers.length > 0;\n\u00a0\u00a0return { exists };\n}\n\/**\n\u00a0* saveUserJoinedChannelTrigger creates a new user_joined_channel trigger\n\u00a0* for the \"Send Welcome Message\" workflow in a channel.\n\u00a0*\/\nexport async function saveUserJoinedChannelTrigger(\n\u00a0\u00a0client: SlackAPIClient,\n\u00a0\u00a0channel: string,\n): Promise&lt;{ ok: boolean; error?: string }> {\n\u00a0\u00a0const triggerResponse = await client.workflows.triggers.create&lt;\n\u00a0\u00a0\u00a0\u00a0typeof SendWelcomeMessageWorkflow.definition\n\u00a0\u00a0>({\n\u00a0\u00a0\u00a0\u00a0type: \"event\",\n\u00a0\u00a0\u00a0\u00a0name: \"User joined channel\",\n\u00a0\u00a0\u00a0\u00a0description: \"Send a message when a user joins the channel\",\n\u00a0\u00a0\u00a0\u00a0workflow:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0`#\/workflows\/${SendWelcomeMessageWorkflow.definition.callback_id}`,\n\u00a0\u00a0\u00a0\u00a0event: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0event_type: \"slack#\/events\/user_joined_channel\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0channel_ids: [channel],\n\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0inputs: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0channel: { value: channel },\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0triggered_user: { value: \"{{data.user_id}}\" },\n\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0});\n\u00a0\u00a0if (!triggerResponse.ok) {\n\u00a0\u00a0\u00a0\u00a0return { ok: false, error: triggerResponse.error };\n\u00a0\u00a0}\n\u00a0\u00a0return { ok: true };\n}<\/pre>\n\n\n\n<p>Result:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Link trigger<\/strong>: Allows bot users to set up a welcome message by clicking a link, initiating the MessageSetupWorkflow<\/li>\n\n\n\n<li><strong>Event trigger<\/strong>: Sends the automated messages when a new user joins the specified channel, using the stored message and channel details<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"7-step-7-create-a-workflow-for-sending-the-welcome-message\">Step 7: Create a workflow for sending the welcome message<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Navigate to folder<\/strong>: Go to the workflows folder<\/li>\n\n\n\n<li><strong>Create file<\/strong>: Create a new file named send_welcome_message.ts<\/li>\n\n\n\n<li><strong>Add code<\/strong>: Define the workflow to retrieve and send the welcome message from the datastore<\/li>\n<\/ul>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \/workflows\/send_welcome_message.ts\nimport { DefineWorkflow, Schema } from \"deno-slack-sdk\/mod.ts\";\nimport { SendWelcomeMessageFunction } from \"..\/functions\/send_welcome_message.ts\";\n\/**\n\u00a0* The SendWelcomeMessageWorkFlow will retrieve the welcome message\n\u00a0* from the datastore and send it to the specified channel, when\n\u00a0* a new user joins the channel.\n\u00a0*\/\nexport const SendWelcomeMessageWorkflow = DefineWorkflow({\n\u00a0\u00a0callback_id: \"send_welcome_message\",\n\u00a0\u00a0title: \"Send Welcome Message\",\n\u00a0\u00a0description:\n\u00a0\u00a0\u00a0\u00a0\"Posts an ephemeral welcome message when a new user joins a channel.\",\n\u00a0\u00a0input_parameters: {\n\u00a0\u00a0\u00a0\u00a0properties: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0channel: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: Schema.slack.types.channel_id,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0triggered_user: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: Schema.slack.types.user_id,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0required: [\"channel\", \"triggered_user\"],\n\u00a0\u00a0},\n});<\/pre>\n\n\n\n<p>This workflow retrieves the stored welcome message and sends it to the appropriate channel when a new user joins, enhancing engagement and automating the onboarding process.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"8-step-8-create-a-custom-function-to-send-the-welcome-message\">Step 8: Create a custom function to send the welcome message<\/h3>\n\n\n\n<p>1. Define the custom function:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Navigate to folder:<\/strong> Go to the functions folder<\/li>\n\n\n\n<li><strong>Create file:<\/strong> Create a new file named send_welcome_message.ts<\/li>\n<\/ul>\n\n\n\n<p>2. Add function definition:<\/p>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \/functions\/send_welcome_message.ts\nimport { DefineFunction, Schema, SlackFunction } from \"deno-slack-sdk\/mod.ts\";\nimport { WelcomeMessageDatastore } from \"..\/datastores\/messages.ts\";\n\/**\n\u00a0* This custom function will pull the stored message from the datastore\n\u00a0* and send it to the joining user as an ephemeral message in the\n\u00a0* specified channel.\n\u00a0*\/\nexport const SendWelcomeMessageFunction = DefineFunction({\n\u00a0\u00a0callback_id: \"send_welcome_message_function\",\n\u00a0\u00a0title: \"Sending the Welcome Message\",\n\u00a0\u00a0description: \"Pull the welcome messages and sends it to the new user\",\n\u00a0\u00a0source_file: \"functions\/send_welcome_message.ts\",\n\u00a0\u00a0input_parameters: {\n\u00a0\u00a0\u00a0\u00a0properties: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0channel: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: Schema.slack.types.channel_id,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0description: \"Channel where the event was triggered\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0triggered_user: {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: Schema.slack.types.user_id,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0description: \"User that triggered the event\",\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0},\n\u00a0\u00a0\u00a0\u00a0required: [\"channel\", \"triggered_user\"],\n\u00a0\u00a0},\n});<\/pre>\n\n\n\n<p>3. Add functionality:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Implement Code:<\/strong> Add the following code below the function definition in send_welcome_message.ts:<\/li>\n<\/ul>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \/functions\/send_welcome_message.ts\nexport default SlackFunction(SendWelcomeMessageFunction, async (\n\u00a0\u00a0{ inputs, client },\n) => {\n\u00a0\u00a0\/\/ Querying datastore for stored messages\n\u00a0\u00a0const messages = await client.apps.datastore.query&lt;\n\u00a0\u00a0\u00a0\u00a0typeof WelcomeMessageDatastore.definition\n\u00a0\u00a0>({\n\u00a0\u00a0\u00a0\u00a0datastore: WelcomeMessageDatastore.name,\n\u00a0\u00a0\u00a0\u00a0expression: \"#channel = :mychannel\",\n\u00a0\u00a0\u00a0\u00a0expression_attributes: { \"#channel\": \"channel\" },\n\u00a0\u00a0\u00a0\u00a0expression_values: { \":mychannel\": inputs.channel },\n\u00a0\u00a0});\n\u00a0\u00a0if (!messages.ok) {\n\u00a0\u00a0\u00a0\u00a0return { error: `Failed to gather welcome messages: ${messages.error}` };\n\u00a0\u00a0}\n\u00a0\u00a0\/\/ Send the stored messages ephemerally\n\u00a0\u00a0for (const item of messages[\"items\"]) {\n\u00a0\u00a0\u00a0\u00a0const message = await client.chat.postEphemeral({\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0channel: item[\"channel\"],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0text: item[\"message\"],\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0user: inputs.triggered_user,\n\u00a0\u00a0\u00a0\u00a0});\n\u00a0\u00a0\u00a0\u00a0if (!message.ok) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return { error: `Failed to send welcome message: ${message.error}` };\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0}\n\u00a0\u00a0return {\n\u00a0\u00a0\u00a0\u00a0outputs: {},\n\u00a0\u00a0};\n});<\/pre>\n\n\n\n<p>4. Integrate custom function:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Add to the workflow: <\/strong>Go back to your send_welcome_message.ts workflow file and add the custom function as a step:<\/li>\n<\/ul>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \/workflows\/send_welcome_message.ts\nSendWelcomeMessageWorkflow.addStep(SendWelcomeMessageFunction, {\n\u00a0\u00a0channel: SendWelcomeMessageWorkflow.inputs.channel,\n\u00a0\u00a0triggered_user: SendWelcomeMessageWorkflow.inputs.triggered_user,\n});<\/pre>\n\n\n\n<p>With this custom function, your Slack app settings will now send messages to any user who joins a private or public channel with a specific channel.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"9-step-9-use-your-slack-app\">Step 9: Use your Slack app<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"10-1-run-your-slack-app-locally\">1. Run your Slack app locally<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Install locally:<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Open your terminal and navigate to your app&#8217;s root folder<\/li>\n\n\n\n<li>Run: slack run<\/li>\n\n\n\n<li>Follow the terminal prompts to set up your local server<\/li>\n<\/ul>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Invoke the Link Trigger:<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Open a new terminal tab<\/li>\n\n\n\n<li>Create the link trigger: slack trigger create &#8211;trigger-def triggers\/create_welcome_message_shortcut.ts<\/li>\n\n\n\n<li>Install the trigger in your workspace and choose the Local environment<\/li>\n\n\n\n<li>Copy the Shortcut URL provided<\/li>\n\n\n\n<li>Post this URL in a Slack channel to start the workflow and create the welcome message<\/li>\n<\/ul>\n\n\n\n<pre class=\"syntax\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\ud83d\udcda App Manifest\n   Created app manifest for \"welcomebot (local)\" in \"myworkspace\" workspace\n\u26a0\ufe0f  Outgoing domains\n   No allowed outgoing domains are configured\n   If your function makes network requests, you will need to allow the outgoing domains\n   Learn more about upcoming changes to outgoing domains: https:\/\/api.slack.com\/changelog\n\ud83c\udfe0 Workspace Install\n   Installed \"welcomebot (local)\" app to \"myworkspace\" workspace\n   Finished in 1.5s\n\u26a1 Trigger created\n   Trigger ID:   Ft0123ABC456\n   Trigger Type: shortcut\n   Trigger Name: Setup a Welcome Message\n   Shortcut URL: \nhttps:\/\/slack.com\/shortcuts\/Ft0123ABC456\/XYZ123\n...\n<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"11-2-launch-your-slack-app\">2. Launch your Slack app<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Deploy Slack:<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Run:<\/strong> slack deploy<\/li>\n<\/ul>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Recreate the Trigger:<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Create the trigger for the deployed app:<\/strong> slack trigger create &#8211;trigger-def triggers\/create_welcome_message_shortcut.ts<\/li>\n\n\n\n<li>Choose the deployed option<\/li>\n<\/ul>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Use in a Deployed Environment:<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Copy the new Shortcut URL<\/li>\n\n\n\n<li>Use it within your Slack workspace<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"12-step-10-your-slack-bot-is-ready\">Step 10: Your Slack bot is ready!<\/h3>\n\n\n\n<p>Congratulations on reaching the final step of building your Slack bot! Your bot will now automatically send messages to new users. Test it out to make sure it&#8217;s working properly on a public channel.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"79\" src=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/Slackbot.png\" alt=\"Slackbot\" class=\"wp-image-212273\" srcset=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/Slackbot.png 602w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/Slackbot-300x39.png 300w\" sizes=\"auto, (max-width: 602px) 100vw, 602px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"13-limitations-of-using-slack-bots-for-communication\">Limitations of Using Slack Bots for Communication<\/h2>\n\n\n\n<p>By now, you must have realized the convenience Slack bots bring to <a href=\"https:\/\/clickup.com\/blog\/slack-hacks\/\">workplace communication<\/a>. After all, who doesn\u2019t love a little help with automation?&nbsp;<\/p>\n\n\n\n<p>But there are a few limitations you should be wary of.<\/p>\n\n\n\n<p>Knowing these limitations will allow you to make an informed decision about which <a href=\"https:\/\/clickup.com\/blog\/workplace-communication-tools\/\">workplace communication platform<\/a> is most efficient for you.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"14-1-slack-bots-can-be-distracting\">1. Slack bots can be distracting<\/h3>\n\n\n\n<p>Slack bots can be a double-edged sword when it comes to focus.<\/p>\n\n\n\n<p>Sure, it provides quick information and helps with tasks with a simple query. But it also comes with a barrage of notifications, from the bot&#8217;s token updates to team messages.<\/p>\n\n\n\n<p>This constant distraction can hinder work. It often makes it difficult for your employees to prioritize work with the additional bot noise.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"15-2-slack-can-be-expensive-and-so-can-its-bots\">2. Slack can be expensive, and so can its bots<\/h3>\n\n\n\n<p>This is probably the biggest problem when it comes to <a href=\"https:\/\/clickup.com\/blog\/asynchronous-communication-tools\/\">communication tools like Slack<\/a>: they can become really expensive quickly.<\/p>\n\n\n\n<p>Slack offers various plans, each with its own features, but as your team grows, so does the total cost of ownership for a SaaS product.<\/p>\n\n\n\n<p>For example, the Pro plan costs $7.25 per user per month, which might seem reasonable initially. However, when you have a large team, these costs can quickly escalate, leading to a significant monthly expense.&nbsp;At that price, you can find <a href=\"https:\/\/clickup.com\/blog\/alternatives-to-slack\/\">Slack alternatives<\/a> that offer better features.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"16-3-slack-bots-need-maintenance-\">3. Slack bots need maintenance&nbsp;<\/h3>\n\n\n\n<p>Slack bots, much like any other chatbot, rely on the data they have been trained with. If a bot user asks for information that hasn&#8217;t been integrated into the bot&#8217;s system, it will likely fail to provide a satisfactory response.&nbsp;<\/p>\n\n\n\n<p>This means that your Slack bot will require constant updates to stay relevant and useful.<\/p>\n\n\n\n<p>You&#8217;ll need to keep track of the most common questions being asked and regularly feed your Slack bot new, relevant information. This ongoing maintenance can become a significant workload, especially as your Slack workspace grows.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"17-4-bots-can-eat-up-space\">4. Bots can eat up space<\/h3>\n\n\n\n<p>Slack has minimal storage capacity, and as these limits are reached, Slack automatically deletes older files and messages to make room for new ones.<\/p>\n\n\n\n<p>This process can lead to the unintentional loss of important documents or communication history, especially if you&#8217;re using bots to automate tasks that generate a lot of data.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"18-5-slack-bots-aren%E2%80%99t-creative-\">5. Slack bots aren\u2019t creative&nbsp;&nbsp;<\/h3>\n\n\n\n<p>This is a no-brainer, but bots aren\u2019t usually the smartest tool in the shed. They lack critical thinking and the ability to approach a situation from different perspectives.&nbsp;<\/p>\n\n\n\n<p>Therefore, in a sticky situation where problem-solving is required, you cannot depend on your Slack bot to provide unique solutions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"19-enhancing-team-communication-with-clickup-and-slack\">Enhancing Team Communication with ClickUp and Slack<\/h2>\n\n\n\n<p>If you think Slack is an efficient communication tool, wait until you integrate it with <a href=\"https:\/\/clickup.com\/\">ClickUp<\/a>.<\/p>\n\n\n\n<p>Together, <a href=\"https:\/\/clickup.com\/blog\/clickup-vs-slack\/\">Slack and ClickUp form the ultimate dream team<\/a> in a collaborative environment.<\/p>\n\n\n\n<p>Let&#8217;s explore how different teams can benefit from this integration while keeping Slack etiquette in mind.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"20-enable-clickup-activity-sync-with-slack\">Enable ClickUp activity sync with Slack<\/h3>\n\n\n\n<p>Once you&#8217;ve <a href=\"https:\/\/clickup.com\/blog\/best-slack-integrations\/\">integrated ClickUp with Slack<\/a>, you can sync all your ClickUp activity with your Slack workspace for specific spaces, folders, and lists.&nbsp;<\/p>\n\n\n\n<p>Your ClickUp activities will be automatically sent as messages to your Slack channel. You can select public or private channels where ClickUp can access these notifications.&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"571\" src=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/ClickUp-with-Slackbot.png\" alt=\"Sync ClickUp into your Slack channel \" class=\"wp-image-212275\" srcset=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/ClickUp-with-Slackbot.png 602w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/ClickUp-with-Slackbot-300x285.png 300w\" sizes=\"auto, (max-width: 602px) 100vw, 602px\" \/><figcaption class=\"wp-element-caption\"><em>Sync ClickUp into your Slack channel and choose what kind of texts you want to receive<\/em>&nbsp;<\/figcaption><\/figure><\/div>\n\n\n<p>To grant ClickUp access to a private channel, use the \/invite @ClickUp command.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1108\" height=\"1136\" src=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slack-bot.png\" alt=\"ClickUp and Slack Integration\" class=\"wp-image-212297\" srcset=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slack-bot.png 1108w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slack-bot-293x300.png 293w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slack-bot-768x787.png 768w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slack-bot-700x718.png 700w\" sizes=\"auto, (max-width: 1108px) 100vw, 1108px\" \/><figcaption class=\"wp-element-caption\"><em>Search ClickUp in the \u2018add an app\u2019 section on Slack\u2019s integrations page to give access to private channels<\/em>&nbsp;<\/figcaption><\/figure><\/div>\n\n\n<p>How does this help?<\/p>\n\n\n\n<p>Imagine you&#8217;re part of a marketing team working on a high-stakes campaign with a tight deadline. This integration removes the need to <a href=\"https:\/\/clickup.com\/blog\/slack-hacks\/\">update your team members<\/a> on your progress manually.&nbsp;<\/p>\n\n\n\n<p>Instead, ClickUp automatically sends updates to your Slack channel, giving everyone a 360-degree view of where the project currently stands.&nbsp;<\/p>\n\n\n\n<p>Similarly, critical updates from the tech teams\u2014like bug fixes, feature deployments, or server maintenance tasks\u2014are immediately shared with the team in real time.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"21-tasks-comments-and-docs-all-on-your-slack-screen\">Tasks, comments, and docs, all on your Slack screen<\/h3>\n\n\n\n<p>When you link tasks, comments, or Docs in Slack, you&#8217;ll see a preview of each item, a process referred to as &#8220;unfurling.&#8221; This feature lets your team view details like task status, assignees, priorities, and more directly in Slack.&nbsp;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"1472\" height=\"418\" src=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/Slack-bot-2.png\" alt=\"How to create a Slack Bot: Use ClickUp in sync with Slack\" class=\"wp-image-212299\" srcset=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/Slack-bot-2.png 1472w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/Slack-bot-2-300x85.png 300w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/Slack-bot-2-1400x398.png 1400w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/Slack-bot-2-768x218.png 768w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/Slack-bot-2-700x199.png 700w\" sizes=\"auto, (max-width: 1472px) 100vw, 1472px\" \/><figcaption class=\"wp-element-caption\"><em>View description, topic, and assigned members all at once with ClickUp on Slack<\/em><\/figcaption><\/figure><\/div>\n\n\n<p>For instance, say a sales team has created a Slack channel to discuss a key account. When a task related to this account is shared on Slack, everyone can immediately see who\u2019s assigned, what the priority is, and the current status.&nbsp;<\/p>\n\n\n\n<p>Now, sales reps (or any other team) can respond quickly to client needs without digging through multiple apps.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"22-turn-messages-into-tasks\">Turn messages into tasks<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"992\" height=\"1224\" src=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/Slackbot-1.png\" alt=\"How to create a Slack Bot: Use ClickUp in sync with Slack\" class=\"wp-image-212302\" srcset=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/Slackbot-1.png 992w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/Slackbot-1-243x300.png 243w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/Slackbot-1-768x948.png 768w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/Slackbot-1-700x864.png 700w\" sizes=\"auto, (max-width: 992px) 100vw, 992px\" \/><figcaption class=\"wp-element-caption\"><em>Type \/clickup new on a Slack channel to create and save a task<\/em><\/figcaption><\/figure><\/div>\n\n\n<p>You can create ClickUp tasks directly from Slack by using a<strong> \/Slash command like \/clickup new<\/strong> or adding a Slack message as a comment to an existing task.&nbsp;<\/p>\n\n\n\n<p>This is particularly helpful when delegating tasks. Imagine the marketing head likes a creative idea shared in the Slack chat; they can instantly turn that message into a task in ClickUp without ever leaving Slack.&nbsp;<\/p>\n\n\n<div style=\"background-color: #d9edf7; color: #31708f; border-left-color: #31708f; \" class=\"ub-styled-box ub-notification-box wp-block-ub-styled-box\" id=\"ub-styled-box-21cc7834-9f4d-4f3a-8da7-8521a763a48e\">\n<p id=\"ub-styled-box-notification-content-\"><strong>Also read:<\/strong> <a href=\"https:\/\/clickup.com\/blog\/slack-etiquette\/\">The DOs and DON\u2019Ts of Using Slack at Work<\/a><\/p>\n\n\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"23-clickup-does-what-slack-can-and-more\">ClickUp Does What Slack Can, and More<\/h2>\n\n\n\n<p>At the end of the day, you\u2019re using Slack to <a href=\"https:\/\/clickup.com\/blog\/team-communication\/\">communicate effectively with your team<\/a> and across departments. But communication is more streamlined, effective, and intuitive on ClickUp. Let\u2019s explore more.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"24-real-time-conversations-with-chat-view\">Real-time conversations with chat view<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1536\" height=\"1025\" src=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slackbot-2-1.png\" alt=\"How to create a Slack Bot: Use ClickUp in sync with Slack\" class=\"wp-image-212305\" srcset=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slackbot-2-1.png 1536w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slackbot-2-1-300x200.png 300w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slackbot-2-1-1400x934.png 1400w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slackbot-2-1-768x513.png 768w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slackbot-2-1-700x467.png 700w\" sizes=\"auto, (max-width: 1536px) 100vw, 1536px\" \/><\/figure>\n\n\n\n<p><a href=\"https:\/\/clickup.com\/features\/chat-view\">ClickUp\u2019s Chat View<\/a> lets your team engage in <a href=\"https:\/\/clickup.com\/blog\/real-time-collaboration\/\">real-time conversations<\/a> without leaving the platform.&nbsp;<\/p>\n\n\n\n<p>Whether you&#8217;re an IT team troubleshooting an urgent issue or a sales team discussing a new lead, the Chat View keeps all your communications centralized.&nbsp;<\/p>\n\n\n\n<p>Marketing teams particularly struggle with scattered conversations across different apps. On ClickUp, you can brainstorm ideas, share creative briefs, and make quick decisions\u2014all within the same workspace.&nbsp;<\/p>\n\n\n\n<p>And when it\u2019s time to turn those ideas into action, ClickUp lets you do it right from the chat. Assign tasks, set deadlines, and move projects forward without leaving the conversation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"25-collaboration-brainstorming-and-whiteboards\">Collaboration, brainstorming, and whiteboards<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"936\" height=\"625\" src=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/image-362.png\" alt=\"How to create a Slack Bot: Use ClickUp in sync with Slack\" class=\"wp-image-212818\" srcset=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/image-362.png 936w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/image-362-300x200.png 300w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/image-362-768x513.png 768w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/image-362-700x467.png 700w\" sizes=\"auto, (max-width: 936px) 100vw, 936px\" \/><figcaption class=\"wp-element-caption\"><em>Visualize your tasks with ClickUp\u2019s Whiteboard<\/em><\/figcaption><\/figure><\/div>\n\n\n<p>Need to brainstorm a strategy or plan a project? <a href=\"https:\/\/clickup.com\/features\/whiteboards\">ClickUp\u2019s Whiteboards<\/a> offer a virtual space where teams can visually collaborate.&nbsp;<\/p>\n\n\n\n<p>While Slack lets you brainstorm with your teammates through text-based discussions, ClickUp Whiteboards take your projects to the next level by allowing your team to draw, annotate, and turn ideas into actionable tasks on the board.&nbsp;<\/p>\n\n\n\n<p>If you\u2019re part of an engineering team that needs to map out workflows or a project manager handling a complex project timeline, this will become your new favorite tool.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"26-task-management-with-assigned-comments\">Task management with Assigned Comments<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"936\" height=\"625\" src=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slackbot-3.png\" alt=\"How to create a Slack Bot: Use ClickUp in sync with Slack\" class=\"wp-image-212309\" srcset=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slackbot-3.png 936w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slackbot-3-300x200.png 300w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slackbot-3-768x513.png 768w, https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/slackbot-3-700x467.png 700w\" sizes=\"auto, (max-width: 936px) 100vw, 936px\" \/><figcaption class=\"wp-element-caption\"><em>Address issues right away by assigning tasks in comments on ClickUp Chat View<\/em><\/figcaption><\/figure><\/div>\n\n\n<p>One of ClickUp\u2019s standout features is the ability to assign comments to specific team members using <strong>@mentions<\/strong>. If you&#8217;re discussing a critical update in Chat View, you can instantly tag a team member and turn that comment into a task.<\/p>\n\n\n\n<p>For example, during a product development meeting, an engineering lead can assign a bug fix directly from the chat, ensuring nothing slips through the cracks.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"27-visual-communication-with-clickup-clips\">Visual communication with ClickUp Clips<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"864\" height=\"540\" src=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/image-42.gif\" alt=\"How to create a Slack Bot: Use ClickUp in sync with Slack\" class=\"wp-image-212819\"\/><figcaption class=\"wp-element-caption\"><em>Record important events and turn them into resources with ClickUp Clips<\/em><\/figcaption><\/figure><\/div>\n\n\n<p>Are you a visual learner? If yes, <a href=\"https:\/\/clickup.com\/features\/clips\">ClickUp Clips<\/a> is about to enhance your experience tenfold by allowing you to record and <a href=\"https:\/\/clickup.com\/blog\/screen-share-software\/\">share screen recordings<\/a>.&nbsp;<\/p>\n\n\n\n<p>Imagine an IT team recording a step-by-step guide for troubleshooting a common issue\u2014team members can access this clip anytime, making it easier for them to understand and implement changes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"28-strategize-actions-with-templates\">Strategize actions with templates<\/h3>\n\n\n\n<div class=\"wp-block-create-block-cu-image-with-overlay\"><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><div class=\"cu-image-with-overlay__overlay\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/08\/image-416.png\" alt=\"ClickUp Internal Communication Strategy and Action Plan Template\" class=\"image skip-lazy cu-image-with-overlay__image\" style=\"width:100%;height:auto\"\/><div class=\"cu-image-with-overlay__cta-wrap\"><a href=\"https:\/\/app.clickup.com\/signup?template=t-127240564&amp;department=operations\" class=\"cu-image-with-overlay__cta cu-image-with-overlay__cta--#7c68ee\" data-segment-track-click=\"true\" data-segment-section-model-name=\"imageCTA\" data-segment-button-clicked=\"Download This Template\" data-segment-props=\"{&quot;location&quot;:&quot;body&quot;,&quot;sectionModelName&quot;:&quot;imageCTA&quot;,&quot;buttonClicked&quot;:&quot;Download This Template&quot;}\">Download This Template<\/a><\/div><\/div><figcaption class=\"wp-element-caption\">Streamline internal communication with ClickUp\u2019s Internal Communication Strategy and Action Plan Template<\/figcaption><\/figure><\/div><\/div>\n\n\n\n<p>At the end of the day, tools like ClickUp and Slack are communication enablers. For these tools to be useful and actually bring order to your internal communication, you need a strategy. And that\u2019s where <a href=\"https:\/\/clickup.com\/templates\/internal-communication-strategy-and-action-plan-t-127240564\">ClickUp\u2019s Internal Communication Strategy and Action Plan Template<\/a> can come in handy.<\/p>\n\n\n\n<p>With this template, you can assess your existing communication strategy, chart out a new approach and its associated goals, set goals and objectives for your strategy, and create a coherent action plan.<\/p>\n\n\n\n<div class=\"wp-block-cu-buttons\"><a href=\"https:\/\/app.clickup.com\/signup?template=t-127240564&amp;department=operations\" class=\"cu-button cu-button--purple cu-button--improved\">Download This Template<\/a><\/div>\n\n\n<div style=\"background-color: #d9edf7; color: #31708f; border-left-color: #31708f; \" class=\"ub-styled-box ub-notification-box wp-block-ub-styled-box\" id=\"ub-styled-box-8fa32424-7414-4bcb-a864-7c21781c304a\">\n<p id=\"ub-styled-box-notification-content-\"><strong>Bonus:<\/strong> <a href=\"https:\/\/clickup.com\/blog\/communication-plan-templates\/\">15 Free Project Communication Plan Templates<\/a><\/p>\n\n\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"29-you%E2%80%99re-a-click-away-from-better-communication-with-clickup\">You\u2019re a Click Away from Better Communication with ClickUp<\/h2>\n\n\n\n<p>Slack is a great tool that becomes even better with ClickUp\u2019s integration.&nbsp;<\/p>\n\n\n\n<p>However, instead of juggling Slack messages with ClickUp project updates and management, having one platform that can do it all makes more sense.&nbsp;ClickUp is that platform. It ensures all you need to work\u2014messages, tasks, views, dashboards, and more\u2014resides in one place.<\/p>\n\n\n\n<p>ClickUp\u2019s real-time conversations, the convenience of turning one direct message into a detailed task, and the ability to visualize discussions\u2014all make ClickUp a holistic project management app when compared to <a href=\"https:\/\/clickup.com\/blog\/slack-project-management\/\">Slack\u2019s project management<\/a> capabilities, which are limited.&nbsp;<\/p>\n\n\n\n<p>Try it out yourself to see the difference. <a href=\"https:\/\/clickup.com\/signup\">Create your free ClickUp account<\/a> today and simplify your workflows!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Virtual workspaces like Slack have become a big part of our work culture.&nbsp; Need to communicate with your teammates? Just send them a direct message on Slack. Want to collaborate on a project? Slack has you covered with channels, integrations, and easy file sharing.&nbsp; One of Slack\u2019s best capabilities is its automated bots, which perform [&hellip;]<\/p>\n","protected":false},"author":125,"featured_media":212342,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ub_ctt_via":"","cu_sticky_sidebar_cta_is_visible":true,"cu_sticky_sidebar_cta_title":"Start using ClickUp today","cu_sticky_sidebar_cta_bullet_1":"Manage all your work in one place","cu_sticky_sidebar_cta_bullet_2":"Collaborate with your team","cu_sticky_sidebar_cta_bullet_3":"Use ClickUp for FREE\u2014forever","cu_sticky_sidebar_cta_button_text":"Get Started","cu_sticky_sidebar_cta_button_link":"","_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[223],"tags":[],"class_list":["post-212259","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software"],"featured_image_src":"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/How-to-Create-a-Slack-Bot-From-Scratch.png","author_info":{"display_name":"Engineering Team","author_link":"https:\/\/clickup.com\/blog\/author\/engineering\/"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Create Your Own Slack Bot | ClickUp<\/title>\n<meta name=\"description\" content=\"Want to send customized bot messages via Slack? Here\u2019s a guide on how to create your Slack bot and enhance it with ClickUp integration.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Create Your Own Slack Bot | ClickUp\" \/>\n<meta property=\"og:description\" content=\"Want to send customized bot messages via Slack? Here\u2019s a guide on how to create your Slack bot and enhance it with ClickUp integration.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/\" \/>\n<meta property=\"og:site_name\" content=\"ClickUp\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/clickupprojectmanagement\" \/>\n<meta property=\"article:published_time\" content=\"2024-09-13T12:34:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-18T16:07:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/How-to-Create-a-Slack-Bot-From-Scratch.png\" \/>\n\t<meta property=\"og:image:width\" content=\"768\" \/>\n\t<meta property=\"og:image:height\" content=\"576\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Engineering Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@clickup\" \/>\n<meta name=\"twitter:site\" content=\"@clickup\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Engineering Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/\"},\"author\":{\"name\":\"Engineering Team\",\"@id\":\"https:\/\/clickup.com\/blog\/#\/schema\/person\/fd9a8ab5492a85bda4a7dc698c3c73fc\"},\"headline\":\"How to Create a Slack Bot From Scratch\",\"datePublished\":\"2024-09-13T12:34:17+00:00\",\"dateModified\":\"2026-02-18T16:07:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/\"},\"wordCount\":2807,\"publisher\":{\"@id\":\"https:\/\/clickup.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/How-to-Create-a-Slack-Bot-From-Scratch.png\",\"articleSection\":[\"Software\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/\",\"url\":\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/\",\"name\":\"How to Create Your Own Slack Bot | ClickUp\",\"isPartOf\":{\"@id\":\"https:\/\/clickup.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/How-to-Create-a-Slack-Bot-From-Scratch.png\",\"datePublished\":\"2024-09-13T12:34:17+00:00\",\"dateModified\":\"2026-02-18T16:07:30+00:00\",\"description\":\"Want to send customized bot messages via Slack? Here\u2019s a guide on how to create your Slack bot and enhance it with ClickUp integration.\",\"breadcrumb\":{\"@id\":\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#primaryimage\",\"url\":\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/How-to-Create-a-Slack-Bot-From-Scratch.png\",\"contentUrl\":\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/How-to-Create-a-Slack-Bot-From-Scratch.png\",\"width\":768,\"height\":576,\"caption\":\"How to Create a Slack Bot From Scratch\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/clickup.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Software\",\"item\":\"https:\/\/clickup.com\/blog\/software\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"How to Create a Slack Bot From Scratch\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/clickup.com\/blog\/#website\",\"url\":\"https:\/\/clickup.com\/blog\/\",\"name\":\"ClickUp\",\"description\":\"The ClickUp Blog\",\"publisher\":{\"@id\":\"https:\/\/clickup.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/clickup.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/clickup.com\/blog\/#organization\",\"name\":\"ClickUp\",\"url\":\"https:\/\/clickup.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/clickup.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2025\/07\/logo-v3-clickup-light.jpg\",\"contentUrl\":\"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2025\/07\/logo-v3-clickup-light.jpg\",\"width\":503,\"height\":125,\"caption\":\"ClickUp\"},\"image\":{\"@id\":\"https:\/\/clickup.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/clickupprojectmanagement\",\"https:\/\/x.com\/clickup\",\"https:\/\/www.linkedin.com\/company\/clickup-app\",\"https:\/\/en.wikipedia.org\/wiki\/ClickUp\",\"https:\/\/tiktok.com\/@clickup\",\"https:\/\/instagram.com\/clickup\",\"https:\/\/www.youtube.com\/@ClickUpProductivity\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/clickup.com\/blog\/#\/schema\/person\/fd9a8ab5492a85bda4a7dc698c3c73fc\",\"name\":\"Engineering Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/clickup.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3f1543e2e7e1e9ca0bef5c781d533c8ffa5089d38319a999b769c7f6572c7de0?s=96&d=retro&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3f1543e2e7e1e9ca0bef5c781d533c8ffa5089d38319a999b769c7f6572c7de0?s=96&d=retro&r=g\",\"caption\":\"Engineering Team\"},\"description\":\"ClickUp Engineering comprises a group of tech enthusiasts who double up as the authoritative and creative force behind ClickUp's blog. With a passion for both problem-solving and storytelling, their goal is to help tech engineers and product managers across the globe.\",\"url\":\"https:\/\/clickup.com\/blog\/author\/engineering\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Create Your Own Slack Bot | ClickUp","description":"Want to send customized bot messages via Slack? Here\u2019s a guide on how to create your Slack bot and enhance it with ClickUp integration.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/","og_locale":"en_US","og_type":"article","og_title":"How to Create Your Own Slack Bot | ClickUp","og_description":"Want to send customized bot messages via Slack? Here\u2019s a guide on how to create your Slack bot and enhance it with ClickUp integration.","og_url":"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/","og_site_name":"ClickUp","article_publisher":"https:\/\/www.facebook.com\/clickupprojectmanagement","article_published_time":"2024-09-13T12:34:17+00:00","article_modified_time":"2026-02-18T16:07:30+00:00","og_image":[{"width":768,"height":576,"url":"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/How-to-Create-a-Slack-Bot-From-Scratch.png","type":"image\/png"}],"author":"Engineering Team","twitter_card":"summary_large_image","twitter_creator":"@clickup","twitter_site":"@clickup","twitter_misc":{"Written by":"Engineering Team","Est. reading time":"21 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#article","isPartOf":{"@id":"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/"},"author":{"name":"Engineering Team","@id":"https:\/\/clickup.com\/blog\/#\/schema\/person\/fd9a8ab5492a85bda4a7dc698c3c73fc"},"headline":"How to Create a Slack Bot From Scratch","datePublished":"2024-09-13T12:34:17+00:00","dateModified":"2026-02-18T16:07:30+00:00","mainEntityOfPage":{"@id":"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/"},"wordCount":2807,"publisher":{"@id":"https:\/\/clickup.com\/blog\/#organization"},"image":{"@id":"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#primaryimage"},"thumbnailUrl":"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/How-to-Create-a-Slack-Bot-From-Scratch.png","articleSection":["Software"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/","url":"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/","name":"How to Create Your Own Slack Bot | ClickUp","isPartOf":{"@id":"https:\/\/clickup.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#primaryimage"},"image":{"@id":"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#primaryimage"},"thumbnailUrl":"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/How-to-Create-a-Slack-Bot-From-Scratch.png","datePublished":"2024-09-13T12:34:17+00:00","dateModified":"2026-02-18T16:07:30+00:00","description":"Want to send customized bot messages via Slack? Here\u2019s a guide on how to create your Slack bot and enhance it with ClickUp integration.","breadcrumb":{"@id":"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#primaryimage","url":"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/How-to-Create-a-Slack-Bot-From-Scratch.png","contentUrl":"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/09\/How-to-Create-a-Slack-Bot-From-Scratch.png","width":768,"height":576,"caption":"How to Create a Slack Bot From Scratch"},{"@type":"BreadcrumbList","@id":"https:\/\/clickup.com\/blog\/how-to-create-a-slack-bot\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/clickup.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Software","item":"https:\/\/clickup.com\/blog\/software\/"},{"@type":"ListItem","position":3,"name":"How to Create a Slack Bot From Scratch"}]},{"@type":"WebSite","@id":"https:\/\/clickup.com\/blog\/#website","url":"https:\/\/clickup.com\/blog\/","name":"ClickUp","description":"The ClickUp Blog","publisher":{"@id":"https:\/\/clickup.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/clickup.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/clickup.com\/blog\/#organization","name":"ClickUp","url":"https:\/\/clickup.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/clickup.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2025\/07\/logo-v3-clickup-light.jpg","contentUrl":"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2025\/07\/logo-v3-clickup-light.jpg","width":503,"height":125,"caption":"ClickUp"},"image":{"@id":"https:\/\/clickup.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/clickupprojectmanagement","https:\/\/x.com\/clickup","https:\/\/www.linkedin.com\/company\/clickup-app","https:\/\/en.wikipedia.org\/wiki\/ClickUp","https:\/\/tiktok.com\/@clickup","https:\/\/instagram.com\/clickup","https:\/\/www.youtube.com\/@ClickUpProductivity"]},{"@type":"Person","@id":"https:\/\/clickup.com\/blog\/#\/schema\/person\/fd9a8ab5492a85bda4a7dc698c3c73fc","name":"Engineering Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/clickup.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3f1543e2e7e1e9ca0bef5c781d533c8ffa5089d38319a999b769c7f6572c7de0?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3f1543e2e7e1e9ca0bef5c781d533c8ffa5089d38319a999b769c7f6572c7de0?s=96&d=retro&r=g","caption":"Engineering Team"},"description":"ClickUp Engineering comprises a group of tech enthusiasts who double up as the authoritative and creative force behind ClickUp's blog. With a passion for both problem-solving and storytelling, their goal is to help tech engineers and product managers across the globe.","url":"https:\/\/clickup.com\/blog\/author\/engineering\/"}]}},"reading":["17"],"keywords":[["Software","software",223]],"redirect_params":{"product":"","department":""},"is_translated":"true","author_data":{"name":"Engineering Team","link":"https:\/\/clickup.com\/blog\/author\/engineering\/","image":"https:\/\/clickup.com\/blog\/wp-content\/uploads\/2024\/03\/Screenshot-2024-03-25-at-2.14.52\u202fPM.png","position":""},"category_data":{"name":"Software","slug":"software","term_id":223,"url":"https:\/\/clickup.com\/blog\/software\/"},"hero_data":{"media_url":"","media_alt_text":"How to Create a Slack Bot From Scratch","button":"","template_id":"","youtube_thumbnail_url":"","custom_button_text":"","custom_button_url":"https:\/\/"},"_links":{"self":[{"href":"https:\/\/clickup.com\/blog\/wp-json\/wp\/v2\/posts\/212259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/clickup.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/clickup.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/clickup.com\/blog\/wp-json\/wp\/v2\/users\/125"}],"replies":[{"embeddable":true,"href":"https:\/\/clickup.com\/blog\/wp-json\/wp\/v2\/comments?post=212259"}],"version-history":[{"count":25,"href":"https:\/\/clickup.com\/blog\/wp-json\/wp\/v2\/posts\/212259\/revisions"}],"predecessor-version":[{"id":594429,"href":"https:\/\/clickup.com\/blog\/wp-json\/wp\/v2\/posts\/212259\/revisions\/594429"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/clickup.com\/blog\/wp-json\/wp\/v2\/media\/212342"}],"wp:attachment":[{"href":"https:\/\/clickup.com\/blog\/wp-json\/wp\/v2\/media?parent=212259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/clickup.com\/blog\/wp-json\/wp\/v2\/categories?post=212259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/clickup.com\/blog\/wp-json\/wp\/v2\/tags?post=212259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}