> ## Documentation Index
> Fetch the complete documentation index at: https://www.zippendo.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Connect order channels

> Connect WooCommerce or a custom channel so store and ERP orders appear in Zippendo.

An **order channel** is where your orders come from. Zippendo does not create store orders on its own — it imports them from a connected channel so you can create shipments in one place.

This walkthrough covers every channel you can add from **Order Channels** in the client, except Shopify. Shopify installs from the App Store and finishes in a different flow — follow [Connect Shopify](/docs/tutorials/connect-shopify) for that.

<Info>
  You can create shipments without a channel. Connect one when you want store or ERP orders to land under **Orders** instead of typing each address by hand.
</Info>

## What an order channel is

A channel is a named connection on your organization. After it is connected and **Active**:

* New orders from that source appear under **Orders**.
* The channel name is listed in the sidebar under **Channel orders**, so you can open that store’s orders in one click.
* Opening an order shows the **Order Channel**, customer, address, and lines. Use **Create Shipment** (or **Send order** if a shipment already exists) to fulfil it.

If your organization uses [brands](/docs/settings/brands), assign a **Brand** on the channel after you connect. Orders synced from that channel — and the shipments made from them — belong to that brand. Unassigned channels stay organization-wide. The WooCommerce and custom connect flows do not ask for a brand up front.

## Supported channels in the app

Open **Order Channels** from the sidebar. The page title is **Order Channels**. The subtitle is **Connect your e-commerce platforms to import orders automatically**.

Two tabs sit in the header (they are URL state — `?tab=`):

| Tab                        | What it shows                                                                                                                                                |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Connected stores**       | Shopify installations, WooCommerce stores, and custom channels you already added. Leftover rows from a removed store appear under **Disconnected channels**. |
| **Available integrations** | The three connect cards Zippendo offers.                                                                                                                     |

<Frame caption="Available integrations lists Shopify, WooCommerce, and Custom channel">
  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/01-available-integrations-light.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=ff85d6e3da8c7b8272bae9f609ad137f" alt="Order Channels Available integrations tab with Shopify, WooCommerce, and Custom channel cards" className="block dark:hidden" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/01-available-integrations-light.png" />

  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/01-available-integrations-dark.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=0aebd884cc9ff81f4356b8e78f2d120b" alt="Order Channels Available integrations tab with Shopify, WooCommerce, and Custom channel cards" className="hidden dark:block" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/01-available-integrations-dark.png" />
</Frame>

Those cards are the full catalog. There is no separate “webshop” or “API” card. A webshop or ERP you built yourself uses **Custom channel**. Creating orders through the REST API also uses a channel you already created (usually custom).

| Card               | Button                  | Features shown on the card                                                                                 |
| ------------------ | ----------------------- | ---------------------------------------------------------------------------------------------------------- |
| **Shopify**        | **Connect Shopify**     | REST API integration, Webhook support, Custom order mapping                                                |
| **WooCommerce**    | **Connect WooCommerce** | REST API integration, Webhook support, Custom order mapping                                                |
| **Custom channel** | **Create channel**      | Signed webhook order ingestion, Full REST API with official SDKs, Automatic shipment creation and dispatch |

Shopify: [Connect Shopify](/docs/tutorials/connect-shopify). The rest of this page is WooCommerce and custom.

<Frame caption="Connected stores shows live channels as Active cards; leftovers sit under Disconnected channels">
  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/02-connected-stores-light.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=374a87d4f0a0e2c823348b3d4f849f90" alt="Order Channels Connected stores tab with an Active custom channel and a Disconnected leftover" className="block dark:hidden" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/02-connected-stores-light.png" />

  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/02-connected-stores-dark.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=3c03e9ebaec6ea3a9ee96e90211996e6" alt="Order Channels Connected stores tab with an Active custom channel and a Disconnected leftover" className="hidden dark:block" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/02-connected-stores-dark.png" />
</Frame>

A live custom card shows **Custom integration**, an **Active** or **Disabled** badge, **Connected** date, and either **Last order received** or **No orders received yet**. Click the card to open settings.

**Disconnected channels** are leftovers from a removed store. They have no settings page. The subtitle is **No active integration**. Use **Remove** if you no longer need the row — that also deletes orders imported under it.

