AutomationFlowsData & Sheets › Extract and Merge Page Data to Google Sheets

Extract and Merge Page Data to Google Sheets

Original n8n title: Splitout Code (http Request) #7

Splitout Code. Uses manualTrigger, stickyNote, scheduleTrigger, httpRequest. Event-driven trigger; 13 nodes.

Event trigger★★★★☆ complexity13 nodesHTTP RequestGoogle Sheets
Data & Sheets Trigger: Event Nodes: 13 Complexity: ★★★★☆ Added:

This workflow follows the Google Sheets → HTTP Request recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "ff5634c3-349b-4181-a03a-97b310e5232b",
      "name": "When clicking \u2018Test workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        120,
        60
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "66e204fb-3e00-45e0-b1b2-341836476b95",
      "name": "Extract page_info ",
      "type": "n8n-nodes-base.code",
      "position": [
        900,
        120
      ],
      "parameters": {
        "jsCode": "function parseNextParams(headerValue) {\n    // Match the URL inside <>\n    const urlMatch = headerValue.match(/<([^>]+)>;\\s*rel=\"next\"/);\n    if (!urlMatch) return null;\n\n    const url = urlMatch[1]; // Extracted URL\n    const paramsString = url.split(\"?\")[1]; // Get query string\n\n    if (!paramsString) return {}; // No params found\n\n    // Convert query string to object\n    return paramsString.split(\"&\").reduce((acc, param) => {\n        const [key, value] = param.split(\"=\");\n        acc[decodeURIComponent(key)] = decodeURIComponent(value);\n        return acc;\n    }, {});\n}\n\n/* Example usage\n`<https://59b774-3.myshopify.com/admin/api/2025-01/orders.json?limit=250&fields=id%2Cnote%2Cemail%2Cprocessed_at%2Ccustomer&page_info=eyJzdGF0dXMiOiJhbnkiLCJsYXN0X2lkIjo2MzQ5MjI3MDAwMDk0LCJsYXN0X3ZhbHVlIjoiMjAyNC0xMi0zMSAwOToxMzowMi42MTcxNjYiLCJkaXJlY3Rpb24iOiJuZXh0In0>; rel=\"next\"`\n*/\nconst headerValue = $input.first().json.headers.link;\nconst params = parseNextParams(headerValue);\nreturn params;"
      },
      "typeVersion": 2
    },
    {
      "id": "5b0086ce-f09b-4d55-86b6-9a14574506ab",
      "name": "Merge Loop items",
      "type": "n8n-nodes-base.code",
      "position": [
        1120,
        -100
      ],
      "parameters": {
        "jsCode": "let results = [],\n  i = 0;\n\ndo {\n  try {\n    results = results.concat($(\"Get Customers\").all(0, i));\n  } catch (error) {\n    return results;\n  }\n  i++;\n} while (true);"
      },
      "typeVersion": 2
    },
    {
      "id": "2302257c-51c0-42d7-8745-ecc0b4fc9faf",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        440,
        -160
      ],
      "parameters": {
        "width": 232,
        "height": 346,
        "content": "## Edit this node \ud83d\udc47\n\nGet your store URL and replace in the GET url: https://{your-store}.myshopify.com/admin/api/2025-01/customers.json\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d857962a-6599-44b2-acb0-3eb8165e93ce",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1560,
        -440
      ],
      "parameters": {
        "width": 272,
        "height": 506,
        "content": "## Clone this spreadsheet\n\nhttps://docs.google.com/spreadsheets/d/1E8i98hwiFW7XG9HuxIZrOWfuLxGFaDm3EOAGQBZjhfk/edit?usp=sharing\n\nYour spreadsheet can have up to three columns, and need to be arranged in this order (no header):\n\nEmail address\nFirst name (optional)\nLast name (optional)\nShopify Customer ID (will be ignored)"
      },
      "typeVersion": 1
    },
    {
      "id": "be7cf143-893a-44f8-ace9-8ad581bddb68",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        120,
        -120
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "58097363-29ec-4067-a439-717d355df91f",
      "name": "Assign page_info parameter",
      "type": "n8n-nodes-base.set",
      "position": [
        1120,
        120
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "57e59bb7-ac20-4a1b-b54a-3468fc0519d3",
              "name": "page_info",
              "type": "string",
              "value": "={{ $json.page_info }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "0676abce-4405-42a1-87d3-ba75355fe264",
      "name": "Check page_info existence",
      "type": "n8n-nodes-base.if",
      "position": [
        720,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "30d965c3-cbba-430e-81c2-ef8b543665e7",
              "operator": {
                "type": "string",
                "operation": "notContains"
              },
              "leftValue": "={{ $json.headers.link }}",
              "rightValue": "rel=\"next\""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "1cc63979-b2f8-4678-b40b-f3f0ad63d377",
      "name": "Get Customers",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        500,
        0
      ],
      "parameters": {
        "url": "https://{your-store}.myshopify.com/admin/api/2025-01/customers.json",
        "options": {
          "response": {
            "response": {
              "fullResponse": true
            }
          }
        },
        "sendQuery": true,
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "limit",
              "value": "250"
            },
            {
              "name": "fields",
              "value": "id,email,first_name,last_name"
            },
            {
              "name": "={{ $json.page_info ? \"page_info\" : \"status\" }}",
              "value": "={{ $json.page_info ? $json.page_info : 'any' }}"
            }
          ]
        },
        "nodeCredentialType": "shopifyAccessTokenApi"
      },
      "credentials": {
        "shopifyAccessTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "ce91af42-1634-4773-944a-2b24dcaf812b",
      "name": "List Customers",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1380,
        -100
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "body.customers"
      },
      "typeVersion": 1
    },
    {
      "id": "19a0f6a7-b86a-43bd-8504-62e3bd37af89",
      "name": "Customers Spreadsheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1620,
        -100
      ],
      "parameters": {
        "columns": {
          "value": {
            "Last name": "={{ $json.last_name }}",
            "First name": "={{ $json.first_name }}",
            "Email address": "={{ $json.email }}",
            "Shopify Customer ID": "={{ $json.id }}"
          },
          "schema": [
            {
              "id": "Email address",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Email address",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "First name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "First name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Last name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Shopify Customer ID",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Shopify Customer ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Shopify Customer ID"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1358690917,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1yf_RYZGFHpMyOvD3RKGSvIFY2vumvI4474Qm_1t4-jM/edit#gid=1358690917",
          "cachedResultName": "sqs_contacts"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1yf_RYZGFHpMyOvD3RKGSvIFY2vumvI4474Qm_1t4-jM",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1yf_RYZGFHpMyOvD3RKGSvIFY2vumvI4474Qm_1t4-jM/edit?usp=drivesdk",
          "cachedResultName": "Squarespace automation"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "48ec5e3b-9bb5-451c-9495-b03080c9211e",
      "name": "Convert to Squarespace contacts csv",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        1920,
        160
      ],
      "parameters": {
        "options": {
          "headerRow": false
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "8de9174a-af87-4602-a9aa-a5c35a3f0ed4",
      "name": "Extract customers data",
      "type": "n8n-nodes-base.set",
      "position": [
        1620,
        160
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "27c42d50-df07-46b4-b67a-13a1b64b5145",
              "name": "Email address",
              "type": "string",
              "value": "={{ $json['Email address'] }}"
            },
            {
              "id": "9fd2c3fd-9b03-4562-ad78-9ce30da7bb26",
              "name": "First name",
              "type": "string",
              "value": "={{ $json['First name'] }}"
            },
            {
              "id": "f51b7da6-0065-41ea-b04c-420058ce3b9c",
              "name": "Last name",
              "type": "string",
              "value": "={{ $json['Last name'] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    }
  ],
  "connections": {
    "Get Customers": {
      "main": [
        [
          {
            "node": "Check page_info existence",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "List Customers": {
      "main": [
        [
          {
            "node": "Customers Spreadsheet",
            "type": "main",
            "index": 0
          },
          {
            "node": "Extract customers data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Loop items": {
      "main": [
        [
          {
            "node": "List Customers",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get Customers",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract page_info ": {
      "main": [
        [
          {
            "node": "Assign page_info parameter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Customers Spreadsheet": {
      "main": [
        []
      ]
    },
    "Extract customers data": {
      "main": [
        [
          {
            "node": "Convert to Squarespace contacts csv",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check page_info existence": {
      "main": [
        [
          {
            "node": "Merge Loop items",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Extract page_info ",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Assign page_info parameter": {
      "main": [
        [
          {
            "node": "Get Customers",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Test workflow\u2019": {
      "main": [
        [
          {
            "node": "Get Customers",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert to Squarespace contacts csv": {
      "main": [
        []
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

How this works

This workflow streamlines the extraction and processing of structured data from web pages or APIs, delivering clean, organised outputs directly into Google Sheets for easy analysis and reporting. It's ideal for analysts, marketers, or developers handling repetitive data pulls without coding everything from scratch, saving hours on manual entry and errors. The key step involves a code node that parses incoming page information, followed by conditional checks and merging to ensure reliable data flow before appending to your sheets.

Use this when you need event-driven automation for occasional data scraping or API monitoring, such as tracking website changes or aggregating metrics on demand. Avoid it for high-volume, real-time processing where dedicated tools like web scrapers perform better, or if your data sources require advanced authentication beyond basic HTTP requests. Common variations include swapping Google Sheets for Airtable integration or adding email notifications for completed extractions.

About this workflow

Splitout Code. Uses manualTrigger, stickyNote, scheduleTrigger, httpRequest. Event-driven trigger; 13 nodes.

Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Data & Sheets

TrackCollect_deeper. Uses googleSheets, httpRequest, @n-octo-n/n8n-nodes-json-database, itemLists. Event-driven trigger; 80 nodes.

Google Sheets, HTTP Request, @N Octo N/N8N Nodes Json Database +1
Data & Sheets

This template is ideal for solo store owners, eCommerce marketers, automation beginners, or anyone using Shopify and Gmail who wants to recover lost revenue without coding.

HTTP Request, Gmail, Twilio +3
Data & Sheets

PCN. Uses googleSheets, httpRequest, @n-octo-n/n8n-nodes-json-database, itemLists. Event-driven trigger; 60 nodes.

Google Sheets, HTTP Request, @N Octo N/N8N Nodes Json Database +3
Data & Sheets

The workflow automates the process of gathering extensive keyword data for a "Main Keyword." It starts by reading initial parameters from a Google Sheets template, creates a new dedicated Google Sheet

Google Sheets, Google Drive, HTTP Request
Data & Sheets

cdp_router. Uses gmailTrigger, telegramTrigger, googleSheets, httpRequest. Event-driven trigger; 53 nodes.

Gmail Trigger, Telegram Trigger, Google Sheets +4