Skip to content
Cash Flow Inventory / Docs
Operations

Item Types & Service Catalog

Not everything you sell sits on a shelf. Every product record carries a catalog-wide Item Type (Products → Add Item / Edit Item) — the standard three-way split most accounting and inventory systems use for a sellable catalog entry:

  • Inventory — a physical, stock-tracked good. The default; behaves exactly like every existing product always has.
  • Non-Inventory — a physical thing you sell but don't hold as countable stock: a one-time fee, a pass-through charge, a drop-shipped line you never warehouse.
  • Service — labor, consulting, installation, or any other non-physical line item. No stock, ever.

Mark an item Non-Inventory or Service and its stock-only fields disappear from the form — opening stock, warehouse/rack assignment, batch tracking, serial tracking, QC required — and shipping-rate calculation is skipped entirely, since there's nothing to weigh, box, or ship. Anything created before this feature existed, or never explicitly set at all, defaults to Inventory: its prior, only-ever behavior.

Who this is for

  • Any business whose catalog mixes physical goods with billable services — a repair shop selling parts and labor, a consultancy billing hours alongside an occasional deliverable, a retailer tacking on a one-time setup fee.
  • Businesses syncing their catalog to WooCommerce who need a service or fee line to show up correctly on the storefront, not as an out-of-stock physical product.
  • Multi-location and enterprise operations that want Service/Non-Inventory lines excluded from stock reports, reorder planning, and available-to-promise by default, instead of filtering them out of every report by hand.

Item Types & Service Catalog — the main screen

drop a screenshot at assets/screenshots/guides/item-type-service-catalog.png to replace this

1. SETTING AN ITEM'S TYPE — STEP BY STEP

  1. Inventory → Products → Add Item (or open an existing item and Edit). The Item Type selector sits in the Physical Attributes section of the form, alongside weight/dimensions.
  2. Choose Inventory, Non-Inventory, or Service. The form updates live: choosing Non-Inventory or Service immediately hides opening stock, warehouse/rack, batch tracking, serial tracking, and QC-required — there's nothing to fill in for fields that don't apply.
  3. Save as normal. The Products list shows Item Type as a real table column (toggleable via the column-visibility control like any other column) and as its own "Filter by Item Type" dropdown option, so a catalog mixing hundreds of physical SKUs with a handful of service lines can be filtered down to just one kind in a click.
Item Type — one choice, three behaviors
graph LR
  A["New / Edit Item"] --> B["Inventory"]
  A --> C["Non-Inventory"]
  A --> D["Service"]
  B --> E["Stock-tracked, ships"]
  C --> F["Physical, not stocked"]
  D --> G["No stock, ever"]

2. WHAT CHANGES ON A SERVICE / NON-INVENTORY ITEM

  • Add/Edit Item form: the whole stock-related section — opening stock, rack/warehouse, batch/serial tracking, QC required, dimensions/weight-based shipping fields — hides itself.
  • Sales Order fulfillment (the one-click "Mark as Fulfilled" flow, and the equivalent step reached via Convert to Fulfilled from a Quotation or Job — see the Leads & Direct Conversions guide): a Service/Non-Inventory line is still invoiced normally and still appears on the Material Issue/Delivery Order/Invoice paperwork, but it never generates an inventory movement — there's no stock to deduct.
  • Approving a Sales Order: a Service/Non-Inventory line is never reserved against stock. Closing or deleting an order correctly never tries to "give back" stock for a line that was never taken from stock to begin with.
  • Products list / product detail page: Item Type shows as its own field, filterable and toggleable like any other column.

Worth flagging: this is a different thing entirely from the item's own After-Sales Service section (Warranty/Guarantee + days) elsewhere on the item form — that's a warranty attached to a *physical* product you still stock, not the item's own stock-tracking type.

3. WOOCOMMERCE EXPORT

WooCommerce has no native "service" product type — its own types are simple/grouped/external/variable — so the correct equivalent, and what this feature actually pushes, is a simple product marked `virtual` with stock management turned off. That's what makes WooCommerce hide shipping-related fields for the listing and stop tracking a stock count for it, exactly like this catalog now treats it locally. It applies on both the Products export stage and the periodic Stock sync stage, so a later stock-only sync run doesn't accidentally re-enable stock management on a Service item.

4. HOW IT CONNECTS TO THE REST OF THE SYSTEM

  • Sales Orders, Quotations & Jobs — a Service/Non-Inventory line can be added, priced, discounted, and taxed exactly like any other line on any sales document; the only difference is it never touches stock.
  • Service & Job Templates — a saved template can freely mix Inventory, Non-Inventory, and Service lines (a "Standard Installation Package" might be one physical part plus one labor line), and starting a Quotation/Job from it carries that type-driven behavior through automatically.
  • Bill of Materials & Production — Item Type is independent of the Raw Material/kit flag; a Service item is never a valid BOM component, since there's nothing physical to consume, so it simply doesn't appear in BOM component pickers.
  • Reorder Planning & Stock Reports — Service and Non-Inventory items are excluded from reorder-point calculations, available-to-promise, and stock-health reporting, since none of those concepts apply to a line with no physical form.
  • WooCommerce / ecommerce integrations — see section 3 above.