<Note>
  If **Connected stores** is empty, you see **No stores connected** and a **Connect Shopify** button, plus **Browse available integrations**.
</Note>

## Connect WooCommerce

One-click connect is the default. You enter your store URL, approve the connection on your own store, and WooCommerce generates the REST API keys. Prefer to paste keys you created in wp-admin? Use **Enter API keys manually** in the same modal.

### Before you start

* WooCommerce admin access.
* The store reachable over **HTTPS** for one-click connect. If the store is not on HTTPS, use the API keys step.
* At least one sender address under **Settings → Sender** if you want a **Default Address** on the channel (used as the sender on shipments created from this store). You can skip it and set it later.

### One-click connect

<Steps>
  <Step title="Open Available integrations">
    Go to **Order Channels** and open the **Available integrations** tab.
  </Step>

  <Step title="Click Connect WooCommerce">
    The **Connect WooCommerce Store** modal opens on step **1 of 2 · One-click**. The subtitle is **Connect in one click — you approve the connection on your own store**.
  </Step>

  <Step title="Enter Store URL">
    Type the full store URL (placeholder `https://mystore.dk`). Optionally choose a **Default Address**. The help text explains that Zippendo sends you to the store to approve the connection.
  </Step>

  <Step title="Click Connect">
    You leave Zippendo and land on your store’s WooCommerce authorization screen. Approve **read/write** access. WooCommerce creates the keys and sends you back.
  </Step>
</Steps>

<Frame caption="Connect WooCommerce Store modal on the One-click step">
  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/03-connect-woocommerce-light.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=e520c3f88c7fa5357b20e2daafaedb48" alt="Connect WooCommerce Store modal with Store URL, Default Address, and Connect" className="block dark:hidden" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/03-connect-woocommerce-light.png" />

  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/03-connect-woocommerce-dark.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=f807196c6e506e50c0a98ca9fbb2afc7" alt="Connect WooCommerce Store modal with Store URL, Default Address, and Connect" className="hidden dark:block" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/03-connect-woocommerce-dark.png" />
</Frame>

Back in Zippendo you should see the toast **WooCommerce store connected!** with **Webhooks have been set up for real-time order sync.** The store appears under **Connected stores**.

<Warning>
  One-click connect redirects to your store. Do not close that tab until WooCommerce sends you back. A **Read/Write** grant is required — a read-only key can import orders but cannot push tracking back.
</Warning>

### Enter API keys manually

Use this when you already have keys, or one-click cannot reach the store.

<Steps>
  <Step title="Generate a REST API key in WooCommerce">
    In wp-admin go to **WooCommerce → Settings → Advanced → REST API** and click **Add Key**. Set permissions to **Read/Write**. Copy the **Consumer Key** and **Consumer Secret** — the secret is shown only once.
  </Step>

  <Step title="Switch the Zippendo modal to API keys">
    In **Connect WooCommerce Store**, click **Enter API keys manually**. The modal moves to step **2 of 2 · API keys**. The subtitle is **Enter the REST API keys you generated in WooCommerce**.
  </Step>

  <Step title="Fill Store URL, Consumer Key, and Consumer Secret">
    Optionally set **Default Address**. The modal repeats the four wp-admin steps under **How to get API Keys**.
  </Step>

  <Step title="Click Connect">
    Zippendo probes the keys against the store before it saves the channel. On success the store appears under **Connected stores**.
  </Step>
</Steps>

<Frame caption="API keys step with Consumer Key, Consumer Secret, and How to get API Keys">
  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/04-connect-woocommerce-manual-light.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=16904f6ef280631db3029d20ab0ba87f" alt="Connect WooCommerce Store modal on the API keys step" className="block dark:hidden" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/04-connect-woocommerce-manual-light.png" />

  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/04-connect-woocommerce-manual-dark.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=9ccd6a835af142eb6e428ec1bc2accb8" alt="Connect WooCommerce Store modal on the API keys step" className="hidden dark:block" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/04-connect-woocommerce-manual-dark.png" />
</Frame>

Use **Back to one-click connect** if you change your mind. The URL and address you already typed are carried over.

### WooCommerce settings after connect

Open the store from **Connected stores**. The header description is the store URL (or **WooCommerce store settings**). **WooCommerce admin** opens `{store}/wp-admin` in a new tab.

