skills/integrations-apis/marketplace-connectors/SKILL.md
List products on Amazon, eBay, and Walmart with two-way inventory sync, automated listing creation, and order import into your store
npx skillsauth add finsilabs/awesome-ecommerce-skills marketplace-connectorsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.
| Platform | Recommended Approach | Key Apps | |----------|---------------------|----------| | Shopify | Use a marketplace app — no custom code needed | Codisto ($39/month) for Amazon + eBay + Walmart; LitCommerce ($19/month) for multi-channel listing management | | WooCommerce | Use a plugin for standard integrations | WooCommerce Amazon Fulfillment (free, amazon.com) for FBA; WP-Lister Pro for Amazon ($99) for full listing and order management | | BigCommerce | Use App Marketplace connectors | Sellbrite ($79/month, marketplace.bigcommerce.com) syncs Amazon, eBay, Walmart, and Etsy; ChannelAdvisor for enterprise multi-channel | | Custom / Headless | Direct API integration | Build using Amazon SP-API, eBay REST API, and Walmart Marketplace API; use a queue for order imports and inventory sync |
Connect Amazon with Codisto:
Important before listing:
Connect Amazon with WP-Lister Pro:
For eBay with WooCommerce:
Connect Amazon, eBay, and Walmart with Sellbrite:
Amazon SP-API authentication:
// 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):
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):
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:
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);
}
| Problem | Solution |
|---------|----------|
| Amazon listing succeeds but goes inactive | Check for listing suppressions in the Listings API response; common causes include missing required attributes for the product type |
| Inventory oversells due to sync lag | Set 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 orders | Check that the app has Write permissions for Orders in your Shopify admin under Apps → App permissions |
| eBay listing rejected for policy violation | Pre-screen product titles for restricted terms before automating; review eBay's Prohibited Items policy |
tools
Let shoppers save products to a wishlist, share it with friends, and get notified when saved items come back in stock or drop in price
development
Build a themeable storefront with design tokens and CSS custom properties that supports white-labeling, multi-brand variants, and dark mode
development
Speed up product discovery with instant search suggestions, fuzzy typo matching, and category-aware results powered by Algolia or Elasticsearch
development
Build a mobile-first storefront with thumb-friendly navigation, sticky add-to-cart buttons, and touch-optimized components for high mobile conversion