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
Location
Calgary (default store for web sales & POS)
Project start date
2025

Project Name / Code:
Cross-Store Sync App
Category:
Retail / Ecommerce
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.
- Normalizes incoming events into a canonical change (product change, inventory delta, location-change event).
- 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
KPIs / Metrics to track
- 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