{
  "name": "Scrape URLs from Google Sheets and save as Markdown to Google Drive",
  "nodes": [
    {
      "id": "63d513b3-4054-456f-910b-cd4a765df79a",
      "name": "Sticky Note16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1712,
        -960
      ],
      "parameters": {
        "width": 1024,
        "height": 400,
        "content": "![Logo Growth AI](https://cdn.prod.website-files.com/6825df5b20329ba581df4914/68d413c43f8729fa336568a6_Logo_horizontal.png)"
      }
    },
    {
      "id": "15175f62-b287-4455-94ef-2f08914ff656",
      "name": "Sticky Note17",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1712,
        -528
      ],
      "parameters": {
        "width": 1024,
        "height": 240,
        "content": "## Need more advanced automation solutions? Contact us for custom enterprise workflows!\n\n# Growth-AI.fr\n\n## https://www.linkedin.com/in/allanvaccarizi/\n## https://www.linkedin.com/in/hugo-marinier-%F0"
      }
    },
    {
      "id": "1a314b56-840f-40a1-a148-065c789654cb",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        768,
        -512
      ],
      "parameters": {
        "width": 480,
        "height": 896,
        "content": "## Batch scraping\n\n### How it works\n\n1. The workflow is triggered by a chat message, which kicks off the URL scraping pipeline.\n2. URLs are read from a Google Sheet and filtered to remove any empty or"
      }
    },
    {
      "id": "04d083f5-ce2f-4cf8-b949-6df65b9424dc",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1312,
        -224
      ],
      "parameters": {
        "width": 640,
        "height": 320,
        "content": "## Trigger and fetch URLs\n\nThe workflow starts when a chat message is received. URLs are then read from a Google Sheet and filtered to remove any empty rows before processing."
      }
    },
    {
      "id": "7799c5f1-49a2-4c03-a2df-963ee04d4ea1",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2032,
        -240
      ],
      "parameters": {
        "width": 464,
        "height": 352,
        "content": "## Batch loop and scrape\n\nValid URLs are fed into a batch loop that iterates over each item. Each URL is scraped using Firecrawl, with the loop cycling until all URLs are processed."
      }
    },
    {
      "id": "a301031e-e3a9-4dfa-96db-73c2fd8cdea9",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2576,
        -224
      ],
      "parameters": {
        "width": 688,
        "height": 320,
        "content": "## Process, save, and update status\n\nScraped content is processed and converted to Markdown via a code node, saved as a file in Google Drive, and then the source row in Google Sheets is marked as scra"
      }
    },
    {
      "id": "096b6879-d342-41d0-a9e4-ec7c0e0cc777",
      "name": "When Chat Message Received",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        1360,
        -64
      ]
    },
    {
      "id": "4d20bae7-5cf5-4f44-bb3f-9195c85809f6",
      "name": "Scrape URL with Firecrawl",
      "type": "@mendable/n8n-nodes-firecrawl.firecrawl",
      "position": [
        2352,
        -48
      ]
    },
    {
      "id": "3fa1b84b-2cb4-4184-9e81-be306cb224b0",
      "name": "Read URLs from Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1568,
        -64
      ]
    },
    {
      "id": "799f9382-38a0-409f-8ab7-d499b35a6931",
      "name": "Filter Non-Empty Rows",
      "type": "n8n-nodes-base.filter",
      "position": [
        1808,
        -64
      ]
    },
    {
      "id": "3d34488e-0eaf-4695-89dd-3c1ed61f67bd",
      "name": "Save Markdown to Google Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        2896,
        -64
      ]
    },
    {
      "id": "dbdced1c-ba11-4216-a851-5b3b74c0dd20",
      "name": "Update Scraped Status in Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3120,
        -64
      ]
    },
    {
      "id": "e0833704-4d0a-4afc-90ea-1e8740cdbc0e",
      "name": "Transform Scraped Content",
      "type": "n8n-nodes-base.code",
      "position": [
        2624,
        -64
      ]
    },
    {
      "id": "5c6cc015-69bc-4471-bea7-d6d81097729f",
      "name": "Loop Over URLs",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        2080,
        -64
      ]
    },
    {
      "id": "52c112a0-0e92-4c56-8d24-d8eb6ece74b6",
      "name": "Sticky Note18",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1664,
        208
      ],
      "parameters": {
        "width": 1120,
        "height": 144,
        "content": "# Google Sheets template \n\n## https://docs.google.com/spreadsheets/d/1vgNAV6P3cvBtTUax1rKrhzCLmEBAQu5sgeUxbU5_--0"
      }
    }
  ],
  "connections": {
    "Loop Over URLs": {
      "main": [
        [],
        [
          {
            "node": "Scrape URL with Firecrawl",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Non-Empty Rows": {
      "main": [
        [
          {
            "node": "Loop Over URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read URLs from Sheets": {
      "main": [
        [
          {
            "node": "Filter Non-Empty Rows",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape URL with Firecrawl": {
      "main": [
        [
          {
            "node": "Transform Scraped Content",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Loop Over URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transform Scraped Content": {
      "main": [
        [
          {
            "node": "Save Markdown to Google Drive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When Chat Message Received": {
      "main": [
        [
          {
            "node": "Read URLs from Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save Markdown to Google Drive": {
      "main": [
        [
          {
            "node": "Update Scraped Status in Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Scraped Status in Sheets": {
      "main": [
        [
          {
            "node": "Loop Over URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}