AutomationFlowsAI & RAG › Analyze & Tag User Feedback in Notion with Gpt-4 Sentiment Analysis

Analyze & Tag User Feedback in Notion with Gpt-4 Sentiment Analysis

ByAgent Studio @agentstudio on n8n.io

This n8n workflow processes user feedback automatically, tags it with sentiment, and links it to relevant insights in Notion. It uses GPT-4 to analyze each feedback entry, determine whether it corresponds to an existing insight or a new one, and update the Notion databases…

Event trigger★★★★★ complexityAI-powered32 nodesNotionNotion ToolOutput Parser StructuredSentiment AnalysisOutput Parser AutofixingMemory Buffer WindowNotion TriggerOpenAI Chat
AI & RAG Trigger: Event Nodes: 32 Complexity: ★★★★★ AI nodes: yes Added:

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

This workflow follows the Agent → OpenAI Chat 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
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "d4f8359b-c80b-409c-a5e3-0c4a2b1868ae",
      "name": "update feedback sentiment analysis",
      "type": "n8n-nodes-base.notion",
      "position": [
        1664,
        -224
      ],
      "parameters": {
        "pageId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('on database item update').item.json.id }}"
        },
        "options": {},
        "resource": "databasePage",
        "operation": "update",
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "Sentiment Analysis|select",
              "selectValue": "={{ $json.sentimentAnalysis.category || null }}"
            }
          ]
        }
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "76fd1d49-3c0e-4f82-a362-e9e934fb4603",
      "name": "Get database structure",
      "type": "n8n-nodes-base.notion",
      "position": [
        1648,
        448
      ],
      "parameters": {
        "simple": false,
        "resource": "database",
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "1df6b2b6-117f-81bc-9395-ff4ddfc363af",
          "cachedResultUrl": "https://www.notion.so/1df6b2b6117f81bc9395ff4ddfc363af",
          "cachedResultName": "Insights"
        }
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "cdea1403-bb1f-498e-bed7-999f5a32ac67",
      "name": "Get all feedback",
      "type": "n8n-nodes-base.notionTool",
      "position": [
        3360,
        608
      ],
      "parameters": {
        "filters": {
          "conditions": [
            {
              "key": "active?|checkbox",
              "condition": "equals",
              "checkboxValue": true
            }
          ]
        },
        "options": {},
        "resource": "databasePage",
        "operation": "getAll",
        "returnAll": true,
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "1df6b2b6-117f-81d8-8258-db00e3899927",
          "cachedResultUrl": "https://www.notion.so/1df6b2b6117f81d88258db00e3899927",
          "cachedResultName": "User Feedback"
        },
        "filterType": "manual",
        "descriptionType": "manual",
        "toolDescription": "Call this tool anytime you need to get all existing feedback"
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "c0c95739-45b9-4947-b214-0d238b51c33b",
      "name": "Get all insights",
      "type": "n8n-nodes-base.notionTool",
      "position": [
        3184,
        608
      ],
      "parameters": {
        "options": {},
        "resource": "databasePage",
        "operation": "getAll",
        "returnAll": true,
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "1df6b2b6-117f-81bc-9395-ff4ddfc363af",
          "cachedResultUrl": "https://www.notion.so/1df6b2b6117f81bc9395ff4ddfc363af",
          "cachedResultName": "Insights"
        },
        "descriptionType": "manual",
        "toolDescription": "Call this tool anytime you need to get all existing insights"
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "90241f39-a8af-4675-a57a-f1391f9b513c",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        3984,
        768
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"Feedback Name\": \"Message threading can get messy with large teams.\",\n  \"Feedback ID\": \"13817812-04d6-8031-8c33-d9aea47dc0af\",\n  \"Category\": \"New Insight\",\n  \"Insight Name\": \"Improve Message Threading for Large Teams\",\n  \"Insight ID\": \"c4bd07df-419e-40e0-82ee-5acb77b4943a\",\n  \"Insight Solution\": \"Closing Comment Threads\",\n  \"Insight User Persona\": \"Client\",\n  \"Explanation\": \"This feedback highlights a specific issue regarding closing comments, which is not covered by existing insights.\"\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "f93b5559-8eb5-4216-95b8-82e061a71b24",
      "name": "Sentiment Analysis1",
      "type": "@n8n/n8n-nodes-langchain.sentimentAnalysis",
      "position": [
        1248,
        -224
      ],
      "parameters": {
        "options": {
          "categories": "Positive, Neutral, Negative",
          "systemPromptTemplate": "You are highly intelligent and accurate sentiment analyzer. Analyze the sentiment of the provided text. \nThe source is an email subject and content sent by a user of our form creation platform.\nCategorize it into one of the following: {categories}. Use the provided formatting instructions. Only output the JSON."
        },
        "inputText": "={{ $json['Feedback Text'] }}"
      },
      "typeVersion": 1
    },
    {
      "id": "33b9c804-4f4b-44ae-8238-2bdb5e859665",
      "name": "Auto-fixing Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserAutofixing",
      "position": [
        3808,
        624
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "8a306667-f028-48fc-a3a3-44bf33d79cad",
      "name": "Create New Insight",
      "type": "n8n-nodes-base.notionTool",
      "position": [
        3520,
        608
      ],
      "parameters": {
        "title": "={{ $fromAI('title', 'a representative, concise, and understandable name for the insight', 'string') }}",
        "options": {},
        "resource": "databasePage",
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "1df6b2b6-117f-81bc-9395-ff4ddfc363af",
          "cachedResultUrl": "https://www.notion.so/1df6b2b6117f81bc9395ff4ddfc363af",
          "cachedResultName": "Insights"
        },
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "Solution|multi_select",
              "multiSelectValue": "={{ $fromAI('solution', 'Solution provided in \"Possible Solutions\"', 'string') }}"
            },
            {
              "key": "User Persona|multi_select",
              "multiSelectValue": "={{ $fromAI('user_persona', 'User Persona provided in \"Possible User Persona\"', 'string') }}"
            }
          ]
        },
        "descriptionType": "manual",
        "toolDescription": "Call this tool once anytime you need to create a new insight. "
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "2146f34b-9f59-404e-b70d-f8e22b7f49b0",
      "name": "Window Buffer Memory1",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        2864,
        608
      ],
      "parameters": {
        "sessionKey": "feedback_1",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.2
    },
    {
      "id": "87c6d9a6-58d7-4a58-b1da-3ee37ab58e3e",
      "name": "Update Feedback",
      "type": "n8n-nodes-base.notion",
      "maxTries": 2,
      "position": [
        3872,
        160
      ],
      "parameters": {
        "pageId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.output.output['Feedback ID'] }}"
        },
        "options": {},
        "resource": "databasePage",
        "operation": "update",
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "Insights|relation",
              "relationValue": [
                "={{ $json.output.output['Insight ID'] }}"
              ]
            },
            {
              "key": "Status|status",
              "statusValue": "Processed"
            }
          ]
        }
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2.2,
      "waitBetweenTries": 5000
    },
    {
      "id": "965d9764-2916-4bc5-bc46-37d242871173",
      "name": "on database item update",
      "type": "n8n-nodes-base.notionTrigger",
      "position": [
        928,
        144
      ],
      "parameters": {
        "event": "pagedUpdatedInDatabase",
        "pollTimes": {
          "item": [
            {
              "mode": "everyX",
              "unit": "minutes",
              "value": 5
            }
          ]
        },
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "1df6b2b6-117f-81d8-8258-db00e3899927",
          "cachedResultUrl": "https://www.notion.so/1df6b2b6117f81d88258db00e3899927",
          "cachedResultName": "User Feedback"
        }
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "2d691c3b-92c9-4f70-b51c-cfb11455b52e",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        2432,
        160
      ],
      "parameters": {
        "mode": "combine",
        "options": {
          "includeUnpaired": true
        },
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3
    },
    {
      "id": "9a0475cd-906a-4bdc-a9db-167dabc1916a",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        864,
        32
      ],
      "parameters": {
        "color": 6,
        "height": 300,
        "content": "### Trigger\nSet it to use the Database containing the User Feedback\n"
      },
      "typeVersion": 1
    },
    {
      "id": "49d3e282-b43a-435f-b04f-663680383f09",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1184,
        -336
      ],
      "parameters": {
        "color": 5,
        "width": 680,
        "height": 420,
        "content": "### Make A Sentiment Analysis\nThis part of the workflow runs a sentiment analysis for each new/up[dated feedback and set it in Notion\n"
      },
      "typeVersion": 1
    },
    {
      "id": "ec11349c-fc60-41f1-baa7-01ab6c25ddc8",
      "name": "OpenAI - Sentiment Analysis",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1344,
        -80
      ],
      "parameters": {
        "options": {
          "temperature": 0.2,
          "responseFormat": "json_object"
        }
      },
      "credentials": {},
      "typeVersion": 1
    },
    {
      "id": "3d3051dc-c141-4917-a7a4-25d6bb9d8065",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1200,
        240
      ],
      "parameters": {
        "color": 5,
        "width": 320,
        "height": 380,
        "content": "### Configure your product information\nIn this node, you will define your product:\n- `Product Overview`: text\n- `Core Features`: a comma-separated list of product features that define your product"
      },
      "typeVersion": 1
    },
    {
      "id": "cda892d3-d588-418d-85ac-d266bf91592b",
      "name": "Set the Product information",
      "type": "n8n-nodes-base.set",
      "position": [
        1312,
        448
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "62b51786-ea27-4c6c-b847-403e64883de8",
              "name": "Product Overview",
              "type": "string",
              "value": "Basecamp is a project management and team collaboration tool that helps teams organize projects, communicate, and track work in one place"
            },
            {
              "id": "05fa05bf-d865-4c14-8f88-cdf348e6342b",
              "name": "Core Features",
              "type": "string",
              "value": "Project boards, Team messaging, File sharing, Task management, Calendar, Document collaboration"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "c7a2465f-4062-49e7-9dd3-70768d7f00d4",
      "name": "Set Prompt",
      "type": "n8n-nodes-base.set",
      "position": [
        2128,
        448
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "159cdcca-d718-4215-9541-d4511b0b8ce9",
              "name": "system_prompt",
              "type": "string",
              "value": "**Task Description:**\n\nYou are an AI Agent tasked with analyzing new product feedback. Your objectives are:\n\n1. **Categorize Feedback:**\n   - Determine whether each piece of feedback corresponds to an **existing insight** or represents a **new insight**.\n\n2. **Qualify Feedback:**\n   - Assess the significance and relevance of the feedback.\n\n3. **Name New Insights:**\n   - If the feedback is a new insight, assign it a **representative, concise, and understandable name** that clearly differentiates it from existing insights.\n\n*An insight is a clear understanding of why users behave a certain way.*\n\n---\n\n**Instructions:**\n0. **Only categorize feedback with Status **Received**. Skip the rest of the instructions otherwise.\n\n1. **Review Each Feedback Entry:**\n   - Understand the main point, underlying issues, suggestions, and any implicit user needs or expectations.\n\n2. **Compare with Existing Insights:**\n   - Use the **Get All Insights** tool to access the list of existing insights from Notion.\n   - Determine if the feedback aligns with any current insights or highlights a previously identified issue.\n\n3. **Categorize the Feedback:**\n   - **Existing Insight:**\n     - If the feedback matches an existing insight, categorize it accordingly.\n     - Note the **name** and **ID** of the existing insight it corresponds to.\n   - **New Insight:**\n     - If the feedback does not fit any existing insights, classify it as a new insight.\n     - Proceed to name the new insight.\n\n4. **Name New Insights and Obtain Insight ID:**\n   - Create a **concise and clear name** that encapsulates the core idea of the feedback.\n   - Ensure the name highlights what makes this insight unique (**true differentiator**) compared to existing insights.\n   - Use terminology that is easily understandable by all stakeholders.\n   - **Important**: Only create a new insight if there is no Existing Insight\n   - **Mandatory:** Use the **Create New Insight Workflow** tool to add the new insight to the Notion database.\n     - Provide the name, solution, and user persona as input parameters.\n     - The tool will return the **Insight ID**, which you must include in your output.\n\n5. **Assign Solution and User Persona (For New Insights Only):**\n   - **Insight Solution:** Select the most appropriate solution from the provided \"Possible Solutions.\"\n   - **Insight User Persona:** Choose the relevant user persona from the provided \"Possible User Personas.\"\n\n6. **Update Notion Databases:**\n   - If required, use the **Create New Insight Workflow** tool to add new insights to the Notion database with the values provided: name, solution, and user persona.\n   - Use the **Get All Feedback** tool if you need to reference additional feedback entries from Notion.\n\n7. **Document Your Findings:**\n   - Provide a structured output for each feedback item as a JSON\n   - Include the original feedback text, feedback ID, category, insight name, **Insight ID returned by the tool or provided by the user**, assigned solution, user persona, and an optional brief explanation.\n   - **Important:** Do not invent or leave the Insight ID empty. You must obtain it by calling the **Create New Insight Workflow** tool for the category \"New Insight\".\n\n---\n\n**Available Tools:**\n1. **Get All Feedback:**\n   - Retrieve and review all existing feedback entries stored in Notion.\n2. **Get All Insights:**\n   - Access the list of existing insights, including their names and IDs, stored in Notion.\n3. **Create New Insight Workflow:**\n   - **Usage:** Provide the insight name, solution, and user persona as input parameters. Always use the value from the new feedback\n   - **Function:** Adds the new insight to the Notion database.\n   - **Returns:** The **Insight ID** of the newly created insight.\n   - **Notes:** \n      - You **must** call this tool when creating a new insight to obtain the Insight ID.\n      - You will call this tool **only when category is \"New Insight**\n\n---\n\n**Example:**\nAssuming the **Create New Insight Workflow** tool returns an Insight ID of `\"abc123\"` when called:\n-  \"Feedback Text\": \"Message threading can get messy with large teams.\",\n-  \"Feedback ID\": \"13817812-04d6-8031-8c33-d9aea47dc0af\",\n-  \"Category\": \"New Insight\",\n-  \"Insight Name\": \"Challenges Managing Threads in Large Teams\",\n-  \"Insight ID\": \"abc123\",\n-  \"Insight Solution\": \"Focus Mode\",\n-  \"Insight User Persona\": \"Client\",\n-  \"Explanation\": \"This feedback reveals a new issue with thread management in large teams not covered by existing insights.\"\n\n---\n\n**Additional Considerations:**\n- **Mandatory Tool Usage:** You **must** use the tools provided when appropriate.\n  - When identifying a new insight, you **must** call the **Create New Insight Workflow** tool to obtain the Insight ID.\n  - Do not invent or leave the Insight ID empty.\n- **Maintain Objectivity:** Base your categorization on the content of the feedback without personal bias.\n- **Anonymity:** Do not include any personal identifiers to maintain user privacy.\n- **Consistency:** Use consistent language and formatting throughout your analysis.\n- **Compliance:** You have access to the following tools, and **you must call them** when required."
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "a6ed81c9-b6d8-4777-b6bb-c27c91becb0d",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1584,
        240
      ],
      "parameters": {
        "color": 5,
        "width": 400,
        "height": 380,
        "content": "### Get your insights solutions and user persona\n- These nodes get live data from your Notion `Insight` Database and format them in a right way.\n- Set it to use your the database containing your Insights."
      },
      "typeVersion": 1
    },
    {
      "id": "616e34d9-2c57-4942-befc-4ee2b585934e",
      "name": "Clean the database propertied",
      "type": "n8n-nodes-base.code",
      "position": [
        1824,
        448
      ],
      "parameters": {
        "jsCode": "const input = $input.last().json.properties;\n\n$input.last().json.clean_properties = {\n  properties: {\n    solutions: {\n      options: input[\"Solution\"].multi_select.options.map(option => ({ name: option.name }))\n    },\n    user_persona: {\n      options: input[\"User Persona\"].multi_select.options.map(option => ({ name: option.name }))\n    }\n  }\n};\n\nreturn $input.last().json.clean_properties;"
      },
      "typeVersion": 2
    },
    {
      "id": "158439de-221a-492e-adc3-746cb2201321",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2032,
        240
      ],
      "parameters": {
        "color": 5,
        "width": 300,
        "height": 380,
        "content": "### Set the AI Agent Prompt\nThis node contains the prompt for the main AI Agent.\nYou shouldn't have to modify it."
      },
      "typeVersion": 1
    },
    {
      "id": "9a0f41b8-9fc3-4a79-9d65-1e7032a28574",
      "name": "OpenAI - AI Agent",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        2544,
        608
      ],
      "parameters": {
        "model": "gpt-4o",
        "options": {
          "temperature": 0.2,
          "responseFormat": "json_object"
        }
      },
      "credentials": {},
      "typeVersion": 1
    },
    {
      "id": "356ed301-f92d-4e0e-a07b-1e56ce0b7af1",
      "name": "OpenAI - Parser fixing",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        3840,
        768
      ],
      "parameters": {
        "options": {
          "temperature": 0.2
        }
      },
      "credentials": {},
      "typeVersion": 1
    },
    {
      "id": "6e16a3c3-5453-4e75-9742-8a2f1efb92a0",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2448,
        400
      ],
      "parameters": {
        "color": 5,
        "width": 300,
        "height": 380,
        "content": "### Chat model\nUse GPT 4o to orchestrate Node as Tools, decide when to create insights and write them properly.\nAdjust temperature as needed.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8ef22961-fcef-4f48-9e27-36caefe91ce6",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2768,
        400
      ],
      "parameters": {
        "color": 5,
        "width": 300,
        "height": 380,
        "content": "### Memory\nThis is the basic n8n Memory. We recommend using an alternative memory such as Postgres (easy to do with [Supabase](https://supabase.com/))"
      },
      "typeVersion": 1
    },
    {
      "id": "61144e4d-9c4e-41cb-98ef-aecefc5dd721",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3088,
        400
      ],
      "parameters": {
        "color": 5,
        "width": 609.5205857836678,
        "height": 380,
        "content": "### Node as tools\nThese nodes as tools are all connected to your Notion account and Databases: Feedback and Insights. \nThey enable the agent to get all existing insights, existing feedback and let them create a new insight if necessary. "
      },
      "typeVersion": 1
    },
    {
      "id": "68d38fd5-6aa5-4e4d-8019-d43767d4e03b",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2880,
        -32
      ],
      "parameters": {
        "color": 5,
        "width": 466.6446274279343,
        "height": 375.53222703726067,
        "content": "### Agent\nThe agent is the main component of this workflow.\nIt receives all the information from the previous nodes about the new feedback received and the options of the Insight Database.\nThe agent makes all the decisions to associate a feedback to an existing insight or create a new one if required.\nIt output a JSON structure with the required changes."
      },
      "typeVersion": 1
    },
    {
      "id": "c24f6d6f-4291-4a25-a874-8ae676db104e",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3744,
        400
      ],
      "parameters": {
        "color": 5,
        "width": 381,
        "height": 521,
        "content": "### Fixing parser\nThese nodes fix occasionally the output from the Agent. In some cases, the output was erroneous and the feedback couldn't be updated.\nIf you see that it's not required anymore, you can connect the \"Structured Output parser\" node directly to the Agent."
      },
      "typeVersion": 1
    },
    {
      "id": "cb5af46d-2dc2-409f-bff3-56e16beb6cb2",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2944,
        160
      ],
      "parameters": {
        "text": "=## Product Information\n### Product Overview:\n{{ $('Set the Product information').last().json['Product Overview'] }}\n\n### Core Features\n{{ $('Set the Product information').last().json['Core Features'] }}\n\n## Available Resources:\n- **Possible Solutions:** {{ JSON.stringify($('Clean the database propertied').item.json.properties.solutions.options.map(item => item.name)) }}\n- **Possible User Personas:** {{ JSON.stringify($('Clean the database propertied').item.json.properties.user_persona.options.map(item => item.name)) }}\n\n---\n## New feedback\n### Name: {{ $json['Feedback Text'] }}\n### ID: {{ $json.id }}\n### Existing Insight ID? {{ $json['Insights'].map(item => item) || \"\"}}\n### Status: {{ $json['Status'] }}",
        "agent": "openAiFunctionsAgent",
        "options": {
          "systemMessage": "={{ $('Set Prompt').item.json.system_prompt }}"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.6
    },
    {
      "id": "321d155f-b2a2-4073-83d7-3893b3f52a12",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3744,
        -48
      ],
      "parameters": {
        "color": 5,
        "width": 370.5875087290284,
        "height": 380,
        "content": "### Update feedback\nThis node updates the feedback Database based on the Agent recommendation."
      },
      "typeVersion": 1
    },
    {
      "id": "e7c6de3b-3787-449f-be67-f2bd3ab07412",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -128,
        -368
      ],
      "parameters": {
        "color": 7,
        "width": 840,
        "height": 1360,
        "content": "## Automatically Analyze and Tag User Feedback in Notion\n\n## Overview\n- This n8n workflow processes user feedback automatically, tags it with sentiment, and links it to relevant insights in Notion.\n- It uses GPT-4 to analyze each feedback entry, determine whether it corresponds to an existing insight or a new one, and update the Notion databases accordingly.\n- It helps teams centralize and structure qualitative user feedback at scale.\n\n## Who It\u2019s For\n- Product teams looking to organize and prioritize user feedback.\n- Founders or solo builders seeking actionable insights from qualitative data.\n- Anyone managing a Notion workspace where feedback is collected and needs to be tagged or linked to features and improvements.\n\n## Prerequisites\n- A Notion account with:\n  - A **Feedback** database (must include fields for feedback content and status).\n  - An **Insights** database with multi-select fields for `Solution`, `User Persona`, and a relation to Feedback.\n  - The Notion template (linked below) helps you get started quickly \u2014 just remove the mock data.\n- A [configured Notion API integration in n8n](https://docs.n8n.io/integrations/builtin/credentials/notion/#using-api-integration-token).  \n  \ud83d\udc49 Don\u2019t forget to connect the n8n integration to the correct Notion page.\n- An [OpenAI API key](https://platform.openai.com/api-keys)\n\n## Notion Template\nThis workflow is designed to work seamlessly with a pre-configured Notion template that includes the required feedback and insights structure.  \n\ud83d\udc49 [User Feedback Analysis \u2013 Notion Template](https://agentstudio-templates.notion.site/User-Feedback-Analysis-1df6b2b6117f81ec8273e6fcb29d0dab)\n\n## How It Works\n- The workflow is triggered when a feedback item is updated in Notion (e.g. new feedback is submitted).\n- Sentiment analysis (Positive, Neutral, or Negative) is run using OpenAI and stored in a select field in Notion.\n- The AI agent analyzes the feedback to:\n  - Identify whether it matches an **existing insight**.\n  - Or create a **new insight** in Notion with a concise name, solution, and user persona.\n- The feedback is then linked to the appropriate insight and marked as \"Processed.\"\n\n## How to Use It\n1. Connect your Notion databases in all Notion nodes (including those used by the AI agent) for both Feedback and Insights \u2014 follow the node names provided.\n2. Ensure your OpenAI and Notion credentials are correctly set.\n3. **Set up your product context**:\n   - Define a `\u201cProduct Overview\u201d` and list your `\u201cCore Features\u201d`.\n   - This helps the AI agent categorize insights more accurately.\n   - (The Basecamp product is used as an example in the template.)\n4. (Optional) Modify the prompt to better fit your specific product context.\n5. Once feedback is added or updated in Notion, the workflow triggers automatically.\n\n## Notes\n- Only feedback with the status `Received` is processed.\n- New insights are only created if no relevant match is found.\n- Feedback is linked to insights via Notion\u2019s relation property.\n- A fallback parser is included to fix potential formatting issues in the AI output.\n- You can swap the default n8n memory for a more robust backend like Supabase."
      },
      "typeVersion": 1
    },
    {
      "id": "7f457c8d-3183-44c4-894c-49dca3280f16",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -128,
        -704
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "height": 300,
        "content": "## Attribution\n![Agent Studio](https://agentstudio.io/images/agent_studio_logo_small.png)\nThis template was created by [Agent Studio](https://agentstudio.io/) and is available on [n8n](https://n8n.io/workflows/)\n\nIf you need help implementing the template or modifying it, [just reach out \ud83d\udc8c](mailto:hello@agentstudio.io?subject=Notion%20User%20Feedback%20Analysis)\n\n\ud83d\udc49 [Find more of our templates](https://n8n.io/creators/agentstudio/)"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Merge": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Update Feedback",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Prompt": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Get all feedback": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Get all insights": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI - AI Agent": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Create New Insight": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Sentiment Analysis1": {
      "main": [
        [
          {
            "node": "update feedback sentiment analysis",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "update feedback sentiment analysis",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "update feedback sentiment analysis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Window Buffer Memory1": {
      "ai_memory": [
        [
          {
            "node": "AI Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Get database structure": {
      "main": [
        [
          {
            "node": "Clean the database propertied",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI - Parser fixing": {
      "ai_languageModel": [
        [
          {
            "node": "Auto-fixing Output Parser",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "on database item update": {
      "main": [
        [
          {
            "node": "Sentiment Analysis1",
            "type": "main",
            "index": 0
          },
          {
            "node": "Set the Product information",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Auto-fixing Output Parser",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Auto-fixing Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI - Sentiment Analysis": {
      "ai_languageModel": [
        [
          {
            "node": "Sentiment Analysis1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Set the Product information": {
      "main": [
        [
          {
            "node": "Get database structure",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Clean the database propertied": {
      "main": [
        [
          {
            "node": "Set Prompt",
            "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

This n8n workflow processes user feedback automatically, tags it with sentiment, and links it to relevant insights in Notion. It uses GPT-4 to analyze each feedback entry, determine whether it corresponds to an existing insight or a new one, and update the Notion databases…

Source: https://n8n.io/workflows/3689/ — 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

This workflow serves as a comprehensive "Workflow Nodes SEO & Documentation Generator". It uses AI to analyze, rename, and document n8n workflows, offering a streamlined way to optimize workflow reada

Form Trigger, n8n, Output Parser Autofixing +11
AI & RAG

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Output Parser Structured, Telegram, N8N Nodes Tesseractjs +14
AI & RAG

This workflow is perfect for creators, solopreneurs, and personal brands who want to consistently publish bold, high-performing content on X (Twitter) — without writing a single line themselves. After

OpenAI Chat, Memory Buffer Window, Tool Workflow +10
AI & RAG

This workflow is for users who want to turn Telegram into a personal AI-powered assistant capable of handling everyday tasks through natural language. It's ideal for solo founders, operators, or profe

Memory Buffer Window, Tool Workflow, Tool Think +9
AI & RAG

AI Blog Publisher – Automated Blog Content Workflow This workflow is designed for individuals and teams who regularly publish content on their blog and want to automate the entire process from start t

WordPress, HTTP Request, Memory Buffer Window +9