{"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 <email>`.\"\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 <email>`.\"\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: <https://airtable.com/app3wAXUUwalhapFV/tbljkxW55l2Gq7Fzq/viwOJdJM1taITEaPr/{{$node[\"Airtable\"].json[\"id\"]}}?blocks=hide|View in Airtable>"},{"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"},"description":"Production-ready workflow: Production Workflow. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."}