AutomationFlowsAI & RAG › Unify Multiple Triggers Into a Single Workflow

Unify Multiple Triggers Into a Single Workflow

ByGuillaume Duvernay @duv on n8n.io

Stop duplicating your work! This template demonstrates a powerful design pattern to handle multiple triggers (e.g., Form, Webhook, Sub-workflow) within a single, unified workflow.

Event trigger★★★★☆ complexityAI-powered15 nodesForm TriggerExecute Workflow TriggerOpenAI ChatChain LlmSlack
AI & RAG Trigger: Event Nodes: 15 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #7784 — we link there as the canonical source.

This workflow follows the Chainllm → Execute Workflow Trigger 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
{
  "nodes": [
    {
      "id": "fa6c3683-960f-49c8-8c83-691347da9016",
      "name": "On form submission",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -32,
        0
      ],
      "parameters": {
        "options": {},
        "formTitle": "Product feedback",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Your feedback",
              "requiredField": true
            },
            {
              "fieldType": "dropdown",
              "fieldLabel": "Feedback type",
              "fieldOptions": {
                "values": [
                  {
                    "option": "Bug"
                  },
                  {
                    "option": "Feature request"
                  },
                  {
                    "option": "Praise"
                  },
                  {
                    "option": "Other"
                  }
                ]
              },
              "requiredField": true
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "75dfc8e9-b916-4310-91dd-c1f08c1d037c",
      "name": "When Executed by Another Workflow",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "position": [
        -32,
        192
      ],
      "parameters": {
        "workflowInputs": {
          "values": [
            {
              "name": "feedback"
            },
            {
              "name": "feedback type"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "90729deb-9654-4a12-a528-470434627ae0",
      "name": "Prepare data from form",
      "type": "n8n-nodes-base.set",
      "position": [
        304,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a1f1f4a2-39ad-4e12-a945-5b4733f4f5ea",
              "name": "feedback",
              "type": "string",
              "value": "={{ $json['Your feedback'] }}"
            },
            {
              "id": "db2b9184-9584-4a0d-ba37-632debb9309a",
              "name": "feedback type",
              "type": "string",
              "value": "={{ $json['Feedback type'] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ff6caf39-e310-4f6f-a2fc-0f55694154da",
      "name": "Prepare data from sub-workflow",
      "type": "n8n-nodes-base.set",
      "position": [
        304,
        192
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a1f1f4a2-39ad-4e12-a945-5b4733f4f5ea",
              "name": "feedback",
              "type": "string",
              "value": "={{ $json.feedback }}"
            },
            {
              "id": "db2b9184-9584-4a0d-ba37-632debb9309a",
              "name": "feedback type",
              "type": "string",
              "value": "={{ $json['feedback type'] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "94050a85-f1e8-4310-b7aa-92b57b06e6a5",
      "name": "Consolidate trigger data",
      "type": "n8n-nodes-base.set",
      "position": [
        640,
        144
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a1f1f4a2-39ad-4e12-a945-5b4733f4f5ea",
              "name": "feedback",
              "type": "string",
              "value": "={{ $json.feedback }}"
            },
            {
              "id": "db2b9184-9584-4a0d-ba37-632debb9309a",
              "name": "feedback type",
              "type": "string",
              "value": "={{ $json['feedback type'] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "9ddc61d5-0781-4202-8a4a-67bc4cb9ca53",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1024,
        320
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "1e270cb8-8cf8-472b-9d42-a92baece3831",
      "name": "Summarise feedback",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        960,
        144
      ],
      "parameters": {
        "text": "=Feedback:\n\n{{ $json.feedback }}\n\nFeedback type:\n\n{{ $json['feedback type'] }}",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "Return a one-line summary of the feedback provided by the user message"
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "da72acd7-ab2e-4acd-9a68-75f610c98ffd",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -32,
        384
      ],
      "parameters": {
        "path": "516b9b23-c30c-4396-a32e-2f139beb3248",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "190a9eb4-bb6e-4b0e-9a5a-641fa003292a",
      "name": "Prepare data from webhook",
      "type": "n8n-nodes-base.set",
      "position": [
        304,
        384
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a1f1f4a2-39ad-4e12-a945-5b4733f4f5ea",
              "name": "feedback",
              "type": "string",
              "value": "={{ $json.body.feedback }}"
            },
            {
              "id": "db2b9184-9584-4a0d-ba37-632debb9309a",
              "name": "feedback type",
              "type": "string",
              "value": "={{ $json.body['feedback type'] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "fe6790a2-75ff-4b95-a4bf-4dffa084d1a7",
      "name": "Notify the team on Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        1312,
        144
      ],
      "parameters": {
        "text": "=We received a new feedback!\nIn summary: {{ $json.text }}\n\nType: {{ $('Consolidate trigger data').item.json['feedback type'] }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C025KLW3MQS",
          "cachedResultName": "g\u00e9n\u00e9ral"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "e3c4b1a6-ad78-4a5a-84a6-8272778ab648",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -688,
        -160
      ],
      "parameters": {
        "width": 512,
        "height": 736,
        "content": "# Multi-Trigger Unification Pattern\n\nThis workflow demonstrates a powerful design pattern for running the same core logic from multiple different triggers (e.g., Form, Webhook, Sub-workflow). This avoids duplicating workflows and makes maintenance much easier.\n\n## How it works\n\nThe pattern is simple: **Normalize then Consolidate.**\n1.  **Normalize:** Each trigger path has a `Set` node that reformats its unique output into a standard data structure with consistent key names.\n2.  **Consolidate:** All paths then merge into a single `Set` node that uses the generic `$json` expression to accept the standardized data from whichever path ran. The rest of the workflow is now trigger-agnostic.\n\n## How to adapt this pattern\n\n1.  **Replace the triggers** with your own.\n2.  **Update the \"Normalize\" nodes:** After each of your triggers, use a `Set` node to map its specific output to a common schema.\n3.  **Build your logic:** Connect all your \"Normalize\" nodes to the **\"Consolidate trigger data\"** node and build your main workflow from that point onward.\n\n\n\n*A template provided by Guillaume Duvernay*"
      },
      "typeVersion": 1
    },
    {
      "id": "d9106483-b0f6-416b-885f-7f296dfecd88",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -112,
        -160
      ],
      "parameters": {
        "color": 5,
        "width": 272,
        "height": 736,
        "content": "### Replace with the workflow triggers you need"
      },
      "typeVersion": 1
    },
    {
      "id": "4ca8de38-4cf0-44e1-a957-143deca66458",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        224,
        -160
      ],
      "parameters": {
        "color": 6,
        "width": 272,
        "height": 736,
        "content": "### Prepare the variables before the consolidation\nMake sure to use the same field names to be able to consolidate them later!"
      },
      "typeVersion": 1
    },
    {
      "id": "f8a00250-d66f-4a77-8b21-269944962792",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        880,
        -48
      ],
      "parameters": {
        "width": 656,
        "height": 512,
        "content": "### Replace this and build your workflow"
      },
      "typeVersion": 1
    },
    {
      "id": "fecc47ea-839f-42b2-9220-48c9cc4e5d1d",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        -48
      ],
      "parameters": {
        "color": 4,
        "width": 256,
        "height": 368,
        "content": "### Consolidation node\nThis takes data from the previous nodes, no matter the path.\n\nMap previous nodes to this consolidation node when you need data from the triggers."
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Prepare data from webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Summarise feedback",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "On form submission": {
      "main": [
        [
          {
            "node": "Prepare data from form",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Summarise feedback": {
      "main": [
        [
          {
            "node": "Notify the team on Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare data from form": {
      "main": [
        [
          {
            "node": "Consolidate trigger data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Consolidate trigger data": {
      "main": [
        [
          {
            "node": "Summarise feedback",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare data from webhook": {
      "main": [
        [
          {
            "node": "Consolidate trigger data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare data from sub-workflow": {
      "main": [
        [
          {
            "node": "Consolidate trigger data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When Executed by Another Workflow": {
      "main": [
        [
          {
            "node": "Prepare data from sub-workflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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

About this workflow

Stop duplicating your work! This template demonstrates a powerful design pattern to handle multiple triggers (e.g., Form, Webhook, Sub-workflow) within a single, unified workflow.

Source: https://n8n.io/workflows/7784/ — 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; 91 nodes.

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

This template attempts to replicate OpenAI's DeepResearch feature which, at time of writing, is only available to their pro subscribers.

Output Parser Structured, OpenAI Chat, Form Trigger +8
AI & RAG

Agent Nodes. Uses lmChatOpenAi, slack, stopAndError, errorTrigger. Event-driven trigger; 72 nodes.

OpenAI Chat, Slack, Stop And Error +12
AI & RAG

This end-to-end AI-powered recruitment automation workflow helps HR and talent acquisition teams automate the complete hiring pipeline—from resume intake and parsing to GPT-4-based evaluation, TA appr

Form Trigger, Output Parser Structured, Google Drive +10
AI & RAG

This workflow is perfect for: Agile development teams and project managers who need to quickly set up Jira projects Product managers who want to convert feature ideas into structured user stories and

Form Trigger, OpenAI Chat, Output Parser Structured +5