1. Home
  2. Features
  3. Inventory & Purchasing
Inventory & Purchasing · Built into RootControl

From "we're running low" to "stock's on the shelf."

Per-location on-hand with moving-average cost. Lot tracking for chemicals and fertilizer. A vendor catalog with preferred-supplier preferences. Purchase Orders that bump inventory the moment you mark them received. And one button on the Supply Forecast that drafts the POs you need, grouped by the vendor that should supply them.

Per-location on-hand Moving-average cost Lot tracking Vendor catalog Draft POs from forecast Receive → ledger
Why landscape companies lose money on materials

Three places stock falls through the cracks.

If your supplier-bill stack is what keeps your stockroom honest, you're already late. Three patterns repeat across every landscape shop that adds a serious treatment program, plant material, or hardscape mix to the menu.

You only know you're out when the truck's loaded.

The forecast lives in someone's head. Crews leave HQ short a bag of pre-emergent or two pallets of pavers, lose a half-day driving back, and the job runs late on top of the missed margin.

You can't tell which supplier you paid.

"Vendor" is a free-text string scattered across years of supplier invoices. Same vendor spelled four ways, no priority ordering, no notion of who should supply what — so every reorder is a phone-call exercise.

Receiving is paperwork, not data.

The dock stamps a packing slip; nothing flows to your books. Moving-average cost drifts, lot expiry on regulated product goes untracked, and the regulator-grade paper trail your applicator license depends on quietly thins out.

The closed loop

From shortage row to stock on the shelf, in five steps

One queue carries demand from the Supply Forecast all the way to a stockroom update. Every step is auditable; every step is safe to retry.

1

The Supply Forecast surfaces the shortage

For every treatment program with assigned properties, the forecast rolls round-by-round product demand into an annual total per product, subtracts what's already on hand, and lists what's short. Rate strings like "oz / 1000 sqft" and "lb / acre" turn into a per-property quantity automatically. Anything the parser doesn't recognise is flagged so you can clean up the catalog entry.

2

One click drafts the POs, grouped by preferred vendor

"Draft POs" on the Supply Forecast page reads each shortage row's preferred vendor (lowest priority wins) and creates one draft Purchase Order per vendor, plus a single "no-vendor" bucket for products that don't yet have a supplier preference. Annual rollup means you don't get a dozen tiny POs across rounds for the same product.

3

Review, set costs, mark sent

The PO detail modal shows lines with editable unit cost and quantity. Status flows through four states: draft, sent, received, or cancelled at any non-terminal step. While a PO is in draft you can edit anything. Once it's sent, only delivery location stays editable so you can re-route receive without re-doing the order. Corrections after sent happen via cancel and redraft, not in-place edit.

4

Mark received — inventory bumps in the same step

Marking a PO received writes one stock-movement per line (tied back to the PO line for the audit trail), bumps on-hand at the destination location, and recomputes moving-average cost. The destination is either an explicit override at receive time, the PO's delivery location, or your HQ yard as a safe fallback so the receive never silently fails.

5

Lot & expiry get carried through the lifecycle

For chemicals and fertilizer, the receive form surfaces lot number and expiry date. Both ride along on every ledger entry tied to the lot, including the consume entry when a crew logs an application that pulls from the linked product. The expiring-lots view surfaces anything within a window you set (30 days by default).

What's in the module

The pieces that close the loop

Each piece is wired to the next so there's no manual hand-off between forecast, ordering, receiving, and the stock ledger.

Per-Location Stock Ledger

Every location (HQ, satellites, trucks) holds its own on-hand quantity and rolls into the moving-average cost. Receive, transfer, consume, return, and adjust movements form the audit trail. Nothing edits an existing entry — the ledger is append-only.

  • Every org gets an HQ yard on day one so the first receive never fails for a missing location
  • Multiple yards are supported, so growing from one yard to several doesn't strand existing stock
  • Moving-average cost recomputed on every receipt with concurrency-safe locking
  • Two crews consuming the same SKU at the same time never push on-hand into the negative
Professional+

Lot Tracking & Expiry Alerts

