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
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
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
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}")
Inventory Propagation
engine.update_inventory(
sku="TSHIRT-RED-M",
quantity=150,
source_channel="shopify",
propagate=True # Push updated quantity to all other channels
)
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;
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
Best Practices
- Define one source of truth — Never allow two channels to be authoritative
- Use safety buffers — Hold back 3-5 units to prevent overselling during sync delays
- Enable channels incrementally — Validate each before adding the next
- Map categories upfront — Amazon and eBay have strict category taxonomies
- Monitor sync errors — Set up alerts for repeated failures on specific SKUs
- 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.
Or grab the entire Retail Automation Pro bundle (11 products) for $139 — save 30%.
Top comments (0)