DEV Community

Thesius Code
Thesius Code

Posted on • Originally published at datanest-stores.pages.dev

Multi-Channel Sync Toolkit: Multi-Channel Sync

Multi-Channel Sync

Synchronize products, inventory, orders, and pricing across Shopify, WooCommerce, Amazon, and eBay from a single source of truth. Eliminate overselling and manual data entry.

Key Features

  • Product Sync — Push titles, descriptions, images, and variants to all channels
  • Inventory Sync — Real-time stock level propagation across marketplaces
  • Order Aggregation — Pull orders from every channel into a unified pipeline
  • Price Management — Set base prices with per-channel markups and currency rules
  • Conflict Resolution — Configurable strategies for handling sync collisions
  • Mapping Engine — Translate categories, attributes, and SKUs between platforms

Quick Start

# 1. Extract and configure
unzip multi-channel-sync.zip
cd multi-channel-sync
cp config.example.yaml config.yaml

# 2. Configure channel credentials (see Configuration section)
# 3. Run initial product sync
python -m multi_channel_sync.core --sync products --direction push
Enter fullscreen mode Exit fullscreen mode

Architecture

src/multi_channel_sync/
├── core.py              # Sync orchestrator: scheduling, conflict resolution
├── channels/
│   ├── base.py          # Abstract channel adapter interface
│   ├── shopify.py       # Shopify REST API adapter
│   ├── woocommerce.py   # WooCommerce REST API adapter
│   ├── amazon.py        # Amazon SP-API adapter
│   └── ebay.py          # eBay Trading API adapter
├── mappers.py           # Category and attribute mapping between platforms
└── utils.py             # Rate limiting, retry logic, diff calculation
Enter fullscreen mode Exit fullscreen mode

Sync Flow: Source of Truth → Diff Engine → Channel Adapters → Platform APIs

Usage Examples

Push Products to All Channels

from multi_channel_sync.core import SyncEngine

engine = SyncEngine(config_path="config.yaml")

result = engine.sync_products(direction="push")
for channel, stats in result.items():
    print(f"{channel}: {stats['created']} created, "
          f"{stats['updated']} updated, {stats['errors']} errors")
# shopify: 12 created, 45 updated, 0 errors
# amazon: 10 created, 43 updated, 2 errors
Enter fullscreen mode Exit fullscreen mode

Pull Orders from All Channels

orders = engine.sync_orders(direction="pull", since="2026-03-01")
print(f"Pulled {len(orders)} orders from {len(engine.channels)} channels")

for order in orders[:3]:
    print(f"  [{order['channel']}] #{order['order_id']} - ${order['total']:.2f}")
Enter fullscreen mode Exit fullscreen mode

Inventory Propagation

engine.update_inventory(
    sku="TSHIRT-RED-M",
    quantity=150,
    source_channel="shopify",
    propagate=True  # Push updated quantity to all other channels
)
Enter fullscreen mode Exit fullscreen mode

Channel Mapping Query

-- View product mapping across channels
SELECT
    m.internal_sku,
    m.channel_name,
    m.external_id,
    m.external_sku,
    m.last_synced_at,
    CASE WHEN m.sync_status = 'error'
         THEN m.error_message ELSE 'OK' END AS status
FROM channel_mappings m
ORDER BY m.internal_sku, m.channel_name;
Enter fullscreen mode Exit fullscreen mode

Configuration

source_of_truth: "internal"       # Which system is authoritative

channels:
  shopify:
    enabled: true
    api_key: "YOUR_SHOPIFY_API_KEY"
    api_secret: "YOUR_SHOPIFY_SECRET"
    store_url: "https://your-store.myshopify.com"
    rate_limit_per_second: 2

  woocommerce:
    enabled: true
    url: "https://your-store.example.com"
    consumer_key: "ck_YOUR_KEY_HERE"
    consumer_secret: "cs_YOUR_SECRET_HERE"

  amazon:
    enabled: false
    marketplace_id: "ATVPDKIKX0DER"
    refresh_token: "YOUR_REFRESH_TOKEN"

  ebay:
    enabled: false
    auth_token: "YOUR_EBAY_TOKEN"
    site_id: "EBAY-US"

sync:
  interval_minutes: 15
  conflict_strategy: "source_wins" # source_wins | newest_wins | manual
  batch_size: 50

inventory:
  safety_buffer: 5                # Hold back N units to prevent overselling
  propagation_delay_seconds: 10
Enter fullscreen mode Exit fullscreen mode

Best Practices

  1. Define one source of truth — Never allow two channels to be authoritative
  2. Use safety buffers — Hold back 3-5 units to prevent overselling during sync delays
  3. Enable channels incrementally — Validate each before adding the next
  4. Map categories upfront — Amazon and eBay have strict category taxonomies
  5. Monitor sync errors — Set up alerts for repeated failures on specific SKUs
  6. Respect rate limits — Each platform has different API limits

Troubleshooting

Issue Cause Fix
Products not appearing Missing required fields Check channel-specific field requirements
Overselling despite sync Sync interval too long Reduce interval_minutes or use webhooks
Rate limit errors (429) Too many API calls Lower rate_limit_per_second and batch_size
Price mismatch Currency not converted Configure per-channel price_markup rules
Duplicate listings SKU mapping missing Populate channel_mappings before first sync

This is 1 of 11 resources in the Retail Automation Pro toolkit. Get the complete [Multi-Channel Sync Toolkit] with all files, templates, and documentation for $39.

Get the Full Kit →

Or grab the entire Retail Automation Pro bundle (11 products) for $139 — save 30%.

Get the Complete Bundle →


Related Articles

Top comments (0)