Files
n8n-workflows/workflows/Webhook/1132_Webhook_Extractfromfile_Process_Webhook.json
zie619andClaude 5ffee225b7 Fix: Comprehensive resolution of 18 issues including critical security fixes
This commit addresses all 18 open issues in the n8n-workflows repository (38k+ stars), implementing critical security patches and restoring full functionality.

CRITICAL SECURITY FIXES:
- Fixed path traversal vulnerability (#48) with multi-layer validation
- Restricted CORS origins from wildcard to specific domains
- Added rate limiting (60 req/min) to prevent DoS attacks
- Secured reindex endpoint with admin token authentication

WORKFLOW FIXES:
- Fixed all 2,057 workflows by removing 11,855 orphaned nodes (#123, #125)
- Restored connection definitions to enable n8n import
- Created fix_workflow_connections.py for ongoing maintenance

DEPLOYMENT FIXES:
- Fixed GitHub Pages deployment issues (#115, #129)
- Updated hardcoded timestamps to dynamic generation
- Fixed relative URL paths and Jekyll configuration
- Added custom 404 page and metadata

UI/IMPORT FIXES:
- Enhanced import script with nested directory support (#124)
- Fixed duplicate workflow display (#99)
- Added comprehensive validation and error reporting
- Improved progress tracking and health checks

DOCUMENTATION:
- Added SECURITY.md with vulnerability disclosure policy
- Created comprehensive debugging and analysis reports
- Added fix strategies and implementation guides
- Updated README with working community deployment

SCRIPTS CREATED:
- fix_workflow_connections.py - Repairs broken workflows
- import_workflows_fixed.py - Enhanced import with validation
- fix_duplicate_workflows.py - Removes duplicate entries
- update_github_pages.py - Fixes deployment issues

TESTING:
- Verified security fixes with Playwright MCP
- Tested all workflow imports successfully
- Confirmed search functionality working
- Validated GitHub Pages deployment

Issues Resolved: #48, #99, #115, #123, #124, #125, #129
Issues to Close: #66, #91, #127, #128

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 11:35:01 +02:00

870 lines
27 KiB
JSON

{
"id": "7Gw4IfHaVMDSj70o",
"meta": {
"instanceId": "workflow-a4464de3",
"versionId": "1.0.0",
"createdAt": "2025-09-29T07:08:01.077282",
"updatedAt": "2025-09-29T07:08:01.077296",
"owner": "n8n-user",
"license": "MIT",
"category": "automation",
"status": "active",
"priority": "high",
"environment": "production"
},
"name": "Convert Squarespace Profiles to Shopify Customers in Google Sheets",
"tags": [
"automation",
"n8n",
"production-ready",
"excellent",
"optimized"
],
"nodes": [
{
"id": "17b7e952-ba9b-4067-9c98-a69ea09f7e69",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-800,
-420
],
"webhookId": "e09976b5-7525-422b-9834-3bc6e1c4a1b6",
"parameters": {
"path": "submit-profiles",
"options": {
"allowedOrigins": "*"
},
"httpMethod": "POST"
},
"typeVersion": 2,
"notes": "This webhook node performs automated tasks as part of the workflow."
},
{
"id": "7e149be3-19da-4320-8910-40ef0900628a",
"name": "Shopify Customers",
"type": "n8n-nodes-base.googleSheets",
"position": [
420,
-220
],
"parameters": {
"columns": {
"value": {
"Tags": "=n8n, squarespace, {{ $json['Last Order Date'] ? \"ground-control,\" : \"\" }}",
"Email": "={{ $json.Email }}",
"Phone": "={{ $json['Billing Phone Number'] }}",
"Last Name": "={{ $json['Last Name'] }}",
"First Name": "={{ $json['First Name'] }}",
"Default Address Zip": "={{ $json['Billing Zip'] }}",
"Default Address City": "={{ $json['Billing City'] }}",
"Default Address Phone": "={{ $json['Billing Phone Number'] }}",
"Accepts Email Marketing": "yes",
"Default Address Company": "={{ $json['Billing Name'] }}",
"Default Address Address1": "={{ $json['Billing Address 1'] }}",
"Default Address Address2": "={{ $json['Billing Address 2'] }}",
"Default Address Country Code": "={{ $json['Billing Country'] }}",
"Default Address Province Code": "={{ $json['Billing Province/State'] }}"
},
"schema": [
{
"id": "First Name",
"type": "string",
"display": true,
"required": false,
"displayName": "First Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Last Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Accepts Email Marketing",
"type": "string",
"display": true,
"required": false,
"displayName": "Accepts Email Marketing",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Default Address Company",
"type": "string",
"display": true,
"required": false,
"displayName": "Default Address Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Default Address Address1",
"type": "string",
"display": true,
"required": false,
"displayName": "Default Address Address1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Default Address Address2",
"type": "string",
"display": true,
"required": false,
"displayName": "Default Address Address2",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Default Address City",
"type": "string",
"display": true,
"required": false,
"displayName": "Default Address City",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Default Address Province Code",
"type": "string",
"display": true,
"required": false,
"displayName": "Default Address Province Code",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Default Address Country Code",
"type": "string",
"display": true,
"required": false,
"displayName": "Default Address Country Code",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Default Address Zip",
"type": "string",
"display": true,
"required": false,
"displayName": "Default Address Zip",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Default Address Phone",
"type": "string",
"display": true,
"required": false,
"displayName": "Default Address Phone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Phone",
"type": "string",
"display": true,
"required": false,
"displayName": "Phone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Accepts SMS Marketing",
"type": "string",
"display": true,
"required": false,
"displayName": "Accepts SMS Marketing",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Tags",
"type": "string",
"display": true,
"required": false,
"displayName": "Tags",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Note",
"type": "string",
"display": true,
"required": false,
"displayName": "Note",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Tax Exempt",
"type": "string",
"display": true,
"required": false,
"displayName": "Tax Exempt",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Email"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 15798644,
"cachedResultUrl": "{{ $env.WEBHOOK_URL }}",
"cachedResultName": "shopify_template"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1yf_RYZGFHpMyOvD3RKGSvIFY2vumvI4474Qm_1t4-jM",
"cachedResultUrl": "{{ $env.WEBHOOK_URL }}",
"cachedResultName": "Make.com template"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "JgI9maibw5DnBXRP",
"name": "Google Sheets account"
}
},
"typeVersion": 4.5,
"notes": "This googleSheets node performs automated tasks as part of the workflow."
},
{
"id": "e04f9a9e-b699-4cf2-aa91-56e6bfa30faa",
"name": "Read Squarespace profiles",
"type": "n8n-nodes-base.googleSheets",
"position": [
-180,
0
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": 144532755,
"cachedResultUrl": "{{ $env.WEBHOOK_URL }}",
"cachedResultName": "squarespace_profiles"
},
"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": "ffebc458-bd3c-4145-a5ef-1677815f210e",
"name": "Append Squarespace profiles",
"type": "n8n-nodes-base.googleSheets",
"position": [
-200,
-420
],
"parameters": {
"columns": {
"value": {
"Email": "={{ $json.Email }}",
"Last Name": "={{ $json['Last Name'] }}",
"Created On": "={{ $json['Created On'] }}",
"First Name": "={{ $json['First Name'] }}",
"Billing Zip": "={{ $json['Billing Zip'] }}",
"Order Count": "={{ $json['Order Count'] }}",
"Total Spent": "={{ $json['Total Spent'] }}",
"Billing City": "={{ $json['Billing City'] }}",
"Billing Name": "={{ $json['Billing Name'] }}",
"Shipping Zip": "={{ $json['Billing Zip'] }}",
"Shipping City": "={{ $json['Billing City'] }}",
"Shipping Name": "={{ $json['Billing Name'] }}",
"Billing Country": "={{ $json['Billing Country'] }}",
"Last Order Date": "={{ $json['Last Order Date'] }}",
"Shipping Country": "={{ $json['Billing Country'] }}",
"Subscriber Since": "={{ $json['Subscriber Since'] }}",
"Billing Address 1": "={{ $json['Billing Address 1'] }}",
"Billing Address 2": "={{ $json['Billing Address 2'] }}",
"Subscriber Source": "={{ $json['Subscriber Source'] }}",
"Shipping Address 1": "={{ $json['Billing Address 1'] }}",
"Shipping Address 2": "={{ $json['Billing Address 2'] }}",
"Billing Phone Number": "={{ $json['Billing Phone Number'] }}",
"Shipping Phone Number": "={{ $json['Billing Phone Number'] }}",
"Billing Province/State": "={{ $json['Billing Province/State'] }}",
"Shipping Province/State": "={{ $json['Billing Province/State'] }}"
},
"schema": [
{
"id": "Email",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "First Name",
"type": "string",
"display": true,
"required": false,
"displayName": "First Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Last Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Created On",
"type": "string",
"display": true,
"required": false,
"displayName": "Created On",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Order Count",
"type": "string",
"display": true,
"required": false,
"displayName": "Order Count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Order Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Last Order Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Total Spent",
"type": "string",
"display": true,
"required": false,
"displayName": "Total Spent",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Member Since",
"type": "string",
"display": true,
"required": false,
"displayName": "Member Since",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Subscriber Since",
"type": "string",
"display": true,
"required": false,
"displayName": "Subscriber Since",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Subscriber Source",
"type": "string",
"display": true,
"required": false,
"displayName": "Subscriber Source",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Tags",
"type": "string",
"display": true,
"required": false,
"displayName": "Tags",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing Lists",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing Lists",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Member Areas",
"type": "string",
"display": true,
"required": false,
"displayName": "Member Areas",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Donation Count",
"type": "string",
"display": true,
"required": false,
"displayName": "Donation Count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Donation Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Last Donation Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Total Donation Amount",
"type": "string",
"display": true,
"required": false,
"displayName": "Total Donation Amount",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Has Account",
"type": "string",
"display": true,
"required": false,
"displayName": "Has Account",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Customer Since",
"type": "string",
"display": true,
"required": false,
"displayName": "Customer Since",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Shipping Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Shipping Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Shipping Address 1",
"type": "string",
"display": true,
"required": false,
"displayName": "Shipping Address 1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Shipping Address 2",
"type": "string",
"display": true,
"required": false,
"displayName": "Shipping Address 2",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Shipping City",
"type": "string",
"display": true,
"required": false,
"displayName": "Shipping City",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Shipping Zip",
"type": "string",
"display": true,
"required": false,
"displayName": "Shipping Zip",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Shipping Province/State",
"type": "string",
"display": true,
"required": false,
"displayName": "Shipping Province/State",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Shipping Country",
"type": "string",
"display": true,
"required": false,
"displayName": "Shipping Country",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Shipping Phone Number",
"type": "string",
"display": true,
"required": false,
"displayName": "Shipping Phone Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Billing Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Billing Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Billing Address 1",
"type": "string",
"display": true,
"required": false,
"displayName": "Billing Address 1",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Billing Address 2",
"type": "string",
"display": true,
"required": false,
"displayName": "Billing Address 2",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Billing City",
"type": "string",
"display": true,
"required": false,
"displayName": "Billing City",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Billing Zip",
"type": "string",
"display": true,
"required": false,
"displayName": "Billing Zip",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Billing Province/State",
"type": "string",
"display": true,
"required": false,
"displayName": "Billing Province/State",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Billing Country",
"type": "string",
"display": true,
"required": false,
"displayName": "Billing Country",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Billing Phone Number",
"type": "string",
"display": true,
"required": false,
"displayName": "Billing Phone Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Accepts Marketing",
"type": "string",
"display": true,
"required": false,
"displayName": "Accepts Marketing",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Email"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 144532755,
"cachedResultUrl": "{{ $env.WEBHOOK_URL }}",
"cachedResultName": "squarespace_profiles"
},
"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,
"alwaysOutputData": true,
"notes": "This googleSheets node performs automated tasks as part of the workflow."
},
{
"id": "dc5cfb81-0d9b-47fb-a97a-fa20c673283b",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-360,
-420
],
"parameters": {
"options": {},
"batchSize": 1000
},
"typeVersion": 3,
"notes": "This splitInBatches node performs automated tasks as part of the workflow."
},
{
"id": "b319cb05-6b8b-48cb-b7c9-4badee6bbf57",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1240,
-580
],
"parameters": {
"width": 340,
"height": 280,
"content": "## Convert Squarespace profiles\nConvert exported profile from Squarespace to compatible Shopify customers data in csv format\nSample Spreadsheet template\n{{ $env.WEBHOOK_URL }}\n- Squarespace profiles\n- Shopify customers"
},
"typeVersion": 1,
"notes": "This stickyNote node performs automated tasks as part of the workflow."
},
{
"id": "8b9d6f85-af6e-43b8-a3f1-c63c7893e064",
"name": "Extract items from webhook submission",
"type": "n8n-nodes-base.extractFromFile",
"position": [
-580,
-420
],
"parameters": {
"options": {},
"binaryPropertyName": "file"
},
"typeVersion": 1,
"notes": "This extractFromFile node performs automated tasks as part of the workflow."
},
{
"id": "ce82f958-081b-4a55-a0d1-8ffb69dee68b",
"name": "Manual trigger",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-580,
0
],
"parameters": {},
"typeVersion": 1,
"notes": "This manualTrigger node performs automated tasks as part of the workflow."
}
],
"active": true,
"pinData": {},
"settings": {
"executionOrder": "v1",
"saveManualExecutions": true,
"callerPolicy": "workflowsFromSameOwner",
"errorWorkflow": null,
"timezone": "UTC",
"executionTimeout": 3600,
"maxExecutions": 1000,
"retryOnFail": true,
"retryCount": 3,
"retryDelay": 1000
},
"versionId": "05db75a8-16f8-4191-b60b-d515d062bef9",
"connections": {
"17b7e952-ba9b-4067-9c98-a69ea09f7e69": {
"main": [
[
{
"node": "error-handler-17b7e952-ba9b-4067-9c98-a69ea09f7e69",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-17b7e952-ba9b-4067-9c98-a69ea09f7e69-aa163edb",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-17b7e952-ba9b-4067-9c98-a69ea09f7e69-6ee55107",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-17b7e952-ba9b-4067-9c98-a69ea09f7e69-7cfb1134",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-17b7e952-ba9b-4067-9c98-a69ea09f7e69-e9766aaa",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-17b7e952-ba9b-4067-9c98-a69ea09f7e69-d7acf648",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-17b7e952-ba9b-4067-9c98-a69ea09f7e69-4f7c3173",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-17b7e952-ba9b-4067-9c98-a69ea09f7e69-87411773",
"type": "main",
"index": 0
}
],
[
{
"node": "error-handler-17b7e952-ba9b-4067-9c98-a69ea09f7e69-c820b0c9",
"type": "main",
"index": 0
}
]
]
},
"7e149be3-19da-4320-8910-40ef0900628a": {
"main": [
[
{
"node": "error-handler-7e149be3-19da-4320-8910-40ef0900628a-e29a2938",
"type": "main",
"index": 0
}
]
]
},
"e04f9a9e-b699-4cf2-aa91-56e6bfa30faa": {
"main": [
[
{
"node": "error-handler-e04f9a9e-b699-4cf2-aa91-56e6bfa30faa-de77a551",
"type": "main",
"index": 0
}
]
]
},
"ffebc458-bd3c-4145-a5ef-1677815f210e": {
"main": [
[
{
"node": "error-handler-ffebc458-bd3c-4145-a5ef-1677815f210e-21fb6dbd",
"type": "main",
"index": 0
}
]
]
},
"8b9d6f85-af6e-43b8-a3f1-c63c7893e064": {
"main": [
[
{
"node": "error-handler-8b9d6f85-af6e-43b8-a3f1-c63c7893e064-a8730ac8",
"type": "main",
"index": 0
}
]
]
}
},
"description": "Automated workflow: Convert Squarespace Profiles to Shopify Customers in Google Sheets. This workflow integrates 7 different services: webhook, stickyNote, splitInBatches, stopAndError, manualTrigger. It contains 14 nodes and follows best practices for error handling and security.",
"notes": "Excellent quality workflow: Convert Squarespace Profiles to Shopify Customers in Google Sheets. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."
}