> ## Documentation Index
> Fetch the complete documentation index at: https://docs.1club.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Inventory and stock

> Track stock levels per location, record receive, sale, adjustment, and waste movements, and build cafe or bar recipes from ingredients that decrement automatically when a product sells.

Inventory lets your gym track physical stock behind the point of sale: bottled drinks and merchandise in a pro-shop, and the raw ingredients that make up cafe or bar items. When a product sells, stock decrements automatically, so on-hand counts stay accurate without manual bookkeeping. Managers receive, adjust, and write off stock and build recipes; front-desk staff can see stock levels and sell as normal.

Inventory is an opt-in feature. Until you turn it on, products sell without any stock tracking.

## When to use it

Turn inventory on when you sell physical goods and want to know what is left at each location without counting by hand after every sale. Every change is recorded in a ledger you can audit, and each location keeps its own count.

Typical uses:

* **A pro-shop with bottled drinks and merchandise** - each bottle of water or branded t-shirt you ring up takes one unit off that location's count.
* **A cafe that makes drinks to order** - a latte recipe of 18 g of coffee beans and 150 ml of milk draws down both ingredients on each sale, and if you have milk for 40 lattes but beans for only 12, 1Club shows 12 available.
* **Keeping counts honest** - you record a spilled or spoiled item as waste, correct the count after a physical stock-take, and you review write-offs in the movements report.