5. WHY IT SCALES FROM SMB TO ENTERPRISE

01

Small business / solo service provider

Every item can just be Service — no stock module to configure, no warehouse to set up, just billable line items.

02

Growing business

A mixed-catalog business — repair shop, installer, consultancy with deliverables — tags exactly the items that need stock tracking as Inventory and leaves everything else Non-Inventory/Service, with no need to fake a "phantom" stock item just to bill a fee or a labor line.

03

Enterprise / multi-location

Reorder planning, available-to-promise, and stock reports stay clean and accurate because Service/Non-Inventory noise is excluded at the data model level, not filtered out ad hoc in every single report.

6. SETTINGS

None — Item Type is always available on every item, the same as any other catalog field. There's no separate on/off toggle to turn this feature on for a business.

7. BILL OF MATERIALS / PRODUCTION ORDER ELIGIBILITY (added 2026-08-07)

This is a SEPARATE axis from Item Type — easy to confuse, since both get informally called "item type" in conversation:

no_vendor = 1 -> produced in-house, not bought from a supplier no_vendor = 0 -> sourced from a supplier (purchasable)

It's set via the "Raw material (production item, no supplier)" checkbox on the item's Add/Edit form. This flag, NOT Item Type, is what actually gates whether an item can be manufactured:

  • Bill of Materials "what am I building" picker and Production Order's own target picker: only items with no_vendor=1 are selectable, and Item Type must not be Service — a service can't be manufactured.
  • Bill of Materials material/component picker and Production Order's own material picker: only items with no_vendor=0 (or unset) are selectable, and Item Type must not be Service — a service can't be a physical input material either.
  • The Purchase Order item picker already excludes no_vendor=1 items, since you don't buy from a supplier what you make yourself — this was already correct before 2026-08-07, so no change was needed there.

Before 2026-08-07, the Bill of Materials pickers had no filtering at all — any item, including Service-type or vendor-purchased items, could be added as a BOM target or material — while Production Order's own pickers already had the correct no_vendor filter. BOM now matches Production Order's already-proven pattern.

Item Type = Inventory is not itself required for BOM/Production eligibility (Non-Inventory items with no_vendor=1 are still allowed — an in-house-assembled kit you don't hold as countable stock, say) — only Item Type = Service is excluded, since a service categorically cannot be manufactured or consumed as a material.

8. SERVICE TEMPLATES — DELIBERATELY UNRESTRICTED (added 2026-08-07)

service-template.php's item picker does NOT filter by Item Type, and that's intentional, not a gap: a Service Template legitimately bundles a mix of Service-type labor lines and physical Inventory materials in one reusable package — an "Installation Package" might be 2 hours labor plus 3 mounting brackets. Restricting the picker to Service-only items would break that. Service-type items were already fully pickable here before 2026-08-07 — confirmed no exclusion ever existed.

9. SHOPIFY / BIGCOMMERCE EXPORT (added 2026-08-07)

WooCommerce export already handled Service/Non-Inventory items correctly (manage_stock=false, virtual=true — see section 3). Shopify and BigCommerce had no equivalent handling before 2026-08-07:

  • Shopify has no separate "virtual product" flag; instead each variant carries requires_shipping. Export now sets requires_shipping=false on the variant whenever Item Type is Service or Non-Inventory, mirroring WooCommerce's own predicate.
  • BigCommerce supports inventory_tracking: 'none' for non-stock items. Export now sends that value — instead of the always-on 'variant'/'product' it sent before — for the same Item Type predicate.

Both changes are export-payload-only: no schema change, no backfill, and they apply to future sync runs only, per the "new entries going forward" scope this pass was done under.

Quick Reference

Quick reference — where things live
  Set an item's type ........................ Product Add/Edit form >
                                             Physical Attributes > Item Type
                                             (also editable on product.php's
                                             own Edit form as of 2026-08-07)
  Filter the Products list by type . Products list > Filter by Item Type
  Show/hide the Item Type column .... Products list > column-visibility
                                             control
  WooCommerce export behavior ....... Integrations > WooCommerce (applies
                                             automatically, no separate toggle)
  Shopify export behavior ........... Integrations > Shopify (applies
                                             automatically, no separate toggle)
  BigCommerce export behavior ....... Integrations > BigCommerce (applies
                                             automatically, no separate toggle)
  "Produced in-house, no supplier" .. Product Add/Edit form > "Raw material
                                             (production item, no supplier)"
                                             checkbox (sets no_vendor=1) --
                                             this, not Item Type, gates BOM/
                                             Production Order eligibility

See this running in your own account

Free to start, no credit card required — most businesses are set up and creating real records within minutes.

Create free account