Zippendo

Managingordersfrommultiplesaleschannels

Selling on Shopify, WooCommerce and somewhere custom means three order lists and three ways of being wrong. How order channels pull them into one.

Zippendo
tutorials

Most shops we talk to did not plan to sell in three places. It happened. Shopify came first, then a WooCommerce site for a second brand, then a marketplace or a B2B portal that mails over a spreadsheet on Tuesdays.

Each one keeps its own order list. Each one has its own idea of what an order is. And the person packing is the one holding all three in their head.

What an order channel is

In Zippendo every order arrives through an order channel, and a channel is the connection to one source system. There are four kinds:

  • Shopify. You install the app and orders arrive as they are placed. Fulfilments and tracking numbers travel back the other way.
  • WooCommerce. The same thing through our plugin, plus live rates and pickup points at checkout.
  • Custom. Your own webshop, ERP or marketplace bridge pushes orders to us over a signed webhook.
  • Manual. No source system at all. Orders you type in yourself, or ones an importer created while migrating you off something else.

Whichever it is, the order looks the same by the time it reaches the shipping side. That is the entire point of the abstraction.

The custom channel, because everyone asks

If we have no integration for your system, you get a channel with its own signing secret and an ingest URL. Your system posts the order, signs the body with HMAC-SHA256, and sets a topic header for created, updated or cancelled.

Verification is fail-closed. No secret, no signature, or a signature that does not match, and you get a 401 rather than us guessing what you meant.

The field that matters most is externalId, your own ID for the order. We key on it. Send the same order twice and the second one updates the first instead of creating a twin. So when your retry loop fires three times at two in the morning because our response was slow, you still end up with one order.

There is a REST endpoint too, if pushing webhooks is awkward on your side. Same rules, except a duplicate externalId gets a 409 rather than an update, because there you asked to create something rather than to sync it.

Where the channels stop mattering

Once orders are in, the channel is mostly just a label. Shipping rules do not care where an order came from unless you tell them to. Write the rule once, this weight to that carrier, this country to a pickup point, and it covers all of them.

Two places the channel still matters. Fulfilment goes back to the system the order came from, so Shopify gets its fulfilment and Woo gets its tracking number. And if you run Brands, a channel belongs to exactly one brand, which is how a second shop gets its own name on the packing slip without needing a second account.

The part that is genuinely annoying

Order statuses do not mean the same thing on every platform, and no amount of mapping fixes that completely. What we do is refuse to regress a status: if a shipment has already reached a later state, a late update cannot drag it backwards. That prevents the worst of it. It does not make three platforms agree on what processing means, and we stopped pretending it could.

If you are running more than one shop across more than one browser tab, this is the part of Zippendo built for you. Connect the second channel and see whether the packing bench notices any difference.

Tags

order channelsshopifywoocommerceintegrations