# Inventory Reconciliation: Shopify, Amazon and a 3PL (2026)

> Published 2026-10-27
> Source: https://viktor.com/blog/inventory-reconciliation

## Key Takeaways

- Inventory reconciliation is the monthly job of comparing on-hand stock in Shopify, Amazon FBA and your 3PL against one cut-off, explaining every variance and posting the adjustments to one source of truth.
- Most variances are not theft. They come from four places: channel sync lag, returns in transit, bundled or kitted SKUs, and 3PL cycle counts that disagree with system counts.
- Amazon’s Inventory Ledger report and Shopify’s on hand, committed and unavailable states give you everything you need, but only if you pull them on the same cut-off date.
- A person still decides write-offs, reimbursement claims, disputes with the 3PL and any change to the source of truth. The pulling, mapping and variance list can be handed off.
- Amazon reimbursement claims have deadlines (60 days for units marked lost or damaged in a fulfillment center, per Amazon’s US policy), so a monthly cadence is the slowest one that still protects your money.

## The short answer

Inventory reconciliation for a Shopify, Amazon and 3PL setup means pulling on-hand counts from all three systems on the same cut-off, mapping SKUs across channels and bundles, listing every variance, explaining each one (timing, returns, shrink or mapping errors) and posting approved adjustments to your source of truth. Done monthly, it takes a few hours if the data pull is automated and a full day if it is not.

