> ## 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.

# Checkout

> Show live carrier rates and pickup points at Shopify or WooCommerce checkout.

Zippendo does **not** host a shopper checkout widget or a rate sandbox in the dashboard. Live rates appear in **your** store checkout — Shopify Carrier-Calculated Shipping, the **Zippendo for WooCommerce** plugin, or `POST /orgs/:orgId/shipping-quote` on a headless storefront.

What you configure in Zippendo is which [shipping rules](/docs/tutorials/shipping-rules) become those options, how many pickup points to show, and (Shopify) whether the **Zippendo Shipping** carrier service is registered.

<Info>
  Connect the store first — [Connect Shopify](/docs/tutorials/connect-shopify) or [Connect order channels](/docs/tutorials/connect-order-channels) — and add at least one outbound shipping rule. Without a rule, checkout has nothing to offer.
</Info>

## What the shopper sees

A matching **shipping rule** becomes a shipping method. The shopper's destination country, cart weight, order value, and item count decide which rules appear and what they cost. Service-point rules expand into individual pickup locations.

After checkout, the order syncs into **Orders** with that rule attached, so [creating a shipment](/docs/tutorials/create-a-shipment) fills carrier, product, and sender from the rule.

<Note>
  You cannot preview a cart inside Zippendo. The **Test** button on a shipping rule tests **conditions** (would this rule match this cart?), not a live carrier quote. See [Shipping rules](/docs/tutorials/shipping-rules).
</Note>

## Prerequisites

<Steps>
  <Step title="Connect the store">
    **Order Channels → Available integrations**. Shopify, WooCommerce, or a custom channel.
  </Step>

  <Step title="Connect carriers">
    **Carriers → All Carriers**. Rates use the products on those accounts — [Carriers](/docs/tutorials/carriers).
  </Step>

  <Step title="Add outbound shipping rules">
    **Shipping Rules → Add Shipping Rule**. Name the rule the way customers should read it. Set destination countries and conditions. [Shipping rules](/docs/tutorials/shipping-rules).
  </Step>
</Steps>

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

  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/checkout/01-order-channels-catalog-dark.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=2a4ee078600458198f468f1722fd9c6e" alt="Order Channels catalog with Connect Shopify, Connect WooCommerce, and Create channel" className="hidden dark:block" width="2880" height="1800" data-path="images/tutorials/checkout/01-order-channels-catalog-dark.png" />
</Frame>

<Frame caption="Shipping Rules power the methods shoppers see at checkout">
  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/checkout/04-shipping-rules-light.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=054a3d2e62328141fc6d50c4cee609ad" alt="Shipping Rules list with GLS Hjemmelevering – Danmark and PostNord MyPack Home – Norden" className="block dark:hidden" width="2880" height="1800" data-path="images/tutorials/checkout/04-shipping-rules-light.png" />

  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/checkout/04-shipping-rules-dark.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=90f22b34dd3d37dda5b8cf2bcdfbdc60" alt="Shipping Rules list with GLS Hjemmelevering – Danmark and PostNord MyPack Home – Norden" className="hidden dark:block" width="2880" height="1800" data-path="images/tutorials/checkout/04-shipping-rules-dark.png" />
</Frame>

## Shopify: Zippendo Shipping

Shopify checkout uses **carrier-calculated rates**. Zippendo registers a carrier service named **Zippendo Shipping**. Shopify calls Zippendo when the shopper reaches shipping; Zippendo returns the selected rules (and pickup points) as rates.

### Install the store

From **Available integrations**, click **Connect Shopify**. The modal is **Connect your Shopify store**.

<Frame caption="Connect your Shopify store — install from the Shopify App Store">
  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/checkout/02-connect-shopify-modal-light.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=e52ff4410d44f020a4cd16540a959b8c" alt="Connect your Shopify store modal with Open Shopify App Store" className="block dark:hidden" width="2880" height="1800" data-path="images/tutorials/checkout/02-connect-shopify-modal-light.png" />

  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/checkout/02-connect-shopify-modal-dark.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=7ae52457e49207db17f35591c4c9811d" alt="Connect your Shopify store modal with Open Shopify App Store" className="hidden dark:block" width="2880" height="1800" data-path="images/tutorials/checkout/02-connect-shopify-modal-dark.png" />
</Frame>

<Steps>
  <Step title="Open the Zippendo listing in the Shopify App Store" />

  <Step title="Install the app on your store and approve the permissions" />

  <Step title="You are redirected back to Zippendo to choose organization, sender address and order import" />
</Steps>

Already a paying Zippendo customer? Your existing subscription continues unchanged — installing the app does not move billing to Shopify. The rest of the install: [Connect Shopify](/docs/tutorials/connect-shopify).

