All articles

30 August 2026 · 20 min read

Supplies tracking in a beauty salon: usage rates and write-offs

Supplies are a salon's most invisible cost line: colour, developer, shampoo, gloves and disposable linen go a little at a time, and at the end of the month it turns out a noticeable sum went on restocking and nobody can say exactly where. Here's how stock tracking works in SetNow: how to set a usage rate on a service, why materials are written off by themselves after a visit, what happens on a cancellation, how a service's cost price and margin are calculated, and how to see which specialists use more than the rate.

You can start stock tracking without counting the whole salon

The main reason stock tracking never gets adopted always sounds the same: "we'd have to count everything first". So every item has its own "Track stock" toggle. While it's off, no movements are recorded and stock asks nothing of you, but planned cost prices and usage rates still work — materials per service delivered and service margin are calculated from day one. You can switch tracking on later: the system will only ask for opening balances on the items you've decided to keep an eye on.

The working order is this: create your items, give them a planned cost price, set usage rates for the five to ten most frequent services. Even at that point you can see how much material one colour service eats and what's left of the price. Stock levels, goods receipts and stocktaking are step two, and you can get to them in a week or in a month.

Items: the item, its purpose, its unit

The unit of tracking is a stock item with a purpose: "supply" (goes into services), "product" (sits on the shelf) or "product and supply". The last one isn't unusual, it's the norm for a salon: the same shampoo is both sold to clients and poured out at the basin. Creating two records with two separate balances for that isn't allowed — that way lies permanently mismatched stock, which is why purpose is a property of the item rather than a marker of a separate store.

The unit of measure is picked from a fixed list — pieces, millilitres, litres, grams, kilograms, metres — and is locked by the first movement; there is deliberately no conversion between units. Packaging like "250 ml bottle" exists only for entry and display — tracking always runs in the base unit. Items are organised into categories, and goods receipts have a supplier directory.

The branch is the store

Stock levels and cost prices are kept per item and branch. There's no separate "store" entity and no store selector in the forms: the "two cupboards in one room" scenario isn't something salons and studios need, while branches give you the access model for free — the owner sees the whole company, an administrator sees their own branches.

A transfer between branches is a document in its own right, not a write-off plus a receipt. One operation creates both halves at once: an outgoing movement at the sending branch and an incoming one at the receiving branch, with a single number and inside a single transaction — one half can't exist without the other. The cost price carries across by itself and can't be typed in: moving goods internally must not change the value of the company's stock by a single penny. A transfer doesn't count as usage or as loss in any breakdown — the goods changed shelf, they didn't leave. The stock balance report shows transfers in their own columns: without them, "40 pieces out" doesn't tell you whether they were sold, used up or driven to another branch.

The usage rate lives on the service, not on the service-and-specialist pair

The rate lives on its own "Materials" tab on the service: lines of "item plus quantity in the base unit". That's a deliberate choice. In the matrix approach, where a rate is tied to a service-by-employee pair, a salon with twenty services and ten specialists gets two hundred configuration points — nobody will ever fill them all in, and half of what does get filled in goes stale.

Exceptions for a specific employee do exist, but they live in a separate block, collapsed while it's empty. You pick the employee first, then their lines — which is exactly how the exception reads: "Anna does it differently". An override completely replaces the base line for that item, including with a value of 0 — "doesn't use it". Zero is shown as an explicit marker rather than an empty field: "doesn't use it" and "nobody filled it in" are different facts.

A rate line has a basis. "Per person attending" — colour, gloves, anything spent on an individual. "Once per session that goes ahead" — disinfecting the room, materials for the group as a whole; a line like that is written off when the session finishes, provided at least one participant came. It's that second basis that makes tracking honest for group formats: what a room consumes shouldn't be multiplied by the number of participants. One item on one service carries one basis — the switch edits the existing line rather than creating a second one.

Editing a rate doesn't apply retroactively. Only lines created before the visit took place are used in a write-off, and every movement stores a snapshot of the rate. So changing a rate today doesn't generate usage on yesterday's visits and doesn't rewrite what's already been written off — and a closed month's report doesn't change on its own.

Write-offs follow the visit, not a button press

