Inventory & suppliers
Track purchase orders and supplier ETAs in Notion
Give every open purchase order one row in Notion — supplier, line items, order date, promised ETA, status — and let n8n keep it current: it reads supplier confirmation emails, updates the revised ETA, and flags anything past due. You answer 'where's that order and when does it land?' from one screen instead of digging through your sent folder.
- Notion
- n8n
The manual way today
A PO gets emailed to a supplier, the supplier replies with a confirmation and maybe a ship date, and that thread becomes the only record it ever existed. To know what's still open, someone scrolls their sent mail, opens each thread to find the latest ETA, and keeps a side spreadsheet they update by hand — when they remember. 'Is the Q3 reorder still coming this week?' takes ten minutes of inbox archaeology to answer.
The status of your inbound stock lives in a dozen email threads and a spreadsheet that's always one update behind. A supplier slips a delivery two weeks and nobody notices until the shelf is empty, because the new ETA sat unread in a reply. You re-order things that are already on the way, and you can't tell at a glance which suppliers actually hit their dates — so you keep buying on a promise instead of a track record.
What running looks like
One Notion database is the single source of truth for every purchase order. Each row carries the supplier, line items, order date, the promised ETA and the latest revised ETA, and a live status. n8n watches the purchasing inbox: when a supplier emails an update, it matches the PO number and writes the new ETA onto the row automatically. A formula marks anything overdue, a daily check surfaces the POs that need a chase, and receiving an order is one status flip that drops it off the open list. You see what's coming and when — without opening your sent folder.
01The build
How to build it
Model the purchase-order database in Notion
Needs a humanBuild a Purchase Orders database with one row per PO. Properties: PO number (the Title — your join key everywhere else), Supplier (Relation to a Suppliers database, or a Select to start), Status (a Status property: Placed, Confirmed, Partially received, Received, Cancelled), Order date, Promised ETA and Revised ETA (two Date properties), Total cost (Number), and a Notes text field. Add a linked Line Items database — one row per SKU on the PO, with ordered qty and received qty — so a partial delivery has somewhere honest to land. This schema is the thing every later step reads and writes.
Get POs into Notion the moment they're placed
Runs itselfWhen a PO goes out, it should appear in Notion without a second round of typing. In n8n, use the Notion 'Create a database page' node, keyed on PO number. Trigger it from wherever the PO is born: a manual 'placed' button, a Notion form, or — if you run the auto-generate-purchase-orders recipe — the same approval that emails the supplier. Before creating, query Notion for an existing page with that PO number and update it instead of inserting, so a re-run never spawns a duplicate row.
Read supplier ETA updates straight out of the inbox
Runs itselfPoint n8n's email trigger (Gmail Trigger, or an IMAP node) at the purchasing inbox. On each new message, extract the PO number with a regex against the subject and body, find the matching Notion page, and write the supplier's ship or delivery date into Revised ETA — plus flip Status to Confirmed if it was still Placed. Parsing a date out of free-text email is the fiddly part; keep it conservative and only write a date you're confident you read correctly.
Send the ambiguous emails to a human, never guess
Needs a humanIf the regex finds no PO number, finds more than one, or the message has no parseable date, do not write anything. Instead, append the email's link and subject to a 'Needs review' note on the closest matching PO — or to a catch-all Notion page — and stop. A wrong ETA written silently is worse than no ETA, because the team will trust it. The automation handles the clean confirmations; a person resolves the messy ones.
Compute the effective ETA and an overdue flag with Notion formulas
Runs itselfKeep the logic visible in formula properties, not buried in n8n. 'Effective ETA' = if(empty(prop("Revised ETA")), prop("Promised ETA"), prop("Revised ETA")) — the revised date wins when a supplier has moved it. 'Days vs ETA' = dateBetween(prop("Effective ETA"), now(), "days"). Then a Status-at-a-glance formula buckets each open PO: Overdue when the effective ETA is in the past, Due this week when it's within seven days, On track otherwise. Received and Cancelled POs return blank so they fall out of the urgency math.
Build the views people actually open
Needs a humanMake the database useful with saved views, not one giant table. An 'Open POs' view filtered to Status is not Received and not Cancelled, sorted by Effective ETA ascending so the next arrival sits on top. An 'Overdue' view filtered to the overdue flag. A board view grouped by Supplier for a quick read on who has what outstanding. These views are the answer to 'what's coming and when' — the thing that used to take ten minutes in the inbox.
Run a daily check that surfaces what needs chasing
Runs itselfA Schedule node in n8n fires each morning, queries Notion for open POs where the effective ETA is in the past or within a few days, and posts a short digest — 'PO #1042 from Acme was due Tuesday, no update' — to your email or a Slack channel, with a link to each row. Filter out anything already Received so a delivered order never shows up as overdue because someone forgot to flip its status. The digest pulls a person to the rows that need a decision; it doesn't try to make the decision.
Draft the supplier follow-up, but let a person send it
Needs a humanFor each PO that's past its effective ETA with no update in, say, five days, have n8n draft a short follow-up to the supplier contact — 'Checking on PO #1042, originally due [date]; can you confirm the new ship date?' — and save it as a draft or attach it to the Notion row. A human reviews and sends it. Chasing a supplier is a relationship, not a cron job; the automation removes the typing, not the judgment.
Close the loop on receiving — including partial deliveries
Needs a humanWhen stock lands, a person sets received qty on each Line Item row. A rollup compares received qty to ordered qty across the PO: if everything's in, Status flips to Received and the row leaves every open view; if only some arrived, it reads Partially received and stays visible with the outstanding lines. This is what keeps the dataset trustworthy over time — a PO is only 'done' when the goods are actually on the shelf, not when the supplier said they shipped.
02The stack
What it’s built on
- Notion
- The single source of truth: the Purchase Orders and Line Items databases, the Date and Status properties, the formulas that compute effective ETA and overdue, and the views the team reads instead of their sent folder.Notion's free Personal plan handles this for one or two people; you'll want a paid Plus seat once the whole purchasing team needs to edit, or for unlimited file uploads on supplier docs. The API is included on every tier.
- n8n
- The glue: the email trigger that reads supplier confirmations, the PO-number match and date parse, the Notion create/update calls, the daily overdue check, and the drafted follow-ups.n8n is open-source and self-hostable for free; their cloud tier just saves you running it yourself. Zapier or Make can drive the same email-to-Notion sync if one of those is already in your stack.
03Questions
Before you build
How does it know which PO an email is about?
It matches on the PO number. The reliable pattern is to put a consistent token in every PO — 'PO #1042' or 'PO-1042' — so suppliers reply with it in the subject or quoted body, and a regex can pull it out. When the number is missing or ambiguous, the automation deliberately doesn't guess; it flags the email for a person rather than writing a wrong ETA onto the wrong order.
Why Notion instead of a spreadsheet?
A spreadsheet can hold the same columns, but Notion gives you the relation to line items, a real Status property, formula fields for effective ETA and overdue, and saved filtered views without rebuilding them each time. The deciding feature is that an email automation can write a clean date into a specific row via the API and the whole team sees the same current picture — instead of one person's local copy drifting out of date.
What happens when a supplier moves the delivery date twice?
The Revised ETA field always holds the latest date the supplier has given, and the effective-ETA formula uses it over the original promised date. Each update overwrites the last, and you can keep the history in the Notes field or a small log if you want to see how often a supplier slips. The overdue and digest logic always reads the most recent date, so a moved delivery stops showing as overdue once the new ETA is in.
Can it handle partial shipments?
Yes — that's what the Line Items database is for. Each SKU on a PO gets received qty set as stock arrives, and a rollup compares received to ordered across the whole order. A PO only flips to Received when every line is in; until then it reads Partially received and keeps the outstanding lines visible, so a split delivery never gets quietly marked complete.
Does it talk to my inventory or Shopify at all?
This build is deliberately scoped to tracking the POs and their ETAs — the order side, not the stock side. It pairs naturally with an inventory dashboard or low-stock alerts: those tell you what to reorder, this tells you the status of what you already ordered. Wiring received quantities back into your stock counts is a sensible next step, but it's a separate piece worth scoping on its own.
Can I build this myself, or should you build it?
If you're comfortable with the Notion API and a bit of email parsing, build it — the database schema, the PO-number matching, the formulas, and the edge cases are all written out above on purpose. If you'd rather not own the email parsing and the date logic, we'll build it on the Notion and n8n accounts you already pay for, document every property, and hand you the keys. You own the workflow outright — no monthly retainer, no platform you're locked into. It starts with a free 20-minute teardown where we map your PO process and where the ETAs go missing, not a contract.
Related recipes
Inventory & suppliers
Auto-generate purchase orders at the reorder point
Keep a reorder point and a supplier for every SKU in Airtable, read Shopify's live inventory on a schedule, and draft the purchase order automatically the moment stock drops to the line — then approve it before it sends. You reorder on lead time instead of finding out you're empty from a customer.
- Shopify
- Airtable
- n8n
Inventory & suppliers
Build a reorder-point dashboard in Airtable
Pull live Shopify inventory and trailing sales into Airtable on a schedule, let formula fields turn raw counts into days of cover and a health status per SKU, then read it all on one Interface sorted by urgency. The point isn't to act for you — it's to give you the single screen that tells you what to order next, before a customer finds the gap.
- Airtable
- Shopify
- n8n
Inventory & suppliers
Send low-stock Slack alerts from Shopify inventory
A bestseller running down to zero with nobody watching is the most avoidable stockout there is. Here's how to watch Shopify's live inventory and drop a clear, actionable alert in Slack the moment a SKU crosses its low-stock line — once per dip, not on every sale.
- Shopify
- Slack
Order & fulfillment ops
Notify customers automatically about fulfillment delays
An order that's paid but hasn't shipped past your promised window is a complaint waiting to happen. Here's how to catch those orders on a schedule, confirm they really are stuck, and fire a proactive Klaviyo heads-up with a real new ETA — before the customer has to ask.
- Shopify
- Klaviyo
- ShipBob