marketplace-connectors

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Marketplace Connectors

Marketplace 连接器

Overview

概述

Selling across Amazon, eBay, and Walmart Marketplace multiplies your sales channel reach but introduces operational complexity: each marketplace has its own product data model, listing requirements, order lifecycle, and inventory management API. This skill covers connecting your store to major marketplaces — using apps for managed platforms and direct API integration for custom storefronts.
在亚马逊、eBay和沃尔玛 Marketplace 上销售能够扩大你的销售渠道覆盖范围,但也会带来运营复杂性:每个平台都有自己的商品数据模型、上架要求、订单生命周期和库存管理API。本技能涵盖如何将你的店铺与主流电商平台连接——对于托管平台使用应用程序,对于自定义店铺则使用直接API集成。

When to Use This Skill

适用场景

  • When expanding sales channels beyond your own storefront to major marketplace platforms
  • When building a multichannel commerce system that keeps inventory in sync across channels
  • When automating order imports from marketplaces into your OMS or ERP
  • When existing marketplace feeds are manual (spreadsheet uploads) and need automation
  • 当你希望将销售渠道从自有店铺扩展至主流电商平台时
  • 当你构建跨渠道电商系统,需要在各渠道间保持库存同步时
  • 当你需要将平台订单自动导入至订单管理系统(OMS)或企业资源规划系统(ERP)时
  • 当现有平台商品上传为手动操作(如表格上传),需要实现自动化时

Core Instructions

核心操作指南

Step 1: Determine your platform and recommended approach

步骤1:确定你的平台及推荐方案

PlatformRecommended ApproachKey Apps
ShopifyUse a marketplace app — no custom code neededCodisto ($39/month) for Amazon + eBay + Walmart; LitCommerce ($19/month) for multi-channel listing management
WooCommerceUse a plugin for standard integrationsWooCommerce Amazon Fulfillment (free, amazon.com) for FBA; WP-Lister Pro for Amazon ($99) for full listing and order management
BigCommerceUse App Marketplace connectorsSellbrite ($79/month, marketplace.bigcommerce.com) syncs Amazon, eBay, Walmart, and Etsy; ChannelAdvisor for enterprise multi-channel
Custom / HeadlessDirect API integrationBuild using Amazon SP-API, eBay REST API, and Walmart Marketplace API; use a queue for order imports and inventory sync
平台推荐方案核心应用
Shopify使用电商平台应用——无需自定义代码Codisto(39美元/月)支持亚马逊+eBay+沃尔玛;LitCommerce(19美元/月)用于多渠道商品上架管理
WooCommerce使用插件实现标准集成WooCommerce Amazon Fulfillment(免费,amazon.com)支持亚马逊物流(FBA);WP-Lister Pro for Amazon(99美元)用于完整的商品上架和订单管理
BigCommerce使用应用市场连接器Sellbrite(79美元/月,marketplace.bigcommerce.com)同步亚马逊、eBay、沃尔玛和Etsy的商品;ChannelAdvisor适用于企业级多渠道管理
自定义/无头商店直接API集成基于Amazon SP-API、eBay REST API和Walmart Marketplace API进行开发;使用队列处理订单导入和库存同步

Step 2: Platform-specific marketplace setup

步骤2:平台专属电商平台设置



Shopify

Shopify

Connect Amazon with Codisto:
  1. Install Codisto from the Shopify App Store ($39/month for Amazon + eBay)
  2. Connect your Amazon Seller Central account (US, UK, EU, AU supported)
  3. In Codisto, go to Listings → Amazon and click Link Products — it matches your Shopify products to existing ASINs or creates new listings
  4. Enable Inventory Sync to update Amazon quantities automatically when Shopify inventory changes
  5. Enable Order Import — Codisto imports Amazon orders as Shopify orders so you manage fulfillment from one place
Important before listing:
  • Set a safety stock buffer in Codisto settings: reserve 10–20% of your Shopify inventory from marketplaces to avoid oversells if sync lags
  • Configure marketplace-specific pricing in Codisto to account for Amazon fees (15% referral fee + FBA fees) — list at a higher price than your Shopify store

通过Codisto连接亚马逊:
  1. 从Shopify应用商店安装Codisto(亚马逊+eBay版本39美元/月)
  2. 连接你的亚马逊卖家中心账户(支持美国、英国、欧盟、澳大利亚站点)
  3. 在Codisto中进入Listings → Amazon,点击Link Products——该功能会将你的Shopify商品与现有ASIN匹配,或创建新的商品列表
  4. 启用Inventory Sync,当Shopify库存变化时自动更新亚马逊库存数量
  5. 启用Order Import——Codisto会将亚马逊订单导入为Shopify订单,让你可以在同一平台管理履约
