Sync your catalog and inventory across your own site, Amazon, eBay, and wholesale channels to sell everywhere from one system
Multi-channel selling lets you list products on your own website, Amazon, eBay, Walmart, and wholesale portals simultaneously — with inventory synchronized in real time so you never oversell. The critical rule: one inventory pool, updated immediately when any channel sells or restocks. Purpose-built channel management tools (Linnworks, Sellbrite, Skubana/Extensiv) make this manageable without custom integration work.
| Platform | Recommended Tool | Why |
|---|---|---|
| Shopify | Shopify's native Sales Channels + Sellbrite or Linnworks for external marketplaces | Shopify has built-in Facebook, Instagram, Google, and TikTok channels; Sellbrite adds Amazon/eBay/Walmart with inventory sync |
| WooCommerce | WP-Lister Pro (Amazon + eBay) or Linnworks | WP-Lister Pro lists products from WooCommerce directly to Amazon/eBay and syncs orders back |
| BigCommerce | BigCommerce Channels + Codisto (for Amazon/eBay) | BigCommerce has a native Channel Manager; Codisto extends it to Amazon, eBay, and Walmart with real-time sync |
| Any Platform | Linnworks or Skubana (Extensiv) as a central OMS | These tools sit above all channels and act as the single source of inventory truth for high-volume multi-channel operations |
Before connecting any channels, ensure your primary store has:
Amazon requires a Professional Seller account ($39.99/month) and approved product categories. You'll also need GTINs (UPCs or ASINs) for every listing.
Via Shopify + Sellbrite:
Via WooCommerce + WP-Lister:
Via Shopify + Sellbrite:
Via WooCommerce + WP-Lister:
Via Shopify + Sellbrite:
Via BigCommerce + Codisto:
When one channel sells out, you want to prevent other channels from showing stock you don't have. Most channel management tools handle this — configure buffer quantities per channel.
In Sellbrite:
In Linnworks:
In Codisto (BigCommerce):
BigCommerce stock - 3 for Amazon (holds 3 units back for other channels)Every channel order should flow into your central system and trigger fulfillment from the same process.
Shopify with Sellbrite:
WooCommerce with WP-Lister:
Linnworks (any platform):
// Normalize an order from any marketplace into a common format
interface NormalizedMarketplaceOrder {
channelName: string; // 'amazon', 'ebay', 'walmart', 'shopify'
channelOrderId: string; // the marketplace's order ID
lines: {
channelSku: string;
masterSku: string; // your internal SKU
quantity: number;
unitPriceCents: number;
}[];
shippingAddress: Address;
customerEmail: string;
}
async function ingestMarketplaceOrder(order: NormalizedMarketplaceOrder): Promise<void> {
// Idempotency: skip if already imported
const existing = await db.orders.findByChannelOrderId(order.channelName, order.channelOrderId);
if (existing) return;
await db.transaction(async tx => {
// Create the order in your system
const createdOrder = await tx.orders.insert({
channel: order.channelName,
channel_order_id: order.channelOrderId,
status: 'awaiting_fulfillment',
shipping_address: order.shippingAddress,
customer_email: order.customerEmail,
});
// Reserve inventory for each line
for (const line of order.lines) {
await tx.orderLines.insert({
order_id: createdOrder.id,
sku: line.masterSku,
quantity: line.quantity,
unit_price_cents: line.unitPriceCents,
});
// Decrement inventory immediately
await tx.raw(
'UPDATE inventory SET reserved = reserved + ? WHERE sku = ? AND (quantity_on_hand - reserved) >= ?',
[line.quantity, line.masterSku, line.quantity]
);
}
});
}
Track per-channel metrics monthly to understand your channel economics:
| Metric | Where to find it |
|---|---|
| Revenue per channel | Sellbrite/Linnworks Reports → Sales by Channel |
| Sell-through rate per channel | Compare starting inventory to units sold per period |
| Inventory sync lag (stale listings) | Check your channel tool's "last synced" timestamp — anything over 30 minutes needs investigation |
| Return rate per channel | Amazon has its own return dashboard; WooCommerce/Shopify show returns by source channel tag |
| Problem | Solution |
|---|---|
| Oversell when two channels receive orders simultaneously | Use atomic inventory reservation with a WHERE clause checking available qty; Sellbrite/Linnworks handle this; for custom builds use database-level atomic updates |
| Amazon listing goes inactive after a price change | Amazon may require a price change notification or your listing could violate their pricing policies; check the Amazon Seller Central notification inbox immediately when listings go inactive |
| Duplicate order imports when webhook fires twice | Add a unique constraint on (channel_name, channel_order_id) in your orders table and use INSERT ... ON CONFLICT DO NOTHING |
| Tracking number not pushed back to marketplace | Amazon requires tracking within 2 business days or seller performance metrics drop; verify your channel tool's automatic fulfillment confirmation is enabled |