Two tabs (these are on the settings page, not in the URL):

**Orders & checkout**

* **Automatic sync** — periodically poll the store for new orders as a backup to webhooks.
* **Sync interval (minutes)** — 5–1440.
* **Only unfulfilled orders** — import only orders that are not yet fulfilled.
* **Auto-create shipments** — create a shipment when a new order arrives.
* **Auto-fulfill in WooCommerce** — on by default. Pushes tracking back to WooCommerce when you dispatch a shipment.
* **Brand** — orders from this channel belong to this brand.
* **Default sender address** — sender for shipments created from WooCommerce orders.
* **Save changes** after you edit the draft.
* **Checkout token** — for the [WooCommerce checkout plugin](/docs/order-channels/woocommerce-checkout-plugin). **Generate token** / **Rotate token** / **Revoke**. The plaintext token is shown once.

**Connection**

* **Store URL**, **Status** (**Active** / **Disabled**), **Last sync** (or **Never**).
* **Test connection** — verify the stored keys still reach the store.
* **Webhooks** — WooCommerce order hooks and their status (**Active** or **Disabled by WooCommerce**). WooCommerce turns a hook off after repeated delivery failures. **Re-register** recreates them.
* **Danger zone** — **Disconnect** removes the channel and its webhooks. Orders already in Zippendo stay.

There is no enable/disable switch on the WooCommerce screen. **Status** is a badge. To stop importing, **Disconnect**.

Field-level notes and checkout plugin install: [Connecting WooCommerce](/docs/order-channels/connecting-woocommerce) and [WooCommerce checkout plugin](/docs/order-channels/woocommerce-checkout-plugin).

## Create a custom channel

Use **Custom channel** for a webshop, ERP, or WMS Zippendo does not have a one-click integration for. Orders arrive as signed pushes to an **Ingest URL**, or through `POST /orgs/{orgId}/orders` with an [API token](/docs/settings/api-settings). Tracking goes back out through [org webhooks](/docs/settings/webhooks) (`shipment.dispatched`, `tracking.updated`), not a per-channel callback.

<Steps>
  <Step title="Open Available integrations">
    Go to **Order Channels → Available integrations**.
  </Step>

  <Step title="Click Create channel">
    The **Create custom channel** modal opens. Subtitle: **A channel for your own webshop or ERP integration.**
  </Step>

  <Step title="Enter Channel name">
    Example placeholder: `e.g. My webshop`. If your organization has brands, a **Brand** picker is shown.
  </Step>

  <Step title="Click Create channel">
    Zippendo creates the channel and opens its settings. Toast: **Order channel created successfully**.
  </Step>
</Steps>

<Frame caption="Create custom channel modal with Channel name">
  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/05-create-custom-channel-light.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=e442632a75f9ee3b9ebe3ad0c189b79c" alt="Create custom channel modal with Channel name filled in as My webshop" className="block dark:hidden" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/05-create-custom-channel-light.png" />

  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/05-create-custom-channel-dark.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=6fd99aa5736ee730a25f2233e6ab2702" alt="Create custom channel modal with Channel name filled in as My webshop" className="hidden dark:block" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/05-create-custom-channel-dark.png" />
</Frame>

The hint on the modal is accurate: after create you get an ingest URL and a signing secret so your system can push orders.

### Custom channel settings

The settings header uses the channel name. Description: **Your own integration: push orders to the ingest URL, or use the API and SDKs.** **View documentation** opens the [custom channels](/docs/order-channels/custom-channels) reference.

<Frame caption="Custom channel settings: Order ingestion and Operations">
  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/06-custom-channel-settings-light.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=c7104343c1f0694e9e779175327e8c97" alt="Nordlys ERP settings with Order ingestion and Operations including Channel enabled" className="block dark:hidden" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/06-custom-channel-settings-light.png" />

  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/06-custom-channel-settings-dark.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=704be0f07363c139cb3326c0d595fa62" alt="Nordlys ERP settings with Order ingestion and Operations including Channel enabled" className="hidden dark:block" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/06-custom-channel-settings-dark.png" />
</Frame>

**Order ingestion**

