{
  "id": "MybO59aMEqQ0acaD",
  "name": "Domain Expired Automated Reminder",
  "tags": [],
  "nodes": [
    {
      "id": "492d0f7b-d236-48c7-8fb9-71d16c85b371",
      "name": "Cron (Daily 08:00)",
      "type": "n8n-nodes-base.cron",
      "position": [
        -1456,
        176
      ],
      "parameters": {
        "triggerTimes": {
          "item": [
            {
              "hour": 8
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "9b136e36-0690-4405-a14c-332f92bd1fca",
      "name": "Google Sheets (Read Domains)",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "Expected columns: domain, expiry_date (YYYY-MM-DD), owner (optional), email (optional), last_notified (optional, YYYY-MM-DD)",
      "position": [
        -1248,
        176
      ],
      "parameters": {
        "options": {},
        "sheetName": "domains",
        "documentId": "PUT_YOUR_GOOGLE_SHEET_ID_HERE"
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4
    },
    {
      "id": "f0b10084-f6f9-4df7-8ce0-c642c37f8d54",
      "name": "IF (Should Notify)",
      "type": "n8n-nodes-base.if",
      "position": [
        432,
        384
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "7a23f9ff-af66-421e-a9ea-da5538fec9cc",
              "operator": {
                "type": "number",
                "operation": "lte"
              },
              "leftValue": "={{ $json.timeDifference.days }}",
              "rightValue": 90
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "d14930f6-4c3c-4c40-9ef6-f8f1b3c1afca",
      "name": "Telegram (Send Reminder)",
      "type": "n8n-nodes-base.telegram",
      "position": [
        768,
        576
      ],
      "parameters": {
        "text": "= \ud83d\udd14 Domain Expiry Reminder\n\\n\\nDomain: {{ $('Information Extractor').item.json.output.domain }}\n\\nExpiry Date: {{ $('Information Extractor').item.json.output.expired_date }}\n\\nOwner: {{ $('Information Extractor').item.json.output.owner }}\n\\nStatus: {{ $('Information Extractor').item.json.output.status }}",
        "chatId": "PUT_YOUR_TELEGRAM_CHAT_ID_HERE",
        "additionalFields": {}
      },
      "typeVersion": 1
    },
    {
      "id": "c8df8d0c-4920-4130-9b76-2766564920f0",
      "name": "Google Sheets (Update last_notified)",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "Updates last_notified based on key=domain",
      "position": [
        768,
        288
      ],
      "parameters": {
        "columns": {
          "value": {},
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "update",
        "sheetName": "domains",
        "documentId": "PUT_YOUR_GOOGLE_SHEET_ID_HERE"
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4
    },
    {
      "id": "cb1ff5dc-ec64-4a8e-94ff-20c3576d5ae6",
      "name": "Ollama Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOllama",
      "position": [
        -368,
        592
      ],
      "parameters": {
        "model": "llama3.1:8b",
        "options": {}
      },
      "credentials": {
        "ollamaApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e504e8cc-7c9b-44dc-9d8b-eb362d07ec4a",
      "name": "Information Extractor",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        -352,
        384
      ],
      "parameters": {
        "text": "={{ $json.data }}",
        "options": {},
        "schemaType": "fromJson",
        "jsonSchemaExample": "{\n\t\"domain\": \"google.com\",\n\t\"owner\": \"google\",\n\t\"status\": \"client transfer prohibited\",\n\t\"expired_date\": \"2010-01-01\"\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "47caa6d0-d2a8-4719-8ee5-cd9852f5dcb3",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2000,
        -128
      ],
      "parameters": {
        "width": 460,
        "height": 688,
        "content": "This workflow automatically monitors domain expiration dates and sends reminders\nvia Telegram when a domain is close to expiring.\n\nIt is designed for individuals or teams managing multiple domains and helps\nprevent missed renewals.\n\n## How it works\n- Runs daily at 08:00 AM\n- Reads domain data from Google Sheets\n- Fetches WHOIS information from whois.com for each domain\n- Extracts the data (expired date, domain owner, status domain) using AI\n- Sends a Telegram reminder if the domain expires within 90 days\n- Records the notification date to avoid duplicate alerts\n\n## Setup steps\n1. Add your Google Sheets ID and ensure the required columns exist\n2. Connect your [Google Sheets credentials](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets)\n3. Connect your [Telegram credentials](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.telegram/chat-operations)\n4. Configure your LLM provider (Ollama or other)\n5. Activate the workflow\n\n\n### Need Help?\nContact me on [LinkedIn](https://www.linkedin.com/in/dwicahyas/)!\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "4df337a2-8653-4851-be30-7b4c5cc259b7",
      "name": "Split In Batches",
      "type": "n8n-nodes-base.splitInBatches",
      "notes": "Avoid rate-limit on messaging nodes",
      "position": [
        -1040,
        176
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "b811ec6e-fa64-4ecf-9dc1-b42d969401b2",
      "name": "Replace Me",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1072,
        416
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "8fb104a2-0815-4ea6-9bbd-2258fca5570d",
      "name": "Get raw data html from whois.com",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -864,
        384
      ],
      "parameters": {
        "url": "=https://whois.com/whois/{{$json.domain}}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "4516c799-7502-4853-8a74-1636daf0541c",
      "name": "Mappings row data",
      "type": "n8n-nodes-base.set",
      "position": [
        208,
        384
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "73f9304e-622e-44f6-815b-df3408c3a108",
              "name": "domain",
              "type": "string",
              "value": "={{ $('Information Extractor').item.json.output.domain }}"
            },
            {
              "id": "88ab14d7-3005-4258-ad64-aaf3c3a01729",
              "name": "owner",
              "type": "string",
              "value": "={{ $('Information Extractor').item.json.output.owner }}"
            },
            {
              "id": "e42af5da-b017-4ecd-935c-f9e9f7306cb8",
              "name": "status",
              "type": "string",
              "value": "={{ $('Information Extractor').item.json.output.status }}"
            },
            {
              "id": "a5304f4a-a13f-43f6-812b-d2cca425e4cc",
              "name": "expired_date",
              "type": "string",
              "value": "={{ $('Information Extractor').item.json.output.expired_date }}"
            },
            {
              "id": "4b3aca2f-da4d-4a06-9f4b-4590af2b695c",
              "name": "day_diff_expired",
              "type": "string",
              "value": "={{ $json.timeDifference.days }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "857d5a5a-10d0-418e-9801-05c911f6ad86",
      "name": "Get Date & Time Diff",
      "type": "n8n-nodes-base.dateTime",
      "position": [
        -32,
        384
      ],
      "parameters": {
        "endDate": "={{ $json.output.expired_date }}",
        "options": {},
        "operation": "getTimeBetweenDates",
        "startDate": "={{$now.format('yyyy-MM-dd')}}"
      },
      "typeVersion": 2
    },
    {
      "id": "2db873dd-6f5a-4471-8ac8-edca4f435a14",
      "name": "Extract HTML",
      "type": "n8n-nodes-base.html",
      "position": [
        -592,
        384
      ],
      "parameters": {
        "options": {},
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "data",
              "cssSelector": ".whois-data"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "b055c729-6374-4f66-b2b5-fa0e0e42f3ac",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1504,
        80
      ],
      "parameters": {
        "color": 7,
        "width": 608,
        "height": 336,
        "content": "## Domain Source & Schedule\nLoads domain data daily from Google Sheets.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "9b9536b2-36b3-4178-beae-d85b2170ff89",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -880,
        288
      ],
      "parameters": {
        "color": 7,
        "width": 800,
        "height": 416,
        "content": "## Fetch & Extract Domain Data\nRetrieves WHOIS data and extracts expiration details using AI.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "07b4a91c-09fb-4ba1-b9b9-8fe953fe2183",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        704,
        192
      ],
      "parameters": {
        "color": 7,
        "width": 544,
        "height": 560,
        "content": "## Notify & Update Records\nSends a Telegram reminder and updates the last notification date."
      },
      "typeVersion": 1
    },
    {
      "id": "6409e12e-0851-4f34-9d16-10fc9d12490e",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        288
      ],
      "parameters": {
        "color": 7,
        "width": 672,
        "height": 272,
        "content": "## Expiration Check\nCalculates remaining days and decides whether a reminder is needed."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "139e80c5-e5b8-4412-a143-1cdcdb5f47a1",
  "connections": {
    "Replace Me": {
      "main": [
        [
          {
            "node": "Split In Batches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract HTML": {
      "main": [
        [
          {
            "node": "Information Extractor",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split In Batches": {
      "main": [
        [
          {
            "node": "Get raw data html from whois.com",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Mappings row data": {
      "main": [
        [
          {
            "node": "IF (Should Notify)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Ollama Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Information Extractor",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Cron (Daily 08:00)": {
      "main": [
        [
          {
            "node": "Google Sheets (Read Domains)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF (Should Notify)": {
      "main": [
        [
          {
            "node": "Google Sheets (Update last_notified)",
            "type": "main",
            "index": 0
          },
          {
            "node": "Telegram (Send Reminder)",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Get Date & Time Diff": {
      "main": [
        [
          {
            "node": "Mappings row data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Information Extractor": {
      "main": [
        [
          {
            "node": "Get Date & Time Diff",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Telegram (Send Reminder)": {
      "main": [
        [
          {
            "node": "Replace Me",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets (Read Domains)": {
      "main": [
        [
          {
            "node": "Split In Batches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get raw data html from whois.com": {
      "main": [
        [
          {
            "node": "Extract HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets (Update last_notified)": {
      "main": [
        [
          {
            "node": "Replace Me",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}