{ "nodes": [ { "name": "Receive Slash Command", "type": "n8n-nodes-base.webhook", "position": [ 240, 100 ], "webhookId": "3c0d3820-5896-41c5-83bf-1cd5e956c32c", "parameters": { "path": "3c0d3820-5896-41c5-83bf-1cd5e956c32c", "options": {}, "httpMethod": "POST", "responseMode": "responseNode" }, "typeVersion": 1, "id": "node-edd36b96" }, { "name": "Reject", "type": "n8n-nodes-base.respondToWebhook", "position": [ 680, 200 ], "parameters": { "options": { "responseCode": 403 }, "respondWith": "noData" }, "typeVersion": 1, "id": "node-05b6b58b" }, { "name": "Set", "type": "n8n-nodes-base.set", "position": [ 680, 0 ], "parameters": { "values": { "string": [ { "name": "operation", "value": "={{$json[\"body\"][\"text\"].split(\" \")[0].toLowerCase()}}" }, { "name": "email", "value": "={{$json[\"body\"][\"text\"].split(\" \")[1].toLowerCase()}}" } ] }, "options": {}, "keepOnlySet": true }, "typeVersion": 1, "id": "node-4f943ad7" }, { "name": "Read Command", "type": "n8n-nodes-base.switch", "position": [ 900, 0 ], "parameters": { "rules": { "rules": [ { "value2": "delete" } ] }, "value1": "={{$json[\"operation\"]}}", "dataType": "string", "fallbackOutput": 3 }, "typeVersion": 1, "id": "node-7a71bd8a" }, { "name": "Wrong Command Error", "type": "n8n-nodes-base.respondToWebhook", "position": [ 1120, 100 ], "parameters": { "options": {}, "respondWith": "json", "responseBody": "{\n \"text\": \"Sorry, I didn't understand your command. You can request data deletion like so: `/gdpr delete `.\"\n}" }, "typeVersion": 1, "id": "node-4815a5c7" }, { "name": "Acknowledge", "type": "n8n-nodes-base.respondToWebhook", "position": [ 1340, 0 ], "parameters": { "options": {}, "respondWith": "json", "responseBody": "{\n \"text\": \"On it!\"\n}" }, "typeVersion": 1, "id": "node-08b206fd" }, { "name": "Empty Email?", "type": "n8n-nodes-base.if", "position": [ 1120, -100 ], "parameters": { "conditions": { "string": [ { "value1": "={{$json[\"email\"]}}", "operation": "isEmpty" } ] } }, "typeVersion": 1, "id": "node-1d6fb41e" }, { "name": "Missing Email Error", "type": "n8n-nodes-base.respondToWebhook", "position": [ 1340, -200 ], "parameters": { "options": {}, "respondWith": "json", "responseBody": "{\n \"text\": \"It looks like the user email address is missing. You can request data deletion like so: `/gdpr delete `.\"\n}" }, "typeVersion": 1, "id": "node-98333de1" }, { "name": "Valid Token?", "type": "n8n-nodes-base.if", "position": [ 460, 100 ], "parameters": { "conditions": { "string": [ { "value1": "={{$json[\"body\"][\"token\"]}}", "value2": "foo" } ] } }, "typeVersion": 1, "id": "node-9cde3bb2" }, { "name": "Paddle Data Deletion", "type": "n8n-nodes-base.executeWorkflow", "position": [ 1560, 0 ], "parameters": { "workflowId": "1231" }, "typeVersion": 1, "id": "node-cc5347fc" }, { "name": "Customer.io Data Deletion", "type": "n8n-nodes-base.executeWorkflow", "position": [ 1780, 0 ], "parameters": { "workflowId": "1237" }, "typeVersion": 1, "id": "node-c80f3fc8" }, { "name": "Zendesk Data Deletion", "type": "n8n-nodes-base.executeWorkflow", "position": [ 2000, 0 ], "parameters": { "workflowId": "1240" }, "typeVersion": 1, "id": "node-1f946e15" }, { "name": "Airtable", "type": "n8n-nodes-base.airtable", "position": [ 1780, 200 ], "parameters": { "table": "Log", "options": {}, "operation": "append", "application": "app3wAXUUwalhapFV" }, "credentials": { "airtableApi": { "id": "{{ $credentials.airtableApi.id }}", "name": "mutedjam@n8n.io" } }, "typeVersion": 1, "id": "node-791840a2" }, { "name": "Prepare Log Entry", "type": "n8n-nodes-base.function", "position": [ 1340, 200 ], "parameters": { "functionCode": "let deletion_nodes = [\n 'Paddle Data Deletion',\n 'Customer.io Data Deletion',\n 'Zendesk Data Deletion'\n]\n\nconst deletion_results = deletion_nodes.map(node_name => $items(node_name)[0].json);\nconst deletion_success = deletion_results.filter(json => json.success == true).length == deletion_nodes.length;\n\nreturn [{\n json: {\n Result: deletion_success ? 'Done' : 'Error',\n Notes: deletion_results.map(json => json.service + ': ' + json.message).join('\\n'),\n Processed: new Date().toISOString()\n }\n}];" }, "typeVersion": 1, "id": "node-c389aec5" }, { "name": "Crypto", "type": "n8n-nodes-base.crypto", "position": [ 1560, 200 ], "parameters": { "type": "SHA256", "value": "={{$node[\"Set\"].json[\"email\"]}}", "dataPropertyName": "Email Hash" }, "typeVersion": 1, "id": "node-705040c0" }, { "name": "Respond to Slack", "type": "n8n-nodes-base.httpRequest", "position": [ 2000, 200 ], "parameters": { "url": "{{ $env.BASE_URL }}", "options": {}, "requestMethod": "POST", "responseFormat": "string", "bodyParametersUi": { "parameter": [ { "name": "text", "value": "=GDPR data deletion process finished.\nStatus: {{$node[\"Prepare Log Entry\"].json[\"Result\"] == \"Done\" ? \":white_check_mark: OK\" : \":x: Error\"}}\nLog: " }, { "name": "delete_original", "value": "true" } ] } }, "typeVersion": 1, "id": "node-da3252ec" }, { "id": "error-1749c682", "name": "Error Handler", "type": "n8n-nodes-base.stopAndError", "typeVersion": 1, "position": [ 1000, 400 ], "parameters": { "message": "Workflow execution error", "options": {} } } ], "connections": {}, "name": "Production Workflow", "settings": { "executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3 }, "meta": { "instanceId": "workflow-fa3526ea", "versionId": "1.0.0", "createdAt": "2025-09-29T07:08:00.075574", "updatedAt": "2025-09-29T07:08:00.075593", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production" }, "tags": [ "automation", "n8n", "production-ready", "excellent", "optimized" ], "description": "Production-ready workflow: Production Workflow. This workflow has been optimized for production use with comprehensive error handling, security, and documentation." }