Milan Inventory Sync for WooCommerce

外掛說明

Milan (pronounced mee-LAN, Bengali for “to synchronize”) is a self-hosted multi-channel inventory management plugin. WooCommerce is your source of truth. Milan syncs stock, listings, and orders bidirectionally with Amazon, eBay, Etsy, Shopify, Walmart, and regional marketplaces.

Self-hosted, with no per-SKU accounting

Milan runs inside WordPress. Your catalogue, your stock levels, your mappings and your sync history are rows in your own database, and nothing about them is uploaded anywhere. There is no SKU count, no order quota and no usage metering of any kind.

By the makers of Nishchoy Reviews, Uttor AEO, Chala Subscriptions, and Poth Checkout.

What this plugin does

Everything listed here works, with no licence, no key and no limit. Nothing in this plugin is switched off pending payment.

  • Shopify integration — connect your store and sync inventory in both directions
  • Two-way stock sync — push WooCommerce stock out, and pull the channel’s stock back in
  • Price sync — send WooCommerce prices, with an optional per-channel markup
  • Listing management — create and update channel listings from WooCommerce products
  • Order import — orders placed on the channel become ordinary WooCommerce orders
  • Order status sync — send fulfilment, tracking and cancellations back to the channel
  • Product mapping — match by SKU or by hand, including variations to variants
  • Reserved stock buffers — hold units back per channel so the last one is not sold twice
  • All four conflict strategies — WooCommerce wins, channel wins, most recent wins, or hold for manual review; set per channel, or per event type within a channel
  • Bulk conflict resolution — settle a filtered queue in one action
  • Unlimited channels — connect as many as you have adapters for
  • Full analytics — success rate, failures, conflicts, latency percentiles, daily trends, sales by channel, oversell prevention, and CSV export of any view
  • Optimistic locking — compare-and-swap on every stock write, so concurrent sales cannot lose an update
  • Rate limit enforcement — respects each channel’s published limits and its retry-after headers
  • Retry queue — failed attempts back off exponentially rather than hammering
  • Complete sync and conflict logs — no cap on history
  • REST API + WP-CLI — headless-friendly: wp milan sync, wp milan status, wp milan map, wp milan diagnose
  • HPOS-native
  • Own your data

Additional marketplaces

Adapters for Amazon (SP-API), eBay, Etsy and Walmart Marketplace — and for Flipkart, Meesho, Jumia, Lazada and Noon — are distributed separately as Milan Inventory Sync Pro, along with alerting, multi-warehouse routing, white-labelling, WPML and Polylang support, and a mapping importer. That code is not part of this plugin; installing the add-on adds it.

Works with the publisher’s other plugins

If any of these are installed, Milan uses them. None is required, and nothing here is disabled without them.

  • Nishchoy Reviews — import reviews from Amazon and Etsy, subject to those marketplaces’ terms
  • Uttor AEO — keeps availability schema truthful across every channel
  • Chala Subscriptions — pauses a renewal for something out of stock everywhere
  • Poth Checkout — keeps upsells to items you can actually ship

Importing existing mappings

The separately distributed add-on can import product mappings from a CSV export, so a catalogue already mapped elsewhere does not have to be mapped again by hand. Guide at milan.bytloop.com/docs/migration.

Developer-friendly

Every sync event fires an action. Every channel is a pluggable adapter — third-party channels supported via ChannelAdapterInterface. Full REST API. See milan.bytloop.com/docs/developers.

External services

This plugin connects to one third-party service: Shopify.

It does so only after you have entered your own Shopify credentials and connected a store on the Channels screen. Until you do that, the plugin makes no external requests at all. There is no telemetry, no analytics, no licence check, no phone-home, no remote font and no remote CDN asset.

Shopify Admin API

What it is used for. Keeping your WooCommerce stock and the stock on your Shopify store in agreement, importing orders placed on Shopify, and registering the webhooks that tell this plugin when something changed on Shopify.

Where the requests go. https://{your-store}.myshopify.com — your own Shopify store, using the access token you supply.

What is sent, and when.

  • When you connect a store, and when you press “Test”: a request asking Shopify to confirm the credentials work, and to list your shop’s locations.
  • When WooCommerce stock changes, and when a scheduled sync runs: the product or variant identifier you mapped, and the new stock quantity.
  • If you enable price sync: the product identifier and the price.
  • If you enable listing management: the product fields needed to create or update that listing — title, description, price, SKU, stock.
  • When importing orders: a request asking Shopify for orders placed since the last import. This receives customer data from Shopify; it is not sent there.
  • When registering a webhook: the URL on your own site that Shopify should notify.

No WooCommerce customer data is ever sent to Shopify by this plugin. Nothing is sent for a product you have not mapped.

Terms of service: https://www.shopify.com/legal/terms
Privacy policy: https://www.shopify.com/legal/privacy

If you install the separate add-on

Milan Inventory Sync Pro, distributed from milan.bytloop.com and not part of this plugin, adds adapters that connect to Amazon Selling Partner API, eBay, Etsy, Walmart Marketplace and several regional marketplaces on the same basis — your own seller accounts, your own credentials — and contacts Freemius to validate its licence. Its own readme documents those services. None of that code is in this plugin.

螢幕擷圖