Mark a client as attended and the materials are written off in the same operation — nothing needs posting by hand. If attendance is filled in by auto-completion of bookings, the write-off is materialised by a background job with a 12-hour delay. The delay isn't a technical one: auto-completion marks everyone as attended, actual no-shows included, and writing off immediately would produce phantom usage in exactly their proportion — usually 10-20%. Twelve hours is the window in which a specialist can correct a no-show before it becomes usage.

A cancellation is always a visible reversal document, never a line quietly vanishing. Turn a visit into a no-show, delete a booking made in error, cancel a whole session — the materials come back, and in the movements log that's a separate document linked to the original. Returning materials doesn't depend on whether a membership pass visit was burned: pass penalties have their own rules and materials have theirs.

Running out of stock doesn't block a visit. The service has already been delivered and there's no sense in denying that in the books: the automatic write-off always goes through, the stock level goes negative by exactly the uncovered amount, the shortfall is recorded on the document and the people responsible get a notification. The negative is cleared by the next receipt or by a stocktake. Manual operations that would go negative, by contrast, are always rejected — with the available quantity shown.

Actual usage is edited by whoever delivered the service

The rate is the plan, and only the specialist knows the reality: it took a tube and a half of colour, not one. So editing actual usage lives right on the booking and is available to the person who delivered it without any access to stock — while the server withholds purchase prices and totals from them, so they see only quantities.

The limits on that edit are narrow and deliberate:

  • only on a booking with the status "Attended" — in any other, usage has already been reversed;
  • only items from the usage rates of that booking's services, plus supplies from the same branch;
  • not enough stock means refusal: this is a manual operation, and only automatic write-offs are allowed to go negative;
  • the edit window runs from the visit to the end of the following day in company time, after which corrections need a stock document.

An edit made before materialisation posts the write-off itself with the actual quantities and closes the delay; an edit made afterwards reverses the previous movement and posts a new one, as many times as you like. Session-level usage is edited by a separate operation on the finished session, with the same window.

Stock documents: draft to posted, corrections by reversal only

Every stock operation is a document of the same shape: opening balances, goods receipt, write-off, stocktake, revaluation, usage on services, reversal. A draft can be edited and deleted freely and doesn't touch stock levels. Posting creates the movements and shifts the balance in one atomic operation.

A posted document is never edited and never deleted. A mistake is corrected by a counter-document — a reversal, mirroring the original, linked to it and dated the day of the correction; the same document can't be reversed twice. For the same reason back-dating is forbidden: a document is dated when it's posted, and the number and date on the paper delivery note are reference details, not the date of the operation. Only in that model does the movements log stay an honest answer to "where did those 12 bottles go", and only then does a closed month stop rewriting itself.

Goods receipts are specific: a supplier from the directory and a mandatory purchase price on every line — the form prefills the current average or planned cost price so you're not retyping it. One item can appear on two lines at different prices: two batches on one delivery note is an everyday occurrence.

A write-off has to carry a reason, one per document: damaged, expired, tester, internal use, shortage, correcting a data-entry error. Without a reason there's no "where did those twelve bottles go" report, and stock stops being a control tool. The reason "moved to another branch" survives only in historical documents — transfers now have their own document type, and the system won't accept a new write-off with that reason.

A typo in a delivery note price is fixed by a revaluation — it sets a new cost price for the item at that branch without touching quantity, and requires a comment explaining why. Reversing a receipt that has already had usage against it won't work: the rollback runs into the ban on negative stock. So the rule is simple — price is corrected by revaluation, quantity by reversal.

Cost price is averaged: each receipt recalculates it per item and branch. Usage already posted isn't rewritten in the process — the movement holds a snapshot of the cost price at the moment of write-off, so last month's report is calculated in last month's prices rather than today's.

Opening balances and bulk upload

Opening balances are a document type of their own rather than a receipt: otherwise they'd land in the "how much did we put into purchasing" report and inflate it by everything that was already sitting on the shelf. They're entered once: a line for an item-and-branch pair that already has movements is rejected — a second "opening" would simply double the balance. Anything found after the start can be added by a receipt or a stocktake.

For a bulk start there's an "items plus balances" file upload — with a preview and column mapping, just like the client import: parse first, then create the items and one opening-balance document per branch.

Stocktaking in a salon: a draft, two snapshots, and an empty cell instead of a zero

