Skip to main content

Compare 3PL inventory with SKU.io

A 3PL counts the stock on its shelves, and SKU.io keeps its own count of the same stock. When the two drift apart, you either sell stock that isn't there or hide stock you could sell. The 3PL comparison checks them against each other every day, warehouse by warehouse, and shows you which products are off, why, and by how much. Where the 3PL is right, you accept its count and SKU.io creates the stock takes to match.

It works the same way for every 3PL you connect: Odoo 3PL, ShipBob, ShipHero, Shipfusion, Trackstar and VeraCore.

Before you begin​

  • Connect your 3PL and map each of its locations, or fulfillment centers, to a SKU.io warehouse. A warehouse with nothing mapped to it isn't compared. Until something is mapped, the comparison says No warehouses mapped and offers Map warehouses.
  • Map the 3PL's products to your SKU.io products. A 3PL item with no SKU.io product shows as 3PL only and isn't compared.
  • To run a comparison yourself, you need the Integrations → Sync permission.
  • To accept a 3PL count, you need permission to count inventory, the same permission stock takes use.
  • To change the comparison settings, you need the Integrations → Edit permission. To export, you need permission to export inventory.

Steps​

  1. Go to Inventory → 3PL Comparison. Each row is one 3PL connection, with its latest comparison, its Agreement, the trend over the last 30 Days, how many products are Off By More than your tolerance, and any Warehouse Alerts.
  2. Click the connection's name. Its Comparison tab opens on the latest comparison.
  3. To compare right now instead of waiting for the daily run, click Run comparison now.
  4. Click Off by more to list only the products further apart than your tolerance.
  5. Click a row to see SKU.io's movements around the comparison and the hints that explain the gap.
  6. Where the 3PL is right, tick those rows and click Accept 3PL count, or click Accept all matching filters. Choose Closed (apply now) or Draft, and create the stock takes.

The sections below explain each step.

Open the comparison​

You can also open the tab from the 3PL itself. Open the integration, go to its Inventory page and click Comparison.

Inventory → 3PL Comparison, one row per 3PL connection

Use Health on the list to find the connections that need you: Has warehouse alerts, Below 98% agreement, Stale or never run or Healthy. Provider narrows the list to one kind of 3PL.

How a comparison is taken​

Each comparison takes the 3PL's on-hand count at one moment and compares it with what SKU.io had at that same moment. SKU.io's side is rewound to the time on the comparison, so a shipment or a receipt recorded afterwards never shows up as a difference.

The Comparison tab: the snapshot, its time, the cards, the warehouses and the rows

The line at the top of the tab says when the 3PL's figures are from, after 3PL figure as of. When the 3PL doesn't say when it counted, the comparison uses the moment SKU.io started pulling them, marked (pull start). basis says what both sides count. For most 3PLs it's On hand: every unit physically in the warehouse, including units already allocated to orders. VeraCore reports the stock it can sell, so its basis is Sellable on hand, and SKU.io leaves out its own held and non-sellable units to match.

A new comparison is Provisional at first. After a waiting period, SKU.io recalculates its own side once more, to catch shipments recorded late, and the comparison becomes Settled. Trends and alerts only use settled comparisons.

Run a comparison now​

SKU.io compares each 3PL daily, at 06:00 in your timezone, on its own. You can change the schedule in Settings.

To compare right now, click Run comparison now. SKU.io pulls the 3PL's inventory in the background. You can follow it in the job tray, and the page refreshes when it's done.

Run comparison now is unavailable while a comparison is already running, and until at least one 3PL location is mapped to a warehouse. Scheduled comparisons pause when automatic sync is off for the integration. Run comparison now still works then.

To look at an earlier comparison, choose it from the Snapshot list. Each entry shows its time, its agreement and whether it's Settled, Provisional or Failed. If the latest run failed, a red banner says why and shows the previous comparison, with a Retry button.

Read the summary​

The cards sum up the comparison. Click a card to filter the rows below to it, and click it again to clear the filter.

The summary cards

CardShows
AgreementThe share of compared products whose counts match, exactly or within your tolerance. The line under it is the same idea by units: how much of SKU.io's stock the 3PL's counts confirm. The small chart is the last 30 days
ExactProducts where both counts are the same
Within ±2Products slightly off, but within your tolerance, so they count as agreeing. The number follows your tolerance
Off by moreProducts further apart than your tolerance. The line under it splits them into oversell risk and hidden stock
Units apartEvery product's difference added up, whatever its direction. The line under it is the net difference and its value at cost
3PL onlyItems the 3PL reports that aren't mapped to any SKU.io product
SKU.io onlyProducts SKU.io holds in a mapped warehouse that the 3PL doesn't report at all
Unmapped locationsUnits the 3PL holds in locations that aren't mapped to any SKU.io warehouse, so they aren't compared