See [A typical pro-shop and cafe workflow](#a-typical-pro-shop-and-cafe-workflow) for how to set this up end to end.

## Two kinds of stock: products and ingredients

Every stock record points at exactly one of two things:

* **Products** - packaged items you buy and resell as-is, like a bottle of water or a branded t-shirt. Products are always counted in whole units (`each`).
* **Ingredients** - raw or prepped items that go into something you sell, like coffee beans, milk, or a burger patty. Ingredients are used to build cafe and bar recipes.

Stock is held separately for each location (your organization's clubs). The same ingredient can have a different quantity on hand at each site.

## Turn on inventory

Go to **Settings** > **Sales** > **Inventory Management** (`/settings/operations/inventory`) and toggle inventory on. The setting is organization-wide and controls whether the **Stock**, **Ingredients**, and **Deliveries** tabs appear under **Sales** > **Products**, and whether stock panels and the **Recipe** action appear on your products.

<Note>
  Enabling inventory changes the product detail page: a stock panel appears and,
  for products you build from ingredients, a **Recipe** action becomes
  available. With inventory off, neither shows.
</Note>

Reading stock requires the `inventory.read.club` permission; receiving, adjusting, and editing recipes require `inventory.manage.club`. Turning the feature on or off requires `settings.manage.organization`.

## Units of measure

Each ingredient has a base unit of measure that is fixed when you create it and cannot be changed afterwards. There are three base units:

| Base unit | Use for | Dimension |
| - | - | - |
| `g` | Anything weighed (beans, meat, powder) | Mass |
| `ml` | Anything poured (milk, syrup, spirits) | Volume |
| `each` | Anything counted (cups, bottles, patties) | Count |

When you receive or adjust stock you can enter quantities in a friendlier unit and 1Club converts to the base unit for you: grams accept `g` or `kg`, milliliters accept `ml` or `l`, and counted items accept `each`. Products, which are always counted, only accept `each`.

Conversions stay within the same dimension. You cannot convert a weight into a volume or a count - milliliters never become grams. Pick the base unit that matches how you actually measure the ingredient.

## Stock levels

The stock page at **Sales** > **Products** > **Stock** (`/billing/products/stock`) lists the current quantity on hand for every product and ingredient, at every location you can access. Each row shows whether it is a product or an ingredient, its name, the location, and the on-hand quantity in its base unit.

Click a row to open the underlying product or ingredient. Click **Add stock** to record a delivery, or use the row action to adjust a count.

## Stock movements

Every change to stock is written to an immutable ledger as a movement. A movement records the item, the location, a signed quantity in the base unit, the type of change, and an optional reason. There are four movement types:

* **Receive** - stock coming in, for example a delivery from a supplier. Quantity is positive and increases what is on hand. A reason is optional.
* **Sale** - stock going out because an order was fulfilled. Quantity is negative and is recorded automatically (see below). You never enter a sale by hand.
* **Adjustment** - a manual correction, for example after a stock count finds more or fewer units than expected. The quantity is signed, so you can add or remove, and a reason is required.
* **Waste** - stock written off, for example a spilled or spoiled item. Recorded through the same flow as an adjustment, with a required reason.

### Receiving stock

Click **Add stock** on the stock page, pick the product or ingredient, choose the location, and enter the quantity and unit. 1Club creates a `receive` movement and increases the on-hand level.

This is the quick way to book a single item. For a supplier delivery, record it as a [delivery](/sales/deliveries) instead: attach the invoice, review the lines it reads off the document, and post once so the stock and the expense are written together.

### Adjusting and writing off stock

Use the row action on the stock page to open the adjustment dialog. Enter a signed quantity (positive to add, negative to remove), pick **Adjustment** or **Waste** as the type, and give a reason. The reason is mandatory so the ledger stays auditable.

## How a sale decrements stock

When an order that contains a product is fulfilled, 1Club consumes stock for each line automatically, inside the same transaction that records the order. What gets consumed depends on how the product is set up:

* **A product with a recipe** (a cafe or bar item) is exploded into its ingredients, and each ingredient's stock is decremented by the amount the recipe calls for, multiplied by the quantity sold. A single informational `sale` movement is also recorded against the product itself, so the product's history reads "sold N" rather than a scattered list of ingredient draws.
* **A product with no recipe but a direct stock level** (packaged resale, like bottled water) has its own count decremented by one per unit sold.
* **A product that is neither stocked nor recipe-backed** consumes nothing - selling a service or a non-tracked good is a no-op for inventory.

Consumption is idempotent per order line, so re-processing an order never double-counts. If a sale would take stock below zero, it is still recorded and the on-hand level goes negative; 1Club logs a warning rather than blocking the sale, so the point of sale is never held up by a stock discrepancy.

## Recipes and ingredients for cafe and bar

A recipe defines what a sellable product is made of. Build one when a product is not resold as-is but assembled from ingredients - a latte, a cocktail, a protein shake.

On the product detail page, click **Recipe** to add ingredient lines. Each line names an ingredient, a quantity, and a unit, expressed as the amount needed for one unit of the product. For example, a latte recipe might be 18 g of coffee beans and 150 ml of milk.

Ingredients live at **Sales** > **Products** > **Ingredients** (`/billing/products/ingredients`). From there you can create ingredients, set each one's base unit, and open an ingredient to manage its stock. An ingredient cannot be deleted while any recipe still uses it.

### Sub-recipes

An ingredient can itself have a recipe, letting you model prepped components. A "house syrup" ingredient can be built from sugar and water, and any drink recipe that calls for house syrup will explode all the way down to sugar and water when it sells. Recipes can nest several levels deep, and 1Club guards against cycles and runaway depth.

## Availability

For a product built from ingredients, 1Club computes how many whole units you could sell right now at each location. It expands the recipe to its leaf ingredients and takes the lowest number the on-hand stock of any single ingredient allows. If you have milk for 40 lattes but beans for only 12, availability is 12.

The product detail page shows this availability alongside the product's recent movements, scoped to the location you have selected. Products with a direct stock level show that count; products that are neither stocked nor recipe-backed show as not tracked.

## Inventory movements report

The analytics report at **Analytics** > **Inventory** > **Movements** (`/analytics/inventory/movements`) is the full stock ledger across your organization. It lists every movement newest first, with its date, type, whether it targeted a product or an ingredient, the item name, the location, the signed quantity, a link to the originating order for sales, and the reason for manual changes.

Filter by movement type to focus on one kind of change - for example show only **waste** to review write-offs, or only **receive** to check deliveries.

## A typical pro-shop and cafe workflow

<Steps>
  <Step title="Turn on inventory">
    Enable the feature in **Settings** > **Sales** > **Inventory Management**.
  </Step>

  <Step title="Set up what you stock">
    Create ingredients for cafe and bar items (beans, milk, syrup) with the
    right base unit, and make sure resale products like bottled water exist as
    products.
  </Step>

  <Step title="Build recipes">
    For each cafe or bar product, open it and add a recipe listing the
    ingredients and quantities it consumes per unit.
  </Step>

  <Step title="Receive opening stock">
    On the stock page, click **Add stock** to record what you have on hand at
    each location.
  </Step>

  <Step title="Sell as normal">
    Ring up products at the point of sale. Sales decrement ingredient or product
    stock automatically.
  </Step>

  <Step title="Keep counts honest">
    Record waste as it happens, and use adjustments after a physical count to
    reconcile on-hand levels. Review the movements report to audit the ledger.
  </Step>
</Steps>

## Related

* [Deliveries](/sales/deliveries) - booking supplier deliveries, with invoice scanning and the matching expense
* [Products](/sales/products) - the catalog items you sell and attach recipes to
* [Point of sale](/pos/point-of-sale) - where sales that decrement stock are rung up
* [Sales overview](/sales/overview) - how products, orders, and revenue fit together
* [Analytics overview](/analytics/overview) - where the inventory movements report lives


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.