* Every push must include an HMAC-SHA256 signature of the raw body, keyed with the signing secret.
* **Ingest URL** — copy **your** URL from this field. Production looks like `https://api.zippendo.com/webhooks/order-channels/{channelId}`. Screenshots in this tutorial were taken against a local docs environment, so the host may show `localhost` — do not paste that into a live shop.
* **Generate secret** the first time, then **Rotate secret** / **Revoke**.
* After a generate or rotate, Zippendo shows the secret once: **Copy the secret now — it is only shown once.**

<Frame caption="After Generate secret or Rotate secret, copy the signing secret immediately">
  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/07-signing-secret-light.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=1bf9953d3d3cc22f0af351f0d63864e2" alt="Order ingestion with Ingest URL, one-time signing secret, Revoke, and Rotate secret" className="block dark:hidden" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/07-signing-secret-light.png" />

  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/07-signing-secret-dark.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=e8eff75cdf51097af9031560035a4d19" alt="Order ingestion with Ingest URL, one-time signing secret, Revoke, and Rotate secret" className="hidden dark:block" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/07-signing-secret-dark.png" />
</Frame>

<Warning>
  The **Ingest URL** in screenshots may show `http://localhost:8000/…` because these docs were captured against a local environment. Copy the URL from **your** channel settings, not from the screenshot.
</Warning>

<Warning>
  Rotating invalidates the old secret immediately. Revoking rejects every push until you generate a new secret.
</Warning>

Required headers on each push: `X-Zippendo-Topic` (`order.created`, `order.updated`, `order.cancelled`, or `ping`) and `X-Zippendo-Signature`. Payload, status codes, and a `ping` connectivity test are in [Custom channels](/docs/order-channels/custom-channels).

**Operations**

| Setting                     | What it does                                                                                 |
| --------------------------- | -------------------------------------------------------------------------------------------- |
| **Channel enabled**         | When off, all order pushes to this channel are rejected. This is the enable/disable control. |
| **Auto-dispatch shipments** | Book the carrier automatically when an incoming order matches a shipping rule.               |
| **Brand**                   | Orders from this channel belong to this brand.                                               |
| **Default sender address**  | Used for shipments when no shipping rule matches.                                            |
| **Last order received**     | Timestamp, or **Never**.                                                                     |

Click **Save changes** after you edit auto-dispatch or the default address. **Channel enabled** and **Brand** save as soon as you toggle them.

**Danger zone** — **Delete** removes the channel. The ingest URL stops accepting orders immediately.

## Other ways orders get in

The catalog is only Shopify, WooCommerce, and Custom channel. These are the other paths that still use a channel row:

* **REST API / SDKs** — `POST /orgs/{orgId}/orders` with `orderChannelId` set to a custom (or other) channel. Duplicate `externalId` on the same channel returns `409 ORDER_EXISTS`. See [Custom channels](/docs/order-channels/custom-channels) and the [REST API quickstart](/docs/quickstarts/rest-api).
* **Manual / leftover rows** — a `manual` channel has no connect card and no settings screen. It shows under **Disconnected channels** if nothing else represents it (for example after a store was removed). **Remove** cleans it up.
* **Sidebar → Channel orders** — not a fourth channel type. It lists the channels you already have so you can filter **Orders** to one store.

There is no user-facing “enable webhooks” toggle for custom ingest. Minting a signing secret is what turns ingest on. Org-level outbound webhooks (tracking back to your system) live under **Settings → Webhooks**, not on the channel.

## How orders appear after connecting

WooCommerce: webhooks fire on create/update/cancel, and Zippendo also polls on the interval you set (**Automatic sync**). Custom: your system pushes, or you create the order via the API. Either way the list is the same.

<Frame caption="Orders list with Order ID, Customer, Status, Channel, Shipments, and Created At">
  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/08-orders-list-light.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=09e521dcadd394296e8ee1ee321b3901" alt="Orders list filtered to All orders with channel names and statuses" className="block dark:hidden" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/08-orders-list-light.png" />

  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/08-orders-list-dark.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=84400e07039462ffde2ad798cf99050d" alt="Orders list filtered to All orders with channel names and statuses" className="hidden dark:block" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/08-orders-list-dark.png" />
</Frame>

Columns: **Order ID**, **Customer**, **Status**, **Channel**, **Shipments**, **Created At**. Status values you will see include **Pending**, **Processing**, **Fulfilled**, and **Cancelled**.

