Stocktakes and transfers
Count stock with stocktakes and move it between warehouses with transfers.
Stocktakes check what's really on your shelves against what Smooth POS thinks is there. Transfers move stock from one warehouse to another. Both can be done on a phone or tablet in the app, or driven through the API from your own scanners and systems.
Let Smooth POS move the stockCompleting a stocktake and receiving a transfer update stock levels for you. Don't adjust stock yourself as well, or it'll be counted twice.
Stocktakes
How a stocktake works
- Start it. Smooth POS takes a snapshot of the warehouse's current stock (
stock_freeze): every item and location with stock on hand, leaving out stock in transit. The stocktake is Open. - Count. Add what you count (
stock_count). The first count moves it to In Progress. - Check the variance. Compare the counts with the snapshot and fix any miscounts.
- Complete it. The stocktake becomes Complete and your stock is updated to match the counts.
Completing is final. Once a stocktake is Complete you can't add more counts, so check the variance first, and only complete each stocktake once.
In the app
Go to Inventory → Stocktakes and start a new one for a warehouse. Scan items to count them; on a phone you can use the camera. Open Variances to see the differences before you complete it.
Through the API
1. Start a stocktake. Create a stocktake:
{"warehouse_id": 3, "name": "October stocktake"}2. Add counts. Add counts to a stocktake with PUT /stocktake/{id}/addcount.json. The body is an array, so you can send a whole batch from a scanner at once:
[
{"item_id": 5521, "item_location_id": 17, "soh": 6},
{"item_id": 5522, "item_location_id": 17, "soh": 2}
]Counts add to what's already been counted for that item and location. Sending {"item_id": 5521, "item_location_id": 17, "soh": 6} twice gives a count of 12. To correct an over-count, send a negative soh.
3. Check the variance. Get a stocktake's variance returns stock_variance: one row per item and location with the variance between count and snapshot, and its cost. Add limit (up to 250) to page through big stocktakes with the X-Next-Page header.
4. Complete it. Complete a stocktake: GET /stocktake/{id}/complete.json. This changes data even though it's a GET, so only call it when you mean it.
Find stocktakes with open, in progress and complete lists, filtered by warehouse_in.
Hooks
stocktake_create, stocktake_add_count, stocktake_status_change and stocktake_delete fire as a stocktake moves along. stocktake_status_change sends the before and after status, stocktake_id and warehouse_id.
Transfers
A transfer sends stock from one warehouse to another. It's Sent when you create it, then either Received at the other end or Canceled.
In the app
Go to Inventory → Transfers and create a transfer. Pick the source and destination warehouses, then scan or search for the items and quantities. When it arrives, open it at the destination and receive it.
Through the API
1. Send it. Create a transfer:
{
"from_warehouse_id": 3,
"to_warehouse_id": 5,
"reason": "Restock Bondi",
"carrier_id": 4,
"tracking_code": "AP123456789AU",
"lines": [
{"item_id": 5521, "from_location_id": 17, "quantity": 6}
]
}Errors tell you what's wrong: source warehouse doesent exist, destination warehouse doesent exist, carrier doesent exist, source location doesent exist or one or more items dont exist.
2. Update tracking (optional). Update a transfer changes the carrier, tracking details, tags and custom fields. Tracking details can only change while it's Sent. It doesn't change the lines.
3. Receive or cancel it. Receive a transfer (GET /transfer/{id}/receive.json) or cancel it. Either only works while the transfer is Sent; otherwise you get transfer cant be received or cancelled.
List transfers filters by from_warehouse_ids, to_warehouse_ids, tracking_code and more. Its since_id is inclusive: the transfer with that ID comes back too.
Hooks
transfer_create, transfer_update and transfer_status_change fire as a transfer moves along.
Example: Email the destination store when a transfer is sent
Trigger: System Hook, transfer_create.
-
Script: Read the transfer
var t = JSON.parse($.default); $.transfer = t; $.transfer_id = t.id; $.units = t.lines.reduce(function (sum, l) { return sum + l.quantity; }, 0); $.to_name = (t.to_warehouse && t.to_warehouse.name) || ("warehouse " + t.to_warehouse_id); -
Email: Tell the store, To your store's address, Template Custom, Subject
Transfer {{ transfer_id }} is on its way, Body<p>{{ units }} units are on their way to {{ to_name }}. Tracking: {{ transfer.tracking_code }}</p>
Updated about 22 hours ago
