Clarus goods in, receipts and stock
Lesson 12 of 28 8 min read
Book goods in receipts in Clarus WMS, bring back counted quantities, and understand the two ways Clarus stock is imported, including the snapshot that can zero stock.
This lesson covers the inbound side of Clarus WMS (goods in receipts and what the warehouse counted) and stock levels, which work differently from most connectors.
Booking a goods in receipt
When a purchase order is sent to Clarus as a Goods Inbound, Supply Lens books a goods in receipt. Lines are sent with a Clarus product id only; a product with no cross-referenced id is looked up by SKU at send time.
One unknown SKU stops the receipt
If any product cannot be found in Clarus, the receipt is not sent, and the error names the unmatched SKUs. Add the product in Clarus or fix the cross-reference, then reprocess.
| defaultWarehouseId | The warehouse received into when the fulfilment location has no Clarus warehouse id cross-referenced. When set, the warehouse cross-reference stops being required. Changes at go-live. |
|---|---|
| defaultLocationId | The location booked into, normally the goods in bay. Clarus rejects a receipt without one, so set it. Changes at go-live. |
| receiptType | A plain receipt of goods, a receipt against a purchase order held in Clarus, or a crossdock. Defaults to receipt. |
| inboundMethod | Whether the supplier delivers or the warehouse collects. Defaults to delivery. |
| status | The state the receipt is created in. Only draft and pending are meaningful. Defaults to PENDING. |
| goodsInReceiptKindId, orderTypeId, inboundGoodKindId | Clarus classification ids. Each can be a constant or a rule reading the document's tags, so different kinds of inbound can be classified without a settings change. Left unset, the field is omitted. |
| sendBatchNumbers | Sends one receipt line per batch, with batch number and expiry. Leave off where the warehouse assigns its own batches on receipt. Off by default. |
| sendStorageUnitQuantity | Sends the number of pallets each line fills: quantity in the default unit divided by the pallet conversion, rounded up. Needs the organisation's pallet unit and a pallet conversion on every product; a product without one fails translation naming the SKU. Off by default. |
Why round up?
A part pallet still takes a pallet space. 130 packs at 60 packs per pallet is 2.17 pallets, sent as 3. Each batch line is counted on its own.
Bringing back what was counted
A Goods Inbound Receipt is imported once per change, not once per receipt. The warehouse works a receipt over time, so the same receipt comes back again with more received against it.
| filterByStatuses | Only receipts in these states are imported. Empty imports every state, including receipts the warehouse has not finished working. |
|---|---|
| filterByAccountCode, filterByWarehouseCode | Only receipts for this account or warehouse code. Empty imports everything the credentials can see. |
| useQuantityReceivedField | Clarus has two undocumented received quantities, quantity_received and received_quantity. Enabled (the default) reads quantity_received; disabled reads received_quantity. Change it if quantities on the purchase order come through as zero. |
Stock: snapshot or incremental
Clarus stock is imported in one of two ways, decided by lastImportDate:
Clarus records no timestamp on a stock balance, so "what moved" is found from its stock transactions (allocations, picks, despatches, put-aways, transfers and holds). Each run looks back a further five minutes so nothing at the boundary is missed.
| lastImportDate | Set automatically to the time each run started. Clear it to import a complete snapshot on the next run. |
|---|---|
| onHandBasis | Which Clarus figure counts as on hand: received, available, or available plus allocated plus picked. It has no effect on the stock adjustment today, because quantity available always comes from the available figure. Defaults to received. |
| filterByAccountCode | Stock for one Clarus account only. |
| filterByWarehouseCode | Stock for one warehouse, by code such as AW, not numeric id. |
| filterByProductCode | One product only, intended for verifying the integration. |
| pageSize | Balances per page. Empty means 100, which is also the maximum; larger values are reduced to 100. |
Never leave filterByProductCode set with an empty lastImportDate
A snapshot taken under a product filter is still treated as a complete inventory. Every product the filter excludes is set to zero. Use the product filter for testing, then clear it before any snapshot runs.
Oakmoor Foods resets its stock
After a stock take, Oakmoor wants a clean resync. The implementer checks that
filterByProductCode is empty, confirms the account and warehouse codes are right, clears
lastImportDate and runs Receive. Every balance is read, products Clarus does not hold go to
zero, and the next scheduled run goes back to importing only what moved.
Recap
- Goods in receipts need a location (defaultLocationId) and every product must resolve in Clarus, or nothing is sent.
- Classification ids can come from tags; pallet counts need pallet conversions on every product.
- Receipts are imported once per change; filter by status to bring back only finished ones.
- If received quantities arrive as zero, flip useQuantityReceivedField.
- An empty lastImportDate means a complete stock snapshot that zeroes anything not returned, so never combine it with a product filter.
Quick guides for this topic
Your progress is saved in this browser. Create a free account to keep it everywhere, take quizzes and earn certificates.