AutomationFlowsAI & RAG › AI Fake Review Detector with OpenAI & Airtable

AI Fake Review Detector with OpenAI & Airtable

Original n8n title: Ai-powered Fake Review Detection Workflow Using N8n & Airtable

AI-Powered Fake Review Detection Workflow Using n8n & Airtable. Uses httpRequest, airtable, openAi, slack. Webhook trigger; 27 nodes.

Webhook trigger★★★★☆ complexityAI-powered27 nodesHTTP RequestAirtableOpenAISlack
AI & RAG Trigger: Webhook Nodes: 27 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Airtable → HTTP Request 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": "MwNd8aIMtEp8f7r6",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "AI-Powered Fake Review Detection Workflow Using n8n & Airtable",
  "tags": [],
  "nodes": [
    {
      "id": "02436f9e-fb75-4fc3-9bc5-766b8dacbc9b",
      "name": "Webhook \u2013 Receive Product Payload",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -3776,
        432
      ],
      "parameters": {
        "path": "product_data",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "084e51a0-1c5d-475f-add7-75224fb5c682",
      "name": "Process Each Product",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -3328,
        432
      ],
      "parameters": {
        "options": {
          "reset": false
        },
        "batchSize": 1
      },
      "typeVersion": 1
    },
    {
      "id": "e1c92f87-b29e-43d1-aaed-0755ec651296",
      "name": "Fetch Product Reviews",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -3056,
        416
      ],
      "parameters": {
        "url": "={{ $json.url }}",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "e126f003-cdd9-438f-9640-d35840ca2ead",
      "name": "Extract products",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -3552,
        432
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "body.products"
      },
      "typeVersion": 1
    },
    {
      "id": "fe06f64f-315d-492b-bc03-9f95ae69601c",
      "name": "IF \u2013 Has Reviews?",
      "type": "n8n-nodes-base.if",
      "position": [
        -2864,
        416
      ],
      "parameters": {
        "conditions": {
          "boolean": [
            {
              "value1": "={{!!$json[\"reviews\"] && $json[\"reviews\"].length > 0}}",
              "value2": true
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "800cf035-fda5-4a9a-b035-9eab56de30c7",
      "name": "Expand reviews[] to items",
      "type": "n8n-nodes-base.code",
      "position": [
        -2640,
        416
      ],
      "parameters": {
        "jsCode": "const reviews = $json.reviews || [];\n\nreturn reviews.map(r => ({\n  json: {\n    product_id: $json.product_id,\n    marketplace: $json.marketplace,\n    ...r\n  }\n}));\n"
      },
      "typeVersion": 2
    },
    {
      "id": "db46b462-5c90-40e5-a342-fad3fce9da44",
      "name": "Split review in batches",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -2304,
        272
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "742c6b79-b365-410a-abf5-049bb3b3baef",
      "name": "List Bases",
      "type": "n8n-nodes-base.airtable",
      "position": [
        -1552,
        -112
      ],
      "parameters": {
        "options": {},
        "resource": "base"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "5c1956b8-bf25-4531-99b2-04b592580013",
      "name": "Search Records by Hash",
      "type": "n8n-nodes-base.airtable",
      "position": [
        -1376,
        -112
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appipUxLpxPEKRXrJ",
          "cachedResultUrl": "",
          "cachedResultName": "Fake Review Detector"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tbl14GPDbEqhOfC4f",
          "cachedResultUrl": "",
          "cachedResultName": "reviews"
        },
        "options": {},
        "operation": "search",
        "filterByFormula": "={hash} = \"{{ $('Generate Review Hash1').item.json.hash }}\""
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1,
      "alwaysOutputData": true
    },
    {
      "id": "3664fe23-aa07-45a0-86ed-bbf341586478",
      "name": "Normalize Airtable Result",
      "type": "n8n-nodes-base.code",
      "position": [
        -1168,
        -112
      ],
      "parameters": {
        "jsCode": "// REVIEW from your computeHash node\nconst review = $node[\"Generate Review Hash1\"].json;\n\n// Airtable output (the items coming into THIS function node)\nconst items = $items();\n\n// case 1: no records found\nif (!items || items.length === 0) {\n  return [{ json: { exists: 0, ...review } }];\n}\n\n// case 2: Airtable returns [{}] \u2192 treat as no match\nif (items.length === 1 && Object.keys(items[0].json).length === 0) {\n  return [{ json: { exists: 0, ...review } }];\n}\n\n// case 3: record exists\nreturn [{ json: { exists: 1, ...review } }];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "1006fdeb-9121-4465-a7ac-ab930626fbca",
      "name": "Is New Review?",
      "type": "n8n-nodes-base.if",
      "position": [
        -976,
        -112
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "d1a875b4-67e6-4d7b-b72a-9359131b936d",
              "operator": {
                "type": "number",
                "operation": "equals"
              },
              "leftValue": "={{ $json.exists }}",
              "rightValue": 0
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "b535d8ef-507f-4a70-bf22-80611e1392ef",
      "name": "Create Review Record",
      "type": "n8n-nodes-base.airtable",
      "position": [
        -432,
        208
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appipUxLpxPEKRXrJ",
          "cachedResultUrl": "",
          "cachedResultName": "Fake Review Detector"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tbl14GPDbEqhOfC4f",
          "cachedResultUrl": "",
          "cachedResultName": "reviews"
        },
        "columns": {
          "value": {
            "Date": "={{ $json.review_date }}",
            "hash": "={{ $json.hash }}",
            "rating": "={{ $json.rating }}",
            "review_id": "={{ $json.review_id }}",
            "product_id": "={{ $json.product_id }}",
            "marketplace": "={{ $json.marketplace }}",
            "profile_url": "={{ $json.reviewer_profile }}",
            "review_text": "={{ $json.review_text }}",
            "review_title": "={{ $json.title }}",
            "reviewer_name": "={{ $json.reviewer_name }}",
            "reviewer_profile": "={{ $json.reviewer_profile }}",
            "verified_purchase": "={{ $json.verified_purchase }}"
          },
          "schema": [
            {
              "id": "hash",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "hash",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "product_id",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "product_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "marketplace",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "marketplace",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "review_title",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "review_title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "rating",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "rating",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "reviewer_name",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "reviewer_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "reviewer_profile",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "reviewer_profile",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "verified_purchase",
              "type": "boolean",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "verified_purchase",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date",
              "type": "dateTime",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "suspicious_score",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "suspicious_score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "created_at",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "created_at",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "profile_url",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "profile_url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "review_id",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "review_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "review_text",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "review_text",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "create"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "d1ed1608-c59e-4c19-aa90-59c861f5e3b6",
      "name": "Update Review Record",
      "type": "n8n-nodes-base.airtable",
      "position": [
        496,
        208
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appipUxLpxPEKRXrJ",
          "cachedResultUrl": "",
          "cachedResultName": "Fake Review Detector"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tbl14GPDbEqhOfC4f",
          "cachedResultUrl": "",
          "cachedResultName": "reviews"
        },
        "columns": {
          "value": {
            "hash": "={{ $('Create Review Record').item.json.fields.hash }}",
            "reason": "={{ $json.reason }}",
            "fake_score": "={{ $json.fake_score }}",
            "risk_level": "={{ $json.risk_level }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "id",
              "defaultMatch": true
            },
            {
              "id": "hash",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "hash",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Record ID",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Record ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "product_id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "product_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "marketplace",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "marketplace",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "review_title",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "review_title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "rating",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "rating",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "reviewer_name",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "reviewer_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "reviewer_profile",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "reviewer_profile",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "verified_purchase",
              "type": "boolean",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "verified_purchase",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "suspicious_score",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "suspicious_score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "created_at",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "created_at",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "profile_url",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "profile_url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "review_id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "review_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "review_text",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "review_text",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "fake_score",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "fake_score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "risk_level",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "risk_level",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "reason",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "reason",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "hash"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "21604a2e-a9ef-4af8-895d-f6d3d58db8a5",
      "name": "AI Fake Review Analysis",
      "type": "n8n-nodes-base.openAi",
      "position": [
        -240,
        208
      ],
      "parameters": {
        "model": "o4-mini",
        "prompt": {
          "messages": [
            {
              "content": "You are a Trust & Safety analyst for eCommerce platforms. You detect fake, AI-generated, incentivized, or manipulated product reviews."
            },
            {
              "content": "=Review details: - rating: {{$json.fields.rating}} - title: {{$json.fields.review_title}} - review_text: {{$json.fields.review_text}} - reviewer_name: {{$json.fields.reviewer_name}} - verified_purchase: {{$json.fields.verified_purchase}} - marketplace: {{$json.fields.marketplace}} - review_date: {{$json.fields.Date}}  Evaluate if this review is fake or manipulated. Respond with JSON only:  {   \"fake_score\": <0-100>,   \"risk_level\": \"<low|medium|high>\",   \"reason\": \"string explanation\" }"
            }
          ]
        },
        "options": {},
        "resource": "chat",
        "requestOptions": {},
        "simplifyOutput": false
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0c58035e-ef3a-4781-b1af-a587cdc9d238",
      "name": "Parse AI Respons",
      "type": "n8n-nodes-base.code",
      "position": [
        -32,
        208
      ],
      "parameters": {
        "jsCode": "const content = $json.choices[0].message.content;\n\nlet parsed = {};\n\ntry {\n  parsed = JSON.parse(content);\n} catch (e) {\n  parsed = {\n    fake_score: null,\n    risk_level: \"error\",\n    reason: \"Invalid JSON returned by AI\"\n  };\n}\n\nreturn [\n  {\n    json: parsed\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "fc495136-6533-4aac-b6b6-76dba3b4f749",
      "name": "Check Suspicious Score Threshold",
      "type": "n8n-nodes-base.if",
      "position": [
        688,
        208
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "9037cafd-98dd-42e9-a39c-a8bd233ce441",
              "operator": {
                "type": "number",
                "operation": "gte"
              },
              "leftValue": "={{ $json.fields.fake_score }}",
              "rightValue": 60
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "92e6a933-cc2a-40bd-aac7-a9c2e2c85bc2",
      "name": "Send Moderation Alert",
      "type": "n8n-nodes-base.slack",
      "position": [
        1280,
        352
      ],
      "parameters": {
        "text": "=\ud83d\udea8 *Suspicious Review Detected*\n\nA review has been flagged with a high fake-score.\n\n*Product Id:*  {{ $json.fields.product_id }}\n*Marketplace:* {{ $json.fields.marketplace }}\n*Reviewer:* {{ $json.fields.reviewer_name }}\n*Rating:* {{ $json.fields.rating }}\u2b50  \n*Fake Score:* {{ $json.fields.fake_score }}/ 100  \n*Risk Level:* {{ $json.fields.risk_level }}  \n\n\ud83d\udcdd *Review:*  \n\"{{ $json.fields.review_text }}\"\n\n\ud83e\udd16 *AI Reason:*  \n{{ $json.fields.reason }}\n\n\ud83d\udd11 Hash: `{{ $json.fields.hash }}`\n\ud83d\udccc Review ID: {{ $json.fields.review_id }}\n\nPlease review and take action if needed.\n",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09S57E2JQ2",
          "cachedResultName": "n8n"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "cefaef6f-7fc2-4e2f-99a0-fd95c373b890",
      "name": "Generate Review Hash1",
      "type": "n8n-nodes-base.function",
      "position": [
        -1872,
        272
      ],
      "parameters": {
        "functionCode": "function simpleHash(str) {\n  let hash = 5381;\n  for (let i = 0; i < str.length; i++) {\n    hash = (hash * 33) ^ str.charCodeAt(i);\n  }\n  return (hash >>> 0).toString(16); // convert to hex\n}\n\nconst text = $json[\"text\"] || \"\";\nconst reviewer = $json[\"reviewer_id\"] || \"\";\nconst date = $json[\"date\"] || \"\";\n\nconst input = `${text}||${reviewer}||${date}`;\nconst hash = simpleHash(input);\n\nreturn [\n  {\n    json: {\n      ...$json,\n      hash\n    }\n  }\n];\n"
      },
      "typeVersion": 1
    },
    {
      "id": "eddc2f03-3cca-42ef-b357-13cef1abad03",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3824,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 656,
        "height": 544,
        "content": "## Product Input & Setup\n### Receives product data from the webhook, extracts individual product entries, and prepares them for processing. This ensures each product request is handled independently and structured correctly before moving into the review-fetching stage."
      },
      "typeVersion": 1
    },
    {
      "id": "9e6accf5-f2a0-4b2f-b4ee-0ae8b3aef3bb",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3104,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 640,
        "height": 528,
        "content": "## Fetch Reviews\n### Fetches reviews from the external scraper API, checks whether valid review data exists, and expands the results into individual review items. This provides a clean, per-review format ready for analysis and normalization."
      },
      "typeVersion": 1
    },
    {
      "id": "b68e969a-a8f6-40dd-a10f-220027ba24d9",
      "name": "Prepare Review Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        -2064,
        272
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "review_id",
              "value": "={{ $json.review_id }}"
            },
            {
              "name": "text",
              "value": "={{ $json.title }}"
            },
            {
              "name": "rating",
              "value": "={{$json[\"rating\"]}}"
            },
            {
              "name": "date",
              "value": "={{ $json.review_date }}"
            },
            {
              "name": "reviewer_id",
              "value": "={{ $json.review_id }}"
            },
            {
              "name": "reviewer_profile",
              "value": "={{$json[\"reviewer\"]?.profile_url || $json[\"reviewer_profile\"]}}"
            },
            {
              "name": "marketplace",
              "value": "={{$json[\"marketplace\"]}}"
            },
            {
              "name": "product_id",
              "value": "={{$json[\"product_id\"] || $json[\"productId\"]}}"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "5f579bd6-f8f8-4d9b-834a-8e382fdc9add",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2336,
        128
      ],
      "parameters": {
        "color": 7,
        "width": 736,
        "height": 512,
        "content": "## Clean & Hash Review\n### Breaks reviews into single units, standardizes fields like reviewer, rating, and date, and generates a unique hash by combining key attributes. The hash supports consistent deduplication and prevents repeated processing of the same review."
      },
      "typeVersion": 1
    },
    {
      "id": "7ecc4592-16b5-4e8c-acba-f2754bd664c3",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1616,
        -352
      ],
      "parameters": {
        "color": 7,
        "width": 864,
        "height": 464,
        "content": "## Check for Duplicate\n### Searches Airtable for existing records using the generated hash and normalizes the response to avoid empty-object issues. Determines whether the review already exists or must proceed as a new entry."
      },
      "typeVersion": 1
    },
    {
      "id": "333b6164-c94f-4799-a203-7f53b7e25c0e",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -576,
        64
      ],
      "parameters": {
        "color": 7,
        "width": 768,
        "height": 352,
        "content": "## Store & Analyze Review\n### Stores new reviews in Airtable and submits them to the AI model for fake-review analysis. The AI response is cleaned and structured into usable fields like fake score, risk level, and explanation."
      },
      "typeVersion": 1
    },
    {
      "id": "2fda9471-cd99-4111-9785-e5ddea775b7f",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        272,
        64
      ],
      "parameters": {
        "color": 7,
        "width": 640,
        "height": 352,
        "content": "## Update Review Status\n### Updates the Airtable record with AI analysis, computes the risk threshold, and determines whether the review qualifies as suspicious. Only high-risk reviews are escalated for further moderation."
      },
      "typeVersion": 1
    },
    {
      "id": "600ba413-5958-461d-b22c-7bcb07e9a600",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1152,
        144
      ],
      "parameters": {
        "color": 7,
        "width": 352,
        "height": 432,
        "content": "## Send Moderation Alert\n### Sends a detailed Slack alert when a review is flagged as suspicious, including product details, fake score, reviewer information, and reasoning. This enables moderators to quickly identify and act on potentially fake or harmful reviews."
      },
      "typeVersion": 1
    },
    {
      "id": "d2f26f92-cd39-4d9e-afb2-8af73cdf3580",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4608,
        -432
      ],
      "parameters": {
        "width": 704,
        "height": 976,
        "content": "## How It Works\n### This workflow helps you automatically check whether product reviews might be fake. It starts when a product and its review-scraper URL are received through a webhook. The workflow takes each product one by one and calls the scraper API to fetch its latest reviews.\n\n### Each review is then separated into individual items so they can be processed independently. The workflow cleans and organizes the review fields, then generates a unique hash value based on the review\u2019s text, reviewer, and date. This hash helps detect whether the same review was already stored earlier.\n\n### If the review is new, it gets added to Airtable. After that, the workflow sends the review content to OpenAI, which analyzes the text and returns a score showing how likely it is to be fake. The score, explanation, and AI classification are saved back into Airtable. When a review\u2019s score is above the defined risk limit, the workflow sends a clear, detailed message to Slack so a human moderator can quickly check it. This allows you to focus only on reviews that look suspicious, while the workflow handles everything else automatically.\n\n## Setup Steps\n### Add your Airtable, OpenAI, and Slack credentials to n8n.\n\n### Create a reviews table in Airtable with fields for product details, review details, hash, AI score, and reasoning.\n\n### Ensure your webhook is configured to receive real review data from your system.\n\n### Verify that the scraper URL returns review data in the expected format.\n\n### Test the workflow step by step: review fetch, hash generation, Airtable search, AI analysis, and Slack alert.\n\n### Adjust the suspicious score threshold based on how strict you want the detection to be.\n\n### Activate the workflow to run continuously and process incoming reviews automatically."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "99587a94-b16d-42db-94ec-3875f70c4886",
  "connections": {
    "List Bases": {
      "main": [
        [
          {
            "node": "Search Records by Hash",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is New Review?": {
      "main": [
        [
          {
            "node": "Create Review Record",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Split review in batches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract products": {
      "main": [
        [
          {
            "node": "Process Each Product",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse AI Respons": {
      "main": [
        [
          {
            "node": "Update Review Record",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF \u2013 Has Reviews?": {
      "main": [
        [
          {
            "node": "Expand reviews[] to items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Review Record": {
      "main": [
        [
          {
            "node": "AI Fake Review Analysis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Each Product": {
      "main": [
        [
          {
            "node": "Fetch Product Reviews",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Review Record": {
      "main": [
        [
          {
            "node": "Check Suspicious Score Threshold",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Product Reviews": {
      "main": [
        [
          {
            "node": "IF \u2013 Has Reviews?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Review Hash1": {
      "main": [
        [
          {
            "node": "List Bases",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Review Fields": {
      "main": [
        [
          {
            "node": "Generate Review Hash1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Moderation Alert": {
      "main": [
        [
          {
            "node": "Split review in batches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search Records by Hash": {
      "main": [
        [
          {
            "node": "Normalize Airtable Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Fake Review Analysis": {
      "main": [
        [
          {
            "node": "Parse AI Respons",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split review in batches": {
      "main": [
        [],
        [
          {
            "node": "Prepare Review Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Expand reviews[] to items": {
      "main": [
        [
          {
            "node": "Split review in batches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Airtable Result": {
      "main": [
        [
          {
            "node": "Is New Review?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Suspicious Score Threshold": {
      "main": [
        [
          {
            "node": "Send Moderation Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Split review in batches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook \u2013 Receive Product Payload": {
      "main": [
        [
          {
            "node": "Extract products",
            "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

AI-Powered Fake Review Detection Workflow Using n8n & Airtable. Uses httpRequest, airtable, openAi, slack. Webhook trigger; 27 nodes.

Source: https://github.com/weblineindia/n8n-Detect-fake-product-reviews-with-OpenAI-send-alerts-to-Slack-via-Airtable/blob/main/main.json — 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 Facebook Group posts, analyzes them using AI, detects policy violations, logs incidents, notifies moderators and automatically hides high-severity posts to keep th

OpenAI, Slack, Airtable +1
AI & RAG

This powerful n8n automation workflow is designed to execute advanced B2B lead enrichment and hyper-personalization for cold email outreach. By orchestrating a complex chain of data scraping, AI analy

OpenAI, HTTP Request, Airtable
AI & RAG

This template is perfect for e-commerce entrepreneurs, marketers, agencies, and creative teams who want to turn simple product photos and short descriptions into professional flyers or product videos—

Airtable, OpenAI, HTTP Request +1
AI & RAG

Venafi Presentation - Watch Video

Venafi Tls Protect Cloud, HTTP Request, OpenAI +1
AI & RAG

Automatically detects missed Zoom demos booked via Calendly and triggers AI-powered follow-up sequences.

HTTP Request, OpenAI, Email Send +3