{
  "id": "Ken6Jc3jXJ4shTDrjxINh",
  "name": "Monitor AI search visibility with TalorData SERP, OpenAI and Google Sheets",
  "tags": [
    {
      "id": "dioZtMp7x1t8Sh2n",
      "name": "SERP",
      "createdAt": "2026-06-24T04:27:03.407Z",
      "updatedAt": "2026-06-24T04:27:03.407Z"
    },
    {
      "id": "ycHMzRoq571PWbuW",
      "name": "MCP",
      "createdAt": "2026-06-24T04:27:06.581Z",
      "updatedAt": "2026-06-24T04:27:06.581Z"
    },
    {
      "id": "PjhYCZhQNMh3UoOa",
      "name": "AI Visibility",
      "createdAt": "2026-06-27T01:48:28.977Z",
      "updatedAt": "2026-06-27T01:48:28.977Z"
    }
  ],
  "nodes": [
    {
      "id": "9da24366-87a4-4304-a88f-2d7977d789f3",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        928,
        -80
      ],
      "parameters": {
        "width": 480,
        "height": 784,
        "content": "## Monitoring AI Search Visibility with TalorData\n\n### How it works\n\nThis workflow manually runs a TalorData AI search visibility check for a configured query and search engine. It fetches the initial TalorData response, builds a list of result pages to inspect, loops through each page, extracts organic results and related searches, then uses an OpenAI-powered information extractor to structure visibility insights. The final aggregated SERP and AI extraction data is appended or updated in Google Sheets, then the loop continues until all pages are processed.\n\n### Setup steps\n\n- Configure the TalorData MCP Client credentials/server connection for both MCP client nodes.\n- Set the input fields node with the target query, search engine, and initial page value.\n- Configure OpenAI credentials and model settings for the OpenAI Chat Model used by the Structured AI Information Extractor.\n- Connect Google Sheets credentials and select the destination spreadsheet, sheet, key column, and field mappings for append/update behavior.\n- Review the custom Code nodes to ensure they match the TalorData response shape returned by your selected engine.\n\n### Customization\n\nAdjust the query, engine, and page range to monitor different search surfaces. You can also customize the AI extraction schema/prompt, the organic and related-search parsing logic, and the Google Sheets columns used for reporting."
      },
      "typeVersion": 1
    },
    {
      "id": "a9e1f1cd-14c8-41d9-ac56-cbf161f65fd7",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1440,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 640,
        "height": 752,
        "content": "## Manual query setup\n\nStarts the workflow manually, defines the search parameters, and sends the initial request to TalorData."
      },
      "typeVersion": 1
    },
    {
      "id": "8fb8a2d1-9363-4a3e-a0de-e0bbf8b19671",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2112,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 752,
        "content": "## Prepare page queue\n\nExtracts available pages from the first TalorData response, builds the current page item, and merges them into a single page list for processing."
      },
      "typeVersion": 1
    },
    {
      "id": "0f923cfc-69cd-4ea4-9004-356c3909a489",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2560,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 752,
        "content": "## Loop page requests\n\nIterates over each page item and requests the corresponding SERP data from TalorData inside the loop."
      },
      "typeVersion": 1
    },
    {
      "id": "d71a6edf-db50-4b05-86b0-d8cf580083d0",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3008,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 752,
        "content": "## Parse SERP response\n\nSplits each TalorData page response into organic results, related searches, and preserved raw response fields, then merges those parsed outputs together."
      },
      "typeVersion": 1
    },
    {
      "id": "693886c9-0002-4a25-aced-3563a3883553",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3456,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 768,
        "height": 768,
        "content": "## AI visibility extraction\n\nAggregates the parsed SERP response and runs an OpenAI-backed structured information extraction step, then formats the AI output as JSON."
      },
      "typeVersion": 1
    },
    {
      "id": "f9cd4259-6b2b-4ffa-a135-bca0e969abbc",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4256,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 768,
        "content": "## Combine final record\n\nMerges the original aggregated SERP data with the formatted AI extraction and aggregates it into the final record structure."
      },
      "typeVersion": 1
    },
    {
      "id": "35ad4a01-1963-4758-b621-1a9e7395faf8",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4704,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 384,
        "height": 768,
        "content": "## Save sheet results\n\nWrites the completed monitoring result to Google Sheets using append-or-update behavior, then routes control back to the loop for the next page item."
      },
      "typeVersion": 1
    },
    {
      "id": "98e06724-d937-4449-8fe6-daf296506043",
      "name": "Initialize Talordata Client",
      "type": "@n8n/n8n-nodes-langchain.mcpClient",
      "position": [
        1936,
        448
      ],
      "parameters": {
        "tool": {
          "__rl": true,
          "mode": "list",
          "value": "search",
          "cachedResultName": "search"
        },
        "options": {},
        "inputMode": "json",
        "jsonInput": "={\n  \"engine\": {{ $json.engine }},\n  \"q\": {{ $json.query }},\n  \"ai_overview\":true,\n  \"start\": {{ $json.page_init }}\n}\n ",
        "endpointUrl": "https://mcp.talordata.net/mcp",
        "authentication": "bearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "586325e4-bfc6-4104-af89-79692fe80dfc",
      "name": "Manual Execution Trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        1488,
        448
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "893b741b-1ade-495a-80de-ea31c92a4796",
      "name": "Set Query Inputs",
      "type": "n8n-nodes-base.set",
      "position": [
        1712,
        448
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "6d89c363-6909-40a3-814e-214ee1ce6343",
              "name": "query",
              "type": "string",
              "value": "Talordata"
            },
            {
              "id": "4b980b9f-3328-4fe9-9dcd-fb1fd76f2240",
              "name": "engine",
              "type": "string",
              "value": "google"
            },
            {
              "id": "3df91753-8429-47e5-a889-38acffe7788e",
              "name": "page_init",
              "type": "number",
              "value": 1
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "33aacc89-fd14-49aa-9f58-2c62684a2ebe",
      "name": "Extract Pagination Data",
      "type": "n8n-nodes-base.code",
      "position": [
        2160,
        352
      ],
      "parameters": {
        "jsCode": "const pagination = $input.first().json.content?.[0]?.text?.data?.data?.pagination;\n\nreturn pagination?.pages ?? [];"
      },
      "typeVersion": 2
    },
    {
      "id": "51a3092f-f295-40a8-ab74-27b6d1879f0a",
      "name": "Batch Process Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        2608,
        448
      ],
      "parameters": {
        "options": {
          "reset": false
        }
      },
      "typeVersion": 3
    },
    {
      "id": "a53558dc-d8c7-4b0e-91b1-89d736a3142f",
      "name": "Execute Talordata Client Batch",
      "type": "@n8n/n8n-nodes-langchain.mcpClient",
      "position": [
        2832,
        272
      ],
      "parameters": {
        "tool": {
          "__rl": true,
          "mode": "list",
          "value": "search",
          "cachedResultName": "search"
        },
        "options": {},
        "inputMode": "json",
        "jsonInput": "={\n  \"q\": {{ $('Initialize Talordata Client').item.json.content[0].text.request.q }},\n  \"engine\": {{ $('Initialize Talordata Client').item.json.content[0].text.request.engine }},\n  \"start\": {{ $json.page }}\n}\n ",
        "endpointUrl": "https://mcp.talordata.net/mcp",
        "authentication": "bearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "6597d735-c611-4740-8260-487d7d8ea63f",
      "name": "Build Current Page Data",
      "type": "n8n-nodes-base.code",
      "position": [
        2160,
        544
      ],
      "parameters": {
        "jsCode": "return [{\n  \"link\": $input.first().json.content[0].text.data.data.pagination.next_page_link,\n  \"page\": 1,\n  \"start\": 0\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "c4a38cf6-289a-4312-a9e6-a9c77a563376",
      "name": "Combine Page Data",
      "type": "n8n-nodes-base.merge",
      "position": [
        2384,
        448
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "e833d501-4b1e-4c90-ab13-1846262e0e27",
      "name": "Parse Organic Search Results",
      "type": "n8n-nodes-base.code",
      "position": [
        3056,
        480
      ],
      "parameters": {
        "jsCode": "const serp = $input.first().json.content[0].text.data.data.organic;\n\nconst formatted_response = serp.map(r => ({\n\n    position:r.position,\n\n    title:r.title,\n\n    domain:r.source,\n\n    url:r.link,\n\n    snippet:r.description,\n\n    date:r.date ?? null\n\n}));\n\nreturn formatted_response;"
      },
      "typeVersion": 2
    },
    {
      "id": "fbe0644d-3b7e-4778-8ad6-bd5aabf92722",
      "name": "Parse Related Search Queries",
      "type": "n8n-nodes-base.code",
      "position": [
        3056,
        288
      ],
      "parameters": {
        "jsCode": "const serp = $input.first().json.content[0].text.data.data;\n\nconst formatted_response =\nserp.related.map(r=>({\n\n    keyword:r.text,\n\n    keyword_url:r.link\n\n}));\n\nreturn formatted_response;"
      },
      "typeVersion": 2
    },
    {
      "id": "f9de92ce-5e1d-4a8d-bdea-a1723049b4cd",
      "name": "Merge SERP Data",
      "type": "n8n-nodes-base.merge",
      "position": [
        3280,
        272
      ],
      "parameters": {
        "numberInputs": 3
      },
      "typeVersion": 3.2
    },
    {
      "id": "f70ca8f9-e29a-4e76-9a92-f58f2502ddb4",
      "name": "Aggregate SERP Output",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        3504,
        288
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    },
    {
      "id": "9692d3c1-f8e3-414b-bece-94e3ec35129d",
      "name": "OpenAI GPT-4 Mini Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        3808,
        384
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "93a68672-dbb2-4e01-9db6-2e0ac1cfc1ab",
      "name": "AI Information Extractor",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        3728,
        160
      ],
      "parameters": {
        "text": "=You are an AI Search Visibility Analyst and Generative Engine Optimization (GEO) expert.\n\nAnalyze the following TalorData SERP results and generate an AI Search Visibility report.\n\nThe SERP Results are:\n\n{{ $json.toJsonString() }}\n\n--------------------------------------------------\n\nTASKS\n\n--------------------------------------------------\n\n1. Summarize the search visibility of the monitored brand.\n\n2. Determine whether the monitored brand owns the highest ranking organic result.\n\n3. Calculate\n\n- Average Organic Position\n- Number of Top 3 Rankings\n- Number of Top 10 Rankings\n- Brand Owned Results\n- Third Party Mentions\n\n4. Identify every domain appearing in the search results.\n\nSeparate them into\n\n- Official Website\n- Review Sites\n- Documentation\n- Community\n- Forums\n- Blogs\n- News\n\n5. Analyze the search snippets.\n\nIdentify\n\n- Main products mentioned\n- Services mentioned\n- Technologies mentioned\n- Search intent\n- Common themes\n\n6. Determine whether there are opportunities for improving AI Search visibility.\n\nExamples\n\n- Missing FAQs\n- Missing comparison pages\n- Missing tutorials\n- Missing documentation\n- Missing use cases\n- Missing integrations\n- Missing developer content\n\n7. Generate GEO recommendations.\n\nPrioritize recommendations from highest impact to lowest.\n\nExamples\n\n- Create FAQ pages\n- Publish comparison pages\n- Add Schema.org markup\n- Improve topical authority\n- Expand documentation\n- Publish AI-focused content\n\n8. Calculate an AI Search Visibility Score.\n\nScoring\n\nOrganic Ranking ............ 40\n\nBrand Presence ............. 20\n\nContent Relevance .......... 15\n\nAuthority Signals .......... 15\n\nSERP Feature Coverage ...... 10\n\nTotal = 100\n\nReturn\n\nScore\n\nRating\n\nExcellent\nGood\nModerate\nPoor\n\n9. Generate an Executive Summary suitable for a dashboard.",
        "options": {},
        "schemaType": "manual",
        "inputSchema": "{\n  \"visibility_score\": {\n    \"score\": 0,\n    \"rating\": \"\"\n  },\n  \"summary\": \"\",\n  \"organic_visibility\": {\n    \"average_position\": 0,\n    \"top3_results\": 0,\n    \"top10_results\": 0,\n    \"brand_owned_results\": 0\n  },\n  \"brand_analysis\": {\n    \"official_domain\": \"\",\n    \"highest_rank\": 0,\n    \"third_party_mentions\": []\n  },\n  \"domain_analysis\": {\n    \"official\": [],\n    \"reviews\": [],\n    \"community\": [],\n    \"blogs\": [],\n    \"documentation\": [],\n    \"news\": []\n  },\n  \"content_analysis\": {\n    \"products\": [],\n    \"services\": [],\n    \"technologies\": [],\n    \"search_intent\": \"\",\n    \"themes\": []\n  },\n  \"opportunities\": [\n  ],\n  \"recommendations\": [\n  ],\n  \"executive_summary\": \"\"\n}"
      },
      "retryOnFail": true,
      "typeVersion": 1.2
    },
    {
      "id": "9ff30967-3792-47e1-b4df-10f9d1f8e6c0",
      "name": "Format JSON Response",
      "type": "n8n-nodes-base.code",
      "position": [
        4080,
        160
      ],
      "parameters": {
        "jsCode": "const response = $input.first().json.output[0].text || \"\";\n\n// Find the first JSON object\nconst start = response.indexOf(\"{\");\nconst end = response.lastIndexOf(\"}\");\n\nif (start === -1 || end === -1) {\n  throw new Error(\"No JSON object found in AI response.\");\n}\n\nconst jsonString = response.substring(start, end + 1);\n\n return [\n    {\n      json: JSON.parse(jsonString)\n    }\n  ];"
      },
      "typeVersion": 2
    },
    {
      "id": "f60f8068-39fd-4f1f-9733-3eb9c9975e80",
      "name": "Sync Data with Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        4784,
        464
      ],
      "parameters": {
        "columns": {
          "value": {
            "link": "={{ $json.data[1].data[0].link }}",
            "ai_visibility_response": "={{ $json.data[0].toJsonString() }}"
          },
          "schema": [
            {
              "id": "link",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "ai_visibility_response",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "ai_visibility_response",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "link"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ryMSBXHUZWAYIrlzdY54h8pq4baa7RlVBkff3k5L2NI/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1ryMSBXHUZWAYIrlzdY54h8pq4baa7RlVBkff3k5L2NI",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ryMSBXHUZWAYIrlzdY54h8pq4baa7RlVBkff3k5L2NI/edit?usp=drivesdk",
          "cachedResultName": "Talordata AI Visibility"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "813f9b99-c05f-4605-bf6d-8e4d2f1b453a",
      "name": "Set Talordata Response Data",
      "type": "n8n-nodes-base.set",
      "position": [
        3056,
        96
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "94fbc5ec-a812-4068-a218-f5fa10fdb6d7",
              "name": "talordata_response",
              "type": "array",
              "value": "={{ $json.content }}"
            },
            {
              "id": "58dc8f09-082a-43c4-abb0-bf0c9e41f498",
              "name": "link",
              "type": "string",
              "value": "={{ $('Batch Process Items').item.json.link }}"
            },
            {
              "id": "3b29f23f-ca43-4b03-b398-6a95e0384aa4",
              "name": "page",
              "type": "number",
              "value": "={{ $('Batch Process Items').item.json.page }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "2b8d0787-978c-44a4-9ab0-5cec9fdd9ef0",
      "name": "Finalize SERP Data Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        4288,
        288
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "f67273b2-dcce-46b0-8371-9fe0c6ec4300",
      "name": "Compile Final SERP Output",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        4512,
        288
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "82c4b82b-688b-4e72-ae85-d2d7ffae0352",
  "connections": {
    "Merge SERP Data": {
      "main": [
        [
          {
            "node": "Aggregate SERP Output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Query Inputs": {
      "main": [
        [
          {
            "node": "Initialize Talordata Client",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Combine Page Data": {
      "main": [
        [
          {
            "node": "Batch Process Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Batch Process Items": {
      "main": [
        [],
        [
          {
            "node": "Execute Talordata Client Batch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format JSON Response": {
      "main": [
        [
          {
            "node": "Finalize SERP Data Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate SERP Output": {
      "main": [
        [
          {
            "node": "AI Information Extractor",
            "type": "main",
            "index": 0
          },
          {
            "node": "Finalize SERP Data Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Build Current Page Data": {
      "main": [
        [
          {
            "node": "Combine Page Data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Extract Pagination Data": {
      "main": [
        [
          {
            "node": "Combine Page Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI GPT-4 Mini Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Information Extractor",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "AI Information Extractor": {
      "main": [
        [
          {
            "node": "Format JSON Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Finalize SERP Data Merge": {
      "main": [
        [
          {
            "node": "Compile Final SERP Output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manual Execution Trigger": {
      "main": [
        [
          {
            "node": "Set Query Inputs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compile Final SERP Output": {
      "main": [
        [
          {
            "node": "Sync Data with Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Initialize Talordata Client": {
      "main": [
        [
          {
            "node": "Build Current Page Data",
            "type": "main",
            "index": 0
          },
          {
            "node": "Extract Pagination Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Talordata Response Data": {
      "main": [
        [
          {
            "node": "Merge SERP Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Organic Search Results": {
      "main": [
        [
          {
            "node": "Merge SERP Data",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Parse Related Search Queries": {
      "main": [
        [
          {
            "node": "Merge SERP Data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Sync Data with Google Sheets": {
      "main": [
        [
          {
            "node": "Batch Process Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Execute Talordata Client Batch": {
      "main": [
        [
          {
            "node": "Parse Organic Search Results",
            "type": "main",
            "index": 0
          },
          {
            "node": "Parse Related Search Queries",
            "type": "main",
            "index": 0
          },
          {
            "node": "Set Talordata Response Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}