Skip to main content

Inventory

Inventory tracks how many units of each thing you sell you actually have, and where that number came from. It sits directly on top of your catalog: every item here is one of your Offerings, viewed through its stock. You set an opening count when you create the offering, then record every receipt, correction, and physical count against it. Each of those writes a dated line to a movement ledger, so on-hand is never just a number someone typed; it is the sum of entries you can read back.

Inventory is a stock ledger, not a warehouse system. There are no locations, bins, or transfers between sites. Sales orders can reserve stock and, once you issue the invoice they produce, take it off the shelf. Materials used on a field-service job move stock the same way. See Sales orders and What Inventory does not do before you rely on it.

What's included​

PageWhat it's for
InventoryThe stock list: on-hand, SKU, category, price, cost, and the low-stock flag
An item's pageOn-hand and reorder tiles, the Receive / Adjust / Count actions, reorder settings, and Movement history
OfferingsWhere items are created in the first place, including their Initial Stock

In the sidebar, Inventory sits under Sales & Outreach in the Catalog group, next to Offerings. Offerings itself is documented in Sales Ops.

Getting started​

  1. Open Offerings from the sidebar and select Add Offering.
  2. Fill in the name, SKU, Unit Price, Cost, and Category. The SKU and category are what you will search and filter by on the inventory list.
  3. Enter a count in Initial Stock. It can be a fraction, such as 2.5. As the form says, it is "Recorded as an opening receipt in the inventory ledger. Leave blank if you do not track stock."
  4. Save the offering, then open Inventory from the sidebar. Your item is in the list with that opening count already on hand and a matching first ledger entry.
  5. Select the item's name to open its page, where you record everything that happens to it from then on.

Reading the stock list​

The list shows Name, SKU, Category, On hand, Unit price, Cost, and Status. It covers your whole catalog, not only stocked items; anything you never gave a count shows an em dash under On hand rather than a zero, which is how you tell "none left" apart from "not tracked".

Three controls narrow it: the Search by name or SKU box, a Category box that takes an exact category name, and a Low stock only checkbox. The heading above the table counts what you are looking at. If a filter matches nothing you get No matching items; on a workspace with no products at all you get No stocked products yet and an Add a product button that takes you to Offerings.

Status carries two badges. Low stock means on hand has reached the reorder point. Oversold means on hand is below zero, which the list also shows in red.

Receiving, adjusting, and counting stock​

Everything that changes a count happens on the item's page, through three buttons that open the same form in different modes.

  1. Open the item from the inventory list.
  2. Select Receive for stock arriving, Adjust for a correction, or Count after a physical count. You can switch between them inside the form under Change type: Receive, Adjust by, and Set count to.
  3. Enter the number. The field is labeled Units received, Change in units, or Counted units depending on the mode. Receiving takes a positive number; adjusting takes a negative one to reduce stock; counting takes the figure you actually counted, and SaaSy works out the difference for you; as the form puts it, "The difference against the current figure is what gets written to the ledger."
  4. Fill in Reason. It is optional, but it is "Stored on the ledger entry so the change can be explained later". Examples include cycle count variance and damage in transit.
  5. Check the New on hand will be preview, then select Record change.

The form refuses a change of zero, so you get an inline message rather than a failed save. A count that matches the current figure is rejected for the same reason: there is nothing to record.

Quantities can be fractions. You can receive 2.5 gallons and later use 0.75, and on hand reads exactly 1.75. Amounts keep up to six digits after the decimal point, and the app shows them without trailing zeros. The form refuses more than six decimal places. It also refuses a change that would push on hand past about 2.1 billion units. Nothing is saved in either case.

You cannot type over the on-hand number on the Offerings form. In edit mode that field is read-only and reads "Stock changes are recorded in the inventory ledger, so use Adjust rather than editing the number here." This is deliberate. The ledger only stays trustworthy while every change goes through it, so the number and its history can never drift apart.

