AutomationFlowsAI & RAG › AI Twitter Reply Agent via Slack

AI Twitter Reply Agent via Slack

Original n8n title: Agent - Twitter Reply Guy

Agent - Twitter Reply Guy. Uses slackTrigger, chainLlm, slack, outputParserStructured. Event-driven trigger; 26 nodes.

Event trigger★★★★☆ complexityAI-powered26 nodesSlack TriggerChain LlmSlackOutput Parser StructuredOpenAI ChatHTTP RequestInformation ExtractorTwitter
AI & RAG Trigger: Event Nodes: 26 Complexity: ★★★★☆ AI nodes: yes Added:
AI Twitter Reply Agent via Slack — n8n workflow card showing Slack Trigger, Chain Llm, Slack integration

This workflow follows the Chainllm → HTTP Request recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "Agent - Twitter Reply Guy",
  "nodes": [
    {
      "parameters": {
        "trigger": [
          "message"
        ],
        "channelId": {
          "__rl": true,
          "value": "C07RY6EQ6SH",
          "mode": "id"
        },
        "options": {
          "userIds": "U07CUPY83ST,U05Q3C50S0Z,U05QEE5V57A,U08F1GJG0PQ"
        }
      },
      "type": "n8n-nodes-base.slackTrigger",
      "typeVersion": 1,
      "position": [
        -260,
        0
      ],
      "id": "497103c4-d11e-49ed-ad3d-16140cbd646b",
      "name": "slack_trigger",
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": false,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "423cab91-b5b5-4f52-9ba6-f05345b63f5c",
              "leftValue": "={{ $json.attachments[0].fields.map(o => o.value) }}",
              "rightValue": "X (Twitter)",
              "operator": {
                "type": "array",
                "operation": "contains",
                "rightType": "any"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {
          "ignoreCase": true
        }
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        -40,
        0
      ],
      "id": "7911a768-7321-4976-8c2f-0601602fe2f6",
      "name": "filter_only_twitter_source"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": false,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "932940ad-cafb-4621-b97c-ec638528942e",
              "leftValue": "={{ $json.attachments[0].author_name }}",
              "rightValue": "@aiden_tooley",
              "operator": {
                "type": "string",
                "operation": "notContains"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {
          "ignoreCase": true
        }
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        200,
        0
      ],
      "id": "6bfd9477-56c3-4a92-a3c4-d0c774fed6f0",
      "name": "exclude_self_account"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=I want to read this tweet and make a decision if you think a response with a link to an AI Tools directory page that would help answer the question / ask in the provided tweet.\n\nA good tweet for us to reply to is usually in the form of a question like \"How can I use AI to do...?\", \"Are there any AI tools that can help me do...?\", and other questions of that nature.\n\nHere are some examples of types of tweets we don't want to reply to:\n- A statement instead of someone asking for a tool\n- An unrelated question or inquiry that could not be helped by us sharing a link to tools on our AI Tools directory\n- A reply to another tweet (this typical begins with an @ symbol followed by their twitter user name). You can look at the raw slack alert to find more metadata to determine if this was a reply or not.\n- A tweet that shares a link to an article or content piece on another website\n- If someone tweets the question \"How can I use AI to do my job better?\", don't write a reply. This is a common quote that people use instead of a real question we want to reply to.\n- If someone is asking something nefarious, you should NOT reply to this tweet.\n- If someone is asking for a specific tool to take action towards an individual you should NOT reply to this tweet.\n- If someone is sharing a prompt for LLMs, don't reply to that tweet.\n\n---\nTweet To Evaluate:\n\n{{ $('get_tweet_content').item.json.tweet_content }}\n",
        "hasOutputParser": true,
        "messages": {
          "messageValues": [
            {
              "message": "You are a helpful assistant, an expert community manager, and expert social media manager, and an expert at marketing. Your job is to help grow the social media presence of our AI tool directory called \"AI Tools\" on X (formerly Twitter) by evaluating AI-related tweets you should reply to."
            }
          ]
        }
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.5,
      "position": [
        1900,
        -20
      ],
      "id": "f9dafa16-6605-4f57-949e-a46e68cff20e",
      "name": "evaluate_tweet",
      "retryOnFail": true,
      "waitBetweenTries": 5000
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=I want you to write a reply to the tweet I am providing below that will help this person out by sharing a relevant link to our AI Tools directory along with a short note.\n\nYou should first pick out which category page url on AI Tools will be able to help them the most based on their question or inquiry in the initial tweet.\n\nOnce that is done, write a helpful and concise tweet that let's the original person know that they can find helpful or useful tools at the link you selected out. Include this category url link in your tweet reply message.\n\nYou should write in a style that is friendly but would not be considered excessive or over the top. Your goal is to be helpful and share a resource that helps them out.\n\nAvoid repeating information from the original tweet.\n\nKeep your note very concise (short and sweet) and use as few words as you can.\n\nIt is very important you are picking the best category on AI Tools to share in your reply in order to help this person the most. The link you share should help this person find what they are looking for and asking about.\n\nUse direct language in your tweet reply.\n\nDon't start your reply with \"check\".\n\nPrefer \"may help\" over \"could\" in your reply.\n\nShort and sweet is best for this.\n\n---\nHere are some examples we have replied to in the past to help you out when crafting a great reply tweet. Please read these:\n\n### Tweet #1\n- Initial Tweet: Is there an AI tool(or tools) you might  recommend for a novice that wants to play with creating whimsical images? Thanks much!\n- Reply Tweet: There's a bunch of cool ones on here: https://aitools.inc/categories/ai-image-generators\n\n### Tweet #2\n- Initial Tweet: is there a AI tool that can help create comic book stories based on prompts and a story line\n- Reply Tweet: several on here! https://aitools.inc/categories/ai-comic-generators\n\n### Tweet #3\n- Initial Tweet: Sir, is there an AI tool that is able to create a short video based on an image? I want to create a short commercial video but I only have some photos of the product.\n- Reply Tweet: I think some of these allow you to include images w/ your prompt: https://aitools.inc/categories/ai-text-to-video-tools\n\n### Tweet #4\n- Initial Tweet: Are there AI tools that can give you a professional design for an entire web app UI?\n- Reply Tweet: We have a really good list here! https://aitools.inc/categories/ai-design-tools\n\n---\nHere's some feedback on tweets you previously wrote that you should consider for this tweet you are writing. Please reivew this feedback and apply my suggestions when you are writing this tweet:\n\n### Feedback 1\n\n- Input Tweet: I hate video tutorials so fucking much is there an AI tool that give me text ones from a video\n- Your Output: These tools can convert videos into text formats: https://aitools.inc/categories/ai-video-to-blog-tools\n\nInstead of what you wrote, I would write this instead: \"Some of these tools may help: https://aitools.inc/categories/ai-video-to-blog-tools\"\n\n### Feedback 2\n\n- Input Tweet: Is there an AI tool that takes design instructions and produces high fidelity designs?\n- Your Output: Great design tools listed here: https://aitools.inc/categories/ai-design-tools\n\nInstead of what you wrote, I suggest you respond more like this: \"There's some great AI design tools on here: https://aitools.inc/categories/ai-design-tools\"\n\n### Feedback 3\n\n- Input Tweet: This is sick! How do you actually get the design? Are there any ai tools that help with designing that we can then port to cursor?\n- Your Output: There are several AI design tools that might help with what you need: https://aitools.inc/categories/ai-design-tools\n\nInstead of what you wrote, I suggest you respond more like this: \"There are some design tools that may help here: https://aitools.inc/categories/ai-design-tools\"\n\n### Feedback 4\n\n- Input Tweet: is there an ai tool out there where i can just talk to it and it summarizes what i say? hahahahaa like i gotta stop calling @tasonjorres and brain dump\n- Your Output: These AI meeting note takers could help with those brain dumps: https://aitools.inc/categories/ai-meeting-note-takers\n\nInstead of what you wrote, I suggest you respond more like this: \"These could help out with those brain dumps: https://aitools.inc/categories/ai-meeting-note-takers\". It is okay to exclude the exact category name in your response to keep it short.\n\n### Feedback 4\n\n- Input Tweet: are there any AI tools that timestamp youtube videos for you?\n- Your Output: You'll find some helpful tools here: https://aitools.inc/categories/ai-video-to-blog-tools\n\nInstead of what you wrote, I suggest you respond more like this: \"Some of these may be helpful: https://aitools.inc/categories/ai-video-to-blog-tools\". Since the category we are sharing isn't an exact match to what they are asking, we should with a little less certainty.\n\n---\nTweet you will be replying to:\n{{ $node['get_tweet_content'].json.tweet_content }}\n\n---\nList of category page urls on our AI Tools directory. The link you include in your tweet MUST be from this list of urls that point to a category page on our AI Tools directory:\n{{ $('get_category_content').item.json.category_content }}\n\n",
        "hasOutputParser": true,
        "messages": {
          "messageValues": [
            {
              "message": "You are a helpful assistant, an expert community manager, an expert social media manager, and an expert at marketing. Your job is to help grow the social media presence of our AI tool directory called \"AI Tools\" on X (formerly Twitter) by writing a reply tweet that "
            }
          ]
        }
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.5,
      "position": [
        700,
        720
      ],
      "id": "e0d2d5f5-5d5a-4b72-81f4-a2e5c78f52c6",
      "name": "write_tweet",
      "retryOnFail": true,
      "waitBetweenTries": 5000
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "8246f59e-597a-425d-adf8-60bd45dd25f9",
              "leftValue": "={{ $('exclude_retweets').all().length }}",
              "rightValue": 1,
              "operator": {
                "type": "number",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        660,
        0
      ],
      "id": "0f2f8bff-9333-4bfa-9f42-992a94e5ad96",
      "name": "should_evaluate"
    },
    {
      "parameters": {
        "resource": "reaction",
        "channelId": {
          "__rl": true,
          "value": "C07RY6EQ6SH",
          "mode": "id"
        },
        "timestamp": "={{ $('slack_trigger').item.json.event_ts }}",
        "name": "x"
      },
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.3,
      "position": [
        960,
        240
      ],
      "id": "8885819a-0ba5-48b1-a1ea-c9a99c2904cc",
      "name": "leave_skip_reaction",
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"chainOfThought\": {\n      \"type\": \"string\",\n      \"description\": \"Sequential reasoning to determine if this tweet should be replied to.\"\n    },\n    \"is_tweet_good_reply_candidate\": {\n      \"type\": \"boolean\",\n      \"description\": \"Indicator if the evaluated tweet content is a good candidate to reply to.\"\n    }\n  },\n  \"required\": [\n    \"chainOfThought\",\n    \"is_tweet_good_reply_candidate\"\n  ]\n}\n"
      },
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "typeVersion": 1.2,
      "position": [
        2060,
        420
      ],
      "id": "db122f0e-b558-4953-a8bc-3b404c71d5dd",
      "name": "evaluate_tweet_output_parser"
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        1480,
        420
      ],
      "id": "96b2eedf-f40e-4ed6-9e1c-b9a3304d36ec",
      "name": "gpt-4o-mini",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "1c8fe2cd-da05-4f6f-8de8-bfcdaebd8b45",
              "name": "tweet_content",
              "value": "={{ $('fetch_tweet_content').item.json.text }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1600,
        -20
      ],
      "id": "d2bbb29c-76a8-4375-8aa1-0deca41a121d",
      "name": "get_tweet_content"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "6684bc25-d89e-4a22-954a-4c9c3aa5ae47",
              "leftValue": "={{ $json.output.is_tweet_good_reply_candidate }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        -280,
        900
      ],
      "id": "6d9d8de2-5999-4cb4-892f-6cea2bfb9661",
      "name": "is_good_candidate"
    },
    {
      "parameters": {
        "resource": "reaction",
        "channelId": {
          "__rl": true,
          "value": "C07RY6EQ6SH",
          "mode": "id"
        },
        "timestamp": "={{ $('slack_trigger').last().json.event_ts }}",
        "name": "x"
      },
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.3,
      "position": [
        380,
        1020
      ],
      "id": "35df57d0-703d-4aee-ae24-32d9993c0b78",
      "name": "leave_bad_candidate_reaction",
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "select": "channel",
        "channelId": {
          "__rl": true,
          "value": "C07RY6EQ6SH",
          "mode": "id"
        },
        "text": "=I don't think this is a good Tweet for me to reply to.\n\n*Reason:*\n{{ $('evaluate_tweet').item.json.output.chainOfThought }}\n",
        "otherOptions": {
          "thread_ts": {
            "replyValues": {
              "thread_ts": "={{ $('slack_trigger').last().json.event_ts }}"
            }
          }
        }
      },
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.3,
      "position": [
        120,
        1020
      ],
      "id": "31da114a-34a2-4732-b44e-c017ab8ee104",
      "name": "share_bad_tweet_candidate_msg",
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"chainOfThought\": {\n      \"type\": \"string\",\n      \"description\": \"Sequential reasoning to make a decision on the most helpful page to share from AI Tools and how you decided to write your helpful note in the tweet reply.\"\n    },\n    \"tweet_content\": {\n      \"type\": \"string\",\n      \"description\": \"The final tweet content that will be used as a reply on Twitter. This MUST include a url provided from the AI tools website that will help the user.\"\n    }\n  },\n  \"required\": [\n    \"chainOfThought\",\n    \"tweet_content\"\n  ]\n}\n"
      },
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "typeVersion": 1.2,
      "position": [
        900,
        920
      ],
      "id": "1635cf5d-e9ac-44f3-8ee5-77e2e87b881f",
      "name": "write_tweet_output_parser"
    },
    {
      "parameters": {
        "select": "channel",
        "channelId": {
          "__rl": true,
          "value": "C07RY6EQ6SH",
          "mode": "id"
        },
        "text": "=I went forward replying with this Tweet:\n```\n{{ $('write_tweet').item.json.output.tweet_content }}\n```\n\n*Reasoning:*\n{{ $('write_tweet').item.json.output.chainOfThought }}\n",
        "otherOptions": {
          "thread_ts": {
            "replyValues": {
              "thread_ts": "={{ $('slack_trigger').last().json.event_ts }}"
            }
          }
        }
      },
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.3,
      "position": [
        1700,
        720
      ],
      "id": "dc46ea3c-e071-4bd6-ac0b-82b33ac4b354",
      "name": "share_tweet_content",
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "resource": "reaction",
        "channelId": {
          "__rl": true,
          "value": "C07RY6EQ6SH",
          "mode": "id"
        },
        "timestamp": "={{ $('slack_trigger').last().json.event_ts }}",
        "name": "white_check_mark"
      },
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.3,
      "position": [
        2000,
        720
      ],
      "id": "a4d2091b-2b5a-49d5-95bb-5d1ae86e1454",
      "name": "leave_check_reaction",
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": false,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "a8a140f5-ae97-4476-b4de-fac4d3f30767",
              "leftValue": "={{ $json.attachments[0].text }}",
              "rightValue": "RT",
              "operator": {
                "type": "string",
                "operation": "contains"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {
          "ignoreCase": true
        }
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        440,
        0
      ],
      "id": "b8e15349-45ee-436e-9351-6bdcc0bd6b09",
      "name": "exclude_retweets"
    },
    {
      "parameters": {
        "url": "=https://cdn.syndication.twimg.com/tweet-result?id={{ $('extract_tweet_id').item.json.output.tweet_id }}&token=utxo",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1360,
        -20
      ],
      "id": "e69bd2fc-4831-4ec2-afdb-f0f05801458d",
      "name": "fetch_tweet_content"
    },
    {
      "parameters": {
        "text": "=Help me extract the tweet id from the \"Open on web\" url included in this json payload that I received from a slack message webhook.\n\nHere is the slack message content to extract his information from:\n{{ JSON.stringify($('slack_trigger').first().json, null, 2) }}",
        "attributes": {
          "attributes": [
            {
              "name": "tweet_id",
              "description": "The tweet id to extract from slack webhook json payload. This id can be extracted from the 'Open on web' link in the included json payload.",
              "required": true
            }
          ]
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "typeVersion": 1,
      "position": [
        960,
        -20
      ],
      "id": "f6ed0244-b02d-4705-8239-a5e0ddd8beca",
      "name": "extract_tweet_id",
      "retryOnFail": true,
      "waitBetweenTries": 5000
    },
    {
      "parameters": {
        "url": "http://api.aitools.inc/categories",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        120,
        720
      ],
      "id": "a8fe8823-d809-40ff-9c6d-b7703f9e41fa",
      "name": "fetch_categories"
    },
    {
      "parameters": {
        "jsCode": "let category_content = $input.all().map(o => {\n  let result = \"\";\n\n  result += `Title: ${o.json.title}\\n`;\n  result += `Description: ${o.json.meta_description}\\n`;\n  result += `Url: https://aitools.inc/categories/${o.json.slug}`;\n\n  return result;\n}).join(\"\\n\\n\");\n\nreturn { category_content };"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        380,
        720
      ],
      "id": "b558cf94-82b6-453c-b989-9c71532c9d89",
      "name": "get_category_content"
    },
    {
      "parameters": {
        "text": "={{ $('write_tweet').item.json.output.tweet_content }}",
        "additionalFields": {
          "inReplyToStatusId": {
            "__rl": true,
            "value": "={{ $('extract_tweet_id').item.json.output.tweet_id }}",
            "mode": "id"
          }
        }
      },
      "type": "n8n-nodes-base.twitter",
      "typeVersion": 2,
      "position": [
        1400,
        720
      ],
      "id": "55e16bbd-5632-402b-a6e4-d43bec0cd5fb",
      "name": "post_reply_tweet",
      "credentials": {
        "twitterOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "amount": 65
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        1120,
        720
      ],
      "id": "669345a3-b5b6-4c40-85ab-e54135c45394",
      "name": "delay"
    },
    {
      "parameters": {
        "model": "claude-3-5-sonnet-20241022",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1.2,
      "position": [
        680,
        920
      ],
      "id": "c9c84937-4b42-4bb8-8a13-d39c78b33ad2",
      "name": "claude-3.5-sonnet",
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "content": "## 1. Evaluate Tweet\n",
        "height": 640,
        "width": 2540
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -300,
        -60
      ],
      "typeVersion": 1,
      "id": "0526763a-b350-4be6-affc-151de01dc8ae",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "## 2. Post Reply\n\n",
        "height": 640,
        "width": 2540,
        "color": 4
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -300,
        600
      ],
      "typeVersion": 1,
      "id": "801729af-c942-4412-8291-f8370df6aa62",
      "name": "Sticky Note1"
    }
  ],
  "connections": {
    "slack_trigger": {
      "main": [
        [
          {
            "node": "filter_only_twitter_source",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "filter_only_twitter_source": {
      "main": [
        [
          {
            "node": "exclude_self_account",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "exclude_self_account": {
      "main": [
        [
          {
            "node": "exclude_retweets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "evaluate_tweet": {
      "main": [
        [
          {
            "node": "is_good_candidate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "should_evaluate": {
      "main": [
        [
          {
            "node": "extract_tweet_id",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "leave_skip_reaction",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "evaluate_tweet_output_parser": {
      "ai_outputParser": [
        [
          {
            "node": "evaluate_tweet",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "gpt-4o-mini": {
      "ai_languageModel": [
        [
          {
            "node": "evaluate_tweet",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "extract_tweet_id",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "get_tweet_content": {
      "main": [
        [
          {
            "node": "evaluate_tweet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "is_good_candidate": {
      "main": [
        [
          {
            "node": "fetch_categories",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "share_bad_tweet_candidate_msg",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "share_bad_tweet_candidate_msg": {
      "main": [
        [
          {
            "node": "leave_bad_candidate_reaction",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "write_tweet": {
      "main": [
        [
          {
            "node": "delay",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "write_tweet_output_parser": {
      "ai_outputParser": [
        [
          {
            "node": "write_tweet",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "share_tweet_content": {
      "main": [
        [
          {
            "node": "leave_check_reaction",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "exclude_retweets": {
      "main": [
        [
          {
            "node": "should_evaluate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "fetch_tweet_content": {
      "main": [
        [
          {
            "node": "get_tweet_content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "extract_tweet_id": {
      "main": [
        [
          {
            "node": "fetch_tweet_content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "fetch_categories": {
      "main": [
        [
          {
            "node": "get_category_content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "get_category_content": {
      "main": [
        [
          {
            "node": "write_tweet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "post_reply_tweet": {
      "main": [
        [
          {
            "node": "share_tweet_content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "delay": {
      "main": [
        [
          {
            "node": "post_reply_tweet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "claude-3.5-sonnet": {
      "ai_languageModel": [
        [
          {
            "node": "write_tweet",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "33c1f1e3-a201-4466-9405-3da0cba70435",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "yad1A85lKxOrlKyJ",
  "tags": [
    {
      "createdAt": "2025-02-26T22:25:49.163Z",
      "updatedAt": "2025-02-26T22:25:49.163Z",
      "id": "arpWEVz9S0cowtPq",
      "name": "Twitter Reply Guy"
    },
    {
      "createdAt": "2025-02-26T22:25:10.194Z",
      "updatedAt": "2025-02-26T22:25:10.194Z",
      "id": "vU652aNNtdN0LGM9",
      "name": "Agent"
    }
  ]
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

How this works

This workflow transforms you into an automated Twitter reply expert, effortlessly generating insightful responses to tweets mentioned in Slack channels, saving hours of manual monitoring and engagement. It's ideal for social media managers, content creators, or community builders who want to stay active on Twitter without constant vigilance. The key step involves an AI-powered chain that evaluates incoming tweet content and crafts tailored replies, integrating seamlessly with Slack for triggers and notifications, plus OpenAI for intelligent processing.

Use this workflow when you need real-time, event-driven replies to Twitter mentions in team Slack discussions, particularly for brand monitoring or audience interaction. Avoid it for high-volume accounts where rate limits on Twitter or OpenAI could cause issues, or if you prefer fully manual control over responses. Common variations include adding sentiment analysis to prioritise positive engagements or routing replies through approval workflows for sensitive topics.

About this workflow

Agent - Twitter Reply Guy. Uses slackTrigger, chainLlm, slack, outputParserStructured. Event-driven trigger; 26 nodes.

Source: https://github.com/VasilisPlavos/Learn/blob/906c45384956c575c32f82e5baef5b2f4bfcc9bb/automations/n8n/lucaswalter-n8n-ai-automations/twitter_reply_guy_agent.json — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Content - Newsletter Agent. Uses formTrigger, chainLlm, outputParserStructured, httpRequest. Event-driven trigger; 87 nodes.

Form Trigger, Chain Llm, Output Parser Structured +7
AI & RAG

Content - Write Best Tools In Category Article. Uses formTrigger, httpRequest, slack, chainLlm. Event-driven trigger; 41 nodes.

Form Trigger, HTTP Request, Slack +6
AI & RAG

This workflow automates Invoice & Payment Tracking (with Approvals) across Notion and Slack. Ingest — You drop invoices/receipts (PDF/IMG/JSON) into the flow. Extract — OCR + parsing pulls out key fie

HTTP Request, Chain Llm, Anthropic Chat +5
AI & RAG

My workflow 53. Uses formTrigger, httpRequest, lmChatOpenAi, form. Event-driven trigger; 74 nodes.

Form Trigger, HTTP Request, OpenAI Chat +15
AI & RAG

Episode 23: UGC with nanobanana. Uses lmChatOpenAi, lmChatOllama, lmChatDeepSeek, lmChatOpenRouter. Event-driven trigger; 74 nodes.

OpenAI Chat, Ollama Chat, Lm Chat Deep Seek +12