Skip to main content

Stock

The Stock page turns the catalog's price book into a full inventory: typed locations (warehouses, vehicles, technicians), an append-only movement ledger between them, serial and batch tracking, QR-code scanning, stocktakes, and van-kit replenishment.

Navigate to Inventory → Stock.

The tabs​

Stock has eight tabs — Overview, Reservations, Handovers, Movements, Serials, Stocktakes, Locations, and Exceptions — plus a row of header actions that post movements directly: Book in, Transfer, Install at site, Adjust, and a barcode scan box. (Purchasing and Pricing used to be tabs here; they moved to their own pages when Inventory split out of Service Ops — see Purchasing and Pricing & price lists.)

Reservations and Handovers sit next to Overview because they hold the two things the ledger itself cannot say: what is promised but has not moved, and what has left one pair of hands without reaching the next.

Stock is always on​

Unlike some other modules, Stock is not hidden until you start using it — the tab is always in the Inventory tab bar. A control room that has never posted a movement lands on an empty Overview tab showing "No stock movements yet" with a Book in stock button, rather than the tab being absent.

The way in is either that button, or the catalog: open an item and use Set opening stock. Either records an opening balance in your main warehouse (creating it the first time) and the ledger starts from there.

If you never post a movement, nothing changes anywhere else: job line items behave exactly as before, and no part of CleverOps waits on stock data.

How the ledger works​

