Syncing Unleashed Inventory to Shopify: How brands Stays in Stock

Building a real-time inventory bridge between Unleashed warehouse management and Shopify for a multi-warehouse retailers.

Syncing Unleashed Inventory to Shopify: How brands Stays in Stock

Syncing Unleashed Inventory to Shopify: How Business Stay in Stock

If you're running Unleashed for warehouse and inventory management, and Shopify for their online storefront - we have a solution. Two systems, one source of truth problem.

When an product sells on Shopify, Unleashed needs to know. When stock arrives at a warehouse in Melbourne, Shopify needs to reflect it. When a product has 8 finish options across 3 warehouses, both systems need to agree on what's available.

We built the bridge.

The Integration Challenge

Unleashed is a proper inventory management system. It tracks stock across multiple warehouse locations, manages purchase orders, handles unit conversions, and knows things like "this SKU has 14 units in Sydney and 3 in Brisbane."

Shopify is an e-commerce platform. It knows products, variants, prices, and inventory levels per location. It doesn't care about your warehouse management workflow.

The gap between these two systems is where orders get oversold, stock goes phantom, and customers get emails saying "sorry, that's actually not available."

What We Built

A Rails 8 app that sits between both systems and handles:

Product sync -- Unleashed products (with their attributes like Size, Shape, Depth, finish options) map to Shopify products and variants. SKUs are the join key. We match by product_code and handle the attribute transformation (Unleashed stores furniture dimensions differently than Shopify metafields expect them).

Inventory sync -- Stock levels from Unleashed warehouses map to Shopify locations. The Location model handles the warehouse-to-location mapping, and a Stock Converter deals with unit conversions (Unleashed might track by carton, Shopify sells by unit).

Order sync -- When a Shopify order comes in via webhook, we push it to Unleashed as a sales order. Payment status, line items, shipping details -- all translated between the two APIs.

Image sync -- Product images organized by base SKU. A ProductImageGroup links variants to their shared product photos, with the face image (ending in _001) prioritized as the primary display image.

The Rate Limiter That Saved Us

Shopify's API has rate limits. Hit them and your sync stops. For a catalog with hundreds of furniture products and thousands of variants, a naive "sync everything now" approach will get throttled in seconds.

We built a ShopifyApiQueueService -- a priority-based rate-limited queue that caps at 2 API calls per second and orders requests by urgency:

  • Critical (priority 1): Orders and webhooks. A customer just bought something -- this can't wait.
  • High (priority 3): Inventory updates. Stock changed -- update availability before someone oversells.
  • Normal (priority 5): Product sync. New product data -- important but not urgent.
  • Low (priority 7): Image operations. Photos can wait a few minutes.
  • Bulk (priority 9): Full catalog syncs. Run overnight, nobody's watching.

This means a webhook from a new order will jump ahead of a bulk image sync that's been running for 20 minutes. The queue processes continuously, respecting rate limits, and critical operations never get blocked by bulk work.

Multi-Warehouse Complexity

Many brands operate multiple warehouses across Australia. A product might have stock in Sydney, Melbourne, and Brisbane -- or only in one location. Shopify needs to know the per-location breakdown for accurate shipping estimates and availability display.

The sync maps each Unleashed warehouse to a Shopify location and updates inventory levels independently. When stock moves between warehouses in Unleashed (a transfer from Sydney to Melbourne), both location inventories update in Shopify.

We also built inventory health checking -- the system flags discrepancies between what Unleashed reports and what Shopify shows. Yellow highlighting on the dashboard means "these numbers don't match, someone should look." Usually it's a sync delay. Occasionally it's a real problem that saves a customer from ordering something that doesn't exist.

Product Variants and Metafields

Furniture products are complex. A single dining table might come in 3 sizes, 4 finishes, and 2 edge profiles. That's 24 variants for one product.

Unleashed stores these as attributes on the product. Shopify stores them as variant options and metafields. Our sync translates between the two:

  • Unleashed attributes (finish, edge, color, shape, depth) become Shopify metafields
  • Variant SKUs link back to Unleashed product codes
  • Base titles are computed by stripping finish/edge/color from the full product name
  • Images are matched to variants by SKU pattern

The ShopifyProduct model stores the raw Shopify JSON alongside computed attributes from Unleashed, so we always have both representations available for debugging.

Background Jobs

Three Solid Queue job queues handle the work:

  • shopify_api -- Single-threaded, processes the rate-limited API queue in order
  • shopify_images -- Multi-threaded, handles image uploads (these are slow and independent)
  • default -- Everything else: webhook processing, health checks, reporting

No Redis. No Sidekiq. Just Solid Queue backed by SQLite, running on the same server as the app.

The Result

Business inventory is now accurate across both systems within minutes of any change. Overselling dropped to near-zero. The warehouse manager spends about 15 minutes a day reviewing the sync dashboard instead of 3 hours manually updating spreadsheets and copy-pasting between admin panels.

The whole system handles the sync for hundreds of products across multiple warehouses, processes orders in real-time, and runs on a single Rails server with SQLite.

Sometimes the best integration isn't a fancy middleware platform. It's a focused Rails app that does one thing well.


Built by Loadout. Need to connect your inventory system to your storefront? Get in touch.

FREE Shopify Product Migration

Moving to Shopify? We'll migrate your product catalog for free. New stores only.

Learn More