Foodops
All docs

Purchasing · Updated 2026-08-16 · v491abb3

Shopping List (FoodOps)

Audio narration for this article is generated with the weekly docs refresh.

What this is. The Shopping List is FoodOps' procurement worklist — the running list of items you need to buy/reorder. It lives in the back office (foodops-admin-app) at Shopping List in the main nav (shopping-cart icon, /shopping-list), backed by the /shoppinglist API. (New KB entry, 2026-08-16 — closes the top coverage gap. Source-derived. A live-walk was attempted 2026-08-16 and blocked on FoodOps auth — this is "tried, couldn't reach the app," NOT "unstarted" and NOT "feature absent"; see verification history.)

Plain-English summary

The Shopping List is your "what do we need to order" list. It fills up automatically when an ingredient drops below its low-stock threshold, and you can also add products by hand. Each line has a quantity, a priority (Critical / High / Normal / Low), and a supplier. When you're ready to buy, you can email the list to a supplier or turn selected lines into a Purchase Order in one step. As you buy and receive things, items move through Not purchased → Purchased → Purchased-received, so the list always shows what's still outstanding.

When you'd use this

  • Your daily/weekly reorder run — see everything that's low and needs buying, in one place.
  • Turning "we're low on X" into an actual Purchase Order or a supplier email.
  • Prioritising what to buy first (Critical vs Low) when budget or delivery is tight.
  • Tracking which ordered items have arrived (Purchased-received) vs are still on order (Purchased).

How to access

  • Main nav → Shopping List (shopping-cart icon), at /shopping-list. [code: foodops-admin-app@141a197 — nav item {id:"shopping-list", label:"Shopping List", path:"/shopping-list"}; ShoppingListPage.tsx]
  • Also listed in the FoodOps navigation map.

If you don't see it, it's part of the inventory & purchasing tools — access is controlled by your role. See the "greyed out / missing" question below.

