{
  "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![logo](https://images.seeklogo.com/logo-png/43/1/brightdata-logo-png_seeklogo-439974.png)\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
          }
        ]
      ]
    }
  }
}