When everything agrees, a green banner says Everything matches.

Check each warehouse​

Under the cards, Warehouses lists each mapped warehouse with the 3PL's on-hand, SKU.io's on-hand, the difference and the warehouse's own agreement. Click View rows to filter the rows to that warehouse.

The warehouse breakdown

The Checks column flags problems that affect a whole warehouse. Hover a chip for the details.

CheckMeans
3PL reports 0 · SKU.io holds …The 3PL reports no stock at all in the warehouse while SKU.io holds some. Orders sent there can't ship. A red banner above the cards says the same, with View rows. Check the warehouse mapping first
… negative SKU.ioSome products have negative stock in SKU.io for the warehouse: more was shipped than SKU.io had on record. Usually a missed receipt or a late adjustment
… shipped from emptyProducts shipped from the warehouse in the 24 hours before the comparison, while the 3PL reports none of them. Usually the wrong warehouse, or a stale 3PL count

Find what's off​

Each row is one product in one warehouse. Δ is the 3PL's count minus SKU.io's, at the comparison time.

  1. Click Off by more to list only the products further apart than your tolerance.
  2. Read the Status of each row. Red is the risky direction: SKU.io thinks it has more than the 3PL holds, so you could oversell. Amber means the 3PL holds stock SKU.io doesn't know about, so you could sell more.

Rows filtered to Off by more

StatusMeans
ExactBoth counts agree exactly
Within toleranceSlightly off, within your tolerance, so it counts as agreeing
SKU.io higherSKU.io has more than the 3PL. Orders may be accepted for stock that isn't there
3PL higherThe 3PL has more than SKU.io knows about, so sellable stock is hidden from your channels
3PL onlyThe 3PL reports the item, but it isn't mapped to a SKU.io product
SKU.io onlySKU.io has stock of the product in the warehouse, and the 3PL reports nothing for it
Unmapped locationThe 3PL holds the stock in a location that isn't mapped to a SKU.io warehouse. Map the location to include it
Not comparableThe row can't be compared like for like, so it's left out of the agreement

The 3PL's count adds up all of its bins and docks in that warehouse. Locations lists them. 3PL Reserved, Allocated @ Snapshot and On Hold are there for context and aren't part of the difference. SKU.io Now is SKU.io's stock right now. Value Δ prices the difference at the product's cost, roughly what accepting the 3PL's count would adjust.

Search by SKU, product name or the 3PL's SKU, and filter by Status, Warehouse, Product Type and Accepted. Kits are left out unless you turn on Compare kit products in Settings, because 3PLs usually stock a kit's components rather than the kit.

See why a count differs​

Click anywhere on a row, or the arrow at its start, to open its details. Click again to close them.

A row's details: SKU.io's movements around the comparison, and the hints

  • SKU.io movements lists the product's stock movements in that warehouse from 48 hours before the comparison until now. A line marks where the comparison was taken. Click a movement to open its stock take, order or transfer.
  • Since the snapshot adds up what was shipped and received after the comparison, and the net change. These movements aren't part of the difference.
  • Δ over recent snapshots shows the difference at each of the product's last comparisons. A bar that keeps coming back points to a recurring cause.
  • Hints show what usually explains a gap: units on fulfillment orders that haven't shipped yet, units on open purchase orders, and units in transit on a transfer. Hints explain a difference, and never change it.
  • Product inventory and Movements tally open the product's stock and its full movement history.

Before you accept the 3PL's count, rule out the usual causes: a product mapped to the wrong SKU.io product, a 3PL location mapped to the wrong warehouse, or a receipt or shipment the 3PL recorded and SKU.io hasn't yet.

Accept the 3PL's count​

When the 3PL is right, accept its count. SKU.io creates one stock take per warehouse, which moves SKU.io to the 3PL's count.

  1. Tick the rows to accept and click Accept 3PL count. To accept every row the filters show, click Accept all matching filters instead.
  2. Check the totals. Accept 3PL count lists each warehouse with its rows, units and value. Rows that can't be accepted are skipped and counted under the table: rows already accepted, rows already resolved by movements recorded since the comparison, and exact, 3PL only, unmapped-location and not-comparable rows.
  3. Choose a Status. Closed (apply now) posts the adjustment straight away. Draft saves the stock takes for you to review first.
  4. Keep or change the Reason, and add Notes if you like. The reason is saved on each stock take.
  5. Click Create stock takes. The button counts them, for example Create 2 stock takes.

Accept 3PL count, with one stock take per warehouse

Stock takes created lists each new stock take, with its warehouse, items, value and status. Click one to open it. Back in the table, each accepted row shows Accepted and a link to its stock take.

Stock takes created

The stock takes are dated at the comparison time, and each line adjusts by the difference at that moment. So anything that moved since then stays as it is. A draft isn't checked again against later movements, so finalize drafts promptly. See Finalize a stock take.