Counting a shelf is a process, not an instant edit of stock levels, so a stocktake always has a draft: you can fill in lines for as long as you like, and until it's posted no balance is touched. You can count from your phone at the shelving unit — it's the same document and the same mechanics as on the web.

Every line holds two snapshots of the book stock level: at the moment the document was created and at the moment it was posted. The adjustment is calculated from the posting snapshot, and the difference between the snapshots is shown in its own "changed while counting" column, with a drill-down into the movements in that interval. A visit that consumed colour while you were counting the shelf is visible for what it is and doesn't look like a shortage.

An empty count and a zero are different things, and this is the costliest spot in a stocktake. An item left uncounted doesn't touch its balance at all when the document is posted; a zero writes it down to nothing. Posting creates separate surplus and shortage movements; the cost price of a surplus is taken from the line, or from the current average if it wasn't entered, or from the item's planned price if there's no average either.

A posted stocktake can't be deleted — only reversed in full, and only while rolling back every line keeps stock out of the negative. A surplus that visits have already consumed makes a reversal impossible: the system refuses with a list of the blocking items, and the proper correction is then a new, compensating stocktake. Either way the history remains: a mis-count is visible and isn't quietly tidied away.

Batches and expiry dates: switched on per item, not for the whole store

Not every item needs batches. In an aesthetics clinic the filler cabinet stands next to the glove cabinet; in a salon with two hundred items, batch numbers matter for five to twenty — colour, developer, lash glue, disinfectants. So batch tracking is switched on by a toggle on the item: a company-wide switch would have you tracking batch numbers on paper towels.

On a batch-tracked item, a goods receipt has to carry a batch number or an expiry date — otherwise the goods would quietly join the general pool and the traceability the item was flagged for in the first place would be lost on the most frequent operation of all. A repeat receipt of the same batch number joins that same batch instead of breeding twins.

The write-off picks the batch itself — whatever expires soonest goes first. The specialist doesn't choose a batch before a visit and doesn't think about batches at all: the usage record shows them one line even when the material came out of two batches. Making people pick a batch by hand is how you get a system they start working around.

What happens with expired stock is a company setting: a warning for a salon, a block for a clinic. A block means "skip that batch and take the next one", not "refuse": a refusal only comes when there wasn't enough in-date stock. Two exceptions are non-negotiable — a write-off with the reason "expired" always takes expired stock, otherwise it could be neither used nor written off; and a visit is never blocked, because the service has already been delivered.

Expiry is checked against the date of the operation, not against today: an automatic write-off is materialised by a background job after the visit, and a product that was in date when the service was delivered shouldn't become expired after the fact. Moving stock to another branch carries the batch across with its expiry — a transfer is not a way to reset expiry control.

Service cost price: materials per delivery and margin

At the top of the "Materials" tab on a service sit the two numbers that are usually the whole reason for switching the module on: materials per service delivered, and margin — price minus materials, in roubles and per cent. If the service has a first-visit price, its margin is shown on a second line: a promotion that pushes a service into the red on materials alone should be visible before you launch it, not after month end.

This is calculated from the base rate on the "per client" basis. Rates on the "per whole session" basis don't go into service margin — they belong to the session rather than to one person, and dividing them by the number of participants would mean inventing data. The unit cost price is company-wide, weighted across branches: a service isn't tied to a branch, and the number on its record shouldn't change depending on which branch is selected in another window.

If there's no cost price either in stock or as a planned price, the margin is flagged as incomplete and lists those items with a link into the "No cost price" report. A zero is never substituted for an unknown here: a silent zero turns "we don't know the cost price" into "materials are free". Underneath the numbers sits a permanent note — this is an estimate based on usage rates and current average cost prices, and it doesn't feed into revenue or the financial report.

Who overuses: planned vs actual, and the per-employee report

Reports are built from actual usage movements and read the snapshots on the lines rather than the live directories: editing a rate or a cost price today doesn't rewrite last month's overuse.

A line in the "Planned vs actual" report is a service-and-item pair: the plan as the sum of rate snapshots, the actual, the variance and what it cost. Items added to a visit by hand on top of the rate are marked "off-rate" — there's nothing to compare them with, and they don't count as 100% overuse. The "Overuse" report is the same data grouped by the person who delivered the service, expandable down to the service.