上架前注意事项:
  • 在Codisto设置中设置安全库存缓冲:预留Shopify库存的10–20%不对外展示,避免因同步延迟导致超卖
  • 在Codisto中配置平台专属定价,考虑亚马逊的费用(15%佣金+FBA费用)——上架价格应高于你的Shopify店铺价格

WooCommerce

WooCommerce

Connect Amazon with WP-Lister Pro:
  1. Purchase and install WP-Lister Pro for Amazon ($99 from wp-lister.com)
  2. Go to WP-Lister → Settings → Amazon and enter your Amazon Marketplace Web Service (MWS) credentials
  3. In WP-Lister → Products, select products to list and configure ASIN matching or create new listings
  4. Enable Auto-sync inventory — WP-Lister updates Amazon quantities when WooCommerce stock changes
  5. Enable Import Amazon orders — orders appear in WooCommerce automatically
For eBay with WooCommerce:
  1. Install WP-Lister Pro for eBay ($99) — same workflow as Amazon version
  2. Connect via eBay API credentials in WP-Lister settings
  3. Configure category mapping between your WooCommerce categories and eBay categories

通过WP-Lister Pro连接亚马逊:
  1. 购买并安装WP-Lister Pro for Amazon(99美元,wp-lister.com)
  2. 进入WP-Lister → Settings → Amazon,输入你的亚马逊Marketplace Web Service(MWS)凭证
  3. WP-Lister → Products中选择要上架的商品,配置ASIN匹配或创建新的商品列表
  4. 启用Auto-sync inventory——当WooCommerce库存变化时,WP-Lister会更新亚马逊库存数量
  5. 启用Import Amazon orders——订单会自动显示在WooCommerce中
WooCommerce连接eBay:
  1. 安装WP-Lister Pro for eBay(99美元)——操作流程与亚马逊版本一致
  2. 在WP-Lister设置中通过eBay API凭证完成连接
  3. 配置WooCommerce分类与eBay分类的映射关系

BigCommerce

BigCommerce

Connect Amazon, eBay, and Walmart with Sellbrite:
  1. Install Sellbrite from the BigCommerce App Marketplace ($79/month)
  2. Connect your marketplace seller accounts (Amazon, eBay, Walmart) and your BigCommerce store
  3. Sellbrite pulls your BigCommerce product catalog and syncs listings to all connected marketplaces
  4. Set inventory buffer rules per channel (e.g., reserve 5 units for your BigCommerce store)
  5. Configure automatic order import — marketplace orders appear in BigCommerce for unified fulfillment

通过Sellbrite连接亚马逊、eBay和沃尔玛:
  1. 从BigCommerce应用市场安装Sellbrite(79美元/月)
  2. 连接你的电商平台卖家账户(亚马逊、eBay、沃尔玛)和BigCommerce店铺
  3. Sellbrite会拉取你的BigCommerce商品目录,并同步至所有已连接的平台
  4. 为每个渠道设置库存缓冲规则(例如,为BigCommerce店铺预留5件库存)
  5. 配置自动订单导入——平台订单会显示在BigCommerce中,实现统一履约管理

Custom / Headless

自定义/无头商店

Amazon SP-API authentication:
typescript
// lib/amazon/auth.ts — LWA OAuth token with caching
let tokenCache: { accessToken: string; expiresAt: number } | null = null;

