SKU COGS & weighted average cost (WAC)
How SKU COGS uses date range blended WAC (formulas, columns), optional PO-receipt WAC sync to Shopify, and how that differs from a future full ledger flow.
The SKU COGS report (under Reports → SKU COGS in the dashboard) helps you align Shopify variant unit cost with what you have been paying on purchase orders. You pick a PO date range, review a blended weighted average unit cost (WAC) per SKU, and can push that value to Shopify when you are ready.
WAC means weighted average cost: a single cost per unit for a pool of inventory, computed as total dollars ÷ total units in that pool. Blended WAC is WAC when the pool combines shelf stock (dollars from on-hand quantity × current Shopify unit cost) and receipt lines in your PO date range (dollars from PO line totals for that SKU).
What Inventory Mate does today (SKU COGS)
For each SKU (inventory item), the report combines:
- Purchase orders in your selected range — e.g. last 30 / 60 / 90 days, 365 days, custom, or all time. Draft and canceled POs (including “cancelled” spellings) are excluded so uncommitted or voided orders do not move averages. Each line contributes quantity × line unit cost (then line tax; see Blended WAC formula); the report sums those line totals for the SKU in the range (and, if you turn on landed-cost view, allocates extra PO costs like freight across lines by unit share).
- What is on the shelf now — current stock quantity (sum of available across synced locations) and current Shopify unit cost (live from Shopify when possible, otherwise the last synced cost).
That mix is intentional: you are not only averaging recent POs in isolation. You still tie to on-hand quantity and the unit cost Shopify currently holds for that stock, so the proposed number is usually easier to defend than a plain period average alone.
Tradeoffs to keep in mind
- The Shopify cost used as the shelf anchor may be stale or wrong — the blend assumes it is a reasonable stand-in for “value already on the shelf.”
- A short date range can omit older PO lines that still matter for units sitting in current inventory — widen the range or use all time when you need a broader picture.
- On-hand may already include units received in the range. Because current stock reflects today’s shelf, units that arrived from PO receipts inside your window are usually counted on both sides of the blend (anchor and PO receipts). When the Shopify cost anchor is close to recent PO unit cost the answer is still right; when costs have drifted and Shopify cost is stale, the blend can over- or undershoot a true moving average — see When the blend can mislead.
- The date filter is by PO created timestamp, not received. POs whose goods have not arrived yet still pump dollars into the blend. Widen the range or wait for receipts when this matters.
When on-hand stock is zero, the blended value is the same as the weighted average PO unit cost for the range (nothing on the shelf to anchor). When you have on-hand stock but no Shopify unit cost, the app cannot form that shelf part of the blend honestly — set or sync cost in Shopify first.
When the blend can mislead
A worked case where the Shopify anchor is stale:
- On-hand: 100 (50 units bought at $4, 50 units bought at $6).
- Shopify unit cost: $5 (never updated since the cost change).
- POs in range: 50 units at $6 → PO line value $300.
Blended WAC as the formula computes it: (100 × $5 + $300) ÷ (100 + 50) = $5.33.
A true moving average of the actual receipts is (50 × $4 + 50 × $6) ÷ 100 = $5.00. The blend overstates by $0.33 because the anchor is older than the in-range receipts and the in-range units are also part of on-hand. Update Shopify cost or widen the date range when this kind of drift is plausible — the longer window dilutes the bias as the anchor’s share grows.
Blended WAC formula
WAC (weighted average cost) is always total value in the pool ÷ total units in the pool. Here the pool mixes on-hand inventory (valued at Shopify’s unit cost) and PO receipt lines in your date range.
For each SKU:
-
On-hand value =
current stock qty×current Shopify unit cost(units × unit price on the shelf). -
PO dollars in your range = sum of PO line totals for lines whose PO falls in the range. Each line total starts as line quantity × line unit cost (the supplier unit cost on the line—the same basis as Create order), then applies line tax % to that subtotal. With landed-cost view on, each line also gets its allocated share of PO-level extras (freight, etc.) by unit share. PO units in range is the sum of quantities on those same lines.
Then:
Blended WAC = (on-hand value + sum of PO line totals in range) ÷ (on-hand units + PO units in range)
A “PO line total” in this formula always means (qty × unit cost) × (1 + line tax% ÷ 100) plus, when landed-cost view is on, the line’s share of PO-level extras (allocated by units, not line value). When landed-cost view is off, the allocated share is zero and the line total is just the supplier subtotal plus line tax. Either way, it is the same units × unit price → dollars pattern as the on-hand side.
That is the value you can push to Shopify as the inventory item unit cost when the inputs are valid and landed-cost view is off (push is disabled while landed-cost view is on so Shopify stays supplier line-item style).
What you see in the app
| Concept | Meaning |
|---|---|
| Stock | Sum of available units across synced locations (same family of data as inventory value). |
| Avg PO cost | Period only: total PO line value in the range ÷ units on those lines — useful for drill-down against receipts. |
| Blended WAC | Weighted average cost for the blend of shelf + period PO lines—total $ ÷ total units in that mix; what you can push to Shopify when it can be computed and landed-cost view is off. |
| Current cost (Shopify) | What Shopify (or your synced record) says the unit cost is now — used as the shelf anchor in the blend. |
| Match / mismatch | Compares blended WAC to Shopify cost (or falls back to the period average when a full blend cannot be formed), within a small tolerance. |
Push to Shopify writes blended WAC (not the raw period-only average) when landed-cost view is off. With landed-cost view on, you can still review numbers in the report, but push is disabled so variant cost in Shopify does not get full landed amounts. When on-hand is zero, blended WAC and the period average coincide.
What gets excluded
The aggregator is conservative — it drops anything ambiguous rather than guess. Lines that never contribute to the blend:
- POs in draft or canceled / cancelled status (any case spelling).
- POs with no line items at all.
- Lines with no inventory item linked (e.g. free-text rows).
- Lines with quantity ≤ 0 (returns and corrections). They are not subtracted from PO units or PO value — they are silently ignored. If you rely on returns to lower WAC, log a separate negative-cost adjustment line that is linked to the SKU and has a positive quantity with negative cost.
- Lines with non-finite quantity, cost, or tax values.
Mixed currencies
Line totals are summed across POs without FX conversion. The currency label shown in the report is the currency of the last included PO, which is harmless when all POs use the same currency and misleading when they don’t. If your shop has multi-currency suppliers, narrow the date range or filter the PO list to a single currency before drawing conclusions from this report.
Notifications vs the report
The SKU COGS report is the place to review mismatches: you pick the PO date range each time; stock and Shopify cost are loaded for that session. In-app automated “SKU COGS” mismatch notifications are not sent—open the report when you want to check blended WAC against Shopify.
How the report relates to receive-time WAC and future ledger ideas
What Inventory Mate does today — SKU COGS report: The report is date-range blended WAC only. Purchase orders are included when their createdAt falls in the range you pick, the PO has lines, and the PO is not draft or canceled (including “cancelled” spellings). For each SKU, the app sums PO line totals (each built from line qty × line unit cost, then line tax—the same units × unit price idea as shelf stock × Shopify cost) and units in that window, blends that with current synced stock × current Shopify unit cost (see Blended WAC formula), and shows a value you can review and optionally push to Shopify. Each report run is fully determined by your window and the data read at that time.
Optional — PO receipt: weighted average cost sync to Shopify: When you receive on a PO, you can enable a shop default so Inventory Mate computes perpetual WAC from live on-hand at the PO destination and this receipt (PO line unit cost × received delta), writes that new WAC to Shopify before inventory quantities update, and always asks you to confirm on a summary dialog (with a per-line help breakdown of the formula using your actual numbers). That is receive-scoped and live-Shopify–anchored, not the same as the report’s date-range blend.
Future — full ledger per-receipt WAC: A deeper design could treat a receipt ledger as the source of truth (with reconciliation when Shopify and the ledger diverge). That broader ledger product direction is not the same as the optional receive-time sync above.
Wrap-up: The same PO line records (SKU, qty, costs, tax, timestamps) underpin the report’s window rollup and feed receive-time WAC when that option is on. For periodic alignment without receiving, use SKU COGS; for at-receipt perpetual WAC into Shopify, use PO receipt — WAC cost sync.
At a glance
| Date range blended WAC (SKU COGS report) | Optional WAC at PO receive | |
|---|---|---|
| Mechanism | PO lines in your chosen date range, blended with current on-hand qty × current Shopify unit cost | At receive save: live on-hand at destination × live Shopify unit cost + receipt qty × PO line unit cost, then ÷ total units |
| Fit | Review on your schedule and push when ready | Always confirm before each receive save when the default is on; help popover shows the exact WAC math for that line |
| Control | You choose the window and confirm each push | Toggle in Shop defaults → PO defaults; cancel or proceed on the confirmation dialog |
For purchase order lines, receiving, and how POs touch inventory, see Purchase order management. For receive-time cost behavior in detail, see PO receipt — weighted average cost sync to Shopify.