Two orders going through on a single unit—single-store overselling was covered in article 24. But once you run multiple locations (warehouses) and sell the same SKU from several of them, a trickier form of overselling appears. Each location has stock, yet when you look at the combined total it seems you can sell more than you really can.
In this article we focus on the difference between aggregate availability and per-location stock, and we lay out both how cross-location overselling happens and the operations that prevent it by design. We also cover how to write per-location quantities into Shopify with Google Sheets as the master.
How aggregate stock causes cross-location overselling
In Shopify, inventory is tracked per location as states (available, committed, on hand, and so on). The 'available' figure shown on the product page tends to be the sum of stock across the locations where that product is set to sell. If Tokyo has 3 and Osaka has 2, a customer sees 5 as available in total.
Here is the trap. An order is ultimately fulfilled from one location. If five orders land at once but Tokyo only has 3, Tokyo cannot ship 5. Enough in aggregate, not enough per location—that is exactly what cross-location overselling is.
Pitfalls when selling one SKU from multiple locations
Holding the same SKU as stock at several locations is perfectly fine in itself. Shipping from a nearby warehouse actually improves shipping cost and delivery time. The problem arises when you operate without grasping how each location's stock is updated and how it gets aggregated.
- A location sells out heavily, yet the aggregate display still looks like 'there is stock left'
- An in-store POS and online share the same SKU, and one side's movement lags before it reaches the other
- It becomes hard to trace which location a return or stocktake adjustment was applied to
- When you add a new location, you meant to include it in sales but it is not (or vice versa)
Overselling born from sync timing gaps
Across multiple locations, the standard approach is to gather each location's actual stock into a single master and push it from there into Shopify. But there is a time lag between gathering and pushing. If an order lands in the few minutes to tens of minutes between location A's warehouse system decrementing stock, that reaching the master Google Sheet, and the write into Shopify, you accept the order on a stale aggregate figure.
The more locations you add, the more their update timings scatter. A every 15 minutes, B manual, C an overnight batch—this unevenness makes the aggregate inaccurate and becomes a breeding ground for overselling. We recommend first visualizing, on a single table, when and at what granularity each location updates.
Prevent it with per-location inventory control
The structural fix is to manage stock per location rather than in aggregate, and to write into Shopify per location. Shopify ties a product to locations and can hold each location's quantity separately. On the master Google Sheet side too, split rows (or columns) per SKU and per location, and make each location's on-hand explicit.
- 01In Shopify's location settings, make clear which locations sell and which are ship-only
- 02Hold the Google Sheets master at 'SKU x location' granularity, managing each location's quantity one cell at a time
- 03Before syncing, use a connection test to confirm the column mapping (SKU, location, quantity) is correct
- 04Use scheduled sync to push each location's quantity into Shopify on a regular cadence
Sync Master supports multiple locations (multi-warehouse), so the per-location stock on your sheet can be written straight into each Shopify location. Because you can validate the mapping with a connection test before any real sync, you can head off the fatal mistake of mixing up locations in advance.
The option of narrowing published locations
Another practical move is to deliberately narrow which locations count toward online sales. Including every location in the available total makes the picture complex; but if online orders draw only from a single EC-dedicated warehouse while other locations are ship-only or store-only, the ambiguity of aggregation drops sharply.
While you are small, deciding 'just one published location' is a valid simplification. As you grow and add locations, deliberately deciding which ones count toward online stock keeps the aggregate from ballooning and overselling. For a location you want to exclude from sales, remove it from the product or set its stock to zero.
Recovery steps when overselling occurs
Even so, overselling can still happen. When it does, what matters is to respond in order, without panic.
- 01Identify which location ran short (check per location, not in aggregate)
- 02Review the fulfillment assignment to see whether another location with stock can ship instead
- 03If no location can ship, contact the customer early and offer one of: backorder, substitute, or refund
- 04Correct the offending location's quantity in the master immediately and reflect it with a manual sync
- 05To prevent recurrence, review that location's update timing and buffer setting
The starting point for multi-location overselling is to think per location, not by total. Set up Google Sheets as a per-location master, and write accurately into each location with connection tests and scheduled sync, and you move toward operations that are not jerked around by the ambiguity of aggregation. Start by listing your store's published locations and update timings.