export async function getAccessToken(): Promise<string> {
  if (tokenCache && tokenCache.expiresAt > Date.now() + 60000) return tokenCache.accessToken;

  const res = await fetch('https://api.amazon.com/auth/o2/token', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: new URLSearchParams({
      grant_type: 'refresh_token',
      refresh_token: process.env.AMAZON_REFRESH_TOKEN!,
      client_id: process.env.AMAZON_CLIENT_ID!,
      client_secret: process.env.AMAZON_CLIENT_SECRET!,
    }),
  });

  const data = await res.json();
  tokenCache = { accessToken: data.access_token, expiresAt: Date.now() + data.expires_in * 1000 };
  return tokenCache.accessToken;
}
Update Amazon inventory (SP-API Listings Items):
typescript
export async function updateAmazonInventory(sellerId: string, sku: string, quantity: number) {
  const accessToken = await getAccessToken();
  // SP-API also requires AWS Signature V4 — use @smithy/signature-v4
  return fetch(`https://sellingpartnerapi-na.amazon.com/listings/2021-08-01/items/${sellerId}/${encodeURIComponent(sku)}`, {
    method: 'PATCH',
    headers: { 'x-amz-access-token': accessToken, 'Content-Type': 'application/json' },
    body: JSON.stringify({
      productType: 'PRODUCT',
      patches: [{ op: 'replace', path: '/attributes/fulfillment_availability', value: [{
        fulfillment_channel_code: 'DEFAULT',
        quantity,
        marketplace_id: 'ATVPDKIKX0DER', // US marketplace
      }] }],
    }),
  });
}
Import Amazon orders (polling every 5 minutes):
typescript
export async function pollAmazonOrders() {
  const lastPolledAt = await db.syncState.getLastPolled('amazon') ?? new Date(Date.now() - 3_600_000);
  const accessToken = await getAccessToken();

  const params = new URLSearchParams({
    MarketplaceIds: 'ATVPDKIKX0DER',
    CreatedAfter: lastPolledAt.toISOString(),
    OrderStatuses: 'Unshipped,PartiallyShipped',
  });

  const res = await fetch(`https://sellingpartnerapi-na.amazon.com/orders/v0/orders?${params}`, {
    headers: { 'x-amz-access-token': accessToken },
  });
  const { payload } = await res.json();

  for (const amazonOrder of payload.Orders ?? []) {
    // Idempotent: skip if already imported
    if (await db.orders.findByExternalId(amazonOrder.AmazonOrderId)) continue;

    await orderQueue.add('import-order', {
      externalId: amazonOrder.AmazonOrderId,
      channel: 'amazon',
      // ...map order fields
    }, { jobId: `amazon-${amazonOrder.AmazonOrderId}` });
  }

  await db.syncState.updateLastPolled('amazon', new Date());
}
Sync inventory across all channels when stock changes:
typescript
export async function syncInventoryAcrossChannels(sku: string, quantity: number, source: string) {
  const tasks = [];

  if (source !== 'amazon') {
    tasks.push(updateAmazonInventory(process.env.AMAZON_SELLER_ID!, sku, quantity)
      .catch(err => console.error(`Amazon sync failed for ${sku}:`, err)));
  }

  if (source !== 'ebay') {
    tasks.push(ebayClient.updateInventoryItem(sku, quantity)
      .catch(err => console.error(`eBay sync failed for ${sku}:`, err)));
  }

  // Run all syncs in parallel; individual failures logged but don't block others
  await Promise.allSettled(tasks);
}
Amazon SP-API认证:
typescript
// lib/amazon/auth.ts — LWA OAuth token with caching
let tokenCache: { accessToken: string; expiresAt: number } | null = null;

export async function getAccessToken(): Promise<string> {
  if (tokenCache && tokenCache.expiresAt > Date.now() + 60000) return tokenCache.accessToken;

  const res = await fetch('https://api.amazon.com/auth/o2/token', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: new URLSearchParams({
      grant_type: 'refresh_token',
      refresh_token: process.env.AMAZON_REFRESH_TOKEN!,
      client_id: process.env.AMAZON_CLIENT_ID!,
      client_secret: process.env.AMAZON_CLIENT_SECRET!,
    }),
  });

  const data = await res.json();
  tokenCache = { accessToken: data.access_token, expiresAt: Date.now() + data.expires_in * 1000 };
  return tokenCache.accessToken;
}
更新亚马逊库存(SP-API Listings Items):
typescript
export async function updateAmazonInventory(sellerId: string, sku: string, quantity: number) {
  const accessToken = await getAccessToken();
  // SP-API also requires AWS Signature V4 — use @smithy/signature-v4
  return fetch(`https://sellingpartnerapi-na.amazon.com/listings/2021-08-01/items/${sellerId}/${encodeURIComponent(sku)}`, {
    method: 'PATCH',
    headers: { 'x-amz-access-token': accessToken, 'Content-Type': 'application/json' },
    body: JSON.stringify({
      productType: 'PRODUCT',
      patches: [{ op: 'replace', path: '/attributes/fulfillment_availability', value: [{
        fulfillment_channel_code: 'DEFAULT',
        quantity,
        marketplace_id: 'ATVPDKIKX0DER', // US marketplace
      }] }],
    }),
  });
}
导入亚马逊订单(每5分钟轮询一次):
typescript
export async function pollAmazonOrders() {
  const lastPolledAt = await db.syncState.getLastPolled('amazon') ?? new Date(Date.now() - 3_600_000);
  const accessToken = await getAccessToken();

  const params = new URLSearchParams({
    MarketplaceIds: 'ATVPDKIKX0DER',
    CreatedAfter: lastPolledAt.toISOString(),
    OrderStatuses: 'Unshipped,PartiallyShipped',
  });

  const res = await fetch(`https://sellingpartnerapi-na.amazon.com/orders/v0/orders?${params}`, {
    headers: { 'x-amz-access-token': accessToken },
  });
  const { payload } = await res.json();

  for (const amazonOrder of payload.Orders ?? []) {
    // Idempotent: skip if already imported
    if (await db.orders.findByExternalId(amazonOrder.AmazonOrderId)) continue;

    await orderQueue.add('import-order', {
      externalId: amazonOrder.AmazonOrderId,
      channel: 'amazon',
      // ...map order fields
    }, { jobId: `amazon-${amazonOrder.AmazonOrderId}` });
  }

  await db.syncState.updateLastPolled('amazon', new Date());
}
库存变化时同步所有渠道库存:
typescript
export async function syncInventoryAcrossChannels(sku: string, quantity: number, source: string) {
  const tasks = [];

  if (source !== 'amazon') {
    tasks.push(updateAmazonInventory(process.env.AMAZON_SELLER_ID!, sku, quantity)
      .catch(err => console.error(`Amazon sync failed for ${sku}:`, err)));
  }

  if (source !== 'ebay') {
    tasks.push(ebayClient.updateInventoryItem(sku, quantity)
      .catch(err => console.error(`eBay sync failed for ${sku}:`, err)));
  }

  // Run all syncs in parallel; individual failures logged but don't block others
  await Promise.allSettled(tasks);
}

