AutomationFlowsAI & RAG › Analyze Amazon Review Friction and Revenue Impact with Bright Data,…

Analyze Amazon Review Friction and Revenue Impact with Bright Data,…

Original n8n title: Analyze Amazon Review Friction and Revenue Impact with Bright Data, Openrouter and Google Sheets

ByYaron Been @yaron-nofluff on n8n.io

This workflow automatically extracts Amazon product reviews and identifies hidden friction signals that are costing you conversions. It helps ecommerce and product teams turn customer complaints into measurable revenue opportunities.

Event trigger★★★★★ complexityAI-powered31 nodes@Brightdata/N8N Nodes BrightdataAgentOutput Parser StructuredGoogle SheetsOpenRouter Chat
AI & RAG Trigger: Event Nodes: 31 Complexity: ★★★★★ AI nodes: yes Added:

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

This workflow follows the Agent → Google Sheets 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
{
  "id": "VbwgyOwe5ImcwQXu",
  "name": "Finding Customer Friction & Conversion Leaks with Bright Data & n8n",
  "tags": [],
  "nodes": [
    {
      "id": "78e45031-ebab-4b2d-a094-d841ddb58fb7",
      "name": "Run Friction Analysis",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -4432,
        1376
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "a061d9e9-f6bc-4510-b073-764140c5e1bb",
      "name": "Set Product URL",
      "type": "n8n-nodes-base.set",
      "position": [
        -4208,
        1376
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "4539b934-3e9f-4692-a398-0b1388476813",
              "name": "url",
              "type": "string",
              "value": "https://www.amazon.com/Amazon-Basics-Micro-Foam-Nitrile-Coated/dp/B08DDZ1BDV/ref=sr_1_1?adgrpid=87137420328&dib=eyJ2IjoiMSJ9.TSfdhc3EZnn9H2llyVoZXzn6Mt0g1fqCSJpTXab0SD8x6YU9WZ2p72KbpJyDfwxxh5BNCBzULjb_5y7zhoLRB_iVL8czclcKAA_7_xmKkXZ9gYpoNd2lwRSz0oagsf-VvAbQC1hlVJkMdhO9MmnLoKYXpB5A-OEOcAy7cWej-XGIQJaBZR49M28Z1zntbeitNxrDMQ4YGQ5rOKAS1XzrFBuX1C4SRQzU1ePB2ypceERh4jNmti_ZVbQaOv-EyHkYpJS2PgXMjhAfkiXEB9ZC_9qIi5J4YqlgRmMrZKVGvBg.ZMnwoBOKQaX36cEuy0iI6R6v_WszSLdW_zsQjRePkqg&dib_tag=se&hvadid=585479824073&hvdev=c&hvlocphy=9075163&hvnetw=g&hvqmt=b&hvrand=1405474185371293561&hvtargid=kwd-2971+1234567890&hydadcr=29108_14573980&keywords=gloves+amazon&mcid=b731b334a709335cb77408996e3e4244&qid=1771246359&sr=8-1"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "f7c6ee46-231c-4add-b43a-7d7fbd12d1f5",
      "name": "Start Review Scraping (Bright Data)",
      "type": "@brightdata/n8n-nodes-brightdata.brightData",
      "onError": "continueErrorOutput",
      "position": [
        -3600,
        1376
      ],
      "parameters": {
        "urls": "=[{\"url\":\"{{ $json.url }}\"}]",
        "resource": "webScrapper",
        "operation": "triggerCollectionByUrl",
        "dataset_id": {
          "__rl": true,
          "mode": "list",
          "value": "gd_le8e811kzy4ggddlq",
          "cachedResultName": "Amazon Reviews"
        },
        "requestOptions": {}
      },
      "retryOnFail": false,
      "typeVersion": 1
    },
    {
      "id": "fb1ce830-ceac-48f4-9870-8cb702c02bac",
      "name": "Wait Before Status Check",
      "type": "n8n-nodes-base.wait",
      "position": [
        -3248,
        1360
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "dfba77a2-e913-4e80-9290-d1489bf42560",
      "name": "Check Scraping Status",
      "type": "@brightdata/n8n-nodes-brightdata.brightData",
      "position": [
        -3024,
        1360
      ],
      "parameters": {
        "resource": "webScrapper",
        "operation": "monitorProgressSnapshot",
        "snapshot_id": "={{ $json.snapshot_id }}",
        "requestOptions": {}
      },
      "typeVersion": 1
    },
    {
      "id": "ef1d50cf-04b8-4ea7-b3e5-4fe5147385bb",
      "name": "Is Snapshot Ready?",
      "type": "n8n-nodes-base.if",
      "position": [
        -2800,
        1360
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "53b0d323-2400-4f38-a810-dd8b2a66dacf",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "ready"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "7a7f7c2d-81f3-4dec-9145-5fc6b72784a1",
      "name": "Download Review Data",
      "type": "@brightdata/n8n-nodes-brightdata.brightData",
      "position": [
        -2240,
        1344
      ],
      "parameters": {
        "resource": "webScrapper",
        "operation": "downloadSnapshot",
        "snapshot_id": "={{ $json.snapshot_id }}",
        "requestOptions": {}
      },
      "typeVersion": 1
    },
    {
      "id": "28f4955b-81b1-4a60-bbe4-f9a904531641",
      "name": "Detect Friction Signals",
      "type": "n8n-nodes-base.code",
      "position": [
        -2016,
        1344
      ],
      "parameters": {
        "jsCode": "return items.map(item => {\n\n  let signals = [];\n  const review = (item.json.review_text || \"\").toLowerCase();\n\n  // Delivery Issues\n  if (\n    review.includes(\"late delivery\") ||\n    review.includes(\"arrived late\") ||\n    review.includes(\"shipping delay\") ||\n    review.includes(\"took too long\")\n  ) {\n    signals.push(\"delivery_delay\");\n  }\n\n  // Returns / Refund Issues\n  if (\n    review.includes(\"refund\") ||\n    review.includes(\"return\") ||\n    review.includes(\"money back\") ||\n    review.includes(\"refund denied\")\n  ) {\n    signals.push(\"returns_friction\");\n  }\n\n  // Quality / Durability Issues\n  if (\n    review.includes(\"fell apart\") ||\n    review.includes(\"doesn't last\") ||\n    review.includes(\"broke\") ||\n    review.includes(\"torn\") ||\n    review.includes(\"poor quality\")\n  ) {\n    signals.push(\"product_durability_issue\");\n  }\n\n  // Sizing Issues\n  if (\n    review.includes(\"run small\") ||\n    review.includes(\"too tight\") ||\n    review.includes(\"too loose\") ||\n    review.includes(\"size up\")\n  ) {\n    signals.push(\"sizing_issue\");\n  }\n\n  // Support Issues\n  if (\n    review.includes(\"no response\") ||\n    review.includes(\"customer service\") ||\n    review.includes(\"support didn't\")\n  ) {\n    signals.push(\"support_issue\");\n  }\n\n  return {\n    json: {\n      ...item.json,\n      frictionSignals: signals\n    }\n  };\n\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "ee60903e-c78a-4dda-b32c-a2324adb8bd8",
      "name": "Any Friction Detected?",
      "type": "n8n-nodes-base.if",
      "position": [
        -1808,
        1344
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "020b1422-1d58-44f2-baad-d575310ac940",
              "operator": {
                "type": "array",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.frictionSignals }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "583e15c6-64bc-4412-a5f1-523e358099fc",
      "name": "Prepare Review for AI Analysis",
      "type": "n8n-nodes-base.set",
      "position": [
        -1168,
        1328
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "5300ca2a-5c4d-49b8-90f8-9fc4be2d4534",
              "name": "brand",
              "type": "string",
              "value": "={{$json.brand}}"
            },
            {
              "id": "2714bb1c-88e2-452d-af87-73400107bb5b",
              "name": "productName",
              "type": "string",
              "value": "={{ $json.product_name }}"
            },
            {
              "id": "0d610520-afcc-4c50-9e76-87828c662c99",
              "name": "asin",
              "type": "string",
              "value": "={{ $json.asin }}"
            },
            {
              "id": "930bd5fb-86cf-4a87-95f7-2d6877900af2",
              "name": "frictionSignals",
              "type": "array",
              "value": "={{ $json.frictionSignals }}"
            },
            {
              "id": "240c0a8f-36ff-4c53-8739-c494c67f4ca4",
              "name": "frictionType",
              "type": "string",
              "value": "={{$json.frictionSignals[0]}}\n"
            },
            {
              "id": "5af85e38-a897-4784-805e-c1ad2846610c",
              "name": "reviewText",
              "type": "string",
              "value": "={{$json.review_text}}"
            },
            {
              "id": "71447117-856e-44be-89dc-8b609f8dbd4a",
              "name": "reviewRating",
              "type": "number",
              "value": "={{ $json.rating }}"
            },
            {
              "id": "ca714089-aa7f-42c8-8929-6aea1606b1ef",
              "name": "review_header",
              "type": "string",
              "value": "={{ $json.review_header }}"
            },
            {
              "id": "c532cd60-cb84-4d60-a892-d4fb907c000c",
              "name": "revenueImpactScore",
              "type": "number",
              "value": 0
            },
            {
              "id": "b715444c-1df9-49b1-bb85-95a2d986d7e0",
              "name": "confidenceScore",
              "type": "number",
              "value": 0
            },
            {
              "id": "87d83964-433f-48a0-a483-e696cf52abe2",
              "name": "review_country",
              "type": "string",
              "value": "={{ $json.review_country }}"
            },
            {
              "id": "033ed87a-c755-4972-876c-26b597d44e5e",
              "name": "review_posted_date",
              "type": "string",
              "value": "={{ $json.review_posted_date }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "c99ba0f1-d9ad-4e3d-8db0-089be31de580",
      "name": "AI Friction Impact Analyzer",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -944,
        1328
      ],
      "parameters": {
        "text": "=Analyze the following ecommerce friction data:\n\nBrand: {{$json.brand}}\nProduct: {{$json.productName}}\nASIN: {{$json.asin}}\nFriction Signals: {{$json.frictionSignals}}\nReview Rating: {{$json.reviewRating}}\nReview Header: {{$json.review_header}}\nReview Text: {{$json.reviewText}}\n\n\nClassify:\n\n1. Friction category (Checkout / Delivery / Returns / Support / Product)\n2. Estimated revenue impact (Low / Medium / High)\n3. Numerical impact score (0-100)\n4. Confidence score (0-100)\n5. Short reasoning\n\nRespond strictly in this JSON format:\n\n{\n  \"brand\": \"\",\n  \"productName\": \"\",\n  \"asin\": \"\",\n  \"reviewHeader\": \"\",\n  \"reviewText\": \"\",\n  \"reviewRating\": 0,\n  \"frictionSignals\": [],\n  \"frictionCategory\": \"\",\n  \"estimatedImpact\": \"\",\n  \"impactScore\": 0,\n  \"confidenceScore\": 0,\n  \"reasoning\": \"\"\n}\n",
        "options": {
          "systemMessage": "You are an ecommerce conversion intelligence engine.\n\nYou analyze product friction signals extracted from customer reviews.\n\nAlways respond strictly in valid JSON.\nNo explanations outside JSON.\n"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3.1
    },
    {
      "id": "c140c590-19a8-4f6b-ae14-085e6156a03d",
      "name": "Validate AI Friction Output",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -784,
        1600
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"brand\": {\n      \"type\": \"string\"\n    },\n    \"productName\": {\n      \"type\": \"string\"\n    },\n    \"asin\": {\n      \"type\": \"string\"\n    },\n    \"reviewHeader\": {\n      \"type\": \"string\"\n    },\n    \"reviewText\": {\n      \"type\": \"string\"\n    },\n    \"reviewRating\": {\n      \"type\": \"number\"\n    },\n    \"frictionSignals\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"frictionCategory\": {\n      \"type\": \"string\",\n      \"enum\": [\"Checkout\", \"Delivery\", \"Returns\", \"Support\", \"Product\"]\n    },\n    \"estimatedImpact\": {\n      \"type\": \"string\",\n      \"enum\": [\"Low\", \"Medium\", \"High\"]\n    },\n    \"impactScore\": {\n      \"type\": \"number\",\n      \"minimum\": 0,\n      \"maximum\": 100\n    },\n    \"confidenceScore\": {\n      \"type\": \"number\",\n      \"minimum\": 0,\n      \"maximum\": 100\n    },\n    \"reasoning\": {\n      \"type\": \"string\"\n    }\n  },\n  \"required\": [\n    \"brand\",\n    \"productName\",\n    \"asin\",\n    \"reviewHeader\",\n    \"reviewText\",\n    \"reviewRating\",\n    \"frictionSignals\",\n    \"frictionCategory\",\n    \"estimatedImpact\",\n    \"impactScore\",\n    \"confidenceScore\",\n    \"reasoning\"\n  ]\n}\n"
      },
      "typeVersion": 1.3
    },
    {
      "id": "e36ed31e-190b-4188-a0f0-e14067cf4d23",
      "name": "Calculate Correlated Friction Score",
      "type": "n8n-nodes-base.code",
      "position": [
        -576,
        1328
      ],
      "parameters": {
        "jsCode": "return items.map(item => {\n\n  const data = item.json.output;\n\n  let frictionWeight = 0;\n\n  if (data.frictionSignals?.includes(\"checkout_failure\")) frictionWeight += 40;\n  if (data.frictionSignals?.includes(\"delivery_delay\")) frictionWeight += 25;\n  if (data.frictionSignals?.includes(\"returns_friction\")) frictionWeight += 20;\n  if (data.frictionSignals?.includes(\"support_issue\")) frictionWeight += 15;\n  if (data.frictionSignals?.includes(\"sizing_issue\")) frictionWeight += 20;\n  if (data.frictionSignals?.includes(\"product_durability_issue\")) frictionWeight += 30;\n\n  const impactComponent = (data.impactScore || 0) * 0.7;\n\n  const finalScore = Math.round(frictionWeight + impactComponent);\n\n  return {\n    json: {\n      ...data,\n      correlatedScore: finalScore\n    }\n  };\n\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "80332a79-1d65-4605-8edb-c5d66af75c19",
      "name": "Is High-Risk Revenue Friction?",
      "type": "n8n-nodes-base.if",
      "position": [
        -80,
        1328
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "62f3951b-dc89-453f-b1dc-03414a3ff7e6",
              "operator": {
                "type": "number",
                "operation": "gt"
              },
              "leftValue": "={{ $json.correlatedScore }}",
              "rightValue": 60
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "1210bb63-14e7-410f-a61d-fd33885e006f",
      "name": "Tag as High Priority",
      "type": "n8n-nodes-base.set",
      "position": [
        208,
        1168
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "010a0892-4d17-4ddc-9542-0fff0350ac5e",
              "name": "Priority",
              "type": "string",
              "value": "High"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "7e4bd3ef-1fb3-4589-a046-acb2d7ee56ec",
      "name": "Tag as Moderate / Low Priority",
      "type": "n8n-nodes-base.set",
      "position": [
        -16,
        1616
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "5a119cdc-8e45-47e8-bb0a-e48126699f43",
              "name": "Priority",
              "type": "string",
              "value": "Moderate/Low"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "8a26b86a-9c07-4a3d-8c62-5f5294f4eaac",
      "name": "Log Checkout Optimization Opportunity",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        432,
        1168
      ],
      "parameters": {
        "columns": {
          "value": {
            "ASIN": "={{ $json.asin }}",
            "Brand": "={{ $json.brand }}",
            "Priority": "={{ $json['Priority'] }}",
            "Timestamp": "={{ $now }}",
            "Impact Score": "={{ $json.impactScore }}",
            "Friction Type": "={{ $json.frictionSignals[0] }}",
            "Review Header": "={{ $json.reviewHeader }}",
            "Review Rating": "={{ $json.reviewRating }}",
            "Revenue Impact": "={{ $json.estimatedImpact }}",
            "Confidence Score": "={{ $json.confidenceScore }}"
          },
          "schema": [
            {
              "id": "Brand",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Brand",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Friction Type",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Friction Type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Revenue Impact",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Revenue Impact",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Priority",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Priority",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Impact Score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Impact Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Confidence Score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Confidence Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "ASIN",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "ASIN",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Review Header",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Review Header",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Review Rating",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Review Rating",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Timestamp",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Timestamp",
              "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/1i10QicCLs7MCiGcEVui1lCGB9kffPsPlJ6iWtPGS_t0/edit#gid=0",
          "cachedResultName": "Checkout Optimisation List"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1i10QicCLs7MCiGcEVui1lCGB9kffPsPlJ6iWtPGS_t0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1i10QicCLs7MCiGcEVui1lCGB9kffPsPlJ6iWtPGS_t0/edit?usp=drivesdk",
          "cachedResultName": "3. Bright Data Customer Friction & Conversion\u2011Loss Intelligence Engine"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "136d7a80-420d-411b-a5cc-f9d284916250",
      "name": "Prepare Delivery & Returns Risk Flags",
      "type": "n8n-nodes-base.set",
      "position": [
        208,
        1440
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "9759c7b1-c129-4db9-b4c0-f13eb7a4b0cc",
              "name": "deliveryRisk",
              "type": "boolean",
              "value": "={{$json.frictionSignals.includes('delivery_delay')}}"
            },
            {
              "id": "3e681bfc-4454-44f2-9076-b191e4db53f4",
              "name": "returnsRisk",
              "type": "boolean",
              "value": "={{$json.frictionSignals.includes('returns_friction')}}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "880be350-60ef-4fe9-81d4-98b0c3452bb1",
      "name": "Log Delivery & Returns Risk",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        448,
        1440
      ],
      "parameters": {
        "columns": {
          "value": {
            "asin": "={{ $json.asin }}",
            "brand": "={{ $json.brand }}",
            "reasoning": "={{ $json.reasoning }}",
            "reviewText": "={{ $json.reviewText }}",
            "impactScore": "={{ $json.impactScore }}",
            "productName": "={{ $json.productName }}",
            "returnsRisk": "={{ $json.returnsRisk }}",
            "deliveryRisk": "={{ $json.deliveryRisk }}",
            "reviewHeader": "={{ $json.reviewHeader }}",
            "reviewRating": "={{ $json.reviewRating }}",
            "confidenceScore": "={{ $json.confidenceScore }}",
            "correlatedScore": "={{ $json.correlatedScore }}",
            "estimatedImpact": "={{ $json.estimatedImpact }}",
            "frictionSignals": "={{ $json.frictionSignals[0] }}",
            "frictionCategory": "={{ $json.frictionCategory }}"
          },
          "schema": [
            {
              "id": "brand",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "brand",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "productName",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "productName",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "asin",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "asin",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "reviewHeader",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "reviewHeader",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "reviewText",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "reviewText",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "reviewRating",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "reviewRating",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "frictionSignals",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "frictionSignals",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "frictionCategory",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "frictionCategory",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "estimatedImpact",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "estimatedImpact",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "impactScore",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "impactScore",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "confidenceScore",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "confidenceScore",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "reasoning",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "reasoning",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "correlatedScore",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "correlatedScore",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "deliveryRisk",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "deliveryRisk",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "returnsRisk",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "returnsRisk",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 678578591,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1i10QicCLs7MCiGcEVui1lCGB9kffPsPlJ6iWtPGS_t0/edit#gid=678578591",
          "cachedResultName": "Delivery & Returns Risk Report"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1i10QicCLs7MCiGcEVui1lCGB9kffPsPlJ6iWtPGS_t0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1i10QicCLs7MCiGcEVui1lCGB9kffPsPlJ6iWtPGS_t0/edit?usp=drivesdk",
          "cachedResultName": "3. Bright Data Customer Friction & Conversion\u2011Loss Intelligence Engine"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "6e147816-bb0f-411e-8042-d71ace1ce40b",
      "name": "Format Bright Data Error",
      "type": "n8n-nodes-base.set",
      "position": [
        -3536,
        1616
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "548fe42c-b3b5-450d-a317-0a719eb9f941",
              "name": "errorSource",
              "type": "string",
              "value": "Bright Data Scraper"
            },
            {
              "id": "ef6c08bd-4e69-4a27-b116-658e76a1783f",
              "name": "errorMessage",
              "type": "string",
              "value": "={{$json.error?.message || $json.message || 'Unknown Bright Data Error'}}"
            },
            {
              "id": "3c3cea2d-4925-47d6-8083-977a559f575b",
              "name": "errorCode",
              "type": "string",
              "value": "={{$json.statusCode || $json.code || 'N/A'}}"
            },
            {
              "id": "614a2d0a-ecbc-43ac-889b-ea884a01489a",
              "name": "timestamp",
              "type": "string",
              "value": "={{new Date().toISOString()}}"
            },
            {
              "id": "7f2dc396-ddcd-4af7-8a38-9604a482b1b1",
              "name": "hasError",
              "type": "boolean",
              "value": true
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "c9c761cd-4fe6-4e0b-a974-f9b0669ddcc5",
      "name": "Log Scraping Error",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -3328,
        1616
      ],
      "parameters": {
        "columns": {
          "value": {
            "hasError": "={{ $json.hasError }}",
            "errorCode": "={{ $json.errorCode }}",
            "timestamp": "={{ $json.timestamp }}",
            "errorSource": "={{ $json.errorSource }}",
            "errorMessage": "={{ $json.errorMessage }}"
          },
          "schema": [
            {
              "id": "errorSource",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "errorSource",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "errorMessage",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "errorMessage",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "errorCode",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "errorCode",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "timestamp",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "timestamp",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "hasError",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "hasError",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 946155652,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1MkajrqjeeoOQqurtNmWnlUBQcUcDECoB7H5ZyUY6DtM/edit#gid=946155652",
          "cachedResultName": "log bright data error"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1i10QicCLs7MCiGcEVui1lCGB9kffPsPlJ6iWtPGS_t0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1i10QicCLs7MCiGcEVui1lCGB9kffPsPlJ6iWtPGS_t0/edit?usp=drivesdk",
          "cachedResultName": "3. Bright Data Customer Friction & Conversion\u2011Loss Intelligence Engine"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "86db919b-3a9e-4286-aecb-ea99da273c35",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5136,
        624
      ],
      "parameters": {
        "color": 4,
        "width": 512,
        "height": 576,
        "content": "## Customer Friction & Conversion-Loss Intelligence Engine\n\nThis workflow extracts Amazon reviews and identifies hidden revenue friction.\n\nIt:\n\n- Scrapes and monitors review data\n- Detects delivery, returns, product & support issues\n- Uses AI to estimate revenue impact\n- Scores and prioritizes friction severity\n- Logs high-risk conversion leaks automatically\n\nOutput Delivers:\n- Optimization Opportunity\n- Delivery & Returns Risk\n\nWhat you need:\n- Bright Data account (for web scraping)\n- OpenRouter API key (for AI analysis)\n- Google Sheets (for output dashboards)\n\nThe result: structured friction intelligence that turns customer complaints into measurable revenue opportunities.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "48c90aeb-d535-4f0b-bf4f-5efe70184acf",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3680,
        1056
      ],
      "parameters": {
        "color": 7,
        "width": 1072,
        "height": 768,
        "content": "## Review Scraping Flow\n\nInitiates and manages the collection of customer review data from Amazon using Bright Data to enable friction and conversion analysis.\n\n- Starts automated review scraping process  \n- Monitors snapshot generation progress  \n- Waits until review dataset is fully ready  \n- Downloads structured review content  \n- Handles and logs scraping failures  \n\nProvides reliable and structured review input for downstream friction signal detection and impact analysis."
      },
      "typeVersion": 1
    },
    {
      "id": "8cd5f1a9-aab0-4883-bc22-09776bea562a",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2304,
        1008
      ],
      "parameters": {
        "color": 7,
        "width": 752,
        "height": 768,
        "content": "## Friction Signal Detection\n\nAnalyzes downloaded customer reviews to identify potential friction points impacting user experience and conversion.\n\n- Processes structured review data  \n- Detects delivery and fulfillment issues  \n- Identifies returns and refund-related concerns  \n- Flags product durability or quality complaints  \n- Filters reviews with no critical friction signals  \n\nPrepares validated friction signals for downstream AI impact analysis."
      },
      "typeVersion": 1
    },
    {
      "id": "58ca37d7-fc3e-45c6-9434-6201b3d145d2",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1232,
        992
      ],
      "parameters": {
        "color": 7,
        "width": 816,
        "height": 816,
        "content": "## AI Friction Impact Analysis\n\nProcesses validated friction signals using AI to estimate their impact on customer experience and conversions.\n\n- Prepares review data for AI analysis  \n- Classifies type of customer friction  \n- Estimates revenue impact level  \n- Assigns numerical impact score  \n- Validates structured AI output  \n\nEnables prioritization of conversion-impacting customer experience issues."
      },
      "typeVersion": 1
    },
    {
      "id": "7757d68f-e273-460e-b5d9-ec11b9bc3011",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -144,
        816
      ],
      "parameters": {
        "color": 7,
        "width": 784,
        "height": 1008,
        "content": "## Friction Prioritization & Opportunity Logging\n\nFilters high-risk friction signals and routes them into structured reporting dashboards.\n\n- Flags high-risk revenue-impacting friction  \n- Tags moderate or low-priority issues  \n- Prepares checkout optimization opportunities  \n- Logs delivery and returns-related risks  \n- Stores prioritized friction insights for reporting  \n\nSupports targeted conversion optimization and operational improvements."
      },
      "typeVersion": 1
    },
    {
      "id": "36a23fbf-d956-47c9-a5fc-d37991621fc3",
      "name": "Friction Impact Analyzer",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        -960,
        1600
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "4cd0fb94-0ead-47aa-abb9-99489833212d",
      "name": "No Friction Detected",
      "type": "n8n-nodes-base.set",
      "position": [
        -1744,
        1584
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "31f389dc-a1f2-45f9-81b7-b37811d5c313",
              "name": "frictionSignals",
              "type": "string",
              "value": "There is no issue for the customer in review"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "04baa210-e459-4d50-944b-83ba8a766fac",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5136,
        1232
      ],
      "parameters": {
        "color": 4,
        "width": 512,
        "height": 480,
        "content": "## Setup Instructions\n\nBefore running this workflow, configure the following credentials in n8n:\n\n**1. Bright Data API** \u2014 Required for web scraping\n- Sign up at brightdata.com\n- Create an API token\n- Add as \"BrightData account\" credential in n8n\n\n**2. OpenRouter API** \u2014 Required for AI classification\n- Sign up at openrouter.ai\n- Generate an API key\n- Add as \"OpenRouter account\" credential in n8n\n\n**3. Google Sheets OAuth** \u2014 Required for output logging\n- Connect your Google account in n8n\n- See the **Google Sheets Setup** sticky note for required tabs and columns\n- Update each Google Sheets node to point to your new spreadsheet\n\nAfter connecting credentials, edit the configuration node to set your target companies, URLs, or parameters."
      },
      "typeVersion": 1
    },
    {
      "id": "9018eebe-cf35-414e-a353-7aee195ed37c",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4512,
        1056
      ],
      "parameters": {
        "color": 7,
        "width": 464,
        "height": 560,
        "content": "## Input & Configuration\n\nInitial configuration block where the target product URL is defined for friction analysis.\n\n- Sets the Amazon product page URL  \n- Initiates workflow execution manually  \n- Provides configurable entry point for review analysis  \n\nAllows flexible targeting of product-level customer friction signals."
      },
      "typeVersion": 1
    },
    {
      "id": "c96bf200-f6d3-490b-83e6-583389f5b6fb",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5136,
        1744
      ],
      "parameters": {
        "color": 4,
        "width": 512,
        "height": 440,
        "content": "## Google Sheets Setup\n\nCreate a Google Spreadsheet with 3 tabs and add these column headers in row 1:\n\n**Tab: Checkout Optimisation List**\nBrand | Friction Type | Revenue Impact | Priority| Impact Score | Confidence Score | ASIN | Review Header | Review Rating | Timestamp\n\n**Tab: Delivery & Returns Risk Report**\nbrand | productName | asin | reviewHeader | reviewText | reviewRating | frictionSignals | frictionCategory | estimatedImpact | impactScore | confidenceScore | reasoning | correlatedScore | deliveryRisk | returnsRisk\n\n**Tab: log bright data error**\nerrorSource | errorMessage | errorCode | timestamp | hasError\n\nAfter creating the spreadsheet, update each Google Sheets node to point to your document and select the matching tab."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "6da612ec-bcc3-47e2-b04c-d8cbe9f4c7eb",
  "connections": {
    "Set Product URL": {
      "main": [
        [
          {
            "node": "Start Review Scraping (Bright Data)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is Snapshot Ready?": {
      "main": [
        [
          {
            "node": "Download Review Data",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait Before Status Check",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Review Data": {
      "main": [
        [
          {
            "node": "Detect Friction Signals",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Tag as High Priority": {
      "main": [
        [
          {
            "node": "Log Checkout Optimization Opportunity",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Scraping Status": {
      "main": [
        [
          {
            "node": "Is Snapshot Ready?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Run Friction Analysis": {
      "main": [
        [
          {
            "node": "Set Product URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Any Friction Detected?": {
      "main": [
        [
          {
            "node": "Prepare Review for AI Analysis",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Friction Detected",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Detect Friction Signals": {
      "main": [
        [
          {
            "node": "Any Friction Detected?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Bright Data Error": {
      "main": [
        [
          {
            "node": "Log Scraping Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Friction Impact Analyzer": {
      "ai_languageModel": [
        [
          {
            "node": "AI Friction Impact Analyzer",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Wait Before Status Check": {
      "main": [
        [
          {
            "node": "Check Scraping Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Friction Impact Analyzer": {
      "main": [
        [
          {
            "node": "Calculate Correlated Friction Score",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate AI Friction Output": {
      "ai_outputParser": [
        [
          {
            "node": "AI Friction Impact Analyzer",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Is High-Risk Revenue Friction?": {
      "main": [
        [
          {
            "node": "Tag as High Priority",
            "type": "main",
            "index": 0
          },
          {
            "node": "Prepare Delivery & Returns Risk Flags",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Tag as Moderate / Low Priority",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Review for AI Analysis": {
      "main": [
        [
          {
            "node": "AI Friction Impact Analyzer",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calculate Correlated Friction Score": {
      "main": [
        [
          {
            "node": "Is High-Risk Revenue Friction?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Start Review Scraping (Bright Data)": {
      "main": [
        [
          {
            "node": "Wait Before Status Check",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Format Bright Data Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Delivery & Returns Risk Flags": {
      "main": [
        [
          {
            "node": "Log Delivery & Returns Risk",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

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

About this workflow

This workflow automatically extracts Amazon product reviews and identifies hidden friction signals that are costing you conversions. It helps ecommerce and product teams turn customer complaints into measurable revenue opportunities.

Source: https://n8n.io/workflows/13587/ — 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 automatically monitors companies across courts, regulators, and jurisdictions to detect legal risk signals early. It helps legal, compliance, and risk teams stay ahead of litigation thre

Google Sheets, Agent, Output Parser Structured +2
AI & RAG

This workflow automatically scans companies for signs of financial distress across filings, insolvency registers, and financial news. It helps procurement, credit, and risk teams detect early warning

@Brightdata/N8N Nodes Brightdata, Google Sheets, Agent +2
AI & RAG

This workflow automatically scrapes competitor product data from Amazon and identifies gaps in your assortment, pricing, and positioning. It helps merchandising and product teams spot opportunities th

@Brightdata/N8N Nodes Brightdata, Agent, Output Parser Structured +2
AI & RAG

This workflow transforms your Telegram bot into an intelligent creative assistant. It can chat conversationally, fetch trending image prompts from PromptHero for inspiration, or perform a deep "remix"

Telegram Trigger, Output Parser Structured, Telegram +6
AI & RAG

🧠 Automate end-to-end SEO blog creation and WordPress publishing using a GPT-5 multi-agent workflow with real-time research, metadata generation, and optional featured images.

Output Parser Structured, HTTP Request, OpenAI +10