Multi-Location Inventory
PromoSync supports syncing inventory to multiple Shopify locations, enabling sophisticated fulfillment strategies like Hit a Double (multi-supplier inventory).
Overview
Multi-location inventory enables:
- Multiple warehouse locations - Track inventory across locations
- Drop-ship suppliers - Sync supplier warehouse inventory
- Hit a Double - Combine inventory from multiple suppliers
- Location-based fulfillment - Route orders to optimal locations
Prerequisites
Before setting up multi-location inventory:
- Shopify Locations - Create locations in Shopify admin
- Professional Plan - Multi-location requires Professional or Enterprise
- Supplier Access - Verify suppliers support inventory queries
Shopify Location Setup
Creating Locations
- Go to Shopify Admin > Settings > Locations
- Click Add location
- Enter location details:
- Name (e.g., “SanMar West”)
- Address (optional for drop-ship)
- Click Save
Location Types
| Type | Description | Example |
|---|---|---|
| Primary | Your main fulfillment location | ”Main Warehouse” |
| Drop-Ship | Supplier fulfills directly | ”SanMar Direct” |
| Regional | Regional distribution centers | ”West Coast DC” |
PromoSync Location Configuration
Mapping Locations
- Navigate to PromoSync > Settings > Inventory
- Click Location Mapping
- Map Shopify locations to suppliers
{
"location_mappings": [
{
"shopify_location": "Main Warehouse",
"shopify_location_id": "gid://shopify/Location/12345",
"type": "primary",
"suppliers": ["ALL"]
},
{
"shopify_location": "SanMar Direct",
"shopify_location_id": "gid://shopify/Location/12346",
"type": "drop_ship",
"suppliers": ["SanMar"]
},
{
"shopify_location": "alphabroder Direct",
"shopify_location_id": "gid://shopify/Location/12347",
"type": "drop_ship",
"suppliers": ["ALPH"]
}
]
}Primary Location
Set your primary fulfillment location:
- Under Primary Location, select your main location
- This location receives inventory by default
- Products without specific mappings sync here
Supplier Locations
Map suppliers to drop-ship locations:
- Click Add Supplier Location
- Select the Shopify location
- Select the supplier(s) for this location
- Set sync preferences
Hit a Double Setup
“Hit a Double” combines inventory from multiple suppliers for the same product, maximizing availability.
How It Works
Product: Gildan G500 T-Shirt
Supplier A (SanMar): 500 units
Supplier B (alphabroder): 450 units
────────────────────────────────────
Combined Availability: 950 unitsConfiguration
- Enable Hit a Double Mode in settings
- Map suppliers to locations:
{
"hit_a_double": {
"enabled": true,
"products": {
"G500": {
"suppliers": [
{"code": "SanMar", "location": "SanMar Direct"},
{"code": "ALPH", "location": "alphabroder Direct"}
],
"priority": ["SanMar", "ALPH"]
}
}
}
}Supplier Priority
Set fulfillment priority when multiple suppliers have stock:
| Priority | Supplier | Use When |
|---|---|---|
| 1 | SanMar | Better pricing or relationship |
| 2 | alphabroder | Backup when SanMar is out |
| 3 | S&S | Third option |
Inventory Sync Settings
Per-Location Sync
Configure sync behavior per location:
{
"location_settings": {
"SanMar Direct": {
"sync_frequency": "hourly",
"buffer": 5,
"track_when_zero": true
},
"alphabroder Direct": {
"sync_frequency": "daily",
"buffer": 10,
"track_when_zero": false
}
}
}Sync Frequency Options
| Frequency | Best For |
|---|---|
| Real-time | High-velocity products |
| Hourly | Popular products |
| Daily | Standard products |
| Manual | Special cases |
Buffer Settings
Set safety stock per location:
| Location | Buffer | Reason |
|---|---|---|
| Main Warehouse | 0 | Physical inventory is accurate |
| Drop-Ship | 10 | Account for supplier delays |
Warehouse-Level Inventory
Some suppliers report inventory by warehouse:
// Supplier warehouse data
{
"supplier": "SanMar",
"warehouses": [
{"code": "DAL", "name": "Dallas, TX", "qty": 500},
{"code": "PHX", "name": "Phoenix, AZ", "qty": 450},
{"code": "ATL", "name": "Atlanta, GA", "qty": 300}
]
}Warehouse Mapping
Map supplier warehouses to Shopify locations:
{
"warehouse_mappings": {
"SanMar": {
"DAL": "Shopify Location - Dallas",
"PHX": "Shopify Location - Phoenix",
"ATL": "Shopify Location - Atlanta"
}
}
}Fulfillment Rules
Automatic Routing
Configure how orders are routed:
{
"fulfillment_rules": {
"priority": "closest_warehouse",
"fallback": "any_available",
"split_orders": false
}
}Priority Options
| Option | Description |
|---|---|
closest_warehouse | Ship from nearest location |
lowest_cost | Use cheapest supplier |
fastest_delivery | Prioritize speed |
supplier_priority | Follow configured priority |
Monitoring Multi-Location Inventory
Dashboard View
The inventory dashboard shows:
- Total inventory across all locations
- Per-location breakdown
- Sync status per location
- Alerts for low stock
Inventory Report
{
"product": "Gildan G500 - Black/L",
"total_available": 950,
"locations": [
{"name": "SanMar Direct", "qty": 500, "last_sync": "2024-01-20T14:00:00Z"},
{"name": "alphabroder Direct", "qty": 450, "last_sync": "2024-01-20T13:45:00Z"}
],
"fulfillment_priority": ["SanMar Direct", "alphabroder Direct"]
}Alerts
Set alerts for inventory events:
| Alert | Trigger |
|---|---|
| Low Stock | Any location below threshold |
| Out of Stock | All locations at zero |
| Sync Failed | Location sync error |
| Discrepancy | Large qty difference |
Storefront Display
Show Location Availability
Display per-location availability:
{% raw %}{% assign locations = product.metafields.psrestful.location_inventory.value %}
{% if locations %}
<div class="location-availability">
<h4>Availability</h4>
{% for loc in locations %}
<div class="location">
<span class="name">{{ loc.name }}</span>
<span class="qty">
{% if loc.qty > 50 %}In Stock
{% elsif loc.qty > 0 %}Low Stock ({{ loc.qty }})
{% else %}Out of Stock
{% endif %}
</span>
</div>
{% endfor %}
</div>
{% endif %}{% endraw %}Estimated Delivery
Show delivery estimates by location:
{% raw %}{% assign delivery = product.metafields.psrestful.delivery_estimates.value %}
{% if delivery %}
<div class="delivery-estimate">
Estimated delivery: {{ delivery.fastest }} - {{ delivery.slowest }} business days
</div>
{% endif %}{% endraw %}API Integration
Query Location Inventory
query LocationInventory($productId: ID!) {
product(id: $productId) {
variants(first: 100) {
edges {
node {
id
inventoryItem {
inventoryLevels(first: 10) {
edges {
node {
location {
name
}
available
}
}
}
}
}
}
}
}
}Update Location Inventory
# Programmatic inventory update
def update_location_inventory(variant_id, location_id, quantity):
mutation = """
mutation inventoryAdjustQuantity($input: InventoryAdjustQuantityInput!) {
inventoryAdjustQuantity(input: $input) {
inventoryLevel {
available
}
}
}
"""
variables = {
"input": {
"inventoryLevelId": f"gid://shopify/InventoryLevel/{variant_id}?location_id={location_id}",
"availableDelta": quantity
}
}
return shopify_graphql(mutation, variables)Troubleshooting
Inventory Not Syncing to Location
- Verify location mapping exists
- Check supplier code is correct
- Confirm sync is enabled for location
- Review sync logs for errors
Mismatched Inventory
- Compare with supplier inventory directly
- Check buffer settings
- Verify last sync timestamp
- Look for failed sync attempts
Orders Not Routing Correctly
- Review fulfillment rules
- Check location priority
- Verify inventory levels are correct
- Test with manual order
Best Practices
1. Start with One Supplier
Set up one supplier location first, then expand.
2. Use Buffers Wisely
Drop-ship locations need higher buffers than owned inventory.
3. Monitor Sync Health
Check sync status daily during initial setup.
4. Test Order Flow
Place test orders to verify fulfillment routing.
5. Document Your Setup
Keep records of location mappings and rules.
6. Regular Audits
Periodically verify inventory accuracy across locations.