This guide traces one reconciliation end to end, for a brand that sells on its own Shopify store and on Amazon, with some stock at Amazon FBA and the rest at a third-party logistics warehouse. If you want the wider picture of margins and channel profitability, read our guide to [AI for ecommerce](https://viktor.com/blog/ai-for-ecommerce). This page is only about the monthly stock count.

## Why your stock numbers never match

Each system counts a different thing and updates on a different clock.

Shopify splits stock at each location into five states. According to the [Shopify Help Center](https://help.shopify.com/en/manual/inventory-and-locations/fundamentals/inventory-states), on hand is the total of committed, unavailable and available units. Committed units sit in unfulfilled orders, reserved draft orders or transfers marked ready to ship. Unavailable units are damaged, waiting for quality control or held as safety stock. Incoming units are on their way and do not count until someone receives them.

Amazon tracks FBA stock in its own ledger. The [Inventory Ledger report](https://developer-docs.amazon.com/sp-api/lang-tr_TR/changelog/deprecation-notice-suppressed-listings-reports-and-fba-inventory-reports) shows starting balance, receipts, customer shipments, customer returns, transfers between warehouses, found, lost, damaged, disposed and ending balance for each FNSKU. Amazon itself describes it as an end-to-end reconciliation view.

Your 3PL runs a warehouse management system with its own counts, adjusted every time a picker cycle counts a bin. Most 3PLs send a daily stock file or expose an API, and their numbers lag the physical shelf by however long it takes a count discrepancy to be approved.

Three ledgers, three clocks. If you compare Shopify on the 1st at 9:00 with an Amazon report from the 30th and a 3PL file from last Friday, you will find variances that are pure timing. That is why step 1 below is about the cut-off, not the counting.

## Where the numbers diverge

Before you reconcile, know the four places most variances come from. In practice, a good variance list sorts almost every line into one of these buckets.

### Channel sync lag between Shopify and Amazon

When the same units can sell on Shopify and on Amazon (for example through Multi-Channel Fulfillment or a listing tool that pushes stock levels), every sale has to travel from one channel to the other. Sync tools run on intervals. A unit sold on Amazon at 23:55 may still show as available on Shopify at midnight, and the reverse happens too.

Typical symptoms: Shopify shows a few more units than the warehouse holds, oversells cluster around promotions, and the variance disappears when you re-pull the next day. Timing variances like these should net to zero over two cut-offs. If they do not, it is not lag.

### Returns in transit and damaged stock

A customer refund and a returned unit are two events on two dates. On Amazon, when a customer is refunded but the item is not returned to a fulfillment center within the window Amazon sets (60 days in the US, per [Amazon’s seller forum notice on refund at first scan](https://sellercentral.amazon.com/seller-forums/discussions/t/6f8940f5-50df-419e-8c8d-e21553fd45a4)), Amazon normally reimburses you. If the item comes back sellable, it goes back into your inventory instead.

For your Shopify orders, returns go to the 3PL. The unit is in transit for days, then waits at the dock for inspection. Until the 3PL processes it, it exists in neither the 3PL’s sellable stock nor Shopify’s available count. Units that come back damaged should land in Shopify’s unavailable state as damaged, not disappear.

Symptoms: refunds in your sales data with no matching restock, a pile of “pending inspection” units at the 3PL, and FBA units in a customer-damaged or defective disposition that nobody has removed.

### Bundled and kitted SKUs

Bundles create a mapping problem. With Shopify’s native bundles, [bundle inventory is calculated from the component products](https://help.shopify.com/en/manual/products/bundles/eligibility-and-considerations): Shopify divides each component’s available stock by the quantity the bundle needs and takes the lowest whole number. A gift set of 2 candles and 1 diffuser, with 15 candles and 8 diffusers available, can sell 7 sets.

The trouble starts when channels treat bundles differently. Amazon may hold a pre-kitted bundle as its own FNSKU, physically packed at the 3PL, while Shopify sells a virtual bundle built from loose components. One customer order then moves different SKUs in different systems. If your SKU map does not explode bundles into components, every bundle sale looks like a variance.

### 3PL cycle counts vs system counts

Your 3PL counts parts of the warehouse continuously rather than all at once. A common cadence classifies SKUs by value: A items (roughly the top 20% of SKUs) counted weekly or every couple of weeks, B items monthly and C items quarterly. When a count disagrees with the system, the 3PL adjusts its WMS, and that adjustment may or may not flow back to Shopify automatically.

How accurate should you expect it to be? [APQC’s benchmark](https://www.apqc.org/How-Can-Cycle-Counting-Improve-Inventory-Accuracy) puts median inventory accuracy at 95%, with the top quartile at 98% or better, across 8,660 companies. A 3PL running 95% accuracy on a 2,000-unit SKU base is wrong on something every week. Ask your 3PL for its cycle count adjustment log each month. It is the single best document for explaining 3PL variances.

## The monthly reconciliation, step by step

Here is the full job, run once a month after the books close for the period. A brand with a few hundred SKUs can do it in an afternoon once the pulls are automated.

### Step 1: Pull on-hand counts from every system on the same cut-off

Pick one cut-off, for example 23:59 on the last day of the month in your accounting time zone, and pull from all three systems against it:

- **Shopify:** on hand, committed, unavailable and incoming per SKU per location. The inventory export or Shopify’s inventory reports give a snapshot; pull it as close to the cut-off as you can and note the time.
- **Amazon FBA:** the Inventory Ledger summary for the month, by FNSKU and disposition, plus the detail view for the lines you will need to explain. Note that it shows sellable and unsellable separately.
- **3PL:** the end-of-month stock file plus three supporting logs: receipts, returns processed and cycle count adjustments.

Also export the period’s open purchase orders and inbound shipments to Amazon. Units in transit between your 3PL and an Amazon fulfillment center belong to no one’s on-hand count and are the biggest single source of false variances.

### Step 2: Map SKUs across channels and bundles

Build or update one SKU map with a row per component SKU and columns for the Shopify SKU, Amazon MSKU and FNSKU, and the 3PL item code. Add a bundle table that lists each bundle and its components with quantities.

Then explode every bundle into components on every channel so you compare like with like. This is where most mapping errors hide: a new variant added to Shopify but not to the 3PL, an Amazon listing that reused an old MSKU, a kit the 3PL built without telling anyone.

[Hand the monthly data pull and SKU mapping to Viktor and start free with up to $100 in credits, no credit card required](https://app.viktor.com/signup).

### Step 3: Compare and list every variance

For each component SKU, compute what you expect against what each system says:

- Expected total = 3PL on hand + FBA on hand (sellable and unsellable) + units in transit between them.
- Shopify on hand at each location should equal the matching physical location’s count.
- Amazon’s ending balance should equal starting balance plus receipts, minus shipments, plus returns, plus or minus found, lost, damaged and disposed.

Put every non-zero line on a variance list with SKU, systems compared, unit difference and value at cost. Sort by value, not by units. A 40-unit gap on a $2 sticker matters less than a 3-unit gap on a $180 product.

### Step 4: Explain variances (timing, returns, shrink, mapping errors)

Work down the list and tag each line with one cause. A simple table keeps the team consistent:

```json:object
{
  "_key": "k130",
  "_type": "table",
  "rows": [
    {
      "_key": "k124",
      "_type": "tableRow",
      "cells": [
        "Cause",
        "What it looks like",
        "Usual fix"
      ]
    },
    {
      "_key": "k125",
      "_type": "tableRow",
      "cells": [
        "Timing",
        "Variance reverses by the next pull; matches orders near the cut-off",
        "No adjustment; recheck next month"
      ]
    },
    {
      "_key": "k126",
      "_type": "tableRow",
      "cells": [
        "Returns",
        "Refunds without restock; units pending inspection",
        "Wait for processing, chase the 3PL, or file an Amazon claim"
      ]
    },
    {
      "_key": "k127",
      "_type": "tableRow",
      "cells": [
        "Shrink or damage",
        "3PL cycle count adjustment down; FBA lost or damaged lines",
        "Write off, or claim reimbursement"
      ]
    },
    {
      "_key": "k128",
      "_type": "tableRow",
      "cells": [
        "Mapping error",
        "Variance on one SKU mirrored by an opposite variance on another",
        "Fix the SKU map; no stock adjustment"
      ]
    },
    {
      "_key": "k129",
      "_type": "tableRow",
      "cells": [
        "Unknown",
        "None of the above after checking the logs",
        "Escalate to a person and the 3PL"
      ]
    }
  ]
}
```

Amazon lines tagged lost or damaged need a decision quickly. Amazon’s US policy sets the claim window for units marked lost or damaged in a fulfillment center at 60 days after the event, and customer return claims at 45 to 105 days after the refund, per [Amazon’s update to FBA reimbursement claim windows](https://sellercentral.amazon.com/seller-forums/discussions/t/d8f9a56c-882f-437c-ad34-cccd11cfa465). Amazon reimburses many of these automatically, so check the reimbursement report before filing.

### Step 5: Post adjustments and update the source of truth

Decide which system is the source of truth for each location. For most brands it is the 3PL’s WMS for the warehouse and Amazon’s ledger for FBA, with Shopify set to mirror both. Post approved adjustments there first, then let them sync to Shopify, rather than editing Shopify by hand and hoping the 3PL agrees.

Record every adjustment with a reason code (damaged, lost, found, mapping, return processed) and the person who approved it. Give the total value of write-offs to whoever closes the books, since it moves cost of goods sold. Finally, carry open items such as unprocessed returns, pending claims and unexplained lines into next month’s list so nothing quietly falls off.

## What a person still has to adjudicate

Most of the job is mechanical. Some of it is judgement, and that part should stay with a person:

- **Which number is true.** When the 3PL says 120 and a fresh Shopify snapshot says 128 and neither log explains it, someone has to decide whether to request a recount, accept the 3PL’s number or hold the variance open.
- **Write-offs.** Writing off stock changes your margin and possibly your tax position. A person approves it.
- **Reimbursement claims and disputes.** Filing an Amazon claim, or asking a 3PL to pay for units it lost under your contract, is a relationship and money decision.
- **Changes to the SKU map and bundle rules.** A wrong mapping silently corrupts every future reconciliation.
- **Patterns.** If the same SKU shrinks every month, the fix is a process change (packaging, a bin location, a supplier), not another adjustment.

Everything before those decisions (the pulls, the mapping, the arithmetic, the first-pass tagging, the reminders about claim windows) is repetitive work that can be done by software, or by an [AI employee](https://viktor.com/ai-employee).

## Running it with an AI employee in Slack

Viktor is an AI employee who lives in Slack and Microsoft Teams, connects to 9,800+ tools (most via one-click OAuth) and does the work himself. If you are new to the idea, here is [what an AI employee is](https://viktor.com/blog/what-is-an-ai-employee) and how it differs from a chatbot.

For this job you would connect Shopify, Amazon Seller Central and your spreadsheet or accounting tool. If your 3PL has no connector, Viktor can read the stock file the 3PL already emails you or call the 3PL’s API. Then you give him the monthly job in plain words, once:

> On the 1st of every month, pull on-hand counts from Shopify, the Amazon Inventory Ledger and our 3PL file for the last day of the month at 23:59. Explode bundles using the SKU map sheet. Post the variance list to #ops, sorted by value, with a suggested cause for each line. Flag any Amazon lost or damaged lines that are older than 45 days. Do not post any adjustment without my approval.

On the 1st, Viktor posts the variance list in the channel, explains the lines he could tag from the logs and lists the ones he could not. You reply in the thread with decisions (“accept the 3PL count on the candle set, file the FBA claim on the diffuser”), and he drafts the claims and adjustment entries for you to approve. He waits for approval before anything that changes a number in a system, and you can [control where your AI employee works](https://viktor.com/blog/how-to-control-where-your-ai-employee-works), so he only touches the stores and channels you allow.

Viktor starts free with up to $100 in credits and no credit card. The Team plan is $100 a month for 40,000 credits for the whole workspace, per [viktor.com/pricing](https://viktor.com/pricing).

[Set up your first monthly reconciliation run with Viktor in Slack](https://app.viktor.com/signup).

## Reconciliation checklist (copy this)

Use this as a recurring task each month.

1. Set the cut-off date and time, and note your accounting time zone.
2. Pull Shopify on hand, committed, unavailable and incoming per SKU and location.
3. Pull the Amazon Inventory Ledger summary (and detail for flagged FNSKUs), sellable and unsellable.
4. Pull the 3PL stock file, receipts log, returns log and cycle count adjustment log.
5. Export open inbound shipments to Amazon and open purchase orders.
6. Update the SKU map for new variants, listings and kits.
7. Explode bundles into components on every channel.
8. Calculate expected vs reported per component SKU and list every non-zero variance.
9. Sort the list by value at cost.
10. Tag each line: timing, returns, shrink or damage, mapping error, unknown.
11. Check Amazon’s reimbursement report and file claims inside the deadline.
12. Get approval for write-offs and adjustments, then post them to the source of truth first.
13. Send the write-off total to whoever closes the books.
14. Carry open items into next month’s list.

[Let Viktor run this checklist on the 1st of every month, free to start](https://app.viktor.com/signup).

## FAQ

### What is inventory reconciliation?

Inventory reconciliation is the process of comparing the stock your systems record with the stock you actually have, explaining the differences and correcting the records. For a multichannel brand it means matching Shopify, Amazon FBA and 3PL counts at the same point in time.

### How often should you reconcile Shopify, Amazon and 3PL stock?

Monthly is the minimum for most brands, timed with the financial close. Amazon’s 60-day claim window for units lost or damaged in a fulfillment center means a quarterly cadence can cost you reimbursements. High-volume SKUs and A items are worth checking weekly, which is easy once the pulls are automated.

### Can AI post inventory adjustments without approval?

Technically yes, if the software has write access. You should not. Adjustments change your margin and your books, so set the process up so that an AI employee such as Viktor prepares the variance list and the adjustment entries, and a person approves them before anything is posted.