### Choose which rules appear

Open the Shopify store under **Connected stores**. Stay on **Orders & checkout**. Scroll to **Checkout Shipping Rates**.

<Frame caption="Checkout Shipping Rates — tick the rules Shopify should offer">
  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/checkout/05-shopify-checkout-rates-light.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=1ced95e25afe64ab177ddb8a917b058d" alt="Checkout Shipping Rates with GLS Hjemmelevering – Danmark selected and PostNord MyPack Home – Norden unselected" className="block dark:hidden" width="2880" height="1800" data-path="images/tutorials/checkout/05-shopify-checkout-rates-light.png" />

  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/checkout/05-shopify-checkout-rates-dark.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=cee3ad7868901efca88d66438dd8c80b" alt="Checkout Shipping Rates with GLS Hjemmelevering – Danmark selected and PostNord MyPack Home – Norden unselected" className="hidden dark:block" width="2880" height="1800" data-path="images/tutorials/checkout/05-shopify-checkout-rates-dark.png" />
</Frame>

The hint on the card: **Select which shipping rules should be available at Shopify checkout. If none are selected, all organization rules matching the destination country will be used. Service point rules will show individual pickup locations as separate rates.**

Tick the rules this store should offer, then **Save Changes**. Above this card, **Default Shipment Settings** sets the sender for orders that arrive **without** a Zippendo rate (manual Shopify methods, or a shopper who never hit calculated rates).

### Service points per checkout

On the same card, **Service Points per Checkout** is **Total number of pickup point locations to show at checkout. These are divided evenly among service point shipping rules.** Allowed range is 1–20 (the docs org uses **6**).

<Frame caption="Service Points per Checkout and Shipping method mapping on the same tab">
  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/checkout/06-service-points-light.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=9c0aa3cddb4afbcafe9b6bc37a7f2ff4" alt="Service Points per Checkout set to 6, with Shipping method mapping empty below" className="block dark:hidden" width="2880" height="1800" data-path="images/tutorials/checkout/06-service-points-light.png" />

  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/checkout/06-service-points-dark.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=c0e673cd228413f7fb4ee761ab74e172" alt="Service Points per Checkout set to 6, with Shipping method mapping empty below" className="hidden dark:block" width="2880" height="1800" data-path="images/tutorials/checkout/06-service-points-dark.png" />
</Frame>

### Register the carrier service

Open **Connection & integration**. Scroll to **Carrier Service**.

<Frame caption="Check Carrier Service — register Zippendo Shipping with Shopify">
  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/checkout/07-shopify-carrier-service-light.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=e0139a0b994d981d687a861db514c068" alt="Carrier Service card with Check Status and Register Carrier Service, plus Danger Zone" className="block dark:hidden" width="2880" height="1800" data-path="images/tutorials/checkout/07-shopify-carrier-service-light.png" />

  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/checkout/07-shopify-carrier-service-dark.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=3d562acb2c7185559514c30e80018b7c" alt="Carrier Service card with Check Status and Register Carrier Service, plus Danger Zone" className="hidden dark:block" width="2880" height="1800" data-path="images/tutorials/checkout/07-shopify-carrier-service-dark.png" />
</Frame>

<Steps>
  <Step title="Check Status">
    **Check Carrier Service** verifies the carrier service is registered with Shopify for calculated rates. If none is registered, rates will not appear at checkout.
  </Step>

  <Step title="Register Carrier Service">
    Use **Register Carrier Service** if the check finds nothing (or after a reconnect).
  </Step>

  <Step title="Add Zippendo Shipping in Shopify Admin">
    This step is in Shopify, not Zippendo: **Shopify Admin → Settings → Shipping and delivery**, then add **Zippendo Shipping** as a rate provider in your shipping zones.
  </Step>
</Steps>

<Warning>
  Until **Zippendo Shipping** is added in Shopify Admin shipping zones, shoppers will not see Zippendo rates — even if **Check Carrier Service** is green and rules are ticked.
</Warning>

### Fallback: shipping method mapping

**Shipping method mapping** is for stores **without** Shopify Carrier-Calculated Shipping. Map the shipping method names from your manual Shopify rates to shipping rules so imported orders are ready to ship.

Click **Add mapping**, enter the Shopify method name (for example `GLS Home Delivery`), pick a shipping rule, and choose how parcel shops are selected (**Nearest automatically** or **Choose manually**). If you already use **Zippendo Shipping**, you can leave mappings empty.

## WooCommerce: plugin and checkout token

WooCommerce checkout is the **Zippendo for WooCommerce** plugin plus a **Checkout token** (`zck_…`) stored on the channel.