Two rules make these reports usable in a conversation with an actual human being. First: only a positive variance counts as overuse. Coming in under is shown but isn't netted off in the total — otherwise one specialist would compensate for another and the headline figure would lie in both directions. Second: cancelled visits are excluded from the report entirely, since their usage has been reversed. Nobody gets presented with the materials for a visit that never happened.

Money in these reports is calculated from the cost-price snapshot at the moment of write-off, and remains an estimate of materials used: it isn't added to the service price and doesn't reach revenue or the financial report, which has no expenses section. There's deliberately no link to payroll either: a deduction for overuse is entered by hand, as an adjustment line in the payroll calculation, with a reason and an author. The cost of an automation error in someone's pay is higher than the manual step it saves.

Both reports need "Track stock" switched on: an item that's tracked by eye records no movements, and the report won't build a plan with no actual to set against it. The "works from day one" promise applies to service margin, not to planned vs actual.

Selling a product to a client, and the price on the shelf

Items with the purpose "product" are sold to a client straight from the item record: the seller is named explicitly — they aren't always the same person as the one delivering the service, and commission on sales is a separate component of payroll rather than being mixed in with a percentage of visit revenue.

Revenue is recognised on the payment date, not the date the sale was entered. A sale can be saved as owed: the goods have gone, the money hasn't — that's an explicit state with its own list, not a discrepancy to be hunted down later. A return is a document of its own with its own date rather than a deletion of the sale; the goods go back into the batch they came out of, so an expired batch doesn't come back to life as a fresh one.

An item has a sale price per pack — it prefills the sale line and prints on the shelf label. Shelf labels print as a PDF sheet for the items you select: name, price, pack size, SKU, plus the seller and branch. The cost price never reaches the label — it ends up in the buyer's hands.

The cost side: how much materials ate, and what gross margin is

The financial report has gained a second side. The main rule it rests on: buying is not spending. Goods you've bought haven't been spent, they're sitting on a shelf; spending is stock leaving. A report that puts purchases in expenses shows a loss in the month of the delivery and a windfall in the month you sell it all, while the salon works at a perfectly steady pace.

There are three categories rather than one total: materials used on services, cost of goods sold, and losses. Lumped together they stop being manageable — a rising number won't tell you whether you're working more or being stolen from. Write-offs with the reasons "correcting a data-entry error" and "moved to a branch" don't count as losses.

Cost is recognised together with the revenue it belongs to: materials on the day of the visit, goods on the day of payment rather than the day they left the shelf. Otherwise a sale on credit puts revenue and its cost in different months and breaks the margin in both. The bottom line is called gross margin and carries a permanent note: this is not profit.

ABC by turnover answers "what should we focus on": which items eat eighty per cent of the money tied up in stock and which are dead weight. Turnover here means the cost of what left, one scale for products and supplies alike: counting revenue for products and cost for supplies would put a high-markup product in class A rather than the item that genuinely eats the money. Write-offs and shortages aren't part of turnover — otherwise theft would push an item up the list and increase how much of it you buy.

Stock thresholds, the "What to order" report and notifications

An item has a minimum and a target stock level — set for all branches at once, with the option to override them at a specific one. An empty threshold means "we're not watching this item". The "What to order" report works out the shortfall to the target level and groups it by supplier, and a button creates a draft goods receipt with the items and quantities: the order is assembled in one click instead of by copying stock levels into a notebook.

The low-stock notification arrives once a day as a single message per branch — "N items are running low". That's deliberate too: a company that has two hundred items below threshold on its first day gets two notifications, not two hundred. An item doesn't reappear in later pushes until it's restocked above the threshold, so hovering around the minimum produces at most one warning per "ran low, ordered more" cycle.

The second type is a short write-off: a material ran out at the exact moment of an automatic write-off and the balance went negative. The message names the item, the branch and how much was missing; no more than one such notification per day arrives for an item-and-branch pair. Both types go to the same people: the owner and administrators who have stock access and that branch in their remit. Stock notifications are never sent to specialists — they don't have the page. The personal "Stock" toggle in notification settings switches off both.

Who can see stock