安裝方式

  1. Go to Plugins Add New in your WordPress admin.
  2. Search for “Milan Inventory Sync”.
  3. Click Install Now, then Activate.
  4. Follow the setup wizard: connect Shopify and map your first products.
  5. Turn on automatic stock sync in Settings once the mappings look right.

Requirements

  • WordPress 6.3 or newer
  • WooCommerce 8.0 or newer
  • PHP 7.4 or newer (8.1+ recommended)
  • At least one channel account (Shopify for free)

常見問題集

Is this really free?

Yes, and completely. Every feature this plugin contains is enabled: two-way Shopify sync, price and listing sync, order import and status sync, reserved stock, all four conflict strategies, the full analytics screen with CSV export, unlimited channels and unlimited history. Nothing is time-limited, quota-limited or waiting for a licence key.

The separately distributed add-on is not an unlock. It contains adapter code for other marketplaces, plus features whose implementations are not in this plugin at all.

Which is the source of truth — Woo or the channel?

WooCommerce, by default. Milan is designed around Woo-as-canonical. You can override this per channel, and per event type within a channel, in the conflict settings.

What prevents oversells?

Three mechanisms.

Optimistic locking. Every stock write is a compare-and-swap against a version number. Two sales landing in the same second on two marketplaces cannot both write “2 units left” — the second one loses the swap and re-reads. Without this, one of them silently overwrites the other, and the store tells the world it has one more unit than it does. This is in the free plugin.

Fast sync. A sale on any channel reduces WooCommerce stock, which Milan pushes to every other channel within seconds.

Reserved stock buffers (Pro). Hold N units back per channel, so the race happens on units 3 and 4 rather than on units 1 and 0.

Do all the channels send webhooks?

No, and it is worth knowing which before you set expectations.

Shopify does, and Milan uses them — orders and stock changes arrive in seconds.

Amazon, eBay, Etsy, and Walmart do not, in a form a WordPress site can use. Amazon’s notifications go to AWS SQS or EventBridge rather than to an HTTP endpoint; eBay’s require verifying a rotating ECDSA signature; Etsy and Walmart do not offer partner webhooks at all. Milan polls those, on a schedule you control.

This reflects what those marketplaces currently offer partner integrations. Milan polls them instead, which is slower than a webhook but does not miss changes.

What tiers are there?

This plugin has no tiers. It is one plugin and all of it works. The separately distributed add-on is sold in three, differing by which marketplace adapters they include, how many sites the licence covers, and what support comes with it: Personal adds Amazon, eBay, Etsy and Walmart plus alerting; Business covers three sites; Agency covers twenty-five and adds the regional marketplaces, multi-warehouse routing and white-labelling.

Does Milan need Amazon Seller certification?

Yes for Pro’s Amazon integration. Amazon SP-API requires you to be a registered Amazon seller in good standing. Milan handles the OAuth and API connection, but Amazon’s own requirements apply.

What about eBay?

eBay Trading API just needs a Developer account (free) and your eBay seller account credentials.

Does it work with variable products?

Yes. Variable products map to channel-specific variant structures (Amazon parent/child ASINs, eBay variations, Etsy inventory items, Shopify variants).

What happens if a channel goes down?

Milan fails safe. If Amazon’s API is unreachable, Woo keeps running normally. Sync attempts queue with exponential backoff. Once the channel is back, queued jobs process. Alerts (Pro) notify you of extended outages.

How does conflict resolution work?

When Woo and a channel disagree — Woo shows 5 units, Amazon shows 3 because somebody bought there — Milan applies a strategy: WooCommerce wins, the channel wins, the most recent change wins, or hold it for manual review.

Free always uses “WooCommerce wins”, which is the safe default. Personal Pro lets you choose per channel. Business Pro lets you choose per channel and per event type — “WooCommerce wins on stock, eBay wins on price” — and adds the manual-review queue and bulk resolution.

Every conflict is recorded either way, including the ones Milan settles automatically in a microsecond, with the strategy that settled it. The question a merchant eventually asks is not “is my stock right” but “why did my stock change”, and that record is the answer.

Can I sell on Flipkart / Meesho / Jumia / Lazada / Noon?

Yes, on the Agency tier — and those five are marked beta. They are built against each marketplace’s published documentation and tested against recorded responses, but they have not been validated against a live seller account in each region. Sync a handful of products and check before you point one at a catalogue. The Channels screen says the same thing.

Is it HPOS-compatible?

Yes. Milan is HPOS-native. Marketplace orders arrive as first-class Woo orders under HPOS.

What if the channel I need isn’t supported?

You can build a channel adapter. The ChannelAdapterInterface documented at milan.bytloop.com/docs/channel-adapter-guide is a standard extension point. Third-party channels welcome.

Where can I get support?

Free support in the wp.org support forum. Pro customers get email support at support@bytloop.com with 24h SLA. Agency includes video call support for setup and troubleshooting.

I’m a developer — where are the hooks?

The hooks reference lives at milan.bytloop.com/docs/hooks and in /docs/hooks.md in the plugin.

使用者評論

這個外掛目前沒有任何使用者評論。

參與者及開發者

以下人員參與了開源軟體〈Milan Inventory Sync for WooCommerce〉的開發相關工作。

參與者

變更記錄

1.0.1

  • Added a single “Upgrade to Pro” link to the Plugins screen and the Settings screen — both plain outbound links, no third-party script loaded by this plugin.

1.0.0

  • Initial release.