This workflow corresponds to n8n.io template #4861 — we link there as the canonical source.
This workflow follows the Chainllm → 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 →
{
"id": "77EZJT0bcpkDEigw",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Google SERP Tracker + Trends and Recommendations with Bright Data & Google Gemini",
"tags": [
{
"id": "Kujft2FOjmOVQAmJ",
"name": "Engineering",
"createdAt": "2025-04-09T01:31:00.558Z",
"updatedAt": "2025-04-09T01:31:00.558Z"
},
{
"id": "ZOwtAMLepQaGW76t",
"name": "Building Blocks",
"createdAt": "2025-04-13T15:23:40.462Z",
"updatedAt": "2025-04-13T15:23:40.462Z"
},
{
"id": "ddPkw7Hg5dZhQu2w",
"name": "AI",
"createdAt": "2025-04-13T05:38:08.053Z",
"updatedAt": "2025-04-13T05:38:08.053Z"
}
],
"nodes": [
{
"id": "89c87a2f-ee34-47e4-8efd-a4a95d02b052",
"name": "When clicking \u2018Test workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-380,
-160
],
"parameters": {},
"typeVersion": 1
},
{
"id": "44ede7e3-f552-4a70-a538-9d124a4df315",
"name": "Set input fields",
"type": "n8n-nodes-base.set",
"position": [
-120,
-160
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "0ac91db2-9848-40d4-b942-cd7288597ded",
"name": "url",
"type": "string",
"value": "https://www.google.com/search"
},
{
"id": "7142f0df-3c68-4ce0-8e9b-25101db31312",
"name": "webhook_notification_url",
"type": "string",
"value": "https://webhook.site/c9118da2-1c54-460f-a83a-e5131b7098db"
},
{
"id": "f5b7e10d-bcd8-439c-8e84-ba4af11f2cd2",
"name": "search",
"type": "string",
"value": "best crm for the year 2025"
},
{
"id": "3a0bcec2-ec6d-457f-87a5-b73f4d826b2a",
"name": "zone",
"type": "string",
"value": "web_unlocker1"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "adb4eb44-ae8b-4a5e-bab8-afbf5b91e2a2",
"name": "Perform Bright Data Web Request",
"type": "n8n-nodes-base.httpRequest",
"position": [
120,
-160
],
"parameters": {
"url": "https://api.brightdata.com/request",
"method": "POST",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "zone",
"value": "={{ $json.zone }}"
},
{
"name": "url",
"value": "={{ $json.url }}?q={{ encodeURI($json.search) }}"
},
{
"name": "format",
"value": "raw"
}
]
},
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "97f0a53c-81cb-4593-afde-d770547b88d0",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
60,
-440
],
"parameters": {
"color": 5,
"width": 440,
"height": 240,
"content": "## LLM Usages\n\nGoogle Gemini LLM is being utilized for the structured data extraction handling."
},
"typeVersion": 1
},
{
"id": "ca10a555-a4ef-4a2b-8ad1-9abf0e02e2d8",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-380,
-800
],
"parameters": {
"color": 7,
"width": 400,
"height": 340,
"content": "## Logo\n\n\n\n"
},
"typeVersion": 1
},
{
"id": "1ccd35b4-d56a-4c42-88a1-59453a344700",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-380,
-440
],
"parameters": {
"width": 400,
"height": 240,
"content": "## Note\n\nDeals with the Google SERP Tracker by utilizing the Bright Data and Google Gemini LLM for transforming the profile into a structured JSON response.\n\n**Please make sure to set the input fields node with the filtering criteria, Bright Data zone name, Webhook notification URL**\n\nTest Webhook using - https://webhook.site/\n"
},
"typeVersion": 1
},
{
"id": "f9b7f382-4a5a-4ddf-a62c-ee83af913a21",
"name": "Google Search Data Extractor",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
340,
-160
],
"parameters": {
"text": "=Extract the following:\n\nRank (position in list)\n\nTitle\n\nURL\n\nSnippet/description\n\nType (organic/ads/map)\n\n{{ $json.data }}\n\nMake sure to return the data in JSON",
"batching": {},
"promptType": "define",
"hasOutputParser": true
},
"retryOnFail": true,
"typeVersion": 1.7
},
{
"id": "f10a9a84-3e4c-4ac0-957e-7fc7308c9fda",
"name": "Code",
"type": "n8n-nodes-base.code",
"position": [
700,
-160
],
"parameters": {
"jsCode": "return $input.first().json.output.results"
},
"typeVersion": 2
},
{
"id": "d3621752-4837-4e6f-82af-953e98901b24",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
920,
-160
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "2f607774-34cf-4b0e-9384-f7214e0896e5",
"name": "Trends Data Extractor",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
1180,
-140
],
"parameters": {
"text": "=Extract the trends based on the title and spippet:\n\nTitle : {{ $json.title }}\nSnippet : {{ $json.snippet }}\n\nMake sure to return the data in JSON",
"batching": {},
"promptType": "define",
"hasOutputParser": true
},
"retryOnFail": true,
"typeVersion": 1.7
},
{
"id": "551b645b-99d7-4824-ad69-290ea8105689",
"name": "Google Gemini Chat Model for Google Search",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
340,
20
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.0-flash-exp"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "9bd32bc8-9452-4e6a-ac54-e3a1317d196e",
"name": "Structured Output Parser for Google Search",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
520,
20
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n \"$schema\": \"http://json-schema.org/schema#\",\n \"title\": \"Search Results Schema\",\n \"type\": \"object\",\n \"properties\": {\n \"results\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\"rank\", \"title\", \"type\"],\n \"properties\": {\n \"rank\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n \"snippet\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\"organic\", \"paid\", \"featured\"]\n }\n },\n \"additionalProperties\": false\n }\n }\n },\n \"required\": [\"results\"],\n \"additionalProperties\": false\n}\n"
},
"typeVersion": 1.2
},
{
"id": "06d01c21-4054-4879-a060-70c1a1bac559",
"name": "Google Gemini Chat Model for Trend Data",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
1180,
40
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.0-flash-exp"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "7c89ac87-28b1-47f3-9f04-b2c05b1a483a",
"name": "Recommendation Data Extractor",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
1180,
-560
],
"parameters": {
"text": "=Provide recommendations based on the title and spippet:\n\nTitle : {{ $json.title }}\nSnippet : {{ $json.snippet }}\n\nMake sure to return the data in JSON",
"batching": {},
"promptType": "define",
"hasOutputParser": true
},
"retryOnFail": true,
"typeVersion": 1.7
},
{
"id": "f1f9cfac-28d0-40a9-9287-b11689570b53",
"name": "Google Gemini Chat Model for Recommendation",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
1180,
-380
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.0-flash-exp"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "c008d472-0982-4970-a017-73784c6916e7",
"name": "Structured Output Parser for Recommendation",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1360,
-380
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"title\": \"CRM Recommendations Schema\",\n \"type\": \"object\",\n \"properties\": {\n \"recommendations\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\"Software\", \"Action\", \"Consideration\", \"Research\", \"Focus\"],\n \"description\": \"The category or nature of the recommendation\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"The name\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"Explanation or reason behind the recommendation\"\n },\n \"reason\": {\n \"type\": \"string\",\n \"description\": \"A detailed reason for recommendation (mainly used for Software type)\"\n }\n }\n }\n }\n },\n \"required\": [\"recommendations\"]\n}\n"
},
"typeVersion": 1.2
},
{
"id": "113b9477-cb62-47b9-8f43-f49247c7053d",
"name": "Structured Output Parser for Trend Data",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1360,
40
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n \"$schema\": \"https://json-schema.org/schema\",\n \"title\": \"Trends Schema\",\n \"type\": \"object\",\n \"properties\": {\n \"trends\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"trend\": {\n \"type\": \"string\",\n \"description\": \"The name or label of the CRM trend\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"A short explanation of the trend\"\n }\n },\n \"required\": [\"trend\", \"description\"],\n \"additionalProperties\": false\n }\n }\n },\n \"required\": [\"trends\"],\n \"additionalProperties\": false\n}\n"
},
"typeVersion": 1.2
},
{
"id": "6b6bb9f4-2836-469d-b81b-90cddf5d0d6c",
"name": "Code for Recommendations",
"type": "n8n-nodes-base.code",
"position": [
1580,
-560
],
"parameters": {
"jsCode": "return $input.first().json.output.recommendations"
},
"typeVersion": 2
},
{
"id": "cb71a4e9-55ff-4194-8e5c-be96f3971a4e",
"name": "Code for Trends",
"type": "n8n-nodes-base.code",
"position": [
1600,
-140
],
"parameters": {
"jsCode": "return $input.first().json.output.trends"
},
"typeVersion": 2
},
{
"id": "bfdac6af-7fa9-42d9-8931-029291202a35",
"name": "Convert to File for Trends",
"type": "n8n-nodes-base.convertToFile",
"position": [
1840,
-140
],
"parameters": {
"options": {}
},
"typeVersion": 1.1
},
{
"id": "28d26067-622b-4115-ab25-79bf8802acdd",
"name": "Convert to File for Recommendations",
"type": "n8n-nodes-base.convertToFile",
"position": [
1820,
-560
],
"parameters": {
"options": {}
},
"typeVersion": 1.1
},
{
"id": "0fb2daca-d998-432e-901a-001f750822db",
"name": "Write the trends csv file to disk",
"type": "n8n-nodes-base.readWriteFile",
"position": [
2080,
-140
],
"parameters": {
"options": {},
"fileName": "=d:\\Google_SERP_Trends_Response_{{ new Date().toISOString().replace(/[:.]/g, '-')}}.csv",
"operation": "write"
},
"typeVersion": 1
},
{
"id": "b0164de9-50a4-4aba-a680-a392eaba5765",
"name": "Write the recommendations csv file to disk",
"type": "n8n-nodes-base.readWriteFile",
"position": [
2060,
-560
],
"parameters": {
"options": {},
"fileName": "=d:\\Google_SERP_Recommendations_Response_{{ new Date().toISOString().replace(/[:.]/g, '-')}}.csv",
"operation": "write"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "7842a7f6-ab16-42c6-a209-1f313ed15376",
"connections": {
"Code": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Code for Trends": {
"main": [
[
{
"node": "Convert to File for Trends",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "Trends Data Extractor",
"type": "main",
"index": 0
},
{
"node": "Recommendation Data Extractor",
"type": "main",
"index": 0
}
]
]
},
"Set input fields": {
"main": [
[
{
"node": "Perform Bright Data Web Request",
"type": "main",
"index": 0
}
]
]
},
"Trends Data Extractor": {
"main": [
[
{
"node": "Code for Trends",
"type": "main",
"index": 0
}
]
]
},
"Code for Recommendations": {
"main": [
[
{
"node": "Convert to File for Recommendations",
"type": "main",
"index": 0
}
]
]
},
"Convert to File for Trends": {
"main": [
[
{
"node": "Write the trends csv file to disk",
"type": "main",
"index": 0
}
]
]
},
"Google Search Data Extractor": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"Recommendation Data Extractor": {
"main": [
[
{
"node": "Code for Recommendations",
"type": "main",
"index": 0
}
]
]
},
"Perform Bright Data Web Request": {
"main": [
[
{
"node": "Google Search Data Extractor",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Test workflow\u2019": {
"main": [
[
{
"node": "Set input fields",
"type": "main",
"index": 0
}
]
]
},
"Write the trends csv file to disk": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Convert to File for Recommendations": {
"main": [
[
{
"node": "Write the recommendations csv file to disk",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model for Trend Data": {
"ai_languageModel": [
[
{
"node": "Trends Data Extractor",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser for Trend Data": {
"ai_outputParser": [
[
{
"node": "Trends Data Extractor",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Google Gemini Chat Model for Google Search": {
"ai_languageModel": [
[
{
"node": "Google Search Data Extractor",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser for Google Search": {
"ai_outputParser": [
[
{
"node": "Google Search Data Extractor",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Google Gemini Chat Model for Recommendation": {
"ai_languageModel": [
[
{
"node": "Recommendation Data Extractor",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser for Recommendation": {
"ai_outputParser": [
[
{
"node": "Recommendation Data Extractor",
"type": "ai_outputParser",
"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.
googlePalmApihttpHeaderAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Google SERP Tracker + Trends and Recommendations is an AI-powered n8n workflow that extracts Google search results via Bright Data, parses them into structured JSON using Google Gemini, and generates actionable recommendations and search trends. It outputs CSV reports and sends…
Source: https://n8n.io/workflows/4861/ — 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.
Community nodes can only be installed on self-hosted instances of n8n.
Community nodes can only be installed on self-hosted instances of n8n.
Community nodes can only be installed on self-hosted instances of n8n.
Community nodes can only be installed on self-hosted instances of n8n.
Content - Newsletter Agent. Uses formTrigger, chainLlm, outputParserStructured, httpRequest. Event-driven trigger; 87 nodes.