Inventory reports

What is in stock, how fast it sells, how long it will last — days of inventory remaining, sell-through, ABC analysis, adjustments, transfers and shipments, across every location of every store.

16 built-in reports — every one opens in the report editor, runs across all connected stores in one currency, and can be saved, exported or scheduled. The query under each report is the whole report — readable, and yours to change.

Month-end inventory snapshot

Units of each variant in stock at the end of the period.

FROM inventory
  SHOW ending_inventory_units, ending_inventory_value
  WHERE inventory_is_tracked = true
  SINCE startOfMonth(-1m) UNTIL endOfMonth(-1m)
  GROUP BY product_title, product_variant_title, product_variant_sku, inventory_item_cost WITH TOTALS
  ORDER BY product_title ASC
  LIMIT 1000
  VISUALIZE ending_inventory_units TYPE table

Month-end inventory value

Value of stock at the end of the period — cost per item multiplied by ending units.

FROM inventory
  SHOW ending_inventory_units, ending_inventory_value
  WHERE inventory_cost_is_recorded = true
    AND inventory_is_tracked = true
  SINCE startOfMonth(-1m) UNTIL endOfMonth(-1m)
  GROUP BY product_title, product_variant_title, product_variant_sku, inventory_item_cost WITH TOTALS
  ORDER BY ending_inventory_value DESC
  LIMIT 1000
  VISUALIZE ending_inventory_value TYPE table

Unique SKUs

How many distinct items moved between locations in the period — a transfers measure, not a count of the SKUs you stock.

FROM inventory_transfers
  SHOW unique_items_transferred
  SINCE startOfDay(-30d) UNTIL today
  VISUALIZE unique_items_transferred TYPE table

Total shipped

Units shipped out of inter-location transfers in the period.

FROM inventory_shipments
  SHOW shipped_quantity
  SINCE startOfDay(-30d) UNTIL today
  VISUALIZE shipped_quantity TYPE table

Total received

Units received at the destination of inter-location transfers — accepted and rejected together.

FROM inventory_shipments
  SHOW received_quantity
  SINCE startOfDay(-30d) UNTIL today
  VISUALIZE received_quantity TYPE table

Total ordered

Units ordered on inter-location transfers, including drafts.

FROM inventory_transfers
  SHOW ordered_quantity
  SINCE startOfDay(-30d) UNTIL today
  VISUALIZE ordered_quantity TYPE table

Acceptance rate

Share of received transfer units that were accepted, with the accepted and rejected counts behind it.

FROM inventory_shipments
  SHOW accepted_quantity, rejected_quantity, acceptance_rate
  SINCE startOfDay(-30d) UNTIL today
  VISUALIZE acceptance_rate TYPE table

Inventory transfers

Every inter-location transfer with its route, status, tags and line items, subtotalled per transfer.

FROM inventory_transfers
  SHOW ordered_quantity
  GROUP BY transfer_name, inventory_origin_name, destination_name,
    transfer_status, transfer_note, transfer_tags, transfer_created_at,
    inventory_transfer_line_item_id, product_variant_sku WITH GROUP_TOTALS, TOTALS
  SINCE startOfDay(-90d) UNTIL today
  ORDER BY transfer_name DESC, ordered_quantity DESC
  VISUALIZE ordered_quantity TYPE table

Products by sell-through rate

Sell-through rate per product variant — units sold as a share of units sold plus ending inventory.

FROM inventory
  SHOW starting_inventory_units, ending_inventory_units, inventory_units_sold, sell_through_rate
  WHERE inventory_is_tracked = true
  GROUP BY product_title, product_variant_title, product_variant_sku WITH TOTALS, PERCENT_CHANGE
  SINCE startOfDay(-30d) UNTIL today
  COMPARE TO previous_period
  ORDER BY sell_through_rate DESC, inventory_units_sold DESC
  LIMIT 1000
  VISUALIZE sell_through_rate TYPE horizontal_bar

Products by percentage sold

Percentage of starting inventory sold per product — may exceed 100% when restocked mid-period.

FROM inventory
  SHOW inventory_units_sold, starting_inventory_units, percent_of_inventory_sold
  WHERE inventory_is_tracked = true
  GROUP BY product_title, product_variant_title, product_variant_sku WITH TOTALS, PERCENT_CHANGE
  SINCE startOfDay(-30d) UNTIL today
  COMPARE TO previous_period
  ORDER BY percent_of_inventory_sold DESC
  LIMIT 1000
  VISUALIZE percent_of_inventory_sold TYPE horizontal_bar

Products by days of inventory remaining

Estimated days until each product runs out, at the period's daily sales rate.

