Why line-item granularity matters
Most accounting tools categorize at the vendor level. Sysco = "Food." Restaurant Depot = "Food." Ecolab = "Supplies." It's fine for your tax return. It's useless for running your business.
A $3,100 Sysco invoice could be 40% produce, 25% dairy, 20% dry goods, 10% paper, 5% seafood. When produce inflation hits, vendor-level tagging shows you "food cost went up." CostIQ tells you produce went up 12%, dry goods held flat, dairy dropped 3% — so you know which distributor to renegotiate with, which SKUs to swap, and which menu items to re-price.
The 19 categories
CostIQ's category set was designed around how multi-location operators actually think about their P&L:
Nineteen was a deliberate number. Fewer categories lose signal (food vs. beverage is not enough when you need to see dairy inflation). More categories make manual overrides a nightmare and confuse the classifier. Nineteen hits the Prime Cost mental model — Food, Beverage, Paper, Chemicals, Smallwares, Equipment — with enough depth to act on.
The classification model
CostIQ runs as a second pass right after NexosIQ extraction completes. For each line item on the invoice, the classifier gets three signals:
- Vendor context. If the invoice is from Ecolab (a cleaning chemical distributor), line items default toward
chemicals_cleaning. If from RNDC (a liquor distributor), they default towardbeverage_liquor. Vendor context is a prior, not a verdict — overridden when line-item text disagrees. - Line-item text. "LEMON RINSE POWER 3-IN-1" reads as chemicals even on a mixed-distributor invoice. "CHK BRST 40# CS" reads as meat regardless of who sent the invoice. The model learns the distribution of product-name patterns per category across millions of real-world line items.
- Unit + packaging context. Case counts, weights, UOMs give secondary signals. "50 LB BAG" suggests dry goods. "CS/24 CAN" suggests beverage. "GAL CONC" suggests cleaning concentrate.
Why we don't use a static keyword map
The obvious approach — "if line contains ‘chicken’ then meat" — fails on real invoices. Examples we've hit in production:
- "CHICKEN WIRE 50FT ROLL" is smallwares, not poultry.
- "FISH SAUCE 5 GAL" is dry goods / pantry, not seafood.
- "COFFEE FILTER BASKET CS/500" is paper, not beverage.
- "LIQUID EGG 6/5LB" is dairy category in our system (refrigerated protein), not meat.
The classifier has to weigh context. Vendor-first disambiguates most edge cases; unit context handles the rest; the minority that remain ambiguous get flagged with lower confidence so a controller can override with one click and the override feeds future accuracy.
Per-tenant learning
Every manual override becomes training signal for that tenant. If a hospitality group renames "soda syrup" consistently as beverage_non_alcoholic and another overrides it to food_dry_goods (because they're a convenience store that retails it), CostIQ learns each tenant's taxonomy without bleeding between accounts.
Where it feeds
CostIQ categories appear throughout the platform:
- CostIQ Category Analysis sheet in generated Excel reports — category-by-store spend with totals, percentages, and confidence scores.
- True P&L uses CostIQ-tagged invoice totals as the COGS numerator (Professional tier).
- Multi-Location Benchmarking ranks stores by category-level spend.
- Vendor Price Tracking identifies price trends at the SKU level across vendors.
- Cross-Store Price Comparison surfaces which stores are paying more for the same item.
Accuracy
On our production dataset (50k+ real-world invoices across restaurant, retail, and hospitality tenants): ~95% category accuracy at the line-item level. Most errors are ambiguous dual-use items (is that case of olive oil food or smallwares?). Operators rarely override, and when they do, the tenant-specific learning layer absorbs the feedback.
Want per-vendor benchmarks?
We publish anonymized per-vendor category benchmarks quarterly for enterprise customers. Curious how your Sysco mix compares to peers? Get in touch.