Best Practices

最佳实践

  • Set a safety stock buffer for each channel — never expose 100% of your inventory to marketplaces; reserve a buffer for your own store and to absorb sync lag
  • Implement idempotent order imports — use the marketplace order ID as a unique key; polling can return the same order multiple times; a unique constraint prevents duplicates
  • Acknowledge marketplace orders promptly — Walmart requires acknowledgment within 4 hours; Amazon expects shipping confirmation within the promised delivery SLA; late responses result in account defect metrics
  • Respect marketplace-specific rate limits — Amazon SP-API uses token bucket limits per operation; use exponential backoff and the Feeds API for bulk inventory updates (thousands of SKUs) instead of individual calls
  • Monitor listing health, not just sync status — track listing suppression, buy box win rate, and account health per marketplace; suppressed listings cost revenue
  • 为每个渠道设置安全库存缓冲——不要将100%的库存展示在电商平台上;为自有店铺预留缓冲库存,并应对同步延迟问题
  • 实现幂等性订单导入——使用平台订单ID作为唯一标识;轮询可能会重复返回同一订单,唯一约束可防止重复导入
  • 及时确认平台订单——沃尔玛要求在4小时内确认订单;亚马逊要求在承诺的配送服务水平协议(SLA)内确认发货;延迟响应会导致账户绩效指标下降
  • 遵守平台专属速率限制——Amazon SP-API对每个操作使用令牌桶限制;对于批量库存更新(数千个SKU),使用Feeds API而非单个调用,并采用指数退避策略
  • 监控商品列表健康状况,而非仅同步状态——跟踪每个平台的商品列表抑制情况、购物车赢得率和账户健康状况;被抑制的商品列表会损失营收

Common Pitfalls

常见问题及解决方案

ProblemSolution
Amazon listing succeeds but goes inactiveCheck for listing suppressions in the Listings API response; common causes include missing required attributes for the product type
Inventory oversells due to sync lagSet a safety stock buffer in your marketplace app settings; always run a final inventory check at checkout
SP-API returns
QuotaExceeded
Each SP-API operation has separate rate limits; use the Feeds API for bulk inventory updates instead of individual PATCH calls
Shopify marketplace app not importing ordersCheck that the app has Write permissions for Orders in your Shopify admin under Apps → App permissions
eBay listing rejected for policy violationPre-screen product titles for restricted terms before automating; review eBay's Prohibited Items policy
问题解决方案
亚马逊商品上架成功但变为无效状态检查Listings API响应中的商品列表抑制原因;常见原因包括商品类型缺少必填属性
因同步延迟导致库存超卖在电商平台应用设置中设置安全库存缓冲;结账时始终进行最终库存检查
SP-API返回
QuotaExceeded
错误
每个SP-API操作有单独的速率限制;对于批量库存更新,使用Feeds API而非单个PATCH调用
Shopify电商平台应用未导入订单在Shopify后台的Apps → App permissions中检查应用是否拥有订单的Write权限
eBay商品列表因政策违规被拒绝自动化上架前预先检查商品标题是否包含受限词汇;查看eBay的禁售商品政策

Related Skills

相关技能

  • @webhook-architecture
  • @product-information-management
  • @erp-integration
  • @monitoring-alerting-commerce
  • @webhook-architecture
  • @product-information-management
  • @erp-integration
  • @monitoring-alerting-commerce