<Frame caption="Connect WooCommerce Store — store URL and default sender, then approve on the store">
  <img src="https://mintcdn.com/zippendo/nCpImT05qv67zgRn/images/tutorials/checkout/03-connect-woocommerce-modal-light.png?fit=max&auto=format&n=nCpImT05qv67zgRn&q=85&s=842001102f3fa3c24a0b1080fc6a510b" alt="Connect WooCommerce Store modal with Store URL, Default Address, and Connect" className="block dark:hidden" width="2880" height="1800" data-path="images/tutorials/checkout/03-connect-woocommerce-modal-light.png" />

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

Connect the store as in [Connect order channels](/docs/tutorials/connect-order-channels). Live WooCommerce `wc-auth` cannot be completed in this documentation environment, so the channel settings below are described from the product UI (the same labels you will see after a successful connect). Then open the WooCommerce channel and stay on **Orders & checkout**:

<Steps>
  <Step title="Download the plugin">
    The **Checkout token** card includes **Download plugin**. Install **Zippendo for WooCommerce** on the WordPress site.
  </Step>

  <Step title="Generate a checkout token">
    Click **Generate token**. Copy it immediately — only a hash is stored. The token is shown once.
  </Step>

  <Step title="Paste the token into the plugin">
    In WordPress, open the plugin settings and paste the token. **Rotate token** invalidates the old key immediately; **Revoke** stops the plugin until you generate a new one.
  </Step>
</Steps>

The plugin calls `POST /woocommerce/checkout/rates` (and `POST /woocommerce/checkout/service-points` when the shopper changes postcode). Those routes authenticate with the checkout token, not your dashboard session.

**Test connection** on the WooCommerce channel **Connection** tab is different: it verifies the stored REST API keys can reach the store (order sync). It does **not** quote checkout rates. The plugin can ping `GET /woocommerce/checkout/ping` to confirm the token.

<Tip>
  WooCommerce rates still come from your **Shipping Rules**. Create the rules in Zippendo first; the plugin only displays what those rules return for the cart.
</Tip>

## Custom and headless storefronts

A **Custom channel** imports orders (signed ingest or the API). It does not render a Zippendo checkout UI.

To show live rates in your own checkout, call `POST /orgs/:orgId/shipping-quote` with destination, items, and currency. Requirements and a sample body: [Shipping quotes quickstart](/docs/quickstarts/shipping-quotes). You need an API token — [Settings, team, and brands](/docs/tutorials/settings-team-brands) covers **API Settings**.

## How to test rates

There is no in-app checkout preview. Test on the surface the shopper uses:

| Channel          | What you can test in Zippendo                                  | What you test off-domain                                                       |
| ---------------- | -------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| **Shopify**      | Tick rules, set service-point count, **Check Carrier Service** | A real (or draft) checkout after **Zippendo Shipping** is in the shipping zone |
| **WooCommerce**  | **Generate token**, **Test connection** (store API keys)       | Plugin settings + a cart on the WordPress store                                |
| **Custom / API** | Shipping-rule **Test** (conditions only)                       | `POST /orgs/:orgId/shipping-quote` with a sample cart                          |

If a rate is missing, check the rule's **Receiving Countries**, hard limits, and conditions before assuming the carrier service is down.

## After checkout

<Steps>
  <Step title="Confirm the order landed">
    **Orders** — the channel badge and shipping rule should match what the shopper picked. [Orders](/docs/tutorials/orders).
  </Step>

  <Step title="Create the shipment">
    Open the order → **Create Shipment** (or **Add Shipment**). The rule fills carrier and product. [Create a shipment](/docs/tutorials/create-a-shipment).
  </Step>

  <Step title="Print and track">
    [Labels and printing](/docs/tutorials/labels-printing) and [Tracking](/docs/tutorials/tracking).
  </Step>
</Steps>

<CardGroup cols={2}>
  <Card title="Shipping rules" icon="route" href="/docs/tutorials/shipping-rules">
    Build the methods checkout offers — destination, weight, and price.
  </Card>

  <Card title="Connect Shopify" icon="shopping-bag" href="/docs/tutorials/connect-shopify">
    Install the app and finish organization, address, and import.
  </Card>

  <Card title="Connect order channels" icon="store" href="/docs/tutorials/connect-order-channels">
    WooCommerce and custom channels, including more than one store.
  </Card>

  <Card title="Shipping quotes" icon="calculator" href="/docs/quickstarts/shipping-quotes">
    Headless checkout via POST /orgs/:orgId/shipping-quote.
  </Card>
</CardGroup>

Field-level: [Get a shipping quote](/docs/how-to/shipping-quotes) · [Shopify settings](/docs/how-to/shopify-settings) · [Droppoint vs service point](/docs/how-to/drop-point-and-service-points)
