If you are managing inventory in a spreadsheet and checking stock levels manually, this tutorial builds the first automation most operations teams should have: a daily alert that tells you exactly which items have dropped below their reorder point, sent automatically to Slack or email before anyone has to ask.
No ERP API required. No coding. The whole workflow runs in n8n and reads directly from a Google Sheet you already maintain.
A scheduled n8n workflow that:
By the end of this tutorial, you will have a working workflow you can put into production the same day.
Before opening n8n, have these ready:
Google Sheet setup. Your inventory sheet needs at minimum four columns:
The column headers can be named anything. You will map them inside n8n. If your sheet has additional columns (location, unit cost, supplier), that is fine: you only need to reference the four above.
n8n instance. This tutorial works on n8n Cloud or a self-hosted instance. Version 1.0 or later is recommended.
Google Sheets credentials in n8n. In n8n, go to Credentials, add a new Google Sheets OAuth2 credential, and authorize it against the Google account that owns the sheet. If you have not done this before, n8n's credential setup walks you through the OAuth flow.
Slack webhook or Gmail credentials. For Slack: create an incoming webhook in your Slack workspace (Settings and Administration, Manage Apps, Incoming Webhooks) and copy the webhook URL. For Gmail: add a Gmail credential in n8n using OAuth2 with the account you want to send from.
The complete node sequence:
Schedule Trigger
→ Google Sheets (Read all rows)
→ Code node (filter rows where Quantity < Reorder Point)
→ IF node (check if any items need reorder)
→ Slack or Gmail (send consolidated alert)
Five nodes. No branching complexity. This is a good first n8n workflow because every node has a clear single purpose.
Open n8n and create a new workflow. Add a Schedule Trigger node as the starting point.
Set the interval based on how often your inventory changes:
For most manufacturers starting out, a daily trigger at 7am is the right default. You can always increase frequency later.
Add a Google Sheets node after the trigger. Configure it:
Run the node manually (click Execute Node) to confirm it returns your inventory data. You should see each row as a separate item in the output panel. If the output is empty, check that the sheet name matches exactly.
Add a Code node after the Google Sheets node. This node filters the full inventory list down to only the items that need reordering.
In the JavaScript editor, enter the following logic (adjust the column names to match your sheet headers):
const items = $input.all();
const belowThreshold = items.filter(item => {
const qty = Number(item.json['Current Quantity']);
const reorderPoint = Number(item.json['Reorder Point']);
return qty < reorderPoint;
});
return belowThreshold;
Replace 'Current Quantity' and 'Reorder Point' with the exact column names from your sheet. n8n maps column headers as JSON keys, so they must match exactly including capitalization and spaces.
Run the node to confirm it returns only the items below threshold. If everything returns, double-check that your test sheet has at least one item with a quantity below its reorder point.
Add an IF node after the Code node. This prevents a notification from firing when nothing needs to be reordered.
Configure the condition:
Connect the True branch to your notification node (next step). Leave the False branch unconnected or connect it to a No Operation node. When nothing is below threshold, the workflow ends silently.
For Slack:
Add a Slack node on the True branch. Set the operation to Send Message. Select the channel where inventory alerts should go (a dedicated #inventory-alerts channel is cleaner than a general ops channel).
In the Message field, build a consolidated alert using an expression. A clean format:
*Reorder Alert: {{ $now.toFormat('yyyy-MM-dd') }}*
The following items are below their reorder point:
{{ $input.all().map(item => `• ${item.json['Item Name']} (SKU: ${item.json['SKU']}), Current: ${item.json['Current Quantity']}, Reorder Point: ${item.json['Reorder Point']}`).join('\n') }}
This produces a single message listing every below-threshold item, not one message per item.
For Gmail:
Add a Gmail node on the True branch. Set the operation to Send Email. Enter the recipient (purchasing coordinator, operations manager, or a distribution list).
Build the same consolidated list in the email body using HTML for better formatting, or plain text using the same expression pattern above.
Toggle the workflow to Active. n8n will now run it on the schedule you set.
Test by temporarily setting one item's quantity below its reorder point in the sheet, then triggering the workflow manually. Confirm the alert arrives in Slack or email with the correct item details. Reset the test item when done.
Quantity not updating. This workflow reads whatever is in the sheet at the time it runs. If your team is not keeping quantities current, the alerts will not be accurate. The workflow is only as good as the data feeding it. Consider whether quantity updates need to be automated as a separate workflow before this one is useful.
Column name mismatches. The Code node is case-sensitive and space-sensitive. If your header is Current Qty but the code says Current Quantity, the filter returns zero results. Use the output panel from the Google Sheets node to confirm the exact key names before writing the Code node expression.
Too many items below threshold on day one. If your reorder points have never been set, every item may appear in the first alert. Run the workflow in test mode first to review the output before activating, and clean up reorder point values in the sheet before going live.
Once the basic alert is working, three natural extensions:
Write a reorder flag back to the sheet. Add a second Google Sheets node after the filter to update a "Reorder Needed" column for flagged items. This gives you a visual indicator in the sheet alongside the Slack alert.
Auto-create a draft purchase order. If your ERP has a REST API, add an HTTP Request node after the filter to create a draft PO for each flagged item. This is the step that moves this workflow from an alert to an action.
Filter by supplier. Add a Switch node before the notification to route alerts by supplier, so the purchasing coordinator for Supplier A only sees Supplier A's items. Useful once the item count grows.
This workflow is the right first build for two reasons.
First, it works without ERP API access. Many manufacturers are not ready to connect n8n to their ERP in week one. Google Sheets as the data source removes that dependency and gets a working automation into production immediately.
Second, it demonstrates the core pattern every more complex workflow uses: trigger, read data, apply logic, send action. Once your team has seen this workflow run, the mental model for every subsequent build is already in place.
The Flow Kaizen guide covers how to sequence your first five automation builds, starting with quick wins like this one and building toward ERP-connected workflows as your team's confidence grows.