N
n8n Store
Workflow Market
24 Track Satisfaction Scores

24 Track Satisfaction Scores

by yaron-nofluffโ€ข0 views

ๆ่ฟฐ

ๅˆ†็ฑป

๐Ÿ“ข Marketing๐Ÿค– AI & Machine Learning

ไฝฟ็”จ็š„่Š‚็‚น

n8n-nodes-base.setn8n-nodes-base.coden8n-nodes-base.stickyNoten8n-nodes-base.stickyNoten8n-nodes-base.stickyNoten8n-nodes-base.stickyNoten8n-nodes-base.stickyNoten8n-nodes-base.stickyNoten8n-nodes-base.googleSheetsn8n-nodes-mcp.mcpClientTool
ไปทๆ ผๅ…่ดน
ๆต่งˆ้‡0
ๆœ€ๅŽๆ›ดๆ–ฐ11/28/2025
workflow.json
{
  "id": "wRFk4MmXtL2en4zX",
  "meta": {
    "instanceId": "60046904b104f0f72b2629a9d88fe9f676be4035769f1f08dad1dd38a76b9480",
    "templateCredsSetupCompleted": true
  },
  "name": "24 Track Satisfaction Scores",
  "tags": [],
  "nodes": [
    {
      "id": "5418cb29-421a-4087-9206-af79d036fd7f",
      "name": "โฐ Run Weekly NPS Tracker",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        0,
        0
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                1
              ],
              "triggerAtHour": 9
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "aed37f9d-27db-4123-9f05-01bb5164f7d3",
      "name": "โœ๏ธ Set Survey Page URL",
      "type": "n8n-nodes-base.set",
      "position": [
        200,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "96319b57-b99b-460e-ae2c-9927de713274",
              "name": "url",
              "type": "string",
              "value": "https://www.trustpilot.com/review/shopify.com"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "eb159575-b6d9-49ef-af47-05f7dac4d818",
      "name": "๐Ÿง  Scrape Reviews with Agent (MCP)",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        440,
        0
      ],
      "parameters": {
        "text": "=Extract Customer reviews, Star ratings (1 to 5 stars), Comments (optional for deeper insight) and Date of review from the following url\n\nURL: {{ $json.url }}",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2
    },
    {
      "id": "ba4c9999-6ff5-4cb8-a882-5adfe19ca5a0",
      "name": "๐Ÿ“Š Calculate NPS from Ratings",
      "type": "n8n-nodes-base.code",
      "position": [
        920,
        0
      ],
      "parameters": {
        "jsCode": "const reviews = items[0].json.output; // The agent output you provided\nlet promoters = 0;\nlet passives = 0;\nlet detractors = 0;\n\nfor (const review of reviews) {\n  const starRating = review.rating;\n\n  // Convert 1โ€“5 stars to 0โ€“10 scale\n  const score = starRating * 2;\n\n  // Categorize into NPS groups\n  if (score >= 9) {\n    promoters += 1;\n  } else if (score >= 7) {\n    passives += 1;\n  } else {\n    detractors += 1;\n  }\n}\n\n// NPS Calculation\nconst total = promoters + passives + detractors;\nconst nps = total > 0 ? ((promoters - detractors) / total) * 100 : 0;\n\nreturn [\n  {\n    json: {\n      totalResponses: total,\n      promoters,\n      passives,\n      detractors,\n      nps: Math.round(nps),\n      message: `NPS Score is ${Math.round(nps)} based on ${total} responses.`\n    }\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "533563dd-4258-4e18-bd94-ecbfead0416f",
      "name": "๐Ÿ“„ Log NPS to Google Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1100,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "NPS": "={{ $json.nps }}",
            "Passive": "={{ $json.passives }}",
            "summary": "={{ $json.message }}",
            "Detractor": "={{ $json.detractors }}",
            "Promoters": "={{ $json.promoters }}",
            "Total Responses": "={{ $json.totalResponses }}"
          },
          "schema": [
            {
              "id": "Total Responses",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Total Responses",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Promoters",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Promoters",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Passive",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Passive",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Detractor",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Detractor",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "NPS",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "NPS",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "summary",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "summary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1SuIKadXmZ-vUga75VsTMK7CgURsXn6KYh7j5_eM6m7k/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1SuIKadXmZ-vUga75VsTMK7CgURsXn6KYh7j5_eM6m7k",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1SuIKadXmZ-vUga75VsTMK7CgURsXn6KYh7j5_eM6m7k/edit?usp=drivesdk",
          "cachedResultName": "NPS Score"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "r2mDaisH6e9VkwHl",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "19e2572a-9823-4520-9de5-abb3bac64d85",
      "name": "๐ŸŽฏ Prompt & Guide Agent",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        400,
        260
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "8sEyPDkC5p4w4Jha",
          "name": "OpenAi account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "101f8b62-352e-4e28-b5ef-da401e626750",
      "name": "๐ŸŒ Execute Web Scrape (Bright Data)",
      "type": "n8n-nodes-mcp.mcpClientTool",
      "position": [
        580,
        260
      ],
      "parameters": {
        "toolName": "scrape_as_markdown",
        "operation": "executeTool",
        "toolParameters": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Tool_Parameters', ``, 'json') }}"
      },
      "credentials": {
        "mcpClientApi": {
          "id": "eqq94k789oJCd6jU",
          "name": "MCP Client (STDIO) account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ac4346c1-57fa-402e-ab9f-2a94ca5125e5",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -20,
        -840
      ],
      "parameters": {
        "color": 5,
        "width": 360,
        "height": 1020,
        "content": "## ๐Ÿ”ถ **Section 1: Set the Target Survey Page**\n\n### ๐Ÿงฉ Nodes:\n\n* `โฐ Run Weekly NPS Tracker` *(Schedule Trigger)*\n* `โœ๏ธ Set Survey Page URL` *(Edit Fields)*\n\n### ๐Ÿ“ What This Does:\n\nThis section controls **when** and **where** to begin.\n\n* The **Schedule Trigger** node is set to run automatically โ€” for example, **every Monday at 10 AM** โ€” to check the latest customer satisfaction reviews from a specific website like Trustpilot.\n* The **Edit Fields** node allows you to define or update the **target survey/review page URL** (e.g., Shopifyโ€™s Trustpilot page). You can also set any other optional config like number of reviews, date range, etc.\n\n### ๐Ÿง  Why It Matters:\n\n* Allows **automation** instead of manual monitoring.\n* Keeps your system flexible โ€” you can easily change the source URL without editing the rest of the workflow.\n\n---\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "3d7ce000-5de1-4c4f-a15b-f10fc1f68010",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        400,
        -1100
      ],
      "parameters": {
        "color": 3,
        "width": 340,
        "height": 1280,
        "content": "## ๐Ÿค– **Section 2: Scrape Reviews Using AI Agent**\n\n### ๐Ÿงฉ Nodes:\n\n* `๐Ÿง  Scrape Reviews with Agent (MCP)` *(AI Agent)*\n\n  * ๐Ÿ”Œ `๐ŸŽฏ Prompt & Guide Agent` *(OpenAI Chat Model)*\n  * ๐ŸŒ `Execute Web Scrape (Bright Data)` *(MCP Client)*\n  * ๐Ÿ“ฆ `Parse Agent Response` *(Structured Output Parser)*\n\n### ๐Ÿ“ What This Does:\n\nThis is where the **magic** happens โ€” using AI + Bright Data to fetch live reviews.\n\n* The **AI Agent** launches a **headless browser** via Bright Data's Mobile Carrier Proxy (MCP), mimicking a real user to visit the review site.\n* Itโ€™s guided by an OpenAI model that understands natural prompts, like:\n  *โ€œExtract customer ratings, comments, and dates from Trustpilotโ€.*\n* After scraping, the **Structured Output Parser** turns unstructured HTML into clean JSON data โ€” a list of reviews like:\n\n  ```json\n  { \"rating\": 2, \"comment\": \"...\" }\n  ```\n\n### ๐Ÿง  Why It Matters:\n\n* Many review sites use JavaScript โ€” Bright Data MCP bypasses anti-bot detection.\n* No need to write complex scraping code โ€” just describe what you want in plain English.\n* This is your **data foundation** โ€” reliable, structured, fresh.\n\n---\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "1c2c8d84-137a-490a-b178-67a831c94a40",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        880,
        -860
      ],
      "parameters": {
        "color": 6,
        "width": 360,
        "height": 1040,
        "content": "## ๐Ÿ“ˆ **Section 3: Analyze & Log NPS Results**\n\n### ๐Ÿงฉ Nodes:\n\n* `๐Ÿ“Š Calculate NPS from Ratings` *(Code Function)*\n* `๐Ÿ“„ Log NPS to Google Sheet` *(Google Sheets)*\n\n### ๐Ÿ“ What This Does:\n\nThis is your **data analysis and reporting** layer.\n\n* The **Function node** receives the scraped review data, calculates **Net Promoter Score (NPS)** by:\n\n  * Mapping 1โ€“5 star reviews into a 0โ€“10 scale.\n  * Categorizing users as:\n\n    * ๐Ÿ˜ **Promoters** (9โ€“10)\n    * ๐Ÿ˜ **Passives** (7โ€“8)\n    * ๐Ÿ˜  **Detractors** (0โ€“6)\n  * Calculating:\n    **NPS = (% Promoters โˆ’ % Detractors) ร— 100**\n\n* The **Google Sheets node** appends this NPS result to a spreadsheet with columns like:\n\n  ```\n  Date | Total Responses | Promoters | Passives | Detractors | NPS Score\n  ```\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "2d67aa1b-4816-4177-b12f-fa317f183fb2",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1720,
        -840
      ],
      "parameters": {
        "color": 4,
        "width": 1300,
        "height": 320,
        "content": "=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    [email protected]\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"
      },
      "typeVersion": 1
    },
    {
      "id": "e28e886d-519d-4941-99cf-ee546cb28944",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1720,
        -500
      ],
      "parameters": {
        "color": 4,
        "width": 1289,
        "height": 2778,
        "content": "# ๐Ÿ“Š **Track Satisfaction Scores Workflow**\n\n### โœจ *Automatically scrape survey reviews, calculate Net Promoter Score (NPS), and log results to Google Sheets for leadership insights.*\n\n---\n\n## ๐Ÿ”ถ **Section 1: Set the Target Survey Page**\n\n### ๐Ÿงฉ Nodes:\n\n* `โฐ Run Weekly NPS Tracker` *(Schedule Trigger)*\n* `โœ๏ธ Set Survey Page URL` *(Edit Fields)*\n\n### ๐Ÿ“ What This Does:\n\nThis section controls **when** and **where** to begin.\n\n* The **Schedule Trigger** node is set to run automatically โ€” for example, **every Monday at 10 AM** โ€” to check the latest customer satisfaction reviews from a specific website like Trustpilot.\n* The **Edit Fields** node allows you to define or update the **target survey/review page URL** (e.g., Shopifyโ€™s Trustpilot page). You can also set any other optional config like number of reviews, date range, etc.\n\n### ๐Ÿง  Why It Matters:\n\n* Allows **automation** instead of manual monitoring.\n* Keeps your system flexible โ€” you can easily change the source URL without editing the rest of the workflow.\n\n---\n\n## ๐Ÿค– **Section 2: Scrape Reviews Using AI Agent**\n\n### ๐Ÿงฉ Nodes:\n\n* `๐Ÿง  Scrape Reviews with Agent (MCP)` *(AI Agent)*\n\n  * ๐Ÿ”Œ `๐ŸŽฏ Prompt & Guide Agent` *(OpenAI Chat Model)*\n  * ๐ŸŒ `Execute Web Scrape (Bright Data)` *(MCP Client)*\n  * ๐Ÿ“ฆ `Parse Agent Response` *(Structured Output Parser)*\n\n### ๐Ÿ“ What This Does:\n\nThis is where the **magic** happens โ€” using AI + Bright Data to fetch live reviews.\n\n* The **AI Agent** launches a **headless browser** via Bright Data's Mobile Carrier Proxy (MCP), mimicking a real user to visit the review site.\n* Itโ€™s guided by an OpenAI model that understands natural prompts, like:\n  *โ€œExtract customer ratings, comments, and dates from Trustpilotโ€.*\n* After scraping, the **Structured Output Parser** turns unstructured HTML into clean JSON data โ€” a list of reviews like:\n\n  ```json\n  { \"rating\": 2, \"comment\": \"...\" }\n  ```\n\n### ๐Ÿง  Why It Matters:\n\n* Many review sites use JavaScript โ€” Bright Data MCP bypasses anti-bot detection.\n* No need to write complex scraping code โ€” just describe what you want in plain English.\n* This is your **data foundation** โ€” reliable, structured, fresh.\n\n---\n\n## ๐Ÿ“ˆ **Section 3: Analyze & Log NPS Results**\n\n### ๐Ÿงฉ Nodes:\n\n* `๐Ÿ“Š Calculate NPS from Ratings` *(Code Function)*\n* `๐Ÿ“„ Log NPS to Google Sheet` *(Google Sheets)*\n\n### ๐Ÿ“ What This Does:\n\nThis is your **data analysis and reporting** layer.\n\n* The **Function node** receives the scraped review data, calculates **Net Promoter Score (NPS)** by:\n\n  * Mapping 1โ€“5 star reviews into a 0โ€“10 scale.\n  * Categorizing users as:\n\n    * ๐Ÿ˜ **Promoters** (9โ€“10)\n    * ๐Ÿ˜ **Passives** (7โ€“8)\n    * ๐Ÿ˜  **Detractors** (0โ€“6)\n  * Calculating:\n    **NPS = (% Promoters โˆ’ % Detractors) ร— 100**\n\n* The **Google Sheets node** appends this NPS result to a spreadsheet with columns like:\n\n  ```\n  Date | Total Responses | Promoters | Passives | Detractors | NPS Score\n  ```\n\n### ๐Ÿง  Why It Matters:\n\n* Helps your leadership team **track trends** over time.\n* Spot dips in customer satisfaction before they turn into churn.\n* All automated โ€” no spreadsheets, no manual scraping, just insights.\n\n---\n\n## ๐ŸŒŸ Final Output Example:\n\n| Date       | Responses | Promoters | Detractors | NPS  |\n| ---------- | --------- | --------- | ---------- | ---- |\n| 2025-07-06 | 4         | 0         | 4          | -100 |\n\n๐Ÿ’ก Imagine your manager getting this **every Monday morning** โ€” it's like having a customer success analyst on autopilot!\n\n---\n\n## โœ… Takeaways for Beginners\n\n| ๐Ÿ”ง Feature | ๐Ÿ“Œ Benefit                                                 |\n| ---------- | ---------------------------------------------------------- |\n| No-code    | You didnโ€™t write a single scraper โ€” just configured blocks |\n| Dynamic    | URLs, prompts, and responses are editable                  |\n| Scalable   | You can run this for 1 site or 100 with minor tweaks       |\n| Actionable | Leadership gets real-time feedback in sheets or Slack      |\n\n---\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "9f4ab1c3-7645-41db-88de-a909f2dc3eb1",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1340,
        -860
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 240,
        "content": "## Iโ€™ll receive a tiny commission if you join Bright Data through this linkโ€”thanks for fueling more free content!\n\n### https://get.brightdata.com/1tndi4600b25"
      },
      "typeVersion": 1
    },
    {
      "id": "01b5ab5b-d3f3-4c26-8d27-7a360f51b91f",
      "name": "Auto-fixing Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserAutofixing",
      "position": [
        720,
        260
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "67963b9e-df9f-49c2-957b-b3c698bbfb7c",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        700,
        480
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "8sEyPDkC5p4w4Jha",
          "name": "OpenAi account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "00af00b9-e6c0-4106-ba81-cc60d52ce2d7",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        860,
        480
      ],
      "parameters": {
        "jsonSchemaExample": "[\n  {\n    \"rating\": 1,\n    \"comment\": \"Avoid at all costs they donโ€™t support businesses from fraud, they always side with customer chargebacks! And charge fees for nothing, your loss of stock, money, time, postage, and fees!\",\n    \"date\": \"2 days ago\",\n    \"user\": \"Monisha\"\n  },\n  {\n    \"rating\": 2,\n    \"comment\": \"Shopify is too big of a company to hold payments or not payout next day; with Shopify you will only get two deposits a week.\",\n    \"date\": \"13 hours ago\",\n    \"user\": \"Komplex Fitness\"\n  },\n  {\n    \"rating\": 1,\n    \"comment\": \"Shopify requires access to reading my email messages, cannot do anything without it.\",\n    \"date\": \"2 days ago\",\n    \"user\": \"Andre Tuseyev\"\n  },\n  {\n    \"rating\": 1,\n    \"comment\": \"Bought a pair of Hugo Italian design black leather trainers. Opened the package and my utter disappointment, they were not leather, they are certainly not Italian design.\",\n    \"date\": \"6 days ago\",\n    \"user\": \"ROGER EGERTON\"\n  },\n  {\n    \"rating\": 3,\n    \"comment\": \"Despite many negative reviews, weโ€™ve been using Shopify for nearly 10 years.\",\n    \"date\": \"6 days ago\",\n    \"user\": \"Mandy\"\n  },\n  {\n    \"rating\": 5,\n    \"comment\": \"Great platform to manage my online store efficiently.\",\n    \"date\": \"1 week ago\",\n    \"user\": \"Sarah H.\"\n  }\n]\n"
      },
      "typeVersion": 1.2
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "e8e2c0a0-956b-4b35-96a3-882f6d618498",
  "connections": {
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Auto-fixing Output Parser",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Auto-fixing Output Parser",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Auto-fixing Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "๐Ÿง  Scrape Reviews with Agent (MCP)",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "๐ŸŽฏ Prompt & Guide Agent": {
      "ai_languageModel": [
        [
          {
            "node": "๐Ÿง  Scrape Reviews with Agent (MCP)",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "โฐ Run Weekly NPS Tracker": {
      "main": [
        [
          {
            "node": "โœ๏ธ Set Survey Page URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "โœ๏ธ Set Survey Page URL": {
      "main": [
        [
          {
            "node": "๐Ÿง  Scrape Reviews with Agent (MCP)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "๐Ÿ“Š Calculate NPS from Ratings": {
      "main": [
        [
          {
            "node": "๐Ÿ“„ Log NPS to Google Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "๐Ÿง  Scrape Reviews with Agent (MCP)": {
      "main": [
        [
          {
            "node": "๐Ÿ“Š Calculate NPS from Ratings",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "๐ŸŒ Execute Web Scrape (Bright Data)": {
      "ai_tool": [
        [
          {
            "node": "๐Ÿง  Scrape Reviews with Agent (MCP)",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    }
  }
}

็›ธๅ…ณๅทฅไฝœๆต