Every change to stock is a movement: booked in, transferred, used on a job, installed at a site, adjusted, counted, or sent for RMA. Movements are append-only — they can never be edited or deleted, only reversed by a new movement — so the Movements tab is a complete audit trail of where every part went. On-hand figures (per location and the catalog's Stock on hand column) are always derived from the ledger.

Stock that is used on a job or installed at a site leaves the location network — the movement records the job, the site, and (for installs) creates the site's installed-equipment record.

Export CSV on the Movements tab downloads the ledger as a spreadsheet: every movement the current type, location and search filters admit, not just the rows loaded on screen. Each row carries the item and SKU, the quantity, a signed Net change (stock that arrived is positive, stock that left is negative, a transfer between two locations is neither), the from and to locations, unit cost and value, and the stocktake, job and site numbers the movement belongs to.

Locations​

Three kinds of location, managed on the Locations tab:

  • Warehouse — your store(s). The Main warehouse is created automatically the first time stock is tracked.
  • Technician / van — one row per technician, and that row is their van. Every job line draws from it, every handover lands on it, and CleverTech shows it as My van. Created automatically the first time stock is handed to them or a job line names them. Adding one by hand (Add location → Kind: Technician) offers only roster rows that carry the Technician duty, are active, and have no stock location yet — so someone with app access but no Technician duty is simply absent from the list, which the helper text under the dropdown does not say. The same dialog asks Van they drive: pick the fleet vehicle and the row is named after both — Nico Ludike, T3 — and pre-fills from the fleet's own driver sessions when the technician has been driving a vehicle in CleverTech. On an existing row, Assign van / Change van does the same, and Take van off unlinks it (the stock stays; only the name and the link change).
  • In transit — created automatically for a technician the first time stock is handed to them, named In transit to that technician, and emptied when they accept it. It holds stock that has left the store but that nobody has taken responsibility for yet, so it belongs to neither party. Stock arrives there by being handed over and leaves by being accepted: the location is offered in no picker that would move stock by hand — not Transfer, Install at site, Adjust, Hand over, Reserve stock, Stocktake, nor the location a delivery is received into. So nothing can put stock there or take it out by hand, no stocktake can post a variance against stock nobody is standing in front of, and no supplier can deliver into the gap between two people.

A van is not a separate location. Before 13 September 2026 the dialog also offered Vehicle (van stock), a row linked to a fleet vehicle but to no technician. Nothing ever drew from such a row — job lines, handovers and My van all use the technician's row — so stock scanned onto it was invisible to the technician and to every job, and the technician's own row went negative while the van row read full. Rows of that kind still exist where they were created; the list labels them Van (not linked) with a warning line, and Merge into technician… moves everything on the row onto the technician who drives it (pre-filled from the fleet) with permanent transfer movements, retires the row, and gives the technician's row the vehicle's number. A van row holding less than nothing on any line has to be counted before it can be merged.

A row that still carries stock cannot be switched off. Deactivate on a technician or van row is refused while any line on it is not zero or a shortfall on it is still open — the message says to count it to zero, hand the stock over, or merge the van first. A switched-off technician row would go on receiving every job line for that technician with nobody looking at it; if one was switched off before this rule existed, it comes back on by itself the next time a line lands on it.

  • In transit — created automatically for a technician the first time stock is handed to them, named In transit to that technician, and emptied when they accept it. It holds stock that has left the store but that nobody has taken responsibility for yet, so it belongs to neither party. Stock arrives there by being handed over and leaves by being accepted: the location is offered in no picker that would move stock by hand — not Transfer, Install at site, Adjust, Hand over, Reserve stock, Stocktake, nor the location a delivery is received into. So nothing can put stock there or take it out by hand, no stocktake can post a variance against stock nobody is standing in front of, and no supplier can deliver into the gap between two people.

Each location can print a QR label; scanning it identifies the location. Locations deactivate rather than delete, because the ledger references them forever.

Bins — where it is on the shelf​

A location says which building. A bin says which shelf. CleverOps uses the standard warehouse address, coarse to fine:

ZONE - AISLE - BAY - LEVEL - POSITION
  • Zone — building, room or yard. Most sites never need it.
  • Aisle — the rack. The first thing a picker walks to.
  • Bay — a section along the aisle. Left out entirely for racking that is not split into sections.
  • Level — how high up the shelf is.
  • Position — how far along that level the bin sits.

So A-01-01 is aisle A, level 1, position 1 on single-run racking, and A-02-01-03 is aisle A, bay 2, level 1, position 3 where the racking is bayed. Warehouse rows on the Locations tab carry a Bins button (with the count, once there are any); vans and technician stock do not — a van is small enough to see into.

A bin is an address, not a balance. Quantities stay on the location: putting an item in a bin, or moving it to another bin, changes no stock level and writes no movement. That is deliberate — it means bins can be rolled out onto a live warehouse with no risk to the ledger, and a mis-scan while mapping costs an undo rather than a stock adjustment.

Each item has one home bin per location. A second item can share a bin; the same item cannot have two homes in one warehouse — homing it on a new shelf retires the old home rather than leaving it in two places.

A home bin can also be set from the item itself: open the item's workspace (Inventory → Catalog → click the row) and its Position tab carries a Home bin picker, one per warehouse that has bins. That works on a code that holds no stock yet, so a shelf can be assigned to a new line before its first delivery lands.

Some stock never gets an address — cable drums and ladders kept on the floor, or special-order lines that only pass through goods-in on their way to a van. The item's Shelf address (on the catalog item form, and on the same Position tab) says so: Binned is the default, Not binned is loose on purpose, Special order only is bought per job and never shelved. The last two are left off every still unbinned list. That changes only the list — a home bin can still be set on them, and an Items with no bin count still counts them, because a drum on the floor by design still has to be counted.

Setting bins up​

Inside the Bins drawer:

  • Generate locations — name your aisles as a list (A,B,C) or a range (A-F), then how many bays, levels and positions each has. Leave bays at 0 for racking that is not split into sections and that segment is left out of the code. The button says how many will be made, and shows a sample code, before you press it. Running it again only adds what is missing, so growing the warehouse is safe.

  • Add one location — for the shelves that do not fit the grid. It opens the same form the Edit button does, so a hand-added shelf records the same aisle, bay, level and position a generated one does. Each of those four is a pick list of what this warehouse already uses, with the count shown under it; type something it has not seen before and the field says new aisle (or level, or position) so a new value is a decision rather than a typo. That is what stops a warehouse drifting into several code formats.

    The Code on the shelf field is optional. Leave it blank and CleverOps builds the standard code from the segments and shows you what it will be. Type one and it is kept exactly as typed — if it differs from the standard code the form says so and renames nothing.

  • Print bin labels — the same label sheet used everywhere else, one QR per active bin.

  • Fill on a bin row opens the walk (below).

  • Edit changes the code, a friendly label, or where the bin is (aisle, bay, level, position). Delete bin is in the Danger zone at the bottom of that form, not on the row. It says how many items are homed there, and they lose their address until re-homed — untick Active instead if the shelf still exists.

  • Re-sequence pick order re-derives the walking order from those segments. You never type a walking order; add a bay tomorrow and it slots into the right place instead of the end.

Three counters across the top: how many bins, how many items have an address, and how many still do not. The last one matters: a bin-by-bin count only covers items that have a bin, so until it reaches zero, finish with an Items with no bin count. Items whose Shelf address is Not binned or Special order only do not count towards it — they are loose by design, not forgotten.

Filling bins — the walk​

Fill opens a scanner walk. Scan the item, and it is homed in the open bin; scan the next bin's label and the walk moves to that bin without touching the mouse. You can also find an item by name — picking it is the assignment. Every line lands in a This walk list with an Undo, and an item moved out of another bin says where it came from.

This is how a warehouse gets mapped: print the bin labels, stick them on the shelves, and walk the aisles once with a scanner.

Where bins show up​

  • The Overview on-hand grid grows a Bin column as soon as any bin exists, and the filter box searches bin codes as well as names and SKUs.
  • An item's workspace shows its bin beside each location it is held at.
  • Count sheets and stocktake lines are ordered by pick order, so a sheet is walked rather than read alphabetically.

The code, and the order, are two different things​

The code is an address and reads coarse to fine. The pick order is a route, and sorts aisle → bay → position → level. Position deliberately comes before level: you walk the rack once and reach up and down at each stop, instead of walking its whole length once per shelf.

That also means the code you print is not rewritten behind your back. On a warehouse that already has labels on the shelves, CleverOps keeps whatever code you give it and uses the segments only to work out the route — so a site can adopt the standard address for new racking without re-labelling the old.

Book in, transfer, adjust​

The header actions post movements directly:

  • Book in — stock arriving without a purchase order. Serial-tracked items capture one serial per unit (scan them into the serials box); batch-tracked items capture a lot number. A unit cost here feeds the item's weighted-average valuation cost. A delivery from a supplier is better booked in on Purchasing → Deliveries — against its order, or with Receive without an order — so it gets a numbered receipt with the paperwork attached.
  • Transfer — between warehouses and vehicles. A technician's stock is never a transfer's destination: choosing one turns the move into a handover, because stock reaches a technician only when they accept it (or the store accepts it on their behalf).
  • Install at site — issue stock from a location straight onto a site's installed equipment list.
  • Adjust — count up (+) or write off (−) at one location, with a note.

Moves out of a location are blocked when there isn't enough stock, unless you tick allow negative (for when the ledger lagged reality — the shortfall shows as a negative level until corrected).

Scanning and QR labels​

The scan box at the top of the page accepts a USB scanner (scan → Enter) or typed input, and resolves codes in this order: unit serial → our SKU → supplier EAN barcode → bin code, plus the QR payloads printed on CleverOps labels (serial units, catalog items, locations, bins). Scanning a serial opens its full life history; scanning an item opens a transfer for it.

Printable QR label sheets are available for bins (Locations tab → a warehouse's Bins → Print bin labels), items (Overview tab — prints a label for every item matching the current filter), serialized units (Serials tab — the row's Print label button, or the button inside a unit's history) and locations (Locations tab — one location, or every active one at once).

All three open the same dialog, which is shared with the asset register:

  • Label size — 24 per sheet (63.5 × 33.9 mm, Avery L7159), 14 per sheet (99.1 × 38.1 mm, Avery L7163), or 8 per sheet (99.1 × 67.7 mm, Avery L7165), with a live preview of the first label so you can check a long item name still fits.
  • Cut guides on for plain paper, off for pre-cut label stock.
  • Your control room's name on each label.
  • Skip used labels so a part-used sheet can be reused.

Print opens the browser's print dialog; choose Save as PDF as the destination if you want a file rather than paper.

The big line on each label is the identifier you'd read out if the QR won't scan — the SKU for a catalog item, the serial for a unit, the name for a location, the code for a bin.

Serial and batch tracking​

Set an item's Tracking mode on the catalog:

  • Serial numbers — every unit is its own record, captured at goods-in. The Serials tab shows each unit's status (in stock, installed, consumed, faulty, RMA…), where it is, and its complete movement history — received on which GRN, which van carried it, which job installed it at which site.
  • Batch / lot numbers — bulk goods carry a lot number (and optional expiry) captured at receiving.

What jobs are waiting for​

Everything above is about stock the store already has. Requests is the other side of it — every open job that is still waiting on a part, with what to set aside, what to buy, and what is holding each one up. It reads the same ledger; it just groups it by who is waiting rather than by where the stock is.

Using stock on jobs — and automatic site allocation​

A job card line is a requirement, not a movement. When a technician (or the office) adds a stock-tracked catalog item to a job's line items, nothing leaves the shelf: the line promises that quantity to the job, which shows on the Reservations tab as Booked to the job, on Requests as Set aside — still to pull, and comes off what the store can promise anyone else. Change the quantity and the promise follows; delete the line and it is released. Stock leaves the shelf only by a handover, and it is booked to the job — the issue or install movement — when the job is completed, from whichever technician's van holds it (most first), then the lead's van, then the main warehouse for whatever nobody holds. A line added to a job that is already completed or cancelled issues immediately, because there is no later completion to wait for.

The line says where its stock will come from as you type it. Under every stock-tracked line the editor shows the van the trigger will draw from and what it holds — Off Nico Ludike, T3 · holds 4. When the van cannot cover the line, that reads as an amber pill instead: on an open job holds 0 · 2 short at completion, on a completed job holds 0 · 2 short. On a completed or cancelled job the line books the stock out the moment it is saved, so adding a tracked item there, or growing a line's quantity, first asks The van does not hold this — Save anyway posts the line short exactly as before and it lands on Exceptions; Not yet puts the quantity back so the store can hand the parts over first. Nothing is ever refused: the posting stays fail-open and the question is only asked when the answer would change the ledger.

Three things follow from that, and all are worth knowing before you edit a job card.

The stock comes off the van that holds it, not the van of whoever typed the line — a co-technician who accepted the handover is the one whose van is debited at completion. A reversal goes back where the stock came from: reducing a line below what has already been booked out posts the return to the ledger's own record of the source, never to wherever the job is assigned now.

If completion finds a van short, or a posting fails, the job still completes — the problem is recorded on the Exceptions tab instead of blocking the sign-off. A serial-tracked line that closes without its units named lands there too, as Serials not named, for the store to book the serials out by scan.

And once a line's parts have been booked out — after completion, or after a scan on the job — only the store can shrink it. Reducing the quantity or deleting the line is refused for a plain technician with "those parts are already booked out to this job"; the route is Take back (office) or Send back to the store (CleverTech), both of which post the real return. Anyone holding Manage stock, or Manage service on the workspace, can still edit the line directly. Before the stock is booked out — which on an open job is the normal state — the line stays freely editable by everyone, and the promise simply follows it.

One exception, on a completed job that the office has not yet approved: a technician on the job may lower or remove a line whose parts came off their own van — the correction after the customer signed, when the parts turn out wrong. The return goes back onto that van, exactly as a reduction by the store would post it. Parts that came off a colleague's van or the warehouse are still refused ("… came off …, not your van, so the office has to change it."), and once the job is approved or invoiced a field user cannot change its lines at all. Each change is listed for the reviewer; see After the customer signs.

Each job line also has an Install at site tick. When it is on and the job has a site, that line is registered on the site's installed equipment list — with the catalog warranty period applied — the moment it is typed, and the movement posted at completion is recorded as an install rather than a plain issue. CleverOps pre-ticks it for stock-tracked goods and leaves it off for labour, call-outs and freeform lines; you can change it per line. Unticking the box, changing the line, or deleting it closes the site record out again.

Install at site does not require the stock ledger. A control room that never books stock in can still tick the box and build up each site's equipment history from its jobs — the movement is only posted for items that are stock-tracked.

In the CleverTech app, the job's Items tab has Scan part from van: the tech scans the unit's QR/serial (or the box barcode), confirms the quantity, and one action books the part to the job now, moves the stock off their van, and — when Installed at this site is on — registers the equipment on the site's installed-equipment list with its serial and the warranty period from the catalog. A scan of a part the office already typed merges into that line rather than adding a second one, and only grows it for any excess; completion then has nothing left to issue for it. Returning a serialized unit to stock later automatically closes its site record. Scanning the store's counter code here instead (the QR on the Handovers tab or the job's Stock tab, or the six characters typed) accepts that handover onto the van in one tap, so a technician at the counter never has to leave the job.

CleverTech also has My van: what's on the van right now, with the handovers waiting to be accepted at the top. Tapping any line on My van (or scanning a unit that's already on the van) offers Send back to the store — a return that waits in transit until the store takes it in — Hand to a colleague, or Install at a site: pick the site from a searchable list and, when one of the technician's open jobs is at that site, the job it is for; the stock leaves the van as a real install movement, a serialised unit flips to installed, and the site's installed equipment list gains the record with the technician credited as the installer. Naming the job books the part to that job's line, so the job bills it and completion does not issue it a second time; an install with no job is for kit handed over outside a job (a swap-out on a courtesy visit, stock dropped at a guard hut). Booking stock onto the van from the warehouse is not a technician's action any more — the store hands it over and the technician accepts it. A technician can install from their own van; emptying the warehouse to a site stays a Stock controller / office action. Stock actions in the app need a connection (the ledger is server-side); offline, techs add parts from the catalog as before and the promise catches up when the line syncs.

Forgot to record it? The office books it retrospectively with the Stock page's Install at site action, which has an Installed by (technician) picker — the movement posts under the admin's name (the ledger never lies about who typed it), but the site's equipment record credits the technician who actually did the install.

Counter sales​

Stock sold over the counter — no job, no technician — goes out through an invoice: the invoice editor's Add from catalog picker creates counter-sale lines, and each one posts a Counter sale movement the moment the invoice is issued. The stock comes off the control room's nominated counter location (Settings → Sales & CRM → Counter sales); unset, that is the main warehouse.

Unlike a job-card posting, a counter sale is not fail-open: if the location holds too little and stock may not go negative, issuing the invoice is refused — the office is at a screen and can fix it, where a technician in the field cannot. With Let stock go negative on, the sale posts anyway and the shortfall lands on Exceptions. Voiding the invoice reverses the movements (Sale reversed (void) rows), putting the items back on hand.

Only lines born from the picker move stock. Typed invoice lines never do — even when they name a SKU — and job-sourced invoice lines already moved theirs at the job card, so nothing is ever deducted twice. The full lifecycle is documented at Billing → Invoices → Counter sales.

Reservations​

A movement records what has happened. A reservation records what is going to — and it carries the job from the moment the work is booked, before anyone picks the parts and long before they reach a van.

The job card makes most of them. Every stock-tracked line on a job's card is promised to the store the moment it is typed: a Booked to the job row appears here for the job, the lead technician and the scheduled date, and it follows the line — grow the line and the promise grows, shrink it and the promise shrinks, delete it and the promise is released. You never reserve a part that is already on the card; the Reserve dialog refuses with "a job line is promised by itself — change the line instead". Reserve stock is for the rest: an item the card does not list, a hold with no job behind it, or a quote you want covered.

From then on that quantity is no longer available to promise to anyone else, and the tab doubles as the store's picking list: what still has to be pulled, for which job, for whom, by when. The same position is on the job workspace's Stock tab, scoped to one job.

Reserving never refuses an oversell. Type more than you have free and the dialog says so — "That is more than you have free. You can still reserve it — the shortfall will show on the picking list." — but the reservation is still recorded, and the line is flagged Short on the tab with how far the item is now over-promised. A job card line that oversells the item shows the same way, and Requests reads it as Not enough stock.

What stays on the tab​

A reservation is listed only while it is still work for the store — Booked to the job (recorded, nothing has moved) or Set aside in the store (physically picked and put aside). There is no filter for the closed ones, because the tab is a work list rather than a register.

A row leaves the tab the moment it stops being work: Hand over moves it to With the technician, Release cancels it, and the job's completion settles it as Used (as does the technician's own scan on the job, for the part they scanned). The technician's van scans settle it too, without naming a job — install at a site marks it Used, send back to the store closes it as returned when the store takes it in — because the reservation already names them. Cancelling a handover puts the unaccepted part back to Booked to the job; what the technician already accepted stays with them.

Once a row reads With the technician it is no longer the store's work and lives only on the job's Stock tab, which is also where a promise that outlived its stock is closed off by hand.

Three row actions, all behind the same permission as the header actions:

  • Set aside — offered only while the row is Booked to the job, and the only way to move it on to Set aside in the store.
  • Hand over — offered only once the reservation names a technician, so a row left at Not assigned has to be given one first. It opens the same handover window as the Handovers tab.
  • Release — behind a Release this reservation? confirm. Releasing moves nothing in the ledger; it only frees the promise. A promise the job card made comes back the next time the line is touched, so change the line, not the promise.

Reserve stock for a job​

Only Item and Quantity are required.

  • Job defaults to Not linked to a job. A reservation that names a job settles when the job completes; one without a job never does, so it sits on the picking list until somebody releases it by hand.
  • For technician defaults to Not assigned yet — and until it names someone, the row has no Hand over button.
  • Pull from defaults to Any location, and in-transit locations are not offered. Choosing a technician's own stock does something different: the technician already holds it, so the job's promise is covered from their van on the spot — nothing moves, the parts stop counting as unassigned on that van, and only whatever the van does not cover stays to be picked. That is how yesterday's leftover becomes today's job's part.
  • Needed by and Note are optional.

Under the item the dialog says how many are available to promise right now, which is the figure the oversell warning is measured against.

A reservation never outlives its job. Completing or cancelling a job releases whatever it still had reserved, set aside or out with the technician. The stock itself is untouched — it is still counted wherever it physically sits — but the promise is closed, so the store stops holding units for work that is finished. Stock still on a van after that shows as unassigned on the Locations tab, where it can be given to the next job.

What "available" means — and why two screens disagree​

The Available column on this tab, and the figure in the Reserve dialog, are available to promise: on hand + on order − open promises. On order counts only purchase orders that are approved, sent or partially received — a draft is a wish and adds nothing (see Purchasing). A job card line is not a separate term: the promise it makes is the term, and when the part is booked to the job at completion the promise is consumed in the same breath the stock leaves, so nothing is counted twice.

A promise counts against the figure while it is booked, set aside or with the technician, and stops the moment it is used, released, or the job it was promised to ends. Before September 2026 a finished job kept its promises for ever — on Corcomm that was 808 units of phantom demand, quietly making the store look shorter than it was and pushing the buying desk to over-order.

The catalog item workspace has an Available of its own, and it is deliberately a different sum: on hand + on order − committed, where committed is the quantity on open job lines the ledger has not yet booked out. On an open job that is the same thing as the card's promise, so the two screens agree far more often than they used to; they still differ on holds with no job behind them, which only this tab subtracts.

Handovers​

Handing stock to a technician used to be one person's decision, with the ledger obeying instantly and the receiving party never asked. A handover puts a second pair of hands on it — and since September 2026 it is the only way stock reaches a van. A Transfer whose destination is a technician's stock turns into a handover, a technician cannot book stock onto their own van, and a return always comes back through one. The old Vehicle (van stock) location was the way round that rule — a plain transfer could fill it, and nothing drew from it — which is why it is no longer offered (see Locations).

Hand over to technician (on the Handovers tab, straight from a reservation's Hand over button, or from the job workspace's Stock tab, which pre-loads the job's open promises) takes the stock out of the store immediately and parks it in transit. It only lands on the technician's van when the handover is accepted. A line for a job attaches the job's own promise — set-aside first — and stamps the technician on it; anything handed over beyond what the job promised is promised fresh, so a van never reads as free stock while it is carrying a job's parts.

Accepting is the technician's action first, and the fastest way is the counter code: every handover to a technician carries six characters, shown on the Handovers tab and on the job's Stock tab (with a QR). The technician scans the QR or types the code in CleverTech and the whole handover lands on their van in one tap — at the counter, with the storeman watching. Failing that, opening a handover sends them a push ("Stock handed to you") and it appears as a card under My van, where they count what actually arrived and tap Accept onto my van. The store can also accept — with Accept… on this tab, Accept for technician on the job's Stock tab, or the accept it for them now tick on the handover window itself — and when the accepter is not the addressed technician the handover is recorded as an override, visible afterwards as accepted for them. That is deliberate: a technician who cannot (or will not) tap Accept must never strand stock in transit, but doing it for them is never silent. (Unrelated: CleverTech also uses the word handover for the commissioning step that sends keyholders their app invites; that one has nothing to do with stock.)

Accepting opens a count sheet that defaults to all of it, because usually it is all there. Change a number and the difference stays in transit as a variance, with a reason you can type against the line. Serialised items are accepted in full or not at all — a serial is one physical unit, and half of one is not a thing the ledger can describe.

The hand-out window is also where the store asks for a van count. When the technician's van reads below zero, carries unexplained shortfalls, has never been counted, or was last counted more than 30 days ago, the window says so in one line and offers Ask name to count their van — ticked by default. Leave it on and the hand-out opens a blind count on their phone as well; see Asking a technician to count their van. If a count is already open on that van the line shows how far they have got instead, and nothing is asked twice.

Between technicians. A technician can hand stock out of their own van to a colleague, from My van in CleverTech, and the office can do the same by choosing the colleague's van under Out of on the handover window (or by moving a job to a new lead — the job form offers it when the old lead still holds parts). The job's promise travels with the stock, so the job reads with the colleague from then on, and completion draws from the van that actually holds the parts. Cancelling gives both the stock and the promise back to the sender.

Refusing is not a button. A handover nobody accepts simply ages, and the tab is the report: reference, direction, technician, where it came from, units outstanding, and how many days it has been waiting. That ageing list is the actual control — an unaccepted handover is a number you can chase, not a flag someone has to notice.

  • Cancel sends whatever is still in transit straight back where it came from, and the handover stays on record as cancelled. Anything the technician had already accepted stays on their van, promise and all — only the unaccepted part goes back to the picking list.
  • Returns work the same way in reverse: a technician sends stock back and it waits in transit until the store accepts it here. From My van in CleverTech (a plain van return, no job attached) and from a job's Stock tab (Send back to the store, tagged with the job) alike, it is always a handover; on the job the technician also says whether the job no longer needs it: when the store takes it in, the job's lines shrink by what came back, or stand so the part goes back to the picking list for a replacement. The technician's My van screen shows an open return as waiting for the store; the job's Stock tab in CleverOps shows it as coming back, and Take into store there (or Accept… here) is the store's half.
  • Taking it back from the office — when the technician drops a part at the counter — is Take back on the job's Stock tab in CleverOps, which opens and accepts the return in one click. See Stock on the job for how the ledger decides what comes back against the job line and what comes off the van.

Exceptions​

Completing a job books its parts out of the vans that hold them, and that posting is deliberately fail-open — a stock problem must never stop a technician signing a job off. The Exceptions tab is where the consequences show up instead of vanishing. Counter sales land here too, but only when stock is allowed to go negative — otherwise their shortfalls refuse the invoice up front instead of posting.

Three things are recorded, and each row's Source column names the job or invoice behind it:

  • Went negative — the movement posted, but the source location did not hold enough, so it is now below zero. The row names the location and what it actually held. It clears itself the moment stock lands there and the balance is whole again — a handover that arrives after the fact settles the row without anyone touching it.
  • Did not post — the posting failed outright, so no movement exists for that job line and the stock has not moved at all.
  • Serials not named — a serial-tracked line was booked out at completion without anyone scanning the units, so the level dropped but the serial registry still shows them on the van. The store fixes it by booking the serials out by scan.

Dealt with clears the flag. It does not correct anything: if a location really is short, count it or post an adjustment first. Tick Include ones already dealt with to see the history.

The number follows you. Open exceptions are counted on the tab itself — Exceptions (12) — and every other tab of the Stock page carries a banner with the count and an Open Exceptions button while any are open. On a job, the workspace's Stock tab reads Stock (2 short) when lines on that job posted short, and the job's line items list ends with the same count. A store that never opens the tab still watches the number grow.

Locations holding less than nothing​

Above those rows the tab lists every location whose balance is below zero right now, with the item, how far short it is, what that is worth, and when it last moved. A shortfall row is an event — it happened once, and clearing it is bookkeeping. This list is the state those events left behind, and it stays until someone corrects it.

The fix is a count, not an edit: open a stocktake on that location and count the item, or post the handover that was actually missed (usually store → van, for material that went out with a technician without one). Marking the matching exception Dealt with does not move the balance, which is exactly why this list is separate from it.

Stocktakes​

On the Stocktakes tab, pick a location, choose what to count, and Start stocktake. The count snapshot lists what the ledger expects; count by typing or by scanning (each scan adds 1). Posting writes stocktake variance movements for the differences — against the live level, so movements made while counting are not double-corrected. Uncounted lines are left untouched. A stocktake can also be discarded without posting.

Once a count is posted, its variances are ordinary ledger rows. To investigate them, filter the Movements tab to Stocktake variance and Export CSV: the file holds the whole list, the Stocktake # column keeps each count's rows together, and Net change reads as the shortage (negative) or surplus (positive) the count found on each item.

Asking a technician to count their van​

A van is the one location the store never stands next to, so a technician's van can be counted by the technician. Three places ask for it:

  • The hand-out window (Stock → Handovers → Hand to a technician, or the job's Stock tab) — the tick described under Handovers, offered whenever the van needs it.
  • Locations — each technician row carries Ask for a count, and a line under the van's name saying why it needs one (reads 212 units below zero on 14 lines, never been counted, last counted 41 days ago) or, once asked, how far along it is.
  • Stocktakes — pick the technician's van, and the Ask the technician to count it tick appears next to Start stocktake. Only a whole-van count can be asked for; a van has no bins.

Asking sends the technician a push (Please count your van) and puts a Count my van card at the top of My van in CleverTech. They count blind — the app never shows them the ledger figure — by scanning or typing, add anything on the van the sheet did not list with Count something else, and tap Send the count to the store. They cannot post or abandon it; that is the store's job.

Back on the Stocktakes tab the count reads with technician until it comes back, then counted — review, and its button becomes Review and post. Open it, look at the variances the same way as any other count (both print sheets still work), and post. The technician can still change a number until you do. Posting a van count writes the variance movements that clear a negative van and resolve its matching Exceptions in the same statement.

What to count​

ScopeWhat it snapshotsWhen to use it
One binEverything homed on that shelf, including items the ledger shows as zero — an empty shelf has to be confirmed empty, not assumedThe normal count. A real warehouse opens over a thousand lines as a whole; one shelf is a sheet somebody can actually hold
Items with no binStock standing here that has no home binFinishing off, so nothing goes uncounted
The whole locationEvery item with a non-zero level hereA full annual count

Bin counts run side by side, one per bin, so two people can walk two aisles at once. A whole-location count owns the floor: it will not open while a bin count is running, and no other count will open while it is. The same bin cannot be counted twice at once.

Locations that are in transit cannot be counted at all. That stock has left one party and not yet been accepted by the other, so it belongs to neither and nobody can stand in front of it — a variance posted there would invent or destroy stock in the gap between two people.

Asking a technician to count their van​

A van is the one location the store never stands next to, so a technician location can be counted by its own technician, from their phone, at the store's request. Pick the technician's location in the start bar with What to count on Whole location, tick Ask the technician to count it, and the button becomes Ask for the count. The same request is one click away in two other places: Ask for a count on the van's row on the Locations tab, and a tick in the hand-out window — pre-ticked when the van reads below zero, carries unexplained shortfalls, has never been counted, or was last counted more than 30 days ago.

The request has three rules:

  • Only a technician's own van, and only the whole of it. A van has no bins, and "count this shelf" means nothing to its driver.
  • The technician must be active with a CleverTech login; otherwise the request is refused with that technician has no CleverTech login to count with.
  • It opens as an ordinary whole-location stocktake, so the same floor rules apply — nothing else can be counting that van at the same time.

The technician gets a push — Please count your van — and a Count my van card at the top of My van in CleverTech. They count blind: the app shows no ledger figure and no variance, and there is no Abandon. When they are done they tap Send the count to the store; the app reminds them that anything left uncounted should be counted as 0 rather than left blank. Sending posts nothing. A count is a claim; posting it is the store's decision.

On the Stocktakes tab the row reads with technician while they are counting and counted — review once it has been sent back, with who counted it and when. The button changes from Continue counting to Review and post: open it, read the variances against the ledger, and post or discard exactly as for any other count. Only the store can post or discard — the technician's side has neither. A technician sees one open request at a time.

Counting something that lives on another shelf​

A bin count still posts against the whole location's level. So if you count an item on this shelf that the system says lives in another aisle, posting it would write off the stock standing over there.

Rather than guess, the count refuses and tells you where it thinks the item lives. If it really is on the shelf in front of you, take the offer to move its home here and it is counted — re-homing writes no ledger movement. If not, go and count it in its own bin.

An items with no bin count cannot adopt an item that already has a bin, for the same reason.

Counting one bin at a time​

Once a location has bins, a What to count dropdown appears beside it:

  • Whole location — every item the ledger holds there. On a real warehouse that is a sheet of a thousand lines, which is why the other two options exist.
  • One bin — only the items homed in that bin, including any the ledger shows as zero, because an empty shelf has to be confirmed empty rather than assumed.
  • Items with no bin — everything at the location that still has no address. Run this last so nothing is missed.

Bin counts run side by side — several people can count several aisles at the same time, one open count per bin. A whole-location count owns the floor: it will not start while a bin count is open, and no bin count starts under it.

A bin count still posts against the location's level, which is why it may only cover items that live in that bin. Scan something that belongs in another aisle and CleverOps stops and asks whether to move its home to this bin rather than quietly counting it — counting it here would write off whatever is standing on the shelf it actually lives on.

The two paper sheets​

An open count prints two different sheets, for the two halves of the job. Both come out in bin order, so either is walked rather than read alphabetically, and both offer Save as PDF in the print dialog if you want a file instead of paper.

Print count sheet is the sheet that goes to the aisle, and it is blind: bin, item, and an empty box. It does not show what the ledger expects, and there is no setting to make it. A sheet that prints the answer next to the box is not a count — it hands whoever is walking the shelf the exact number that would make a shortage disappear. It is signed off by Counted by and Checked by.

Print variance sheet is the second check, and only becomes available once counts have been keyed in. It puts Expected, Counted and the signed Variance side by side on one page, with a rule down the margin of every line that differs so the eye lands on those and nothing else. A line that agrees with the ledger is ticked rather than printed as a zero. A line nobody counted reads not counted — that is a gap, not a variance, and the header tallies the two apart (9 lines · 4 variances · 1 not counted) so an investigation is not sent looking for stock that was never counted in the first place. It is signed off by Checked by and Approved by.

The variance sheet prints before posting, off the numbers on screen. Once a count is posted, the same ground is covered by the ledger itself — filter Movements to Stocktake variance and export it.

Van kits and replenishment​

Give a vehicle or technician location a Kit (Locations tab): minimum and maximum per item. When the location drops below minimum, it appears in the Overview tab's Van / tech replenishment list with the suggested top-up — restock with a Transfer. When the warehouse itself cannot cover the top-up, the shortfall goes onto the buying desk as a Kit · location needs n line, so a van that is short is bought for rather than just noted.

Valuation and reports​

The Overview tab shows:

  • Stock value at weighted-average cost — updated on every receipt, at the landed cost (the unit cost plus the delivery's share of freight).
  • Needs reordering — how many items are at or below their reorder level, net of what is on order — and the Reorder suggestions table under it: on hand, on order, the reorder level, the suggested quantity and the default supplier. The table is a report, not the place to order from: the same items are already on the buying desk, grouped by supplier with the job shortfalls and van kits, and the Open the buying desk link under the table takes you there.
  • Van / tech replenishment — kits below their minimum, with the suggested top-up.
  • Dead stock — items with stock on hand and no outbound movement in 90 days, with the idle value.

Accounting (Xero) and stock​

Catalog items and prices sync with your accounting provider as before (SKU ↔ item code). Quantities are governed by the Stock quantities setting on the accounting connection (Billing → Config → Accounting sync):

  • CleverOps stock ledger (default, recommended) — the ledger owns on-hand counts; provider quantities are ignored. Keep the items untracked in Xero.
  • Xero tracked inventory — legacy mode: a tracked item's Xero quantity overwrites the local figure on every sync. Not recommended together with the ledger, since the two counts will fight.

The buy side has two more meeting points with the books. Supplier bills pulled by the sync land on Purchasing → Bills, where a bill captured in CleverOps is matched to its order and receipt and, once approved, pushed up to Xero when that push is switched on; and Purchasing → Month end gives the accountant the month's stock movement at cost, the received-not-yet-billed accrual, and the journal a periodic or perpetual book wants. Purchase orders themselves are never sent to the accounting package.

On the phone​

Everything above has a mobile counterpart in the Stock tab of the CleverTech app, for staff with the Stock controller role — what is where, the mover, a Handovers counter view (the counter code shown large, Accept for them for a technician standing there without a phone, Take into store for returns), stocktakes, the ledger, and a Deliveries view of what the buying desk has on its way, each order opening straight into Receive. A technician without the role sees only their own van, exactly as before.

The mover works move first, then scan: choose where the stock is coming from and going to once, and after that every scan adds a line to a basket. A barcode says what, never where to, so the move has to be set first — and scanning a shelf or van's own QR label re-points it. Search is the equal-status fallback for loose stock and unlabelled shelves.

Counting on the phone​

Counting is the one job in the whole stock module that is genuinely miserable with a laptop, so the phone does the full scoped count. Start a count asks for the location and then what to count — one shelf, the stock here with no shelf, or the whole location. A location with no bins skips the question.

The sheet is walked in aisle order under a heading per shelf, not alphabetically, because the person holding the phone is walking past shelves rather than reading a list. This applies to whole-location counts too, since every line carries its home bin.

  • Scanning adds one each time — walking a shelf with the camera up is the point. Tapping a line types the total instead.
  • Scanning a shelf label mid-count narrows the sheet to that shelf. Scan it again, or Show all, to go back.
  • Counting an item that lives in another aisle brings up the same move its home here question described above.
  • Count something else adds stock the snapshot never expected.

Fill a bin​

Fill a bin on the Counts tab is the shelf walk: scan the shelf label, then scan each item on it. Every scan just says this lives here — quantities never change — and every line has an Undo. Items that moved off another shelf say so.

Below the shelf is Still needs a home: stock at this warehouse with no address yet. Tap one to home it on the shelf you are standing at. Items marked Not binned or Special order only on the catalog are not listed — the phone reads the same list the Bins drawer does.

Permissions​

Posting stock movements — transfers, receipts, installs, adjustments, stocktakes, reserving stock, and opening or cancelling a handover — needs the Stock controller role (the Manage stock & warehouse permission). Company owners have it automatically.

Reaching Stock and posting to it are two different gates

Either Manage stock & warehouse or Manage service jobs opens the route to Stock, so a Technical coordinator can read the ledger, the reservations, the movements and the stocktakes. Only Manage stock & warehouse shows the posting actions, because that is the one permission the server accepts. A storeman therefore needs that role and nothing else, and a coordinator without it is never shown a button that would be refused.

Technicians do not need it: their own van flows — returning stock, using a part on a job, and accepting a handover addressed to them — go through separate routines that can only touch their own location. That split is what lets you give a storeman the warehouse without giving them the job pipeline, and give a technician a van without giving them the power to write off stock they have never touched.

Requiring two people​

Two people are on every movement between the store and a technician, on every control room, since 5 September 2026 — there is no longer a switch:

  • A technician cannot issue stock to themselves. They are told to ask the store to hand it over, and their part is to accept it — by scanning the counter code, or under My van.
  • A technician's return is a handover. The stock leaves their van into transit and waits there until the store accepts it.
  • A technician can hand stock from their own van to a colleague; the colleague accepts it the same way.

The point is that the person who releases stock and the person who takes responsibility for it are never the same person — unless a controller deliberately accepts on the technician's behalf, which is recorded on the handover. Settings → Sales & CRM → Quotes → Handovers says so, and sits beside Let stock go negative, which is still a real dial.

Technicians do not need a new app version. The rule is enforced on the server: an older CleverTech build that tries to book stock onto its own van is told to ask the store, and its returns simply wait in transit until someone at the store accepts them.

Viewing stock — levels, locations, the ledger — is available to the same roles as the catalog.

Next steps​

  • Requests — what open jobs are still waiting on, and the store's worklist for it.
  • Purchasing — the buying desk, purchase orders, deliveries and receipts, supplier bills and the month-end pack.
  • Pricing & price lists — import supplier price lists and price the catalog from markup rules.
  • Products & Services — item types, tracking modes, barcodes, warranty months.
  • Installed equipment — the site register that installs write into.
  • Create a job — line items are where consumption happens.