Products and categories

Create categories, track stock and pricing, set low-stock thresholds, and handle services that should not decrement inventory.

How products work

A product is anything you sell: a physical item you hold stock of, or a service you perform. The two are handled differently, and isService is the switch.

FieldMeaning
nameShown at the point of sale. Required.
skuYour own stock-keeping code. Optional, not enforced unique.
buyingPriceWhat you pay. Use 0 for services.
sellingPriceWhat the customer pays.
quantityUnits on hand.
lowStockThreshold for low-stock alerts. Defaults to 5.
isServicetrue means this never decrements stock when sold.
categoryIdWhich category it appears under.
imageUrlOptional product photo.
isActivefalse means deleted. See soft deletes.

Categories

Categories group products and fix their order at the till. Sort order is controlled by sortOrder — lower comes first.

BusinessTypical categories
SalonHair services, Treatments, Products
ShopBeverages, Snacks, Household, Toiletries
PharmacyPrescription, OTC, Vitamins, Personal care
RestaurantMain, Sides, Drinks, Desserts

Categories are listed with a live product count, which is how the app shows how much sits under each heading.

Adding products

From the app

Open Inventory, choose a category, then Add product. Enter the name and the two prices, set the opening quantity, and save. The product is written locally and syncs in the background — you do not need a connection.

From the API

bash
curl -X POST https://aide.omixsystems.store/api/products \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "name": "Maid stout 500ml",
    "sku": "BEV-014",
    "buyingPrice": 80,
    "sellingPrice": 130,
    "quantity": 24,
    "lowStock": 6,
    "categoryId": "cat_bev"
  }'

See Products for the full request and response.

Services versus stock

Set isService to true for anything you do not hold inventory of:

json
{ "name": "Braids - medium", "sellingPrice": 2500, "buyingPrice": 0, "isService": true, "quantity": 0 }

The difference is enforced at the sale:

js
// A service line never touches inventory.
if (item.productId && !item.isService) {
  await tx.product.updateMany({
    where: { id: item.productId, businessId },
    data: { quantity: { decrement: item.quantity } },
  });
}

If you leave isService as false on a haircut, every sale drives its quantity negative and it will show up in low-stock alerts forever.

Low-stock alerts

When a stock product falls to or below its lowStock threshold it appears:

  • in the low stock list on the dashboard
  • as an inventory notification, if you have those enabled

The threshold is per product. Bottled water and hair dye have different reorder points, so set each one deliberately rather than leaving the default. See Notifications to choose which alerts you get.

Adjusting stock

Edit the product and change quantity. Two rules are worth knowing:

  • Adjusting stock is not a sale. It changes the count without creating a sale record or affecting your profit figures. Use it for deliveries, breakage and stock counts.
  • Sales adjust stock automatically. You do not need to edit a product after a sale; the quantity is decremented as part of the sale.

For a stock count, edit each affected product's quantity to the counted figure.

Deleting products

Deleting a product sets isActive to false. The row and its history stay in place; it simply disappears from lists and from the point of sale.

This is deliberate. Sales reference products, so a hard delete would either erase your sales history or leave dangling references. See How Aide stores your data for why deletes are soft in an offline-first system.

Products with isActive: false are excluded from GET /api/products, and from low-stock counts.

Finding products

GET /api/products supports two filters, which can be combined:

bash
curl -H "Authorization: Bearer $TOKEN" \
  "https://aide.omixsystems.store/api/products?categoryId=cat_bev&search=stout"

Results are ordered by name. search is a case-insensitive match on the product name.

Next

Point of sale — selling these products.

Spotted something out of date? Tell us and we'll fix the page.