This workflow corresponds to n8n.io template #12904 — we link there as the canonical source.
This workflow follows the Gmail → Slack 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 →
{
"id": "1k6e3qNMI011JDhZ",
"name": "Order Delay Notification Flow",
"tags": [],
"nodes": [
{
"id": "018e39a3-9113-48a2-87ba-33ac1339cfdc",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
608,
-112
],
"parameters": {
"color": 7,
"width": 464,
"height": 368,
"content": "## Trigger & Order Intake\n### This workflow starts with a WooCommerce Order Update Webhook, which listens to real-time order status changes.\n\n### The incoming payload is normalized to extract only required fields such as order status, customer details, order number and estimated delivery date.\n### This ensures the workflow processes clean and consistent data.\n\n\n### This replaces manual input and enables real-time automation."
},
"typeVersion": 1
},
{
"id": "24403a4d-d5a4-4d4a-a123-84e260636025",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1120,
-208
],
"parameters": {
"color": 7,
"width": 704,
"height": 464,
"content": "## Order Eligibility & Validation\n### The workflow validates whether the order is eligible for delay tracking by checking its status.\n### Only orders with the following statuses are processed:\n### \u2022 processing\n### \u2022 on-hold\n### \u2022 shipped\n### Multiple IF nodes are chained to simulate OR logic.\n### The workflow also verifies that an estimated delivery date exists.\n\n\n\n### If the order fails any validation, the workflow stops immediately.\n\n### This prevents false alerts and unnecessary processing."
},
"typeVersion": 1
},
{
"id": "8873155c-3b09-4c61-8d38-13fb2a402f2f",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1856,
-96
],
"parameters": {
"color": 7,
"width": 576,
"height": 304,
"content": "## Delay Calculation & Decision\n\n### - Once the order is validated, a JavaScript logic node calculates the delay by comparing the current date with the estimated delivery date.\n### - The delay is converted into number of days (delayDays).\n### - Only orders delayed by one or more days continue further.\n\n### This ensures notifications are sent only for genuine delays."
},
"typeVersion": 1
},
{
"id": "6ef68189-4ddf-47b7-92ff-5875796204ad",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
2464,
-176
],
"parameters": {
"color": 7,
"width": 704,
"height": 368,
"content": "## Notifications & Visibility\n### Customer Notification & Internal Visibility\n\n### For delayed orders, the workflow automatically:\n### \u2022 Sends an email notification to the customer\n### \u2022 Sends an internal alert to Slack with order details\n\n### This keeps customers informed and provides internal visibility to support and fulfillment teams.\n\n### The workflow reduces manual follow-ups and improves customer experience."
},
"typeVersion": 1
},
{
"id": "2ca074e6-44c8-4706-9e1b-937f85342631",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-160,
-144
],
"parameters": {
"width": 736,
"height": 944,
"content": "## How it Works:\n\n### This workflow automatically listens for WooCommerce order updates using a webhook trigger.\nWhenever an order status changes, the workflow receives the updated order payload in real time.\n\n### On each execution, the workflow normalizes the incoming order data and validates whether the order is in a state where delays are possible. It then checks for the presence of an estimated delivery date and calculates whether the order is running behind schedule.\n\n### If a delay is detected, the workflow prepares a customer-friendly notification and sends an alert to the internal team via Slack. Orders that are not delayed or do not meet validation criteria are safely ignored.\n\n### Overall, this workflow enables proactive customer communication, reduces support inquiries related to delivery delays and improves operational transparency without manual intervention.\n\n## Setup Steps:\n\n1. Create a WooCommerce Order Update Webhook in n8n to trigger the workflow in real time.\n\n2. Configure the Webhook node to receive POST requests from WooCommerce order updates.\n\n3. Normalize the incoming order payload using a Set / Edit Fields node to extract required fields such as order status, customer email, order number and estimated delivery date.\n\n4. Add chained IF conditions to validate whether the order status is eligible for delay tracking (processing, on-hold or shipped).\n\n5. Add an IF condition to verify that an estimated delivery date exists before performing delay calculations.\n\n6. Use a JavaScript Code node to calculate delay duration by comparing the current date with the estimated delivery date.\n\n7. Add an IF condition to determine whether the order is delayed based on the calculated delay value.\n\n8. Send an automated email notification to the customer when a delay is detected.\n\n9. Send an internal alert to Slack containing order details and delay information for team visibility."
},
"typeVersion": 1
},
{
"id": "8188b649-fb3a-4e23-a320-93fb4d504f4a",
"name": "Normalize Order",
"type": "n8n-nodes-base.set",
"position": [
1232,
288
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "032ac5f5-aa8b-489f-87b6-140bab0ab2f2",
"name": "orderId",
"type": "number",
"value": "={{$json.id}}"
},
{
"id": "d52592df-7c26-4032-a65d-7434b1cf9907",
"name": "orderNumber",
"type": "number",
"value": "={{$json.number}}"
},
{
"id": "b57486b2-025f-4ae0-9958-b6ee66062dbe",
"name": "status",
"type": "string",
"value": "={{$json.status}}"
},
{
"id": "e5272218-28c4-4152-8927-a5484dd9873f",
"name": "email",
"type": "string",
"value": "={{$json.billing.email}}"
},
{
"id": "552c07ca-f5f7-46b9-8508-9191a8e17def",
"name": "customerName",
"type": "string",
"value": "={{$json.billing.first_name}} {{$json.billing.last_name}}"
},
{
"id": "4bc955e0-826a-436e-8151-3b91e439e5ce",
"name": "estimatedDelivery",
"type": "string",
"value": "={{$json.meta_data.find(m => m.key === '_estimated_delivery')?.value}}"
},
{
"id": "f7d97864-2515-46a0-b72c-96a7f124c514",
"name": "updatedAt",
"type": "string",
"value": "={{$json.date_modified}}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "2ab2de7d-3768-4e37-ab63-e31b99c3df2b",
"name": "Processing",
"type": "n8n-nodes-base.if",
"position": [
1472,
288
],
"parameters": {
"options": {
"ignoreCase": false
},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "fd0fdb8b-66a0-4db2-b7e3-92337df6a6bd",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "processing"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "3333563f-4dd0-48ca-b86d-8630e172e196",
"name": "Calculate Delivery Delay",
"type": "n8n-nodes-base.code",
"position": [
2288,
224
],
"parameters": {
"jsCode": "const item = $input.first().json;\n\nconst now = new Date(item.now);\nconst eta = new Date(JSON.parse(item.eta)); \n\nconst diffMs = now - eta;\nconst delayDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\nreturn [\n {\n json: {\n ...item,\n delayDays\n }\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "baed3046-8cb8-412b-95b5-cbdffece87ae",
"name": "Validate Delivery Delay",
"type": "n8n-nodes-base.if",
"position": [
2480,
224
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "0e160e0a-c725-4f4b-8f08-d53e3e5d11ac",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{$json.delayDays}}",
"rightValue": 0
}
]
}
},
"typeVersion": 2.2
},
{
"id": "8375cef7-eb2f-43ec-9b2f-05b8aa54fca9",
"name": "Email Customer",
"type": "n8n-nodes-base.gmail",
"position": [
2752,
208
],
"parameters": {
"sendTo": "user@example.com",
"message": "=Hi {{ $('Normalize Order').item.json.customerName }}, Your order is delayed by {{$json.delayDays}} day(s). We\u2019re actively working on it and will update you soon. Thank you for your patience.",
"options": {},
"subject": "Update on your order",
"emailType": "text"
},
"typeVersion": 2.1
},
{
"id": "f64a0598-c795-4d5c-8421-79ba5b616a8f",
"name": "Delay Alert",
"type": "n8n-nodes-base.slack",
"position": [
3024,
208
],
"parameters": {
"text": "=Order Delay Alert\n\nOrder #: {{ $('Normalize Order').item.json.orderNumber }}\nCustomer:{{ $('Normalize Order').item.json.customerName }}\nDelay: {{ $('Validate Delivery Delay').item.json.delayDays }} day(s)\nEstimated Delivery: {{ $('Validate Delivery Delay').item.json.delayDays }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "",
"cachedResultName": ""
},
"otherOptions": {}
},
"typeVersion": 2.3
},
{
"id": "ab91877c-f695-4831-a0b7-a33a7b95970c",
"name": "ETA Exists?",
"type": "n8n-nodes-base.if",
"position": [
2064,
240
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "d0377099-fb82-4abe-acab-e0b1f912eeda",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.eta }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "91ae4ae6-d5b5-4714-8bd0-0ba40efae263",
"name": "Fetch ETA",
"type": "n8n-nodes-base.set",
"position": [
1872,
240
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "6bbe1c11-3f7b-4002-a499-16276eacf78b",
"name": "now",
"type": "string",
"value": "={{$now}}"
},
{
"id": "f41202c2-df99-4590-b1a9-7d9ae26473dc",
"name": "eta",
"type": "string",
"value": "={{new Date($json.estimatedDelivery)}}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "c292c93e-1adb-4f63-b23d-3069271485d3",
"name": "WooCommerce Trigger",
"type": "n8n-nodes-base.wooCommerceTrigger",
"position": [
800,
288
],
"parameters": {
"event": "order.created"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "7c59c52a-facd-4f2f-ba5a-afbca3cce5e7",
"connections": {
"Fetch ETA": {
"main": [
[
{
"node": "ETA Exists?",
"type": "main",
"index": 0
}
]
]
},
"Processing": {
"main": [
[
{
"node": "Fetch ETA",
"type": "main",
"index": 0
}
]
]
},
"ETA Exists?": {
"main": [
[
{
"node": "Calculate Delivery Delay",
"type": "main",
"index": 0
}
]
]
},
"Email Customer": {
"main": [
[
{
"node": "Delay Alert",
"type": "main",
"index": 0
}
]
]
},
"Normalize Order": {
"main": [
[
{
"node": "Processing",
"type": "main",
"index": 0
}
]
]
},
"WooCommerce Trigger": {
"main": [
[
{
"node": "Normalize Order",
"type": "main",
"index": 0
}
]
]
},
"Validate Delivery Delay": {
"main": [
[
{
"node": "Email Customer",
"type": "main",
"index": 0
}
]
]
},
"Calculate Delivery Delay": {
"main": [
[
{
"node": "Validate Delivery Delay",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This n8n workflow listens to real-time WooCommerce order events and automatically detects delivery delays based on the estimated delivery date. When a delay is identified, it proactively notifies the customer via email and alerts internal teams through Slack, ensuring…
Source: https://n8n.io/workflows/12904/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow automates the synchronization of product prices across Shopify and WooCommerce platforms to ensure retail consistency. It triggers when a price change is detected in either system, appli
This workflow uses a WooCommerce trigger that will run when an order has been placed.
This workflow automates inventory management and predictive reordering for Shopify stores. It integrates Shopify, Google Sheets, and Slack to monitor inventory levels, calculate dynamic reorder points
📖 Description (WooCommerce Version)
This workflow provides a robust, end-to-end automated pipeline for managing e-commerce orders. It bridges the gap between your storefront and your fulfillment team by handling inventory validation, mu