{
  "id": "ABXYhtUzmaF1sbon",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Scrape Unblocker Temp 10",
  "tags": [],
  "nodes": [
    {
      "id": "87a14a6b-7a01-48c6-a378-df1b3b0126eb",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        352,
        -160
      ],
      "parameters": {
        "width": 672,
        "height": 896,
        "content": "## Scrape Unblocker Temp 10\n\n### How it works\n\nThis workflow runs every five hours to monitor expired domain opportunities from ExpiredDomains and GoDaddy Auctions. It scrapes both sources, parses the HTML into domain items, merges the results, and processes each domain one at a time. For each item, it checks Google Sheets to avoid duplicates, saves new domains, sends an email alert, and then continues the loop after a short wait.\n\n### Setup steps\n\n- Configure the schedule trigger interval if five hours is not the desired cadence.\n- Set up Scrape Unblocker credentials or API access for both scraping nodes.\n- Verify the ExpiredDomains and GoDaddy URL values in the Set nodes.\n- Connect Google Sheets credentials and select the spreadsheet/sheet used for existing-domain lookup and new-record insertion.\n- Connect Gmail credentials and configure the recipient, subject, and email body for alerts.\n- Review the custom code parser nodes to ensure they match the current HTML structure of each source site.\n\n### Customization\n\nYou can adjust the source URLs, parsing logic, duplicate-check criteria, wait durations, spreadsheet columns, and email alert content to match the domain metrics and notification style you care about."
      },
      "typeVersion": 1
    },
    {
      "id": "8d29f7cc-bacb-4754-a731-50e0d90b7324",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1072,
        -144
      ],
      "parameters": {
        "color": 7,
        "width": 512,
        "height": 560,
        "content": "## Schedule and URLs\n\nStarts the workflow every five hours and prepares the two source URLs used for scraping expired domain listings."
      },
      "typeVersion": 1
    },
    {
      "id": "7bd86cec-4c3e-472e-9c52-0d5c76f2d20e",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1632,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 288,
        "content": "## Scrape ExpiredDomains\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "832578e2-cad3-4dce-a61f-6f9a87f26a8c",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1616,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 432,
        "height": 336,
        "content": "## Scrape GoDaddy auctions\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "5e30ea6e-7d45-48c9-b56d-5eab331a2d13",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2304,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 272,
        "height": 304,
        "content": "## Combine and iterate\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "40d6357a-6369-4cef-86d9-55a034515ef0",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2608,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 576,
        "height": 480,
        "content": "## Check existing domains\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "c1f06d30-bbae-4b88-9a1e-d9829fcc4913",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3216,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 768,
        "height": 624,
        "content": "## Save and notify\n\nFor new domains, adds a record to Google Sheets, sends an email alert, then waits before returning control to the loop."
      },
      "typeVersion": 1
    },
    {
      "id": "23e442a1-9012-43af-9655-f09821e4c0ba",
      "name": "Every 5 Hours Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        1152,
        112
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 5
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "aa6765bf-7e55-4b4a-a53f-6f5b2a0d1ac6",
      "name": "Scrape ExpiredDomains",
      "type": "n8n-nodes-scrapeunblocker.scrapeUnblocker",
      "notes": "Public listing page (no login). If you have a paid ExpiredDomains.net account, swap this URL for your saved-search export URL \u2014 it will include your keyword/TLD/age filters server-side and give cleaner columns to parse.",
      "position": [
        1680,
        0
      ],
      "parameters": {
        "url": "={{ $json.expireddomains }}",
        "proxy_country": "US"
      },
      "credentials": {},
      "typeVersion": 1
    },
    {
      "id": "50f5a0d8-ab09-4ee1-bcdc-d2eb4d987b2c",
      "name": "Parse ExpiredDomains Data",
      "type": "n8n-nodes-base.code",
      "position": [
        1904,
        16
      ],
      "parameters": {
        "jsCode": "const raw = $input.item.json;\n\nlet html = \"\";\nif (Array.isArray(raw) && typeof raw[0] === \"string\") {\n  html = raw[0];\n} else if (typeof raw === \"string\") {\n  html = raw;\n} else {\n  var vals = Object.values(raw);\n  for (var i = 0; i < vals.length; i++) {\n    if (typeof vals[i] === \"string\" && vals[i].indexOf(\"<html\") > -1) {\n      html = vals[i];\n      break;\n    }\n  }\n}\n\nif (!html) {\n  return [{ json: { error: \"No HTML found\", keys: Object.keys(raw) } }];\n}\n\nvar domainPattern = new RegExp('class=\"field_domain\">\\\\s*<a[^>]+title=\"([^\"]+)\"', \"g\");\n\nvar results = [];\nvar m;\nwhile ((m = domainPattern.exec(html)) !== null) {\n  var full  = m[1].toLowerCase();\n  var parts = full.split(\".\");\n  var name  = parts[0];\n  var tld   = parts.slice(1).join(\".\");\n  results.push({\n    domain:   name,\n    tld:      tld,\n    full:     full,\n    source:   \"expireddomains\",\n    search_url: $('Set ExpiredDomains URL').first().json.expireddomains,\n    found_at: new Date().toISOString()\n  });\n}\n\nif (results.length === 0) {\n  return [{ json: { error: \"No domains parsed. HTML length: \" + html.length } }];\n}\n\nreturn results.map(function(d) { return { json: d }; });"
      },
      "typeVersion": 2
    },
    {
      "id": "d9e2b163-6510-4942-a77e-72a0d05eeebd",
      "name": "Parse GoDaddy Auctions Data",
      "type": "n8n-nodes-base.code",
      "position": [
        1904,
        368
      ],
      "parameters": {
        "jsCode": "const raw = $input.item.json;\n\nlet html = \"\";\nif (Array.isArray(raw) && typeof raw[0] === \"string\") {\n  html = raw[0];\n} else if (typeof raw === \"string\") {\n  html = raw;\n} else {\n  var vals = Object.values(raw);\n  for (var i = 0; i < vals.length; i++) {\n    if (typeof vals[i] === \"string\" && vals[i].indexOf(\"<html\") > -1) {\n      html = vals[i];\n      break;\n    }\n  }\n}\n\nif (!html) {\n  return [{ json: { error: \"No HTML found\", keys: Object.keys(raw) } }];\n}\n\nvar domainPattern = new RegExp('class=\"field_domain\">\\\\s*<a[^>]+title=\"([^\"]+)\"', \"g\");\n\nvar results = [];\nvar m;\nwhile ((m = domainPattern.exec(html)) !== null) {\n  var full  = m[1].toLowerCase();\n  var parts = full.split(\".\");\n  var name  = parts[0];\n  var tld   = parts.slice(1).join(\".\");\n  results.push({\n    domain:   name,\n    tld:      tld,\n    full:     full,\n    source:   \"godaddy_via_expireddomains\",\n    search_url: $('Set GoDaddy URL').first().json.godaddy,\n    found_at: new Date().toISOString()\n  });\n}\n\nif (results.length === 0) {\n  return [{ json: { error: \"No domains parsed. HTML length: \" + html.length } }];\n}\n\nreturn results.map(function(d) { return { json: d }; });"
      },
      "typeVersion": 2
    },
    {
      "id": "4995028e-dcca-402a-94f6-718a95bf4afb",
      "name": "Merge Domain Data Sources",
      "type": "n8n-nodes-base.merge",
      "position": [
        2176,
        96
      ],
      "parameters": {},
      "typeVersion": 3
    },
    {
      "id": "b3a58ae3-c071-4692-bf73-e5059da39596",
      "name": "Email Domain Alert",
      "type": "n8n-nodes-base.gmail",
      "position": [
        3456,
        96
      ],
      "parameters": {
        "sendTo": "user@example.com",
        "message": "==<div style=\"font-family:Arial,sans-serif;font-size:14px;color:#222;max-width:600px\">\n  <h2 style=\"margin:0 0 4px\">\ud83c\udf10 {{ $json.domain }}</h2>\n  <p style=\"margin:0 0 12px;color:#666\">{{ $json.source }} \u00b7 .{{ $json.tld }}</p>\n  <table style=\"border-collapse:collapse;width:100%\">\n    <tr><td style=\"padding:5px 10px;font-weight:bold;background:#f4f4f4;width:140px\">Domain Age</td><td style=\"padding:5px 10px\">{{ $json.domainAgeYears ? $json.domainAgeYears + ' yrs' : 'unknown' }}</td></tr>\n    <tr><td style=\"padding:5px 10px;font-weight:bold;background:#f4f4f4\">Backlinks</td><td style=\"padding:5px 10px\">{{ $json.backlinks ?? 'unknown' }}</td></tr>\n    <tr><td style=\"padding:5px 10px;font-weight:bold;background:#f4f4f4\">Current Bid</td><td style=\"padding:5px 10px\">{{ $json.currentBid || 'n/a' }}</td></tr>\n    <tr><td style=\"padding:5px 10px;font-weight:bold;background:#f4f4f4\">Expiry/Auction</td><td style=\"padding:5px 10px\">{{ $json.expiryOrAuctionDate || 'n/a' }}</td></tr>\n  </table>\n  <p><a href=\"{{ $('Batch Process Domains').item.json.search_url }}\" style=\"color:#0645ad\">View listing \u2192</a></p>\n</div>",
        "options": {},
        "subject": "=\ud83c\udf10 Domain Drop: {{ $json.domain }} ({{ $json.source }})"
      },
      "typeVersion": 2.2
    },
    {
      "id": "7f923e9c-6405-434d-a912-0444328377ab",
      "name": "Scrape GoDaddy Domains",
      "type": "n8n-nodes-scrapeunblocker.scrapeUnblocker",
      "notes": "GoDaddy's auction grid is heavily JS-rendered. If this HTML page returns thin/empty results in an execution, open the real Auctions page in a browser, check the Network tab for the underlying JSON API call it makes, and point this URL at that endpoint instead \u2014 much easier to parse than the rendered HTML.",
      "position": [
        1664,
        368
      ],
      "parameters": {
        "url": "={{ $json.godaddy }}",
        "proxy_country": "US"
      },
      "credentials": {},
      "typeVersion": 1
    },
    {
      "id": "4aa26c54-7c4a-48bc-b968-df2ad5a25b21",
      "name": "Set ExpiredDomains URL",
      "type": "n8n-nodes-base.set",
      "position": [
        1424,
        16
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "cdc08f8f-bd45-4a08-bb6e-569ee972bf98",
              "name": "expireddomains",
              "type": "string",
              "value": "https://www.expireddomains.net/expired-domains/"
            }
          ]
        }
      },
      "executeOnce": false,
      "typeVersion": 3.4
    },
    {
      "id": "e4518f06-0c9a-4897-9613-8d355ce56a46",
      "name": "Set GoDaddy URL",
      "type": "n8n-nodes-base.set",
      "position": [
        1424,
        224
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "825d3677-abad-4464-a316-710bb8e1249a",
              "name": "godaddy",
              "type": "string",
              "value": "https://www.expireddomains.net/godaddy-expired-domains/"
            }
          ]
        }
      },
      "executeOnce": false,
      "typeVersion": 3.4
    },
    {
      "id": "5fa47304-0666-4440-99c7-36a8328e31d7",
      "name": "Batch Process Domains",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        2384,
        96
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "bdd6c04f-dc79-4a86-83c4-66eafba28107",
      "name": "Wait 10 Seconds",
      "type": "n8n-nodes-base.wait",
      "position": [
        3760,
        368
      ],
      "parameters": {
        "amount": 10
      },
      "typeVersion": 1.1
    },
    {
      "id": "dc312eea-b243-4587-86e1-932426d4ee4a",
      "name": "Wait for Domain Check",
      "type": "n8n-nodes-base.wait",
      "position": [
        3040,
        272
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "eee87bca-34e5-47ad-af9b-273eb84f591d",
      "name": "Read Domains from Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2656,
        112
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ $json.full }}",
              "lookupColumn": "full"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 203753909,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1KiRdRARPgXAClVMOSxVV6rvLcnLVUUuOB0LsaPPn9r8/edit#gid=203753909",
          "cachedResultName": "Domains"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1KiRdRARPgXAClVMOSxVV6rvLcnLVUUuOB0LsaPPn9r8",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1KiRdRARPgXAClVMOSxVV6rvLcnLVUUuOB0LsaPPn9r8/edit?usp=drivesdk",
          "cachedResultName": "Domain Monitor"
        }
      },
      "typeVersion": 4.7,
      "alwaysOutputData": true
    },
    {
      "id": "4221364c-5a70-49a1-a62f-89079ea06cd8",
      "name": "If Domain Not in Sheets",
      "type": "n8n-nodes-base.if",
      "position": [
        2864,
        112
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "8d4887f1-f188-4f52-8b75-86ddee9c2386",
              "operator": {
                "type": "string",
                "operation": "notExists",
                "singleValue": true
              },
              "leftValue": "={{ $json.domain }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "443179d6-d2c4-4cc9-bc95-588377ea23c5",
      "name": "Append New Domain to Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3264,
        96
      ],
      "parameters": {
        "columns": {
          "value": {
            "tld": "={{ $('Batch Process Domains').item.json.tld }}",
            "full": "={{ $('Batch Process Domains').item.json.full }}",
            "domain": "={{ $('Batch Process Domains').item.json.domain }}",
            "source": "={{ $('Batch Process Domains').item.json.source }}",
            "found_at": "={{ $('Batch Process Domains').item.json.found_at }}"
          },
          "schema": [
            {
              "id": "domain",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "domain",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "tld",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "tld",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "full",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "full",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "source",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "source",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "found_at",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "found_at",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 203753909,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1KiRdRARPgXAClVMOSxVV6rvLcnLVUUuOB0LsaPPn9r8/edit#gid=203753909",
          "cachedResultName": "Domains"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1KiRdRARPgXAClVMOSxVV6rvLcnLVUUuOB0LsaPPn9r8",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1KiRdRARPgXAClVMOSxVV6rvLcnLVUUuOB0LsaPPn9r8/edit?usp=drivesdk",
          "cachedResultName": "Domain Monitor"
        }
      },
      "typeVersion": 4.5
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "21bc3a53-97b0-4939-a98d-e73497338991",
  "nodeGroups": [],
  "connections": {
    "Set GoDaddy URL": {
      "main": [
        [
          {
            "node": "Scrape GoDaddy Domains",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 10 Seconds": {
      "main": [
        [
          {
            "node": "Batch Process Domains",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Email Domain Alert": {
      "main": [
        [
          {
            "node": "Wait 10 Seconds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Batch Process Domains": {
      "main": [
        [],
        [
          {
            "node": "Read Domains from Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Every 5 Hours Trigger": {
      "main": [
        [
          {
            "node": "Set ExpiredDomains URL",
            "type": "main",
            "index": 0
          },
          {
            "node": "Set GoDaddy URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape ExpiredDomains": {
      "main": [
        [
          {
            "node": "Parse ExpiredDomains Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait for Domain Check": {
      "main": [
        [
          {
            "node": "Batch Process Domains",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape GoDaddy Domains": {
      "main": [
        [
          {
            "node": "Parse GoDaddy Auctions Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set ExpiredDomains URL": {
      "main": [
        [
          {
            "node": "Scrape ExpiredDomains",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If Domain Not in Sheets": {
      "main": [
        [
          {
            "node": "Append New Domain to Sheets",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait for Domain Check",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read Domains from Sheets": {
      "main": [
        [
          {
            "node": "If Domain Not in Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Domain Data Sources": {
      "main": [
        [
          {
            "node": "Batch Process Domains",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse ExpiredDomains Data": {
      "main": [
        [
          {
            "node": "Merge Domain Data Sources",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append New Domain to Sheets": {
      "main": [
        [
          {
            "node": "Email Domain Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse GoDaddy Auctions Data": {
      "main": [
        [
          {
            "node": "Merge Domain Data Sources",
            "type": "main",
            "index": 1
          }
        ]
      ]
    }
  }
}