How items get onto the list

  1. Automatically, from low stock. When an ingredient falls below its low-stock threshold, an alert fires on the Dashboard and the shopping list auto-updates to include it. [grounded: FoodOps/menu/recipes.md — "the shopping list auto-updates" on low stock]
  2. Manually. Use Add product to search the catalogue and add items (the lookup flags anything that's already low stock), individually or several at once. [code: AddProductDialog.tsx; shoppingListService.productLookup / addToShoppingList / addMultipleProducts — ProductLookupResult.isLowStock]

The list

[code: ShoppingListTable.tsx; types/shoppingList.ts — ShoppingListItem]

  • Tabs (the item lifecycle): Not purchasedPurchasedPurchased-received. Each tab shows a count, so you can see at a glance how much is still to buy vs on the way. [code: ShoppingListTab = 'not-purchased' | 'purchased' | 'purchased-received'; ShoppingListCounts]
  • Per line you can set: the quantity to buy, the priority (Critical / High / Normal / Low), the supplier (from the item's supplier options), and the expected purchasing price. [code: shoppingListService.updateQuantity / updatePriority / updateSupplier / updatePurchasingPrice; PrioritySelect.tsx]
  • Filter the list (e.g. by priority) with the filter bar. [code: ShoppingListFilterBar.tsx; ShoppingListFilterParams]
  • Bulk actions: select multiple lines to bulk-change priority or bulk-remove. [code: shoppingListService.bulkChangePriority / bulkRemove]

What you do with the list

  • Create a Purchase Order — select the lines you're buying and preview/create a PO (grouped by supplier). This hands the items to Purchase Orders. [code: POPreviewDialog.tsx; shoppingListService.getPOPreview]
  • Email the list to a supplier — send the shopping list (or a selection) to a supplier's email address with a subject line, straight from the list. [code: EmailShoppingListDialog.tsx; shoppingListService.getEmailData → POST /shoppinglist/email-data]
  • Mark purchased — once bought, mark a line purchased and it moves to the Purchased tab (then Purchased-received when it arrives). [code: shoppingListService.updateIsPurchased]
  • Remove a line you don't need. [code: shoppingListService.removeItem]

Key concepts

  • Auto-fill from low stock — the list's main value: it populates itself from ingredients below their reorder point, so you don't have to remember what's low.
  • Priority — Critical / High / Normal / Low, to order the buying run; editable per line and in bulk.
  • Supplier per line — each item can carry supplier options; you pick which supplier to buy from (this drives PO grouping and the email).
  • Lifecycle tabs — Not purchased / Purchased / Purchased-received: an item's journey from "to buy" to "arrived".
  • Two exits — a Shopping List line becomes either a Purchase Order or a supplier email; it isn't a purchase by itself.

Common questions

Q: What is the Shopping List for in FoodOps? A: It's your reorder/procurement list — the running list of items you need to buy. It auto-fills from low-stock ingredients, you can add items by hand, set quantities/priorities/suppliers, and then either email it to a supplier or turn it into a Purchase Order.

Q: I can't find Shopping List in FoodOps — where has it gone? A: It's in the main navigation as Shopping List (the shopping-cart icon), at /shopping-list, alongside the other purchasing tools. If it isn't there for you, it's almost always access/permissions rather than the feature being removed — Shopping List is part of the inventory & purchasing area, so a role without those tools won't show it. Ask an admin to check your role (see the next question).

Q: Why is Shopping List greyed out for my staff in FoodOps? A: Access follows your role/permissions. Shopping List sits with the purchasing tools, so a staff member whose role doesn't include purchasing/inventory access will see it greyed out or hidden. An admin can enable it by giving that staff member's role access to the purchasing area. (If no one in your organisation can see it — including an admin — it may not be part of your plan; contact support.) (The exact permission that controls it wasn't live-verified this pass — treat "adjust the role" as the general fix.)

Q: How does the Shopping List know what to add? A: Automatically — when an ingredient drops below its low-stock threshold, it's added to the list (and an alert fires on the Dashboard). You can also add anything manually with Add product.

Q: How do I turn the Shopping List into an order? A: Select the lines you want to buy and use Create Purchase Order — it previews a PO (grouped by supplier) and hands the items to Purchase Orders. Alternatively, Email the list to a supplier directly.

Q: How do I email my shopping list to a supplier? A: Use the Email action — it opens a dialog where you set the recipient's email and a subject, and sends the list (or your selected lines). Pick the supplier on the lines first so you're sending them the right items.

Q: What do the tabs (Not purchased / Purchased / Purchased-received) mean? A: They track each item's stage — Not purchased = still to buy, Purchased = ordered/bought, Purchased-received = arrived. Marking a line purchased moves it along.

Q: What are the priority levels for? A: Critical / High / Normal / Low let you order your buying run — do the Criticals first. You can set priority per line or change several at once (bulk).

Q: Can I set which supplier to buy each item from? A: Yes — each line carries its item's supplier options; pick one per line. That choice drives how a Purchase Order is grouped and who the email goes to.

Q: Does adding something to the Shopping List order it or reduce stock? A: No. The Shopping List is a planning list — nothing is ordered or stock-adjusted until you create a Purchase Order (or otherwise receive the goods). Emailing or PO-ing the list is the step that actually starts a purchase.

Q: Is the Shopping List the same as a Purchase Order? A: No. The Shopping List is the "what to buy" worklist; a Purchase Order is the actual order sent to a supplier. The list feeds POs — you build the list, then convert selected lines into a PO.

Edge cases and known issues

  • Not live-walked yet. This entry is source-derived (foodops-admin-app@141a197) plus the low-stock behaviour grounded in recipes.md; the exact on-screen labels, the precise permission that gates access, and the auto-fill trigger have not been confirmed against the running app. Verify before quoting exact wording to a customer.
  • Auto-fill vs manual: the low-stock auto-add is documented in recipes.md; whether items also auto-remove when restocked, and the exact reorder-point source, weren't verified this pass.

Related

An autoqa live-walk was requested (reachability + gate + the four structure claims) and blocked: admin.foodops.io returned 302 → /login?reason=expired (session expired, KB_TEST_PASSWORD unset in the autoqa lane), so autoqa observed a login form, not the FoodOps nav (peer pj1yojs7, f628962). BLOCKED, not a negative finding. The reachability question — does Shopping List actually render, or is it shipped-but-invisible like proforma/recurring? — plus the visibility gate and all four structure claims remain OPEN, answered in neither direction. A blocked walk is not evidence of absence; do not read this null as "Shopping List doesn't render." This note deliberately records why the null exists: it is tried-and-couldn't (unblock = a credential, in progress) — not nobody-tried (which would need a person) — so the next reader doesn't re-run a blocked attempt as an unstarted one. When KB_TEST_PASSWORD reaches the autoqa lane, the full walk runs and this resolves.

Note: New entry 2026-08-16 · codebase foodops-admin-app@141a197 (not live-walked) Written to close the top open answer-side coverage gap (question-bank refresh 2026-08-16: "What is Shopping List for", "where has it gone", "why greyed out for staff"). Source-derived: ShoppingListPage + shoppingListService (BASE /shoppinglist) + types/shoppingList.ts + the components/shopping-list/* dialogs. Structure captured: auto-fill from low stock (grounded in recipes.md) + manual Add product (productLookup/addToShoppingList/addMultipleProducts, ProductLookupResult.isLowStock); per-line quantity/priority/supplier/purchasing-price edits; Critical/High/Normal/Low priority; tabs not-purchased/purchased/purchased-received; bulk priority/remove; PO preview (getPOPreviewpurchase-orders) and email to supplier (EmailShoppingListDialog/shoppinglist/email-data). Nav item is {id:"shopping-list", label:"Shopping List", path:"/shopping-list"}no inline role/feature gate found in the deployed bundle's nav config, so the "greyed out for staff" answer is given as the platform's general role-access model, NOT a verified specific permission (deliberately, per this session's deployed≠source discipline — see feedback_falsifiability_deployed_vs_source). Live-walk + exact gate = the open follow-up before promoting past draft.

Go beyond POS.
Choose the total solution.

Focus on creating the best experience for your guests while we handle the rest.