Profit, expenses & loss control
Every Omni Way merchant, in every sector, gets the same three things that matter most: stock control, a money & profit picture, and loss & theft protection. The catalog/sales/till docs cover stock; this page covers profit, expenses and loss. The industry overlay sits on top, never replacing the baseline.
A tuck shop, a clinic, a kombi operator and a school all get the same baseline. The industry profile only adds sector-specific overlays (recipes, batch/expiry, vehicles, students) and the right words. The baseline is always present.
Cost price โ profit
Give a product a cost price alongside its selling price and the platform tracks gross profit and margin for you. Cost is a moving average: each stock receipt re-weights it by the quantity and unit cost you paid, so it always reflects what your inventory really cost.
curl https://omniway.online/v1/products \
-H "Authorization: Bearer sk_live_..." -H "Content-Type: application/json" \
-d '{ "name":"Cooking oil 2L", "price_cents":450, "cost_cents":300,
"track_stock":true, "low_stock_at":3 }'
# margin_cents 150, margin_bps 3333 (33.3%) come back on every product
curl https://omniway.online/v1/stock/receive \
-H "Authorization: Bearer sk_live_..." -H "Content-Type: application/json" \
-d '{ "product_id":"โฆ", "qty":10, "unit_cost_cents":320 }'
# 0 on hand @300 + 10 @320 -> new moving-average cost 320
Each sale line snapshots the cost at the moment of sale, so the cost of goods sold (COGS) stays historically accurate even when costs change later. Stock is valued at cost on the stock report (with a retail value shown alongside).
Profit & loss
curl "https://omniway.online/v1/reports/pnl?from=2026-06-01" \
-H "Authorization: Bearer sk_live_..."
| Line (per currency) | How it is computed |
|---|---|
revenue_cents | Completed sales total in the period |
cogs_cents | Sum of (qty ร snapshotted cost) on those sales |
gross_profit_cents ยท gross_margin_bps | Revenue โ COGS, and the margin in basis points |
expenses_cents | All expenses recorded in the period |
net_profit_cents | Gross profit โ expenses. The bottom line. |
Expenses
Expenses are what turn gross profit into net profit. Record rent, wages, fuel, stock purchases, utilities and more. They are operational records, not InnBucks settlement, so they live outside the payout ledger.
curl https://omniway.online/v1/expenses \
-H "Authorization: Bearer sk_live_..." -H "Content-Type: application/json" \
-d '{ "category":"rent", "amount_cents":50000, "currency":"USD",
"paid_via":"bank", "note":"June rent" }'
Categories: stock, wages, rent, utilities,
fuel, transport, maintenance, supplies, fees,
tax, other. paid_via is cash | bank |
innbucks | other โ only cash expenses affect the drawer cash-up.
Loss & theft control
The four oldest leaks in any business, each made visible and attributable to a named cashier.
| Control | What it does |
|---|---|
| Discounts | A discount needs a reason and is attributed to the cashier. The loss report totals discounted sales and their value. |
| Voids | POST /v1/sales/:id/void on a completed cash sale restocks the items and flags it with a reason and cashier. Voiding is the classic way to pocket cash, so every void is logged and counted. |
| Stock shrinkage | Negative stock adjustments and stocktake shortfalls are valued at cost in the loss report โ what the missing stock actually cost you. |
| Cash-up variance | At end of shift the platform computes the expected drawer (opening float + cash sales โ cash expenses); the cashier enters the counted cash; the variance is the headline signal. |
curl "https://omniway.online/v1/cashups/expected?currency=USD&opening_float_cents=2000" \
-H "Authorization: Bearer sk_live_..." # preview expected drawer
curl https://omniway.online/v1/cashups \
-H "Authorization: Bearer sk_live_..." -H "Content-Type: application/json" \
-d '{ "currency":"USD", "opening_float_cents":2000, "counted_cents":18750 }'
# -> variance_cents: counted โ expected (negative = short)
curl https://omniway.online/v1/reports/loss -H "Authorization: Bearer sk_live_..."
# voids, discounts, shrinkage value, cash shortage โ per currency
# plus a by_cashier rollup (sales / voids / discounts) to spot a pattern
Staff & cashiers
Attribution needs people. Add staff with a role (owner / manager /
cashier) and an optional 4โ6 digit PIN. The till can take a cashier PIN for the shift so every
sale, void and cash-up carries a name.
curl https://omniway.online/v1/staff \
-H "Authorization: Bearer sk_live_..." -H "Content-Type: application/json" \
-d '{ "name":"Rudo", "role":"cashier", "pin":"4821" }'
curl https://omniway.online/v1/staff/verify \
-H "Authorization: Bearer sk_live_..." -H "Content-Type: application/json" \
-d '{ "cashier_id":"โฆ", "pin":"4821" }' # shift sign-in
Industry profile (the overlay)
The baseline above is identical for everyone. GET /v1/profile returns the merchant's industry
profile: the baseline pillars and modules (always present), plus the sector overlay, default
expense categories and units, the words that sector uses, and a top-metrics ordering hint for the dashboard and
till.
{
"type": "fleet",
"label": "Fleet / transport operator",
"baseline": { "pillars": ["stock","money","loss_control"],
"modules": ["catalog","stock","sales","expenses","cashup","staff","pnl","loss"] },
"overlay": ["vehicles","routes","driver_settlement","fuel"],
"terms": { "customer":"passenger", "sale":"fare", "cashier":"conductor" },
"top_metrics": ["takings_today","fuel_spend","net_profit","cash_variance"]
}
A school calls a sale a "fee" and a customer a "learner"; a clinic says "bill" and "patient". Same engine, sector behaviour as data โ so a new industry is a profile entry, not a code fork.
Where to see it
- Merchant dashboard (
/merchant): a Profit & Loss view, a Loss-control view (with the by-cashier table), Expenses, and Staff โ plus net profit and gross margin on the overview. - Till (
/till): cost on new products and on receive, an Expense and a Cash-up button on the Today screen, and a Void action on recent cash sales.