Inventory
Note — desktop feature. This chapter describes the TechieCRM desktop application. The web portal is read-only for Inventory and has three things: a list of your own stock (item, SKU, type, quantity, status and location, with an out-of-stock warning), an item page for any row on it — the item's details plus its full movement ledger — and a client's transferred stock on that client's Interactions panel. None of the dialogs, toolbars, right-click actions, transformations or automations described below exist there: you cannot add, edit, receive, transform, sell or transfer an item on the web. See On the web portal at the end of this chapter for what each of the three shows.
Cloud sync — switched on, with nothing flowing yet (September 2026). The three inventory collections (
inventory_types,inventory_items,inventory_movements) are now registered for cloud sync on both sides, so the plumbing is in place and inventory created in the web portal will arrive in this computer's local cloud mirror. Two things still have to be built before you see any effect: the desktop does not yet copy its own inventory into that mirror (the Inventory screens read the company database directly), and the desktop's Inventory list does not yet show records that arrived from the web. Until both exist, inventory lives on this computer only — back it up with your company database, not with the cloud backup.
TechieCRM's Inventory tracks anything you hold — raw materials, work-in-progress, finished goods, resale products, digital assets, equipment — through transformation (inputs → process → outputs) to sale or transfer to a client, keeping cost and margin over the whole life. (No source-CRM equivalent.)
In this chapter - Inventory types and custom fields - Items and the list - Receiving, transforming, selling / transferring - Batch History - Statuses and stock - Where inventory shows up elsewhere - Not yet available
Types and custom fields
Set Up Types… (panel toolbar, or Set Up UDF ▸ Set Up Inventory Types…): a type = a kind of thing (name, physical/digital, bulk/serial tracking, unit of measure, sellable, raw material, default cost/price) plus its custom fields (same field types as UDFs: text, number, date, yes/no, table). Six starter types are seeded (Raw Material, Work In Progress, Finished Good, Resale Product, Digital Asset, Equipment & Supplies).
Deleting a type or a custom field is all-or-nothing. The type (or field), its list items and — for a field — every item's value for it are removed in one database transaction, so if the delete cannot complete nothing is removed. A type that still has items is refused before anything is touched.
The list
Filter by type. Columns: Name, Type, SKU, Qty, UOM, Unit Cost, Sale Price, Status, Location. Status
icon and row colour: available (green; amber "out of stock" at qty 0), reserved, in process,
consumed, sold, transferred, scrapped. Double-click opens the item. The toolbar's Column Setup button (left of Refresh) lets you choose, create and share the columns shown — see Chapter 20, Column setups on the TechieCRM windows. (Inventory has extra fields such as stock value, margin, kind and owner.) Margin is sale price
minus unit cost, so an item priced below cost shows a negative margin, written -$5.50 — minus sign
before the dollar sign (Chapter 7, How money is written). Batch unit costs are shown to four
decimal places ($0.0500); every other money column uses two.
Items
Add Item → universal attributes (type, SKU, name, opening quantity — recorded as a receipt —, UOM, location, unit cost, sale price, status) + a custom fields tab for the type. Quantity is read-only after creation: stock changes only through movements (receive / consume / produce / sell). An item with an opening quantity is written together with its opening receipt — if either fails, no item is created. Receive (more stock, weighted-average cost) writes the receipt and the new quantity together. A custom-field value is replaced in one step: if the new value cannot be saved, the previous value is kept.
Saving an item is all-or-nothing. When you press OK, the item's own details and every custom field you filled in are written as one database transaction. If any part cannot go through, nothing at all is written — you never end up with the item saved but some of its custom fields missing — and a message tells you what went wrong, ending with "nothing was written". The dialog stays open with your entries intact, so you can correct them and press OK again. This applies to editing an existing item too: a failure leaves the item exactly as it was, including its name and other details.
Transform
Transform… — pick input items and quantities, name the output(s); the dialog previews the cost roll-up (input cost flows into the output's unit cost); Run consumes the inputs and produces the outputs as a batch (kept in the ledger).
Run Batch is all-or-nothing. The batch, every consumed input, every produced output and the batch's completion are written as one database transaction. If any step cannot go through — an input short of stock at run time (for example the same item staged twice, or stock sold by another user since you staged it), or a database error — the whole batch is rolled back: no stock moves and no output appears, and the message ends with "Nothing was written — stock and the batch are unchanged." Fix the staged inputs and press Run Batch again. While a batch is running, the input items are locked so another user's Sell / Transfer or Transform waits for it to finish rather than racing it.
A failed batch is not silently lost — it is recorded, so you can see what happened. Stock and the ledger are exactly as they were (per above), but the attempt itself — when, who ran it, which inputs and outputs were staged, and the error — is written to the Batch History (see below) with a status of Failed, in its own separate write made only after the rollback above, so the failure record itself is never rolled back along with the batch it is documenting.
Batch History
Batches… (panel toolbar) lists every Transform attempt, successful or failed, newest first: date, process, status, the inputs consumed / attempted and outputs produced / attempted, and who ran it. Select a Failed row (shown in red) to see its error message below the list. This view is read-only — because a failed batch can never leave stock half-changed (see above), there is nothing partially-applied here to complete or cancel. If no batch has ever been run, the list says so ("No batches have been run yet.") instead of showing an empty table.
Sell / Transfer
Right-click ▸ Sell / Transfer… — choose the buyer (client search), quantity and amount: the item leaves your stock, revenue is recorded, and a mirror item appears in the buyer's inventory (hand-off). The dialog also has an Also create an AR invoice for the buyer tick box, ticked by default — leave it ticked and an AR invoice for the sale (one line, the sold quantity, due in 30 days) is raised for that client (Chapter 7); untick it, or set the sale amount to $0, and only the stock movement and revenue are recorded. If the invoice cannot be raised, the sale itself is still recorded. The header line shows the stock on hand and its unit cost, and the line under the amount shows the price per unit as you type. Money on this dialog follows the usual accounting convention: a negative amount reads -$5.50, never $-5.50.
Sell / Transfer is all-or-nothing. The stock decrement, the revenue movement, the buyer's mirror item and its receipt are written as one database transaction. If any part cannot go through — the item is short of stock by the time you press Sell, or a database error — nothing is written: your stock, the ledger and the buyer's inventory are exactly as they were. You are always told: the message says what went wrong and ends with "nothing was written", so a failed sale can never be mistaken for a sale that quietly did nothing. The dialog stays open with the buyer, quantity and amount you entered, so you can try again. While a sale is being written the item is locked, so two users cannot both sell the last units.
Elsewhere
A client's Interactions lists the items handed off to them (type Inventory); double-click opens the item. This works in the web portal too — see below.
On the web portal
Everything here is read-only. Nothing you do in the web portal changes stock.
The stock list (Inventory in the sidebar) shows the items your business holds — item, SKU, type, quantity, status and location. Items you have sold or transferred to a client are not on it; they belong to the buyer now and appear on that client's record instead. An item that is available with none left is marked out of stock in amber, exactly as on the desktop; an item that is sold, consumed or scrapped at zero is finished rather than low and carries no warning.
The item page — double-click a row on the list, or a row on a client's Interactions panel. It
shows the item's status, quantity, SKU, type, location, unit cost, sale price, owner and notes,
followed by the movement ledger: every stock movement for that item, oldest first, with its
date, type, signed quantity (+20 received, -8 sold or transferred), unit cost, total cost, where
it came from (for example sale · INV-1042) and any note. There is no Edit or Delete button,
because there is nothing you may change from here.
The quantity is not the sum of the ledger. The item's on-hand quantity is stored on the item itself and is the number both the desktop and the web portal show. It is written together with each movement, so the two normally agree — but stock recorded before that became a single write can leave a ledger that does not add up to the quantity. When they differ, the quantity is right. The item page says so under the ledger.
A client's transferred stock. Open a client, choose Inventory in the Interactions panel's type list (or leave it on All Types), and you get one row per item handed off to that client, with the quantity they hold. Double-click a row to open the item page for it. A client who has never been sold stock simply has no rows of this type.
Not yet available
Adding, editing, receiving, transforming, selling or transferring stock in the web portal — the web is read-only and there is no plan date for a write path. It is held back deliberately: an item first created in the web portal cannot yet be put on an invoice or a work-order line, because those lines point at an item by the identifier the desktop assigns, and an item born on the web does not have one. Create items on the desktop; the web portal shows them after the next sync.
Work orders consuming parts from inventory — a work order's Lines are typed in by hand, and nothing on a work order reads from or draws down inventory stock today.