This workflow corresponds to n8n.io template #16668 — we link there as the canonical source.
This workflow follows the Google Sheets → Informationextractor 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 →
{
"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
}
]
]
}
}
}
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.
googleSheetsOAuth2ApihttpBearerAuthopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow runs on demand to crawl Google SERP pages via Talordata, aggregates organic results and related searches, uses OpenAI to produce a structured AI Search Visibility report with GEO recommendations and a score, and appends or updates the results in Google Sheets.…
Source: https://n8n.io/workflows/16668/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Eliminate 90% of manual work in procurement by automating quote requests, response tracking, price extraction, and supplier follow-ups. This complete automation handles everything from sending persona
Transform your Gmail sent folder into a comprehensive, enriched contact database automatically. This workflow processes hundreds or thousands of sent emails, extracting and enriching contact informati
This n8n workflow automates the complete processing of PDF invoices with AI-powered data extraction. The workflow monitors a Google Drive folder, extracts important invoice data, and automatically org
Who is this for? Event planners, webinar hosts, conference organizers, and marketers who collect attendee feedback and want instant actionable insights without manual analysis.
Author: CSChin Example Source: https://www.ncl.ac.uk/singapore/staff/profile/chengchin.html#publications