Stock is allowed to go negative. If it does, the item shows the Oversold badge and a note: "On-hand is negative because the ledger allows oversell. Receive stock or record a count to bring it back above zero."

Low stock and reorder points​

Open an item and use the Reorder settings card to set a Reorder point and a Reorder quantity. Both are whole numbers of zero or more, and you can set either one on its own. Select Save reorder.

The reorder point is what drives low-stock reporting: an item counts as low when its on-hand is at or below it. That is what puts the Low stock badge on the row and what the Low stock only filter selects. Both halves have to be present; an item with no reorder point never reads as low, no matter how few are left.

The reorder quantity is a note to yourself about how many to buy when you restock. SaaSy stores it and shows it back to you; it does not raise purchase orders, email a supplier, or send you an alert. Low stock is something you go and look at, not something that comes to you. If your plan includes Ask SaaSy, you can also ask the assistant what is running low and it will read the same list.

The movement ledger​

Movement history on an item's page lists its last 50 movements, newest first, with columns for Type, Delta, Balance, When, Reason, and Reference. Delta is the signed change and Balance is what was on hand immediately after it, so you can follow the count backwards entry by entry. Negative numbers are shown in red.

Types you will see are receipt from receiving stock or from an offering's opening count, adjustment from a correction, count from a physical count, and sale and return from materials logged on a field-service job. Reference is a field for an outside identifier such as a purchase order number. Materials used on a field-service job fill it in as fs_job: followed by the job's ID; otherwise the dashboard leaves it empty, so it shows an em dash unless the entry came in through the API.

For clients that only understand whole numbers, the API still returns stock_quantity, quantity_delta, and balance_after as integers, cut toward zero. The exact values are in the matching stock_quantity_dec, quantity_delta_dec, and balance_after_dec fields, which are decimal strings. The product payload carries the same exact figure as stock_quantity_dec, and that field is the on-hand to read and to adjust from.

Send a fractional amount to the movements endpoint, or as a fractional opening stock_quantity on product create, as a decimal string such as "0.1" or "2.5". Whole amounts may be plain JSON numbers. A JSON number goes through a 64-bit float on its way in, so the API rejects a fractional number with more than 15 significant digits rather than round it silently. The Offerings form and the inventory pages already send fractions as strings.

Movements are append-only. There is no edit and no delete; a mistake is corrected by recording the opposite movement, which leaves both entries in the history. Each entry also stores the person who recorded it, although the table does not show that as a column.

Sales orders​

Inventory → Sales orders holds what a customer has agreed to buy before you invoice it. An order has a status, and each status controls what you can do next:

  • Draft is editable and reserves nothing. Add or change lines freely.
  • Confirmed locks the lines and reserves stock for each stocked item. Partially fulfilled and Fulfilled follow as goods ship.
  • Invoiced means every line has been turned into an invoice. Closed ends the order and hands back any stock still reserved. Cancelled does the same and can happen before anything has shipped or been invoiced.

Create an order from scratch, from a deal, or from a quote. Creating from the same deal or quote twice opens the order that already exists instead of making a second one.

Reserving stock. Each line shows the item's available-to-promise (ATP): on hand minus what other open orders have reserved. Confirming reserves the full quantity, or refuses with an insufficient stock message if the shelf cannot cover it. Available never goes negative unless you turn on Allow backorder on the order; then confirm reserves whatever is available and you can press Reserve again later to top up as stock arrives. Items you do not track (no stock count on the offering) are never reserved.

Converting to an invoice. Convert to invoice creates a draft invoice from the order. You can invoice everything still open or a partial quantity per line, and the same order can be converted more than once until every line has been invoiced. You cannot invoice more than was ordered. Sending the same request twice with the same idempotency key returns the first invoice instead of a duplicate. When you issue the invoice, its stock movements are recorded and the reservation is released, so the shelf count and the reservation move together. Voiding the invoice puts the stock and the reservation back.