Open a row to see **Order Information** (order number, status, **Order Channel**, total), customer, shipping address, lines, and the **Shipments** tab.

<Frame caption="Order detail with Order Channel, lines, and Send order when a shipment already exists">
  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/09-order-detail-light.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=51eabf20152333f7cd582641ca194307" alt="Order detail for NL-202609-0143 showing Order Channel, Processing status, and Send order" className="block dark:hidden" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/09-order-detail-light.png" />

  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/connect-order-channels/09-order-detail-dark.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=0bc055fea41a592ce7f0666a9d692c4c" alt="Order detail for NL-202609-0143 showing Order Channel, Processing status, and Send order" className="hidden dark:block" width="2880" height="1800" data-path="images/tutorials/connect-order-channels/09-order-detail-dark.png" />
</Frame>

* No shipment yet, and the order is not fulfilled or cancelled: header action is **Create Shipment**.
* A shipment is already attached and ready: header action is **Send order**.
* **Shipments** tab lists existing shipments or **No shipments yet**.

Creating the shipment itself is [Create a shipment](/docs/tutorials/create-a-shipment). Browsing and filters: [Orders](/docs/tutorials/orders).

<Tip>
  Click the channel name under **Channel orders** in the sidebar to see only that channel’s orders. The list description becomes **Showing orders from** plus the channel name.
</Tip>

## Troubleshooting

| What you see                                            | What to check                                                                                                                                                                                                                                 |
| ------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **No stores connected**                                 | You are on **Connected stores** with nothing live. Open **Available integrations**.                                                                                                                                                           |
| WooCommerce one-click fails                             | Store must be `https://`. Security plugins or the host may block `wc-auth` or the REST API. Use **Enter API keys manually**.                                                                                                                  |
| **Failed to connect WooCommerce store** / keys rejected | Consumer Key and Secret must be a matching **Read/Write** pair. Regenerate in WooCommerce if needed.                                                                                                                                          |
| WooCommerce connected but no new orders                 | Channel card is **Active**. **Orders & checkout**: **Only unfulfilled orders** may skip the order. **Connection**: **Last sync**, **Test connection**, webhook status. WooCommerce disables a hook after repeated failures — **Re-register**. |
| Custom pushes return `401`                              | No secret yet, wrong secret after rotate, or missing `X-Zippendo-Signature`. Generate a secret and sign the raw body.                                                                                                                         |
| Custom pushes return `400`                              | Missing/unknown `X-Zippendo-Topic`, or the payload failed validation (`externalId`, `orderNumber`, `orderLines`).                                                                                                                             |
| Custom **Channel enabled** is off                       | All pushes are rejected until you turn it back on.                                                                                                                                                                                            |
| Orders list empty after connect                         | Confirm the toast succeeded and you are in the same organization. WooCommerce sync is near-real-time plus polling; custom orders appear only after a successful push or API create.                                                           |
| **Disconnected channels**                               | Leftover from a removed store. **Remove** if you do not need the imported orders.                                                                                                                                                             |
| Shopify                                                 | This page does not cover install or disconnect. Use [Connect Shopify](/docs/tutorials/connect-shopify).                                                                                                                                            |

More on late imports: [Order sync delays](/docs/knowledge-base/order-sync-delays).

## Next steps

<CardGroup cols={2}>
  <Card title="Connect Shopify" icon="shopping-bag" href="/docs/tutorials/connect-shopify">
    App Store install and what happens after Shopify redirects back.
  </Card>

  <Card title="Orders" icon="clipboard-list" href="/docs/tutorials/orders">
    Filter the list, open an order, and create a shipment from it.
  </Card>

  <Card title="Custom channels reference" icon="webhook" href="/docs/order-channels/custom-channels">
    Ingest payload, headers, and the REST alternative.
  </Card>

  <Card title="WooCommerce checkout plugin" icon="map-pin" href="/docs/order-channels/woocommerce-checkout-plugin">
    Live rates and pickup points at checkout (needs a checkout token).
  </Card>
</CardGroup>

Field-level: [Connect WooCommerce](/docs/how-to/connect-woocommerce) · [Custom channel API](/docs/how-to/custom-channel-api) · [Order channel settings](/docs/how-to/order-channel-settings)