FROM inventory
  SHOW ending_inventory_units, inventory_units_sold_per_day, days_of_inventory_remaining
  WHERE inventory_is_tracked = true
  GROUP BY product_title, product_variant_title, product_variant_sku WITH TOTALS, PERCENT_CHANGE
  HAVING inventory_units_sold_per_day > 0
  SINCE startOfDay(-30d) UNTIL today
  COMPARE TO previous_period
  ORDER BY days_of_inventory_remaining ASC, product_title ASC, product_variant_title ASC
  LIMIT 1000
  VISUALIZE days_of_inventory_remaining TYPE histogram

Inventory adjustments by count

How many separate inventory adjustments happened in the period, by reason, app, staff member and location — regardless of how many units each moved.

FROM inventory_adjustment_history
  SHOW inventory_adjustment_count
  GROUP BY week, inventory_change_reason, reference_document_type,
    inventory_app_name, staff_member_name, inventory_location_name, inventory_state
    WITH TOTALS, PERCENT_CHANGE
  SINCE startOfDay(-30d) UNTIL today
  COMPARE TO previous_period
  ORDER BY week ASC
  LIMIT 1000
  VISUALIZE inventory_adjustment_count TYPE table

Inventory adjustment changes

Every inventory quantity change in the period — how many units moved, for which reason, by which app or staff member.

FROM inventory_adjustment_history
  SHOW inventory_adjustment_change
  GROUP BY day, product_variant_sku, inventory_app_name, staff_member_name,
    inventory_change_reason, reference_document_uri, inventory_state WITH TOTALS
  HAVING inventory_adjustment_change != 0
  SINCE startOfDay(-30d) UNTIL today
  ORDER BY day ASC
  LIMIT 1000
  VISUALIZE inventory_adjustment_change TYPE table

Inventory transfer orders and shipments

What was shipped, received, accepted and rejected against inter-location transfers, by transfer, shipment, origin, destination and product. Carries no ordered quantity — that lives on the Inventory transfers report, and Shopify cannot combine the two either.

FROM inventory_shipments
  SHOW shipped_quantity, received_quantity, accepted_quantity, rejected_quantity,
    acceptance_rate
  GROUP BY transfer_name, inventory_origin_name, destination_name, transfer_note,
    staff_member_name, shipment_name, shipment_status, shipment_shipped_at,
    shipment_received_at, product_variant_sku, product_variant_title
    WITH TOTALS
  SINCE startOfDay(-90d) UNTIL today
  ORDER BY transfer_name DESC,
    received_quantity__transfer_name_totals DESC,
    received_quantity DESC, inventory_origin_name ASC, destination_name ASC,
    transfer_note ASC, staff_member_name ASC, shipment_name ASC, shipment_status ASC,
    shipment_shipped_at ASC, shipment_received_at ASC, product_variant_sku ASC
  LIMIT 1000
  VISUALIZE received_quantity TYPE table

ABC product analysis

Stock graded by how much revenue it contributes — A is the top 80%, B the next 15%, C the last 5%, ranked by gross sales. Graded over the window you pick, so the same product can be A over 90 days and B over 30.

FROM inventory
  SHOW ending_inventory_units, ending_inventory_value,
    ending_inventory_retail_value
  WHERE inventory_is_tracked = true
  GROUP BY product_variant_abc_grade WITH TOTALS
  SINCE startOfDay(-30d) UNTIL today
  ORDER BY product_variant_abc_grade ASC
  LIMIT 1000
  VISUALIZE ending_inventory_value TYPE single_stacked_bar

Inventory sold daily by product

Average units sold per day by product variant, against the previous period.

FROM inventory
  SHOW inventory_units_sold, ending_inventory_units, inventory_units_sold_per_day
  WHERE inventory_is_tracked = true
  SINCE startOfDay(-30d) UNTIL today
  GROUP BY product_title, product_variant_title, product_variant_sku WITH TOTALS, PERCENT_CHANGE
  COMPARE TO previous_period
  ORDER BY inventory_units_sold_per_day DESC
  LIMIT 1000
  VISUALIZE inventory_units_sold_per_day TYPE horizontal_bar

FAQ

Do these inventory reports cover all my Shopify stores? Yes — every report on this page aggregates across all connected stores and converts to one currency. Group by store inside any of them for the per-store split.

Can I change what a report shows? Yes — every report opens in the report editor, where metrics, groupings, filters, date ranges and the chart are all editable, and your version saves to your own library.

Can I get these reports automatically? Yes — any report can be downloaded as CSV or Excel, or scheduled to arrive by email or FTP on the cadence you choose.