The draft invoice from a conversion is locked. You cannot add, remove, or change its lines; edit the sales order instead, or use Cancel conversion to discard the draft. Cancelling gives the quantities back to the order so you can convert it again, with the same idempotency key if you like. Before the invoice is issued you can still change its memo, due date, and totals. Once it is issued, void it rather than cancelling the conversion.

Sales orders do not ship anything on their own. The fulfillment steps that record what has left the building arrive with the fulfillment feature; until then the order moves from confirmed to invoiced through conversion.

Lots and serial numbers​

An item's page has a Lots and serial numbers panel with a Tracking setting. Not tracked is the default and behaves exactly as described above. By lot or batch records an expiry date per batch and sells the earliest-expiring stock first. By serial number records one number per unit.

Receiving into a lot. With lot tracking on, Receive asks for a Lot code and, optionally, an Expires on date, a GTIN, and a manufactured date. Receiving again with the same code adds to that lot. The panel lists each lot with its quantity, its expiry, and where it sits. Lots that are past their date show Expired and lots within 30 days show Expiring soon. The Inventory list has an Expiring within 30 days filter and the same badges.

Selling and transferring out of a lot. Adjust and Transfer offer Take from lot, with Earliest expiry first (suggested) selected. Leave it and the earliest-expiring lot with stock is used, then the next. Expired lots are not suggested, and a sale from an expired lot is refused; write the stock off with an adjustment instead. Count works per lot: the count is compared with that lot's own quantity, not the item's total.

Serial numbers. Receive a list of serial numbers, one per line, pasted or scanned, and the count must match the quantity. A serial number is unique per item. It moves through In stock, Sold, Returned, and Scrapped, and a sold serial number cannot be sold again until it is returned. Each serial number keeps a history of the movements that touched it.

Turning tracking on for an item that has stock. The stock on hand has to go somewhere. Assign it to a lot (or give each unit a serial number) when you switch, or keep it unassigned and count it into lots later. Anything changed outside lot tracking, for example by an older client that only sends whole-number totals, shows up as Not in any lot until you count it in. You cannot switch tracking off while a lot holds stock or a serial number is in stock.

Items linked to HiveMinded are managed there. Lot and serial tracking is not available for them, and an item that has tracking on cannot be linked.

Cost and valuation​

Every receipt creates a cost layer: a quantity received at a unit cost. Every sale, adjustment down, or count down consumes cost from those layers, so the ledger knows what your on-hand is worth and what each outflow cost you. Choose the method under Inventory → Inventory valuation.

  • Moving average is the default. Each outflow is charged the running average cost.
  • FIFO charges each outflow the cost of the oldest layer still open.

The method is a workspace setting and it cannot change while any item has stock. Changing it would revalue that stock, and the app refuses rather than do that silently. Count everything out or wait for a period with no stock, then switch.

Where a receipt's cost comes from. In order: the exact cost sent with the movement (a purchase order receipt sends the order line's cost), then the movement's own unit cost, then the offering's catalog cost. Each layer records which one was used. A gain with no cost of its own, such as a count up, an adjustment up, or a return with nothing to restore, comes in at the current cost, so it does not move a moving average.

Returns and voids restore the layers the original sale consumed, at the cost they were consumed at. Transfers do not change value.

Selling before you receive. If a sale takes an item below zero, it is charged the last known cost and flagged as provisional. The next receipt trues that up and books the difference.

Valuation report. The report lists on-hand, unit cost and value by item, with a total. Pick an As of date to see an earlier position. When GL posting is on, the report shows the balance of your inventory account beside the total. They tie to the cent, because each posting is the change in the item's value rounded to cents. Backdated movements can leave a one-cent difference when you run the report as of a past date. An item's page shows its average or next FIFO cost, its inventory value, and its open layers.

Posting to the general ledger is off until an admin turns it on. Confirm five accounts first: inventory, cost of goods sold, goods received not invoiced, adjustments, and opening balance. The app suggests 1140, 5100, 2120, 5100, and 3900 and creates none of them. If your chart has no dedicated adjustment or clearing account, pick the closest one yourself. Postings are balanced and happen in the same transaction as the stock movement, once per movement:

