Shipping integrations
What an integration does
Shipping integrations are the last mile of the Pro customs data layer: they push your IOSS number and the per-order customs snapshot (HS codes, origin countries, EUR values) into the plugin that books your shipments, so the data lands in the electronic customs declaration without you retyping anything. This requires a Pro license — see Licensing.
Each integration activates automatically when it detects its target plugin — there is nothing to configure beyond having your IOSS number and product customs fields filled in.
Supported label plugins
Version 1 ships with four integrations, chosen because together they cover the mainstream WooCommerce label stack:
| Integration | What Pro does |
|---|---|
| WooCommerce Shipping (official) | Mirrors each product’s customs fields into the meta WooCommerce Shipping reads for its customs forms (wcshipping_customs_info), and offers a one-click copy of your IOSS number into its tax-identifier setting so labels transmit it automatically. |
| Sendcloud (and Starshipit) | Publishes your HS code and country of origin as the hs_code / origin_country product attributes both services import from WooCommerce. Your IOSS number is set once in the Sendcloud/Starshipit account settings — the docs walk you through it. |
| DHL for WooCommerce (official) | Writes each product’s HS code and origin into the DHL plugin’s own fields (_dhl_hs_code, _dhl_manufacture_country) and pre-fills the Deutsche Post “Sender customs reference” with your IOSS number on eligible EU-bound orders — the DHL plugin has no IOSS field of its own. |
| ShipStation | Exports the IOSS context on each order through the ShipStation connector’s custom-field hooks, ready to drive ShipStation automation rules; the docs cover the one-time tax-identifier setup in ShipStation’s International Settings. |
Shippo and EasyPost users are covered differently: both platforms take the IOSS number and customs data in their own dashboards or APIs (Shippo’s customs declarations, EasyPost’s tax identifiers), so there is nothing for a WordPress plugin to inject — the docs explain the setup, and the generic hooks below expose everything their APIs accept.
If your label plugin is not on the list, the generic hooks below cover you — and integration requests are genuinely useful signal, so tell us what you ship with.
The mechanism
All integrations work the same way, built on two stable surfaces rather than private APIs:
- Order meta — the IOSS number used and the customs snapshot are stored on the order under stable
_ioss_*meta keys at capture time. Label plugins that read order meta for tax identifiers can be pointed at these directly. - Filters — each integration maps the
ioss_customs_datacontract onto the target plugin’s shipment-data hooks: the IOSS number into the tax-identifier slot, items into the customs-items array, and the EUR intrinsic value where a declared customs value belongs.
The IOSS number is only attached to orders that were actually IOSS-eligible — an over-EUR-150 or excise shipment must not carry your IOSS number, and the integrations respect the eligibility verdict automatically.
Generic developer hooks
To integrate anything yourself — a custom carrier API, a fulfillment service, an ERP bridge:
// Pull the full customs dataset for an order.
$data = apply_filters( 'ioss_customs_data', array(), $order );
// React when an order is captured (eligibility decided, EUR values frozen).
add_action( 'ioss_order_captured', function ( $order_id, $capture ) {
// Push to your shipping system here.
}, 10, 2 );
ioss_customs_data returns the IOSS number, per-item lines (description, quantity, HS code, origin country, EUR value), totals, and the captured FX rate. ioss_order_captured fires once per order at payment acceptance — the right moment to transmit shipment data, since the EUR values are final from then on.
Verify the handoff
Whatever the integration, confirm it once end to end: create a test order, book the label, and check in the carrier’s system (or with their support) that the IOSS number arrived as a tax identifier on the shipment. The customs data page explains what goes wrong when it doesn’t — your customer paying VAT twice plus a carrier fee — and why the number must travel electronically rather than printed on the parcel.