AdvancedMulti-Location Inventory

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:

  1. Shopify Locations - Create locations in Shopify admin
  2. Professional Plan - Multi-location requires Professional or Enterprise
  3. Supplier Access - Verify suppliers support inventory queries

Shopify Location Setup

Creating Locations

  1. Go to Shopify Admin > Settings > Locations
  2. Click Add location
  3. Enter location details:
    • Name (e.g., “SanMar West”)
    • Address (optional for drop-ship)
  4. Click Save

Location Types

TypeDescriptionExample
PrimaryYour main fulfillment location”Main Warehouse”
Drop-ShipSupplier fulfills directly”SanMar Direct”
RegionalRegional distribution centers”West Coast DC”

PromoSync Location Configuration

Mapping Locations

  1. Navigate to PromoSync > Settings > Inventory
  2. Click Location Mapping
  3. 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:

  1. Under Primary Location, select your main location
  2. This location receives inventory by default
  3. Products without specific mappings sync here

Supplier Locations

Map suppliers to drop-ship locations:

  1. Click Add Supplier Location
  2. Select the Shopify location
  3. Select the supplier(s) for this location
  4. 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 units

Configuration

  1. Enable Hit a Double Mode in settings
  2. 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:

PrioritySupplierUse When
1SanMarBetter pricing or relationship
2alphabroderBackup when SanMar is out
3S&SThird 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

FrequencyBest For
Real-timeHigh-velocity products
HourlyPopular products
DailyStandard products
ManualSpecial cases

Buffer Settings

Set safety stock per location:

LocationBufferReason
Main Warehouse0Physical inventory is accurate
Drop-Ship10Account 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

OptionDescription
closest_warehouseShip from nearest location
lowest_costUse cheapest supplier
fastest_deliveryPrioritize speed
supplier_priorityFollow 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:

AlertTrigger
Low StockAny location below threshold
Out of StockAll locations at zero
Sync FailedLocation sync error
DiscrepancyLarge 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

  1. Verify location mapping exists
  2. Check supplier code is correct
  3. Confirm sync is enabled for location
  4. Review sync logs for errors

Mismatched Inventory

  1. Compare with supplier inventory directly
  2. Check buffer settings
  3. Verify last sync timestamp
  4. Look for failed sync attempts

Orders Not Routing Correctly

  1. Review fulfillment rules
  2. Check location priority
  3. Verify inventory levels are correct
  4. 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.