EventDebitCredit
ReceiptInventoryGoods received
SaleCost of goods soldInventory
Return of a saleInventoryCost of goods sold
Adjustment or count upInventoryAdjustment
Adjustment or count downAdjustmentInventory

Turning posting on books the value of stock you already hold to the opening balance account, so the report ties from day one. The accounts are locked while posting is on. Turn it off to change them. A background job costs movements that an older version of the app wrote, every 15 minutes.

Linked HiveMinded items. HiveMinded owns the on-hand for a linked item, but SaaSy owns its cost. A quantity change that HiveMinded applies is costed at the current average, and it never overwrites the cost SaaSy holds.

Cost of goods sold per invoice line is not part of this. Costing tracks what each outflow cost, and the invoice line link comes later.

Items linked to HiveMinded​

If your workspace is connected to HiveMinded, an item linked to a HiveMinded item has one source of truth for its on-hand: HiveMinded. A stock change you record in SaaSy on that item does not edit a SaaSy count. It is queued as a stock change that HiveMinded pulls, applies, and confirms. The number shown is HiveMinded's quantity plus the changes it has not yet confirmed. A physical count of a linked item is sent as an absolute total.

Open Integrations, pick the connected product, and choose Inventory sync to see the state of every linked item: the quantity HiveMinded last reported, what SaaSy shows, how many changes are waiting or were rejected, and when HiveMinded last pulled and confirmed. The page also lists items HiveMinded sent that SaaSy could not accept as they are, with the field they disagree on and which side owns that field.

Workspace owners and admins can relink or unlink an item and settle a proposed relink. Everyone else can read the page.

The Inventory sync page flags three conditions on each item: a change that has not been settled by HiveMinded for more than two hours (not pulled yet, or deferred), a change HiveMinded applied that the reported quantity has not caught up with after an hour, and a link that has received no quantity from HiveMinded after an hour. The page works these out each time you open it. An hourly check runs the same test and writes what it finds to the service logs for the operations team. Neither changes a quantity, and a flag clears by itself once the condition does.

Workspace owners and admins can record a rejected change again with Retry. It sends a new stock change with the amount and unit you confirm. A rejected count cannot be retried, because an old absolute count would overwrite what HiveMinded has now, so enter a fresh count instead. If the item's unit changed after the rejection, Retry is refused and you record the change again in the new unit.

What Inventory does not do​

Being plain about the edges, because they matter for how much you can lean on this:

  • Sales orders and field-service jobs move stock. A sales order reserves stock when you confirm it, and the invoice you convert it into takes stock off the shelf when you issue it (see Sales orders). Logging a material on a field-service job writes a sale movement and lowers on-hand; removing it writes a return movement and restores the count. Quotes and deals do not decrement on-hand. The transfer movement type is reserved and nothing writes it. Every other change you see is one someone recorded by hand.
  • There are no locations or warehouses. One count per item, for the whole workspace.
  • There are no alerts. Low stock is a badge and a filter, not a notification.
  • No lot expiry alerts. Expiring lots are a badge and a filter; nothing is sent to you.
  • Items are created in Offerings, not here. There is no "add item" button on the inventory pages.

Availability​

Inventory is on by default in the agency, e-commerce, SaaS, construction, manufacturing, and general packs. The professional services and nonprofit packs switch it off by default, on the assumption that those businesses do not hold stock. That is a pack default, not a restriction; switch it back on under Settings → Navigation. Hiding is cosmetic, and the pages work if you have the URL.

There is no separate entitlement for Inventory. It is part of the CRM catalog and is included with every SaaSy plan: Starter, Growth, and Scale. There is no add-on to buy and no upsell card: if you can reach the page, you have the feature. There is no free tier, so an active subscription is required.

See Modules, packs, and plans for how visibility and entitlement interact.