Access to the module is a single "Stock" page key, and it isn't part of the standard roles. The reason is simple: stock pages show purchase prices, so the owner grants access deliberately. Until the key is given to anyone, the module effectively doesn't exist for the company — that's the normal off state, not a separate setting.

Beyond that, the usual scope applies: the owner sees the whole company, an administrator their own branches. The one exception is editing actual usage on your own booking: that isn't gated by the key, or there'd be nobody to enter the actuals. But the server strips out totals and purchase prices for anyone without the key — it doesn't hide them in the interface, it doesn't send them at all.

Stock on your phone: the same as on the web

The specialist mobile app mirrors stock in full: items and directories, stock levels and thresholds, documents of every type with posting and reversal, the movements log, usage rates and service margin, editing actual usage, reports, uploading opening balances. The endpoints are the same as the web's, and a behaviour difference between web and phone on the same operation counts as a defect, not a platform quirk.

There is a barcode scanner on the phone: the camera reads a code on an item's record, in item search and right inside a sale — scan the product and the line is added with the price from its record. On the web the scanner works anyway: a USB scanner types the code into the search field like a keyboard.

What the module deliberately doesn't do

A missing feature is more honest than a badly working one, so it's worth knowing the closed decisions in advance:

  • Batch-level stock valuation. Batches and expiry dates exist (see the section above), but the cost price stays an average per item: a batch splits quantity and shelf life, not money. There's no "batch A cost 10, batch B cost 14" report — no sector asks for it, and it costs a rewrite of three reports at once.
  • Multiple stores inside one branch. The branch is the store — "two cupboards in one room" isn't the scenario worth adding a store selector to every form for.
  • Multiple stores inside one branch, and running accounts with suppliers. The branch is the store; a goods receipt stores the supplier and delivery note number, but the module keeps no financial relationship with them.
  • A closed accounting period and retroactive permission windows. The past doesn't get rewritten anyway: a posted document is immutable, and a correction is a reversal dated the day of the correction.
  • A "profit" section. There is gross margin in the financial report — revenue minus materials and cost of goods sold — but it isn't called profit and isn't profit: payroll, rent, taxes and subscriptions aren't in it, and the report says so on its face.

Frequent questions

  • Do we have to track stock levels to see service margin? No. A usage rate and a planned cost price per item are enough. Stock levels are needed for planned vs actual and the overuse report.
  • What happens if a material runs out with the client already in the chair? The visit goes ahead as normal: the write-off is posted, the balance goes negative by the uncovered amount, and the people responsible get a notification. The next receipt or a stocktake clears the negative.
  • We entered the wrong quantity on a receipt — how do we fix it? Reverse the document and post a correct one. If usage has already gone against that item and the reversal runs into the ban on negative stock, correct it with a stocktake — and the price with a revaluation.
  • We changed a rate mid-month — will the past be recalculated? No. The new rate applies from the moment of the edit, and movements already written off keep the snapshot of the old one.
  • A specialist used less than the rate — is that visible anywhere? Yes, planned vs actual and the "Overuse" report both show it. It isn't netted off against the overuse total, so that one employee doesn't compensate for another.
  • Can overuse be deducted from pay automatically? No, that's done by hand — as an adjustment line in the payroll calculation, with a reason and an author.
  • The count took half a day while the salon was open — will the data be off? No: the adjustment is built from the balance at the moment of posting, and everything that happened while you were counting is shown in its own column with a drill-down into the movements.
  • How many items do you need before the module is useful? Ten to fifteen usually does it: colour, developer, shampoos and masks, gloves, disposable linen. Small stuff like cotton pads is easier not to count at all than to count sloppily.

Where to start

Create items only for what's expensive or runs out fast, and give them a planned cost price. Set usage rates for the five to ten most frequent services — that's enough to see materials per delivery and margin without entering a single stock level. A week later, switch "Track stock" on for the items you genuinely want to watch, enter opening balances — by hand per branch or from a file — and set a minimum and target threshold. After that the module looks after itself: a receipt when a delivery arrives, automatic write-offs after visits, "What to order" before you restock, a stocktake once a month.

The point here isn't "doing stock control", it's having the system answer three questions instead of somebody's memory: how much material one service eats, whether its price is set correctly, and where those 12 bottles went.

Try SetNow for your business

Set up online booking in a day and start taking clients 24/7. Signing up is free.