You can only accept counts on the latest comparison. On an older one, the button says "A newer snapshot exists — switch to it before accepting counts".

Export the comparison​

Click Export to download every row matching your filters as a CSV file, or tick rows and click Export selected. Exports of more than 1,000 rows run in the background. You download them from the job tray when they're ready. There's no import, and nothing you change in the file comes back into SKU.io.

ColumnContains
Line IDThe row's number in this comparison
SKUThe SKU.io SKU
ProductThe SKU.io product name
3PL SKUThe item's SKU at the 3PL
WarehouseThe SKU.io warehouse compared
3PL LocationsThe 3PL locations added together for the row, separated by |
3PL On HandThe 3PL's count
SKU.io On Hand at SnapshotSKU.io's count at the comparison time
Difference (3PL − SKU.io)The 3PL's count minus SKU.io's. Negative means SKU.io is higher
StatusThe row's status, as in the table
3PL ReservedUnits the 3PL set aside for orders
SKU.io Allocated at SnapshotUnits SKU.io had allocated to orders at the comparison time
SKU.io On Hold at SnapshotUnits SKU.io had on hold at the comparison time
SKU.io On Hand NowSKU.io's count when you exported
Unit CostThe cost used to value the difference
Value DifferenceThe difference priced at the unit cost
Not Comparable ReasonWhy a row couldn't be compared, when it couldn't
Accepted Stock TakeThe number of the stock take that accepted the row, if any
Snapshot As OfThe comparison time, in your timezone. The heading names the timezone
SettledYes or No

Change the schedule, tolerance and alerts​

Click Settings on the Comparison tab. The settings apply to that 3PL connection, from its next comparison.

Comparison settings

SettingDoes
How often to compareHourly, Every 6 hours or Daily. Daily is the default
Hour of day (your timezone)When the daily comparison runs. Pick a quiet time, after the 3PL's last shipments of the day
Settle delay (minutes)How long to wait before SKU.io recalculates its side once more and the comparison becomes Settled
± units and ± percent (optional)How far apart two counts can be and still agree. A row agrees if it passes either rule. ± units starts at 2
Compare kit productsCompares kits as well. Off by default
Agreement below and Or drops bySends an alert when agreement falls below this percentage, or drops by this many points from the previous comparison
Alert when the 3PL reports 0 for a warehouse SKU.io holds stock inSends an alert for the 3PL reports 0 check above. Usually means a wrong mapping, or the 3PL has lost track of the stock

Who receives the alerts, and how, is set in Settings → Alerts.

SKU.io keeps every comparison's rows for 14 days, then the last comparison of each day for 90 days. The headline figures stay for 13 months, so the trend still works.

Next steps​

Video transcript

To check your 3PL's stock against SKU.io, go to Inventory, then 3PL Comparison. Each row is one 3PL connection. It shows the latest agreement, the trend over thirty days, and how many products are off. To open one connection, click its name in the Integration column. Every 3PL you connect has this same tab on its own Inventory page. Each comparison takes the 3PL's on-hand count at one point in time. SKU.io's stock is rewound to that exact moment. So shipments recorded afterwards never show up as differences. A new one runs every day on its own. To compare right now, click Run comparison now. It pulls the 3PL's inventory in the background, and the page refreshes when it's done. Pick an older comparison from the Snapshot list. The cards sum up the comparison. Agreement is the share of products whose counts match, exactly or within tolerance. Off by more is how many are further apart than your tolerance. 3PL only, SKU.io only and Unmapped locations show stock that can't be compared. Below, each mapped warehouse has its own totals and agreement. The Checks column flags a warehouse-wide problem, like the 3PL reporting zero. Click View rows to see just that warehouse. Click the Off by more card to list only those products. Red means SKU.io thinks it has more than the 3PL holds, so you could oversell. Amber is the opposite: stock at the 3PL that you can't sell yet. To see why a count differs, click anywhere on its row. It lists the stock movements from two days before the comparison until now. The hints show open orders, purchase orders and transfers that can explain a gap. When the 3PL is right, take its number. Tick rows and click Accept 3PL count, or accept every row that matches your filters. SKU.io creates one stock take per warehouse, dated at the comparison. Closed applies the adjustment as soon as you create the stock takes. Draft keeps them for you to review first. Keep or change the reason, add notes if you like, and click Create. The window lists each new stock take, and a link to open each stock take. When you've read the list, click Done to close the window. Each accepted row now links to its stock take. To download the rows you see as a spreadsheet file, use the Export button. To change how the comparison works for this 3PL, click the Settings button at the top. Choose how often to compare. By default, it runs daily at six in the morning. Under Tolerance, set how far apart two counts can be and still agree. The default is two units. Under Alerts, choose when to get an alert, for example when agreement falls below a level you set.

Last verified: