This workflow corresponds to n8n.io template #11184 — we link there as the canonical source.
This workflow follows the Airtable → Gmail 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 →
{
"nodes": [
{
"id": "3b061df3-7034-4751-ba11-bcad25805dc3",
"name": "Requirements Overview Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
20912,
6320
],
"parameters": {
"width": 720,
"height": 336,
"content": "Auto Draft PO: When there's no draft PO left for a supplier, create a new one\n\nAdd Products to Draft PO: When Current Qty changes, if Forecast Qty \u2264 Threshold Qty, add Refill Qty - Current Qty to supplier-specific draft order (or increase if exists)\n\nSend PO with email: When switching from Draft to Order, generate email text:\n\n Hi there,\n I'd like to place the following order:\n {Product 1} - {Qty}\n {Product 2} - {Qty}\n(Don't send emails, just generate text)\n\nGenerate random SO (test):\n\nSimulate daily sales by selling random amounts from each product under current available qty. Manual trigger only."
},
"typeVersion": 1
},
{
"id": "8a217af9-9165-4bfc-9a29-a9c40cc9dbdc",
"name": "Draft PO Creation Section",
"type": "n8n-nodes-base.stickyNote",
"position": [
20784,
6784
],
"parameters": {
"color": 6,
"width": 848,
"height": 448,
"content": "## Create a Draft PO if there's none"
},
"typeVersion": 1
},
{
"id": "9f8c0dfe-4256-4724-8803-7c7fb8739b46",
"name": "PO Modified",
"type": "n8n-nodes-base.airtableTrigger",
"position": [
20576,
6944
],
"parameters": {
"baseId": {
"__rl": true,
"mode": "url",
"value": "https://airtable.com/appN9ivOwGQt1FwT5/tblaoU05NUR1ZPTLK/viwP97rB9cZ9JBElJ?blocks=hide"
},
"tableId": {
"__rl": true,
"mode": "url",
"value": "https://airtable.com/appN9ivOwGQt1FwT5/tblaoU05NUR1ZPTLK/viwP97rB9cZ9JBElJ?blocks=hide"
},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"triggerField": "Last Modified",
"authentication": "airtableTokenApi",
"additionalFields": {
"formula": ""
}
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "1fe9fdf0-5654-4e9a-9cb4-3844c4e37dd4",
"name": "Find Suppliers Without Draft PO",
"type": "n8n-nodes-base.airtable",
"position": [
20912,
6944
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appN9ivOwGQt1FwT5",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5",
"cachedResultName": "[YT] Inventory Management"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblW3uRcMObpV06An",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5/tblW3uRcMObpV06An",
"cachedResultName": "Suppliers"
},
"options": {},
"operation": "search",
"filterByFormula": "{Draft PO Count} = 0"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"executeOnce": true,
"typeVersion": 2.1
},
{
"id": "a74f3b2a-121f-409d-ad0d-0f63134d60c3",
"name": "Create a Draft PO",
"type": "n8n-nodes-base.airtable",
"position": [
21136,
6944
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appN9ivOwGQt1FwT5",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5",
"cachedResultName": "[YT] Inventory Management"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblaoU05NUR1ZPTLK",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5/tblaoU05NUR1ZPTLK",
"cachedResultName": "Purchase Orders"
},
"columns": {
"value": {
"Status": "Draft",
"Supplier": "=[\"{{ $json.id }}\"]"
},
"schema": [
{
"id": "PO ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "PO ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email Text",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Email Text",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "options",
"display": true,
"options": [
{
"name": "Draft",
"value": "Draft"
},
{
"name": "Order",
"value": "Order"
},
{
"name": "Received",
"value": "Received"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Supplier",
"type": "array",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Supplier",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email (from Suppliers)",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Email (from Suppliers)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Modified",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Last Modified",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Stock In Records",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Stock In Records",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "create"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "af859cc7-1623-40bc-8792-8e43753449bb",
"name": "Manual Trigger for Test SO",
"type": "n8n-nodes-base.manualTrigger",
"position": [
20864,
8352
],
"parameters": {},
"typeVersion": 1
},
{
"id": "f3d2e6c1-8f32-4e98-b036-ada97e303584",
"name": "List Products",
"type": "n8n-nodes-base.airtable",
"position": [
21280,
8352
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appN9ivOwGQt1FwT5",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5",
"cachedResultName": "[YT] Inventory Management"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbljPbeJv8V58CZWr",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5/tbljPbeJv8V58CZWr",
"cachedResultName": "Products"
},
"options": {},
"operation": "search",
"filterByFormula": "{Current Qty} >= 1"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "6a801771-6d6d-4369-a893-b311821332ed",
"name": "Auto Add Products Section",
"type": "n8n-nodes-base.stickyNote",
"position": [
20784,
7312
],
"parameters": {
"color": 6,
"width": 1424,
"height": 416,
"content": "## Adds Products to Purchase Order Based on Treshold"
},
"typeVersion": 1
},
{
"id": "9b42958a-74e0-452c-8942-1db762230e60",
"name": "Random SO Generator Section",
"type": "n8n-nodes-base.stickyNote",
"position": [
20784,
8208
],
"parameters": {
"color": 6,
"width": 1104,
"height": 400,
"content": "## For test - generate random SO\n\n\n"
},
"typeVersion": 1
},
{
"id": "ea92d54d-6ea4-4f33-8641-389c0d70bb8d",
"name": "Check Products Hourly",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
20576,
7488
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "33d3fc8f-a61c-4ce5-b1c1-486f4c618135",
"name": "Find Products Need Purchase",
"type": "n8n-nodes-base.airtable",
"position": [
20880,
7488
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appN9ivOwGQt1FwT5",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5",
"cachedResultName": "[YT] Inventory Management"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbljPbeJv8V58CZWr",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5/tbljPbeJv8V58CZWr",
"cachedResultName": "Products"
},
"options": {},
"operation": "search",
"filterByFormula": "{Needs Refill} = 1"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"executeOnce": true,
"typeVersion": 2.1
},
{
"id": "233d43e1-0b1b-4648-86e9-8a94273e431b",
"name": "Find Draft PO for Supplier",
"type": "n8n-nodes-base.airtable",
"position": [
21568,
7472
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appN9ivOwGQt1FwT5",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5",
"cachedResultName": "[YT] Inventory Management"
},
"limit": 1,
"table": {
"__rl": true,
"mode": "list",
"value": "tblaoU05NUR1ZPTLK",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5/tblaoU05NUR1ZPTLK",
"cachedResultName": "Purchase Orders"
},
"options": {},
"operation": "search",
"returnAll": false,
"filterByFormula": "={PO ID} = \"{{ $json[\"Draft PO ID_2\"][0] }}\""
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "14681ae3-1ce5-4058-ad09-cb7dcbe2a6e1",
"name": "Merge Product and Stock In Data",
"type": "n8n-nodes-base.merge",
"position": [
21360,
7472
],
"parameters": {
"mode": "combine",
"options": {
"clashHandling": {
"values": {
"resolveClash": "addSuffix"
}
}
},
"advanced": true,
"joinMode": "keepEverything",
"mergeByFields": {
"values": [
{
"field1": "Product[0]",
"field2": "id"
}
]
}
},
"typeVersion": 3.2
},
{
"id": "e3c1b9a9-b34f-4dd4-8a8b-2c10255859ca",
"name": "Find Existing Stock In",
"type": "n8n-nodes-base.airtable",
"position": [
21120,
7376
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appN9ivOwGQt1FwT5",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5",
"cachedResultName": "[YT] Inventory Management"
},
"limit": 1,
"table": {
"__rl": true,
"mode": "list",
"value": "tblynUveOYVAvQ6NE",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5/tblynUveOYVAvQ6NE",
"cachedResultName": "Stock In"
},
"options": {},
"operation": "search",
"returnAll": false,
"filterByFormula": "={SKU and Status (helper)} = \"{{ $('Find Products Need Purchase').item.json.SKU }} - Draft\""
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1,
"alwaysOutputData": true
},
{
"id": "9095e8ac-4eae-477d-848b-afabc06bea7c",
"name": "Is there Stock In Already",
"type": "n8n-nodes-base.if",
"position": [
21776,
7472
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "32b1f19c-fd39-43be-85a4-3094f6447a51",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ !!$('Merge Product and Stock In Data').item.json.id_1 }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "aa786ba7-3869-4a4d-86f4-3b1f15099fd7",
"name": "Update Stock In",
"type": "n8n-nodes-base.airtable",
"position": [
22016,
7392
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appN9ivOwGQt1FwT5",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5",
"cachedResultName": "[YT] Inventory Management"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblynUveOYVAvQ6NE",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5/tblynUveOYVAvQ6NE",
"cachedResultName": "Stock In"
},
"columns": {
"value": {
"id": "={{ $('Merge Product and Stock In Data').item.json.id_1 }}",
"Quantity": "={{ $('Find Products Need Purchase').item.json['Refill Qty'] - $('Find Products Need Purchase').item.json['Forecast Qty'] }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Product",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Product",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Quantity",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Quantity",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Purchase Order",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Purchase Order",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Product Name",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Product Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "PO Status",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "PO Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "SKU and Status (helper)",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "SKU and Status (helper)",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "c91d8cbe-dcf1-4f5c-af8b-52cb152d50a6",
"name": "Create Stock In",
"type": "n8n-nodes-base.airtable",
"position": [
22016,
7552
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appN9ivOwGQt1FwT5",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5",
"cachedResultName": "[YT] Inventory Management"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblynUveOYVAvQ6NE",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5/tblynUveOYVAvQ6NE",
"cachedResultName": "Stock In"
},
"columns": {
"value": {
"Product": "=[\"{{ $('Find Products Need Purchase').item.json.id }}\"]",
"Quantity": "={{ $('Find Products Need Purchase').item.json['Refill Qty'] - $('Find Products Need Purchase').item.json['Forecast Qty'] }}",
"Purchase Order": "=[\"{{ $json.id }}\"]"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Product",
"type": "array",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Product",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Quantity",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Quantity",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Purchase Order",
"type": "array",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Purchase Order",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Product Name",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Product Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "PO Status",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "PO Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "SKU and Status (helper)",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "SKU and Status (helper)",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"SKU and Status (helper)"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "create"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "c26995a5-e7fa-4614-9a61-c3eb39a34d57",
"name": "PO Enters Needs Email",
"type": "n8n-nodes-base.airtableTrigger",
"position": [
20592,
7888
],
"parameters": {
"baseId": {
"__rl": true,
"mode": "url",
"value": "https://airtable.com/appN9ivOwGQt1FwT5/tblaoU05NUR1ZPTLK/viwP97rB9cZ9JBElJ?blocks=hide"
},
"tableId": {
"__rl": true,
"mode": "url",
"value": "https://airtable.com/appN9ivOwGQt1FwT5/tblaoU05NUR1ZPTLK/viwP97rB9cZ9JBElJ?blocks=hide"
},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"triggerField": "Status Last Modified",
"authentication": "airtableTokenApi",
"additionalFields": {
"formula": "{Status} = \"Needs Email\""
}
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "8783c720-d3aa-42b8-ac91-5e3568b1d14e",
"name": "Email Orders Section",
"type": "n8n-nodes-base.stickyNote",
"position": [
20784,
7760
],
"parameters": {
"color": 6,
"width": 1424,
"height": 416,
"content": "## Sends out order to Suppliers in Email"
},
"typeVersion": 1
},
{
"id": "41b6d1e1-a1b7-4061-a2fe-c0c151b69aa4",
"name": "Create SO",
"type": "n8n-nodes-base.airtable",
"position": [
21072,
8352
],
"parameters": {
"base": {
"__rl": true,
"mode": "url",
"value": "https://airtable.com/appN9ivOwGQt1FwT5/tbljPbeJv8V58CZWr"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tbl7lx9nDHdVlNq57",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5/tbl7lx9nDHdVlNq57",
"cachedResultName": "Sales Orders"
},
"columns": {
"value": {
"SO ID": "={{ `${Math.random().toString(16).slice(2,10)}` }}",
"Status": "Sent"
},
"schema": [
{
"id": "SO ID",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "SO ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "options",
"display": true,
"options": [
{
"name": "Draft",
"value": "Draft"
},
{
"name": "Sent",
"value": "Sent"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Stock Out",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Stock Out",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Total Products",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Total Products",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "create"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "33386f17-23cc-4feb-ab50-6a05583d0aba",
"name": "Create SO Line",
"type": "n8n-nodes-base.airtable",
"position": [
21488,
8352
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appN9ivOwGQt1FwT5",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5",
"cachedResultName": "[YT] Inventory Management"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblK8e458kyOf9odT",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5/tblK8e458kyOf9odT",
"cachedResultName": "Stock Out"
},
"columns": {
"value": {
"Product": "=[\"{{ $json.id }}\"]",
"Quantity": "={{ Math.floor(Math.random() * $json['Current Qty']) }}",
"Sales Order": "=[\"{{ $('Create SO').item.json.id }}\"]"
},
"schema": [
{
"id": "Name",
"type": "string",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Product",
"type": "array",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Product",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Quantity",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Quantity",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Sales Order",
"type": "array",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Sales Order",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "SO Status",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "SO Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Product Name",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Product Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "SO Status (Text)",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "SO Status (Text)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Is Sent?",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Is Sent?",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "create"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "219498e5-2cfa-4b3b-934d-8f43acfd9656",
"name": "Send out PO to Supplier",
"type": "n8n-nodes-base.gmail",
"position": [
20832,
7888
],
"parameters": {
"sendTo": "supplier@example.com",
"message": "={{ $json.fields[\"Order Email Body\"] }}",
"options": {
"appendAttribution": false
},
"subject": "=New Order - No. {{ $json.fields[\"PO ID\"] }}",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "2c3d5986-b6f3-422d-bca2-b2afdd6ab9f3",
"name": "Update PO Status",
"type": "n8n-nodes-base.airtable",
"position": [
21056,
7888
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appN9ivOwGQt1FwT5",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5",
"cachedResultName": "[YT] Inventory Management"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblaoU05NUR1ZPTLK",
"cachedResultUrl": "https://airtable.com/appN9ivOwGQt1FwT5/tblaoU05NUR1ZPTLK",
"cachedResultName": "Purchase Orders"
},
"columns": {
"value": {
"id": "={{ $('PO Enters Needs Email').item.json.id }}",
"Status": "Order"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "PO ID",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "PO ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Order Email Body",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Order Email Body",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Order Lines",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Order Lines",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "options",
"display": true,
"options": [
{
"name": "Draft",
"value": "Draft"
},
{
"name": "Needs Email",
"value": "Needs Email"
},
{
"name": "Order",
"value": "Order"
},
{
"name": "Received",
"value": "Received"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Stock In Records",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Stock In Records",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Supplier",
"type": "array",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Supplier",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Supplier Email Address",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Supplier Email Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Modified",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Last Modified",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status Last Modified",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Status Last Modified",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Order Email Beginning (from Supplier)",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Order Email Beginning (from Supplier)",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "2086d3bc-9c99-44b8-8589-5e8b65874fcd",
"name": "Workflow Description",
"type": "n8n-nodes-base.stickyNote",
"position": [
19872,
6784
],
"parameters": {
"width": 600,
"height": 1108,
"content": "## Workflow Overview\n\nThis n8n workflow automates the entire purchase order process for an Airtable-based inventory management system. It monitors stock levels, automatically creates purchase orders when inventory falls below thresholds, and sends formatted orders to suppliers via email.\n\nThe workflow handles three key processes: ensuring each supplier always has a draft purchase order available, intelligently adding products to those orders based on forecasted stock levels versus threshold quantities, and automatically emailing suppliers when orders are ready to be sent.\n\n### First Setup\n\n**Required:** You must first copy the Airtable inventory base into your own account from: https://airtable.com/appN9ivOwGQt1FwT5/shr1ApcBSi4SOVoPh\n\nYou'll need to configure:\n- **Airtable credentials:** Personal Access Token with read/write permissions to your copied base\n- **Gmail credentials:** OAuth2 connection for sending purchase order emails to suppliers\n\nAfter copying the base, update all Airtable node connections to point to your base URL and table IDs.\n\n### Configuration\n\nThe workflow runs on an **hourly schedule** to check for products needing reorder. You can adjust this frequency in the \"Hourly\" Schedule Trigger node.\n\nThe test workflow (\"Generate random SO\") is manual-trigger only and simulates daily sales by randomly reducing product quantities\u2014useful for testing the reorder automation without real sales data.\n\nAll supplier-specific settings (emails, reorder thresholds, refill quantities) are managed directly in the Airtable base, not in the workflow itself."
},
"typeVersion": 1
},
{
"id": "0ad07274-2fa1-4e00-9fbe-c022d8b6c4e4",
"name": "Creator Contact Info",
"type": "n8n-nodes-base.stickyNote",
"position": [
19872,
6320
],
"parameters": {
"color": 5,
"width": 600,
"height": 440,
"content": "# Contact Us:\n## Milan @ SmoothWork - [Book a Free Consulting Call](https://smoothwork.ai/book-a-call/)\n\n\n\n### We help businesses eliminate busywork by building compact business tools tailored to your process.\n### Contact us for customizing this, or building similar automations.\n\n\ud83d\udce7 hello@smoothwork.ai\n\u25b6\ufe0f [Check us on YouTube](https://www.youtube.com/@vasarmilan)\n\ud83d\udcde [Book a Free Consulting Call](https://smoothwork.ai/book-a-call/)\n\ud83d\udcbc [Add me on Linkedin](https://www.linkedin.com/in/mil%C3%A1n-v%C3%A1s%C3%A1rhelyi-3a9985123/)\n"
},
"typeVersion": 1
},
{
"id": "d002ffdd-6fdc-4a2e-a386-48698927cac4",
"name": "Video Walkthrough",
"type": "n8n-nodes-base.stickyNote",
"position": [
20496,
6320
],
"parameters": {
"width": 420,
"height": 340,
"content": "# Video Walkthrough\n[](https://youtu.be/4CQ3o7qChIs)"
},
"typeVersion": 1
}
],
"connections": {
"Create SO": {
"main": [
[
{
"node": "List Products",
"type": "main",
"index": 0
}
]
]
},
"PO Modified": {
"main": [
[
{
"node": "Find Suppliers Without Draft PO",
"type": "main",
"index": 0
}
]
]
},
"List Products": {
"main": [
[
{
"node": "Create SO Line",
"type": "main",
"index": 0
}
]
]
},
"Check Products Hourly": {
"main": [
[
{
"node": "Find Products Need Purchase",
"type": "main",
"index": 0
}
]
]
},
"PO Enters Needs Email": {
"main": [
[
{
"node": "Send out PO to Supplier",
"type": "main",
"index": 0
}
]
]
},
"Find Existing Stock In": {
"main": [
[
{
"node": "Merge Product and Stock In Data",
"type": "main",
"index": 0
}
]
]
},
"Send out PO to Supplier": {
"main": [
[
{
"node": "Update PO Status",
"type": "main",
"index": 0
}
]
]
},
"Is there Stock In Already": {
"main": [
[
{
"node": "Update Stock In",
"type": "main",
"index": 0
}
],
[
{
"node": "Create Stock In",
"type": "main",
"index": 0
}
]
]
},
"Find Draft PO for Supplier": {
"main": [
[
{
"node": "Is there Stock In Already",
"type": "main",
"index": 0
}
]
]
},
"Manual Trigger for Test SO": {
"main": [
[
{
"node": "Create SO",
"type": "main",
"index": 0
}
]
]
},
"Find Products Need Purchase": {
"main": [
[
{
"node": "Find Existing Stock In",
"type": "main",
"index": 0
},
{
"node": "Merge Product and Stock In Data",
"type": "main",
"index": 1
}
]
]
},
"Find Suppliers Without Draft PO": {
"main": [
[
{
"node": "Create a Draft PO",
"type": "main",
"index": 0
}
]
]
},
"Merge Product and Stock In Data": {
"main": [
[
{
"node": "Find Draft PO for Supplier",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
airtableTokenApigmailOAuth2
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
[](https://youtu.be/4CQ3o7qChIs)
Source: https://n8n.io/workflows/11184/ — 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.
Recruiting agency. Uses typeformTrigger, airtable, httpRequest, googleDrive. Event-driven trigger; 36 nodes.
This workflow collects proof selections via an n8n Form, logs orders in Airtable, creates Razorpay payment links, and delivers a final gallery link by Gmail only after Razorpay confirms payment and th
Streamline Data From An N8N Form Into Google Sheet Airtable And Email Sending. Uses formTrigger, airtable, stickyNote, googleSheets. Event-driven trigger; 10 nodes.
Streamline data from an n8n form into Google Sheet and Airtable. Uses formTrigger, airtable, stickyNote, googleSheets. Event-driven trigger; 10 nodes.
BookLeaf Cover Validation Pipeline. Uses googleDriveTrigger, googleDrive, httpRequest, airtable. Event-driven trigger; 9 nodes.