{
  "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
          }
        ]
      ]
    }
  }
}