Regulated product (chemicals, fertilizer) carries lot number and expiry through every ledger entry from receive to consume. Foremen get an alert when a lot crosses the expiry window so product doesn't go off-spec on your shelf.

  • Lot inputs only show up for fertilizer and chemicals — the receive form stays clean for other products
  • Lot rides along on the consume entry when a crew logs an application that pulls from the linked product
  • Expiring-lots view, with a window you set (30 days by default)
  • One notification fires per expiring lot — routed to foremen, not the whole office
Professional+

Vendor Catalog & Preferences

A real vendor record — not just a free-text string on an invoice. Contact info, payment terms, QuickBooks link, and per-product preferences with priority ordering. The catalog is the source of truth for who should supply what.

  • Same vendor name can't be typed in twice — the catalog tells you it already exists
  • Per-product preference list shows priority ordering; lower priority wins when POs auto-group by vendor
  • Cross-org guards on both product and vendor — one org's catalog can never link into another's
  • Coexists with the legacy spend-aggregation view so a tenant already using it doesn't see a regression
Professional+

Purchase Orders

Draft, sent, received, cancelled. You can't skip "sent", you can't edit lines on a sent PO. Receive is the only step that touches inventory — cancel before that point and nothing in the stockroom moves.

  • Auto-generated PO numbers, guaranteed unique per org — no overlap with anyone else's numbering
  • Source badge on every PO so you can tell at a glance whether it was hand-built or auto-drafted from the Supply Forecast
  • Once a PO is sent, only the delivery location stays editable; corrections after that point happen via cancel and redraft
  • Receive is all-or-nothing across every line — either every line bumps inventory or none do
Professional+

Draft POs from Supply Forecast

One click on the Supply Forecast page groups every shortage row by its preferred vendor and creates one draft PO per vendor, plus a no-vendor bucket. Quantities roll up annually so you get one PO per vendor per program, not a dozen tiny ones per round.

  • Grouping reads each product's preferred-vendor list from the Vendor Catalog
  • Products without a preferred vendor land in a single bucket; you can assign a vendor after the fact
  • Pack-size rounding (bag, pallet, ton) applied per round before the annual sum
  • Result panel breaks out vendor-grouped vs. unassigned counts and deep-links to the filtered PO list
Professional+

Vendor Backfill from Invoices

Most shops arrive with years of supplier invoices where "vendor" is a free-text string and no managed record exists. One pass walks every unlinked invoice, matches against your existing vendors regardless of capitalisation, and (optionally) creates stub records for unmatched names.

  • Case-insensitive match against your existing vendor list
  • Auto-create off by default for cautious shops; flip it on for the fastest backfill
  • Safe to run by two people at the same time — the system won't create the same vendor twice
  • Result panel: created vs. linked counts, plus any unmatched names for manual review
Professional+

Fertilizer Auto-Decrement Bridge

Link a fertilizer product to its inventory SKU. When a crew completes a fertilizer application, RootControl writes one stock-consume entry per linked product line. A re-save of the completed record can't double-decrement; a cancel restores the stock automatically.

  • Org-level toggle, on by default — turn it off if you run a separate stockroom
  • A re-save of a completed application can't double-decrement — the system recognises the second write as a no-op
  • Source location picks the right truck if the job is tied to one, otherwise falls back to your HQ yard
  • Cancelling a completed application writes a compensating adjust entry that restores on-hand
Professional+

Low-Stock Notifications

Set a reorder point per product. When on-hand crosses below that line for the first time, one notification fires to your foremen. No re-firing on every page reload, no spam if the stock dips and recovers.

  • Fires once on the way down, not every time someone loads the page
  • A receipt that brings stock back above the threshold resets it — the next dip below fires again
  • Same notification stream as expiring-lots so foremen see all stockroom alerts in one place
  • Routed to foremen by default, keeping the office-admin inbox clean
Professional+
Quiet correctness

The guardrails you don't see until they save you

Most of inventory's value is what doesn't go wrong. These are the rules that keep the ledger honest when two people, two crews, and a flaky barn Wi-Fi connection all touch it at once.

What the system enforces, every write

  • Every stock movement carries an idempotency key. A duplicate submission — from a tap retry or an offline-then-online sync — returns the existing entry, not a duplicate row or a confusing error.
  • Two crews consuming the same product at the same time: one succeeds, one is told the stock isn't there. Final on-hand is never negative.
  • One org can never see, query, or probe another org's location, product, lot, vendor, or PO — not even to discover whether a record exists.
  • Field crew can receive product on the truck via the mobile app, but is blocked on the office surface and never sees cost or pricing fields.
  • The mobile-side read endpoints strip pricing entirely — crews see quantities, not the shop's cost basis.
  • If a supplier receive references an unknown product, the entire receive rolls back. No half-written batches.
  • PO receive is all-or-nothing across every line. If any line fails, the PO stays sent and nothing in inventory moves.
  • Vendor preference writes verify that both the product and the vendor belong to your org before the row is saved.
  • The backfill handles the case where two staffers run it at the same time — the system won't create the same vendor twice.
  • If the inventory side can't resolve a source location, the regulatory record still commits. Stock bookkeeping never blocks a compliance write.

Inventory is a place where soft-failures compound silently. Every guardrail above is backed by a test that proves it works under the failure case, not just the happy path.

FAQ

Inventory & Purchasing FAQ

How does the Supply Forecast turn into Purchase Orders?
From any treatment program with assigned properties, the forecast rolls round-by-round demand up to an annual per-product total, subtracts what's on hand, and surfaces the shortage. One click on Draft POs groups the shortage rows by each product's preferred vendor (lowest priority wins) and creates one draft PO per vendor, plus a single no-vendor bucket. Quantities are rolled up annually so you don't get many tiny POs for the same product across rounds. You review, set unit cost on each line, mark the PO sent, then mark it received — and the receive step writes the stockroom updates in the same operation.
What does lot tracking actually do?
When you receive a chemical or fertilizer product, the receive form asks for lot number and expiry date. Both are stored on the receipt, and from then on every stockroom entry tied to that lot carries the identifier — including the consume entry when a crew logs an application that pulls from the linked product. An expiring-lots view surfaces receipts whose expiry falls within a window you set (30 days by default), and a notification fires so foremen get a heads-up before product goes off-spec.
How does the fertilizer auto-decrement work?
Link a fertilizer product to its inventory SKU through the "Inventory bridge" picker on the office-side product form. When a crew completes a fertilizer application, RootControl writes one stock-consume entry per linked product line. A re-save of the completed record can't double-decrement — the system recognises the second write as a no-op. If the application is later cancelled, a compensating entry restores the on-hand. Shops that run a separate stockroom can turn the auto-decrement off entirely.
Can I import historical vendors I've been using for years?
Yes. Most landscape companies arrive with years of supplier invoices where "vendor" is just a free-text string and no managed record exists. The "Backfill from invoices" button on Vendor Catalog walks every supplier invoice that has a name but no managed-vendor link, matches against your existing vendors regardless of capitalisation, and optionally creates stub records for unmatched names. The result panel reports created vs. linked counts plus any unmatched names so you can review.
Does inventory work without a treatment program?
Yes. The core ledger — locations, on-hand, moving-average cost, stock movements, lot tracking, vendor catalog, Purchase Orders — is independent of treatment programs. Treatment programs feed the Supply Forecast, which is one of two ways to draft POs. The other is creating a manual PO directly from the Purchase Orders page, which works for any product. Inventory & Purchasing is on the Professional and Enterprise plans.
What happens if I cancel a PO after I've already marked it received?
"Received" is the end of the line — you can't transition back. Fixing a mistaken receive happens through manual adjust entries today. An explicit "cancel received PO" with auto-reversing adjusts is on the roadmap, and the pattern is already in place for fertilizer-application cancels, so the work is mostly mirroring what's there.
Related capabilities

Explore more of RootControl

Get Started

See the loop close in a 30-minute walkthrough

Bring a treatment program you actually run and a vendor you actually use. We'll draft the POs, mark them received, and show you the stock-movement ledger entries before the call ends.