Case Study

Cross-Store Sync App

 Retail client operates two Shopify stores (Calgary = online + POS; Edmonton = POS-only) plus a shared AQ Warehouse location. Current multi-store synchronization relies on a third-party app (Syncio) and the client wants to fully eliminate this. We are building a custom Node.js/Express Shopify app that uses webhooks to centralize product creation/edits and keep inventory in sync across Calgary, Edmonton and AQ Warehouse. The solution removes the Syncio dependency, centralizes control, and makes inventory/product operations reliable across POS and web channels.

Case Study

Introduction

This project will deliver a custom Shopify app that guarantees consistent product state and inventory across two stores and a shared warehouse location. The app’s purpose is to centralize product creation/edits and reliably sync inventory changes arising from POS sales/returns, online sales/returns, manual edits, purchase receiving, and stock takes so front-end and back-end order flows always reflect true stock.

Project Name / Code:

Cross-Store Sync App

Category:

Retail / Ecommerce

Technology:

Shopify , Payment Gateway, VWO , Google Search Console

Location:

Calgary (default store for web sales & POS)

Project Start Date:

2025

About

Problem Statement

Currently the client uses a third-party multistore sync tool (Syncio) and he wants to eliminate this fully.

Objectives

Eliminate dependency on the Syncio multistore sync app.

Allow product creation and full product-field edits (including variants, additions, deletions) from one store (preferably Calgary) and propagate to the other store automatically.

Ensure inventory for Edmonton and AQ Warehouse can be managed in either location and remain consistent.

Provide transparent logging and reconciliation endpoints so operations can audit changes and resolve anomalies quickly.

Implementation

Architecture (high level):

A Node.js + Express backend app installed as a private Shopify app on both stores (Calgary and Edmonton).
Use Shopify Admin API + Shopify Webhooks to catch and react to events. Core webhook events subscribed: orders/* (created, updated, cancelled, fulfilled), inventory_levels/*, products/* (created, updated, deleted), fulfillments/*
A synchronization engine that:
Normalizes incoming events into a canonical change (product change, inventory delta, location-change event).
Applies deterministic rules to update the other store(s): e.g., product creation in Calgary => create product + variants in Edmonton; inventory delta at location X => update inventory level in partner stores at the corresponding location mapping (Calgary, Edmonton, AQ Warehouse).
Handles idempotency & retries (webhook dedup, exponential backoff) and stores event receipts to avoid double-updates.
Location mapping & master rules: a small configuration layer defines which Shopify Location IDs correspond to Calgary / Edmonton / AQ Warehouse across both stores. That mapping is used to route inventory updates.
Reconciliation & audit endpoints: periodic background job or on-demand endpoints produce diffs between expected inventory and live store inventory to surface mismatches.
Manual override tools for operations to accept/reject automated sync changes and re-run fixes for batches of SKUs.
Security: HMAC validation for webhooks, OAuth or private app credentials scoped to necessary Shopify APIs only. Logs persisted for 90+ days for audit.

Key technical components:Node.js + Express server with webhook route handlers.
A message queue (in-process queue or persistent job queue) to serialize and reattempt synchronization tasks reliably.

Administrative UI (optional) or REST endpoints to view sync status, conflict logs, and mapping config.

Results / Outcomes

Removal of third-party dependency: 100% elimination of Syncio (app uninstalled) — target: complete within cutover release.

Sync success rate: % of inbound events that result in correct outbound state change (goal: ≥ 99% success after retries).
Time-to-consistency: average time between origin event and reflected change in other store (goal: 30-60 seconds for most webhook flows; provide SLA exceptions for heavy batched operations)..
Reconciliation drift: number of SKUs with inventory divergence > X units (goal: reduce to near-zero; target: < 0.5% SKUs with drift).
Manual fixes required: number of operational interventions per week (goal: large reduction vs current baseline).

Before & after comparison (illustrative)
Before: Reliance on Syncio
After: Centralized webhook-driven sync; near real-time inventory parity across

Technologies

Technologies / Tools that We used to achieve this task