{
  "name": "Track Google rankings daily with Decodo and Google Sheets",
  "nodes": [
    {
      "id": "sched_1",
      "name": "Schedule Run",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        240,
        192
      ]
    },
    {
      "id": "set_input_1",
      "name": "Input Defaults",
      "type": "n8n-nodes-base.set",
      "position": [
        448,
        192
      ]
    },
    {
      "id": "http_decodo_1",
      "name": "Fetch Google SERP",
      "type": "@decodo/n8n-nodes-decodo.decodo",
      "position": [
        688,
        192
      ]
    },
    {
      "id": "if_has_results_1",
      "name": "Check Results",
      "type": "n8n-nodes-base.if",
      "position": [
        960,
        192
      ]
    },
    {
      "id": "split_out_1",
      "name": "Split Payload Results",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1200,
        176
      ]
    },
    {
      "id": "set_norm_1",
      "name": "Map Result Row",
      "type": "n8n-nodes-base.set",
      "position": [
        1920,
        176
      ]
    },
    {
      "id": "if_valid_row_1",
      "name": "Check Row Valid",
      "type": "n8n-nodes-base.if",
      "position": [
        2160,
        176
      ]
    },
    {
      "id": "gs_success_1",
      "name": "Save SERP Results",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2448,
        160
      ]
    },
    {
      "id": "set_err_no_results_1",
      "name": "Build Empty Error",
      "type": "n8n-nodes-base.set",
      "position": [
        2448,
        320
      ]
    },
    {
      "id": "set_err_bad_item_1",
      "name": "Build Row Error",
      "type": "n8n-nodes-base.set",
      "position": [
        2672,
        208
      ]
    },
    {
      "id": "gs_error_1",
      "name": "Save SERP Errors",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2848,
        320
      ]
    },
    {
      "id": "extract_organic_1",
      "name": "Extract Organic List",
      "type": "n8n-nodes-base.set",
      "position": [
        1440,
        176
      ]
    },
    {
      "id": "split_organic_1",
      "name": "Split Organic Items",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1680,
        176
      ]
    },
    {
      "id": "a747d799-124f-4c76-a0cc-53c05ef39d91",
      "name": "Flow Summary",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -368,
        -288
      ],
      "parameters": {
        "width": 500,
        "height": 750,
        "content": "## Daily SERP monitor: capture top search results\n\n### How it works\n1. Runs on a daily schedule and loads the configured keyword, country, language, device, and top_n.\n2. Calls Decodo to perform a Goo"
      }
    },
    {
      "id": "24fc6079-d7de-404b-bfd6-4cf252d67266",
      "name": "Results Mapping Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2320,
        16
      ],
      "parameters": {
        "width": 748,
        "height": 444,
        "content": "## Store Results & Log Errors\nKeeps only valid top-ranked rows and appends them to the results sheet. If there are no results or a row is missing key fields, it writes an error entry to the errors she"
      }
    },
    {
      "id": "86f89d19-935b-4f42-99d8-1232d668a2af",
      "name": "Error Mapping Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        176,
        16
      ],
      "parameters": {
        "width": 700,
        "height": 444,
        "content": "## Schedule & Search Setup\nRuns daily and defines thesearch and scrape with decodo"
      }
    },
    {
      "id": "1b4a86e5-b42c-4c26-a498-a1a987093699",
      "name": "Input Example Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        896,
        16
      ],
      "parameters": {
        "width": 1404,
        "height": 444,
        "content": "## Parse & Filter Top Results\nBreaks the response into items, extracts organic listings, maps fields, and keeps only valid rows within the top-N ranks."
      }
    }
  ],
  "connections": {
    "Schedule Run": {
      "main": [
        [
          {
            "node": "Input Defaults",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Results": {
      "main": [
        [
          {
            "node": "Split Payload Results",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Build Empty Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Input Defaults": {
      "main": [
        [
          {
            "node": "Fetch Google SERP",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Map Result Row": {
      "main": [
        [
          {
            "node": "Check Row Valid",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Row Error": {
      "main": [
        [
          {
            "node": "Save SERP Errors",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Row Valid": {
      "main": [
        [
          {
            "node": "Save SERP Results",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Build Row Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Empty Error": {
      "main": [
        [
          {
            "node": "Save SERP Errors",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Google SERP": {
      "main": [
        [
          {
            "node": "Check Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Organic Items": {
      "main": [
        [
          {
            "node": "Map Result Row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Organic List": {
      "main": [
        [
          {
            "node": "Split Organic Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Payload Results": {
      "main": [
        [
          {
            "node": "Extract Organic List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}