Products & inventory
Everything you sell lives in Inventory. A product in Distribu is a single SKU with a name, price, stock level, unit of measure, optional category and image, and an active/inactive flag. The same catalog powers three things:
- Your dashboard — what your staff sees in
/dashboard/inventory. - Your storefront — what customers browse at
/store/{your-slug}/catalog. - The REST API and webhooks — what external systems (ERPs, Shopify, etc.)
read and write via
/api/v1/products.
All three are the same data. There's no separate "storefront catalog" to sync — toggling a product inactive hides it from customers immediately; bumping a price in the dashboard changes it on the next storefront page load.
What's in this section
- Adding products — the add/edit form, required and optional fields, and plan limits.
- Product images — accepted formats, size limits, and where images are stored.
- Stock tracking — how stock decrements on orders, low-stock alerts, and bulk adjustments.
- CSV import — bulk-create or update your entire catalog from a spreadsheet.
Related topics
- Per-customer price overrides — set custom pricing on a specific product for a specific customer without touching the catalog price.
- Products CSV format — the exact column spec used by both import and export.
- REST API — Products endpoints — read, create, update, and delete products programmatically.
Anatomy of a product
| Field | Type | Notes |
|---|---|---|
name | string, required | Shown in the dashboard, storefront, and on invoices. Max 200 chars. |
sku | string, optional | Your internal product code. Max 100 chars. Required for CSV import so we can match rows. |
description | string, optional | Long-form product copy shown on the storefront product page. Max 2000 chars. |
category | string, optional | Used to group products on the storefront and in category breakdown reports. Free-form — pick any label. |
unit | string, required | Unit of measure. Defaults to each. One of: each, case, pallet, box, bag, roll, sheet, lb, oz, kg, L, mL. |
price | decimal, required | Up to 2 decimal places. Must be ≥ 0. |
stock | integer, required | Whole number ≥ 0. Decrements automatically when orders are placed. |
imageUrl | URL, optional | Public URL of the product image. Uploaded via the form — see Product images. |
isActive | boolean, defaults to true | Inactive products are hidden from the storefront but stay in your dashboard. |
Products are scoped to your company. Two different distributors can both
have a product with SKU WIDGET-001 — they're separate rows, never visible to
each other.
Next: Adding products.
