Workflow: Manualtrigger Workflow
Integrations: code, convertToFile, googleSheets, httpRequest, if, manualTrigger, scheduleTrigger, set, splitOut, stickyNote

{"meta": {"instanceId": "workflow-a8bb2959", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:53.207784", "updatedAt": "2025-09-29T07:07:53.207797", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production"}, "nodes": [{"id": "ff5634c3-349b-4181-a03a-97b310e5232b", "name": "When clicking \u2018Test workflow\u2019", "type": "n8n-nodes-base.manualTrigger", "position": [120, 60], "parameters": {}, "typeVersion": 1, "notes": "This manualTrigger node performs automated tasks as part of the workflow."}, {"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`<{{ $env.API_BASE_URL }}>; rel=\"next\"`\n*/\nconst headerValue = $input.first().json.headers.link;\nconst params = parseNextParams(headerValue);\nreturn params;"}, "typeVersion": 2, "notes": "This code node performs automated tasks as part of the workflow."}, {"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, "notes": "This code node performs automated tasks as part of the workflow."}, {"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: {{ $env.SHOPIFY_URL }}\n"}, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow."}, {"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\n{{ $env.WEBHOOK_URL }}\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, "notes": "This stickyNote node performs automated tasks as part of the workflow."}, {"id": "be7cf143-893a-44f8-ace9-8ad581bddb68", "name": "Schedule Trigger", "type": "n8n-nodes-base.scheduleTrigger", "position": [120, -120], "parameters": {"rule": {"interval": [{}]}}, "typeVersion": 1.2, "notes": "This scheduleTrigger node performs automated tasks as part of the workflow."}, {"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, "notes": "This set node performs automated tasks as part of the workflow."}, {"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, "notes": "This if node performs automated tasks as part of the workflow."}, {"id": "1cc63979-b2f8-4678-b40b-f3f0ad63d377", "name": "Get Customers", "type": "n8n-nodes-base.httpRequest", "position": [500, 0], "parameters": {"url": "{{ $env.SHOPIFY_URL }}", "options": {"response": {"response": {"fullResponse": true}}}, "sendQuery": true, "authentication": "{{ $credentials.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": "YOUR_CREDENTIAL_HERE"}, "credentials": {"shopifyAccessTokenApi": {"id": "vtyKGPLLdjc7MLea", "name": "Shopify Access Token account"}}, "typeVersion": 4.2, "notes": "This httpRequest node performs automated tasks as part of the workflow."}, {"id": "ce91af42-1634-4773-944a-2b24dcaf812b", "name": "List Customers", "type": "n8n-nodes-base.splitOut", "position": [1380, -100], "parameters": {"options": {}, "fieldToSplitOut": "body.customers"}, "typeVersion": 1, "notes": "This splitOut node performs automated tasks as part of the workflow."}, {"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": "{{ $env.WEBHOOK_URL }}", "cachedResultName": "sqs_contacts"}, "documentId": {"__rl": true, "mode": "list", "value": "1yf_RYZGFHpMyOvD3RKGSvIFY2vumvI4474Qm_1t4-jM", "cachedResultUrl": "{{ $env.WEBHOOK_URL }}", "cachedResultName": "Squarespace automation"}}, "credentials": {"googleSheetsOAuth2Api": {"id": "JgI9maibw5DnBXRP", "name": "Google Sheets account"}}, "typeVersion": 4.5, "notes": "This googleSheets node performs automated tasks as part of the workflow."}, {"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, "notes": "This convertToFile node performs automated tasks as part of the workflow."}, {"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, "notes": "This set node performs automated tasks as part of the workflow."}], "pinData": {}, "connections": {"1cc63979-b2f8-4678-b40b-f3f0ad63d377": {"main": [[{"node": "error-handler-1cc63979-b2f8-4678-b40b-f3f0ad63d377", "type": "main", "index": 0}], [{"node": "error-handler-1cc63979-b2f8-4678-b40b-f3f0ad63d377-5a92133a", "type": "main", "index": 0}], [{"node": "error-handler-1cc63979-b2f8-4678-b40b-f3f0ad63d377-ee35fbc6", "type": "main", "index": 0}], [{"node": "error-handler-1cc63979-b2f8-4678-b40b-f3f0ad63d377-61a54d33", "type": "main", "index": 0}], [{"node": "error-handler-1cc63979-b2f8-4678-b40b-f3f0ad63d377-94b5395e", "type": "main", "index": 0}], [{"node": "error-handler-1cc63979-b2f8-4678-b40b-f3f0ad63d377-6980dcf8", "type": "main", "index": 0}], [{"node": "error-handler-1cc63979-b2f8-4678-b40b-f3f0ad63d377-efbf3ce9", "type": "main", "index": 0}], [{"node": "error-handler-1cc63979-b2f8-4678-b40b-f3f0ad63d377-48d8c485", "type": "main", "index": 0}], [{"node": "error-handler-1cc63979-b2f8-4678-b40b-f3f0ad63d377-fe0e4450", "type": "main", "index": 0}]]}, "19a0f6a7-b86a-43bd-8504-62e3bd37af89": {"main": [[{"node": "error-handler-19a0f6a7-b86a-43bd-8504-62e3bd37af89-a7e1ee8a", "type": "main", "index": 0}]]}, "48ec5e3b-9bb5-451c-9495-b03080c9211e": {"main": [[{"node": "error-handler-48ec5e3b-9bb5-451c-9495-b03080c9211e-66756d98", "type": "main", "index": 0}]]}}, "name": "Manualtrigger Workflow", "settings": {"executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3, "retryDelay": 1000}, "description": "Automated workflow: Manualtrigger Workflow. This workflow integrates 11 different services: convertToFile, stickyNote, httpRequest, code, scheduleTrigger. It contains 17 nodes and follows best practices for error handling and security.", "tags": ["automation", "n8n", "production-ready", "excellent", "optimized"], "notes": "Excellent quality workflow: Manualtrigger Workflow. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."}