Products & SKUs
Everything you sell or stock should have a product record. The product table is the source of truth that POs, sales, write-offs, and reports all hang off of.
Adding a product
Open Products → New product. The minimum fields are SKU and name; everything else can be filled in later.
SKU naming. Pick a format and stick with it. SKUs are workspace-scoped, so they only need to be unique to you. Common patterns:
BRAND-LINE-VARIANT— e.g.RR-THfor Royal Red tee holderCATEGORY-NUMBER— e.g.WIDGET-001- Mirror your Shopify variant SKUs so imports auto-match
Reorder point. When on-hand drops below this number, the SKU shows up on the dashboard's Low stock card. Set this once you have a feel for sell-through; leave it blank until you do.
Reorder qty. How many to reorder when you re-up. Used as a default on new POs.
Lead time (days). How long the supplier takes to deliver. Drives reorder-by-date math.
Hidden vs. archived
Products live in three states:
- Active — the default; shows everywhere, available on POs and sales
- Hidden — kept on the books but hidden from the main list. Use for products you've stopped selling but might bring back
- Archived — soft-deleted. Excluded from queries; won't show on POs or imports. Use when you're sure you're done
You can toggle hidden/archived from the product detail page.
Simple vs. bundle
- Simple — tracked directly. Receive, sell, count, write off. The default
- Bundle — assembled from component SKUs. A "Holder + 10 tees" product is really 1 holder + 1 bag-portion of tees. Bundles need an assembly step before they can be sold (see Assembly)
Bundle component editing is currently done in Prisma Studio (npm run db:studio). The dedicated UI is on the roadmap.
Shopify import
If you sell on Shopify, Settings → Shopify lets you connect your store. Once connected, Integrations → Shopify products lists every Shopify product with three options per row:
- Link to existing — match the Shopify variant to a product you already have
- Create new — pull the variant in as a new product
- Skip — never import this variant
Multi-pack support is built in: a single product can be the inventory source for multiple Shopify variants via a units per order multiplier (e.g. one CC-PYN product supplies both 1-pack at units=1 and 2-pack at units=2).
Costs and visibility
Cost columns (landed unit cost, line totals, COGS) are gated by the costs:view permission. Owner, Admin, and Accountant see them. Fulfillment and Viewer roles do not. This is enforced at the page level and cannot be bypassed by URL.