Managing the Products Catalog
The single source of truth for every purchasable item — and how the Maintenance Part category quietly keeps a second table in sync behind the scenes.
On this page
Why a catalog is required
Go to Purchasing > Products. Every line item on a Requisition or PO must reference a catalog entry here — there is no free-text line-item option. This keeps naming, categorization, and cost reporting consistent across every order.
The three categories
Category is required and picked once, at creation:
| Category | What it does | Project assignment |
|---|---|---|
| Maintenance Part | Feeds CMMS parts inventory. Saving one auto-creates (and keeps in sync) a matching row in Parts. | Can't take a project. Quantity must stay a whole number. |
| Stocked Material | Landscape supplies kept on hand (mulch, seed, fertilizer). | Can optionally be assigned to a project on a PO/Requisition line. |
| Project Material | Job-specific materials bought for one particular job. | Can optionally be assigned to a project on a PO/Requisition line. |
project_id — added specifically after two separate UI paths (an inline line edit, and adding to an existing PO/Requisition from a Project's detail panel) were found to let it slip through. It's not just a form validation; it can't happen at all now, from any screen.Adding a product
Click + New Product. The Details tab has: Name (required), Category (required), Part Number/SKU, Vendor (with inline “create new vendor”), Unit Cost, Sale Price, Description, and a “Track inventory quantity” checkbox that reveals a Quantity on Hand field when checked.
Selecting category Maintenance Part reveals an additional highlighted block: Part Category (a dropdown of your org's configured CMMS part categories) and Min Stock. Neither field appears for Stocked Material or Project Material.
Chemical tracking
Checking Track Chemicals reveals a second Chemical tab: Scientific Name, EPA Registration #, EPA URL, Label Instructions, Client Route Sheet Instructions, Re-Entry Interval, a “Restricted Use Product” flag, and a repeatable list of Active Ingredients (name + percentage). Use this for any fertilizer, herbicide, or pesticide product where label compliance and client-facing route sheets matter.
The Maintenance Part ↔ CMMS Parts link
There is no picker to manually link a product to an existing Part. Instead, saving a product with category Maintenance Part automatically creates a matching row in CMMS Parts, copying over name, part number, description, unit cost, quantity on hand, minimum stock, and vendor. From then on the two rows are kept in sync automatically: editing any of those fields on the product pushes the same change to its linked part, and quantity changes (from receiving or Work Order parts usage) flow through a row-locked database function on both sides so concurrent updates can't corrupt the count.
Unit Cost vs. Sale Price vs. a PO line's actual cost
A product has two money fields: Unit Cost (what you pay) and Sale Price (what a client is charged, used elsewhere in job/estimate pricing — not used by Purchasing at all). Only Unit Cost is touched by receiving.
The catalog's Unit Cost is a suggestion, not a lock. When you add the product to a new PO or Requisition line, the line pre-fills from the catalog cost (via whichever costing method your org uses — see the Inventory Costing Methods guide) but the line's cost field is fully editable from there. Changing it on the line does not write back to the catalog — the two can silently diverge, and that's expected.
Archiving a product
Deleting a product is a soft delete — it sets an internal “removed” timestamp rather than actually erasing the row, even though the confirmation dialog says the action “cannot be undone.” An archived product disappears from the catalog list and can no longer be selected on a new line, but every PO or Requisition that already referenced it is unaffected — those records store their own copy of the name, part number, and cost at the time they were ordered, so historical documents keep displaying correctly. There is currently no Restore button anywhere in the UI; reactivating an archived product requires a direct database change.
Bulk import
Products can be bulk-imported from two places — the Products page toolbar, and Settings > Equipt Settings > Import/Export — both calling the same underlying import logic, see the Import & Export guide for the general mechanics. A few product-specific details worth knowing:
- Category is normalized loosely. Values like “parts,” “stock,” “supplies,” or “job” are all recognized and mapped to the correct category — you don't need the exact enum spelling in your spreadsheet. A row with an unrecognizable category, or a missing name, is skipped rather than failing the whole import.
- Dedup only works by Part Number. A row whose part number matches an existing product updates that product instead of creating a duplicate. Rows with a blank part number always insert as new — two rows with the identical name but no part number become two separate catalog entries, not one.
Gotchas
- Product names aren't required to be unique. Only Part Number is deduplicated (and only when it's non-blank) — nothing stops two products from sharing the exact same name.
- The delete confirmation is misleading. It reads “This action cannot be undone” but the underlying operation is a reversible soft delete.
- Maintenance Part quantities must stay whole numbers, enforced by the database on the product, and again on every Requisition, PO, and receiving line that references it — attempting a fractional quantity (e.g. via a CSV import) fails with a database error rather than a form warning. Stocked Material and Project Material support two decimal places (e.g. partial yards of mulch).
- The two import entry points require slightly different columns — the Products-page importer doesn't require Part Number, the Settings-tab importer does — even though both run identical logic underneath.