Craft Commerce 5 · 16 carriers, free add-ons
One shipping gateway. A free add-on for every carrier.
ShipStation and Sendcloud stop at the markets they serve, and a home-grown label integration is the part of a store nobody wants to touch. Carrier does the hard part once — packing, checkout pricing, the locker picker, label buying that never buys twice, printing and tracking — so the part that differs per carrier is a small free plugin, from UPS to a Croatian Paketomat.
What Carrier owns, so an add-on doesn't have to
An add-on translates one carrier's API into Carrier's shipment documents. Everything that has to be true of every carrier is here, written once.
It never buys the same label twice
Every purchase is claimed in the database before the carrier is called. A retried job, a double-clicked button and a bulk action run twice all find the claim and stop.
- A timeout after the request left is never retried — it waits on Problems for a human to check the carrier's portal
- A refusal can be fixed and retried on the same claim
Lockers and parcel shops at checkout
One line of Twig adds a picker for lockers, parcel shops, post offices and your own stores. The customer cannot pay until a point is chosen.
- Daily-synced point lists searched locally, so checkout never waits on a carrier
- Live search for UPS, FedEx and USPS; CSV import for carriers with no point API
Rates that fail open
Flat, weight-table or live rates with markup and rounding. A carrier that is down costs one method its live price — never the checkout.
- A fallback price, or the method hidden, when the carrier does not answer
- Quotes memoized on the whole cart and cached, because every cart view should not be a paid API call
Print the way your bench prints
PDF A4 sheets, A6 and 4×6 thermal, ZPL and PNG. Bulk from the order index as one print job — a carrier batch, a ZPL stream, a browser sheet or a ZIP.
- Labels stored in the database, so Craft Cloud and load-balanced hosts work
- Pruned after a set number of days; the shipment and its tracking stay
Tracking written back to the order
Polled until delivered — often at first, less as a parcel ages. Scans are stored once, a status never goes backwards, and the order moves on when every parcel has arrived.
- Events for your own “out for delivery” emails, and a webhook endpoint for carriers that push
- Collections and end-of-day closes, with the driver's manifest
A log that cannot leak your key
Every request and response is recorded with credentials redacted at the transport — including the ones a carrier echoes back in its own error message.
- Connections live in the database, so a sandbox account never deploys to production
- Every add-on passes the same conformance suite before it ships
A free add-on for every carrier
Install Carrier once, then the add-on for the carriers you ship with. Each one only translates its carrier's API — the packing, the checkout, the labels and the log are Carrier's, which is why the add-ons cost nothing.
Carrier for UPS
UPS
Rates, labels, returns and tracking through the UPS OAuth APIs, with Access Point lockers, pickups and address validation.
- Live rates
- Labels
- Returns
- Void
- Tracking
- Access Points
- Pickups
- Address check
craft-carrier-ups
Docs →
Carrier for FedEx
FedEx
Rates, labels, returns and tracking through the FedEx REST APIs, with Hold at Location, pickups and address validation.
- Live rates
- Labels
- Returns
- Void
- Tracking
- Hold at Location
- Pickups
- Address check
craft-carrier-fedex
Docs →
Carrier for USPS
USPS
Prices, domestic and international labels and tracking on the USPS APIs v3, with Hold for Pickup at Post Offices.
- Live rates
- Labels
- Returns
- Refunds
- Reprint
- Tracking
- Post Offices
- Pickups
- Address check
craft-carrier-usps
Docs →
Carrier for LTL Freight
TForce Freight, Old Dominion, Estes, XPO, R+L Carriers, SAIA
Six US LTL carriers in one add-on: quotes by handling unit and class, bills of lading, PRO tracking and pickups.
- Live quotes
- Bills of lading
- PRO tracking
- Pickups
- Accessorials
craft-carrier-freight
Docs →
Carrier for DPD
DPD Croatia, DPD Slovenia (EasyShip)
DPD through its EasyShip portal: labels, cash on delivery, parcel shops, collections and the daily manifest.
- Labels
- COD
- Parcel shops (CSV)
- Void
- Reprint
- Tracking
- Collections
- Manifest
craft-carrier-dpd
Docs →
Carrier for GLS
GLS via MyGLS — HR, HU, CZ, RO, SI, SK, RS
Seven GLS countries through MyGLS: labels on A4 sheets or thermal, cash on delivery, parcel shops and lockers.
- Labels
- COD
- Parcel shops
- Lockers
- Void
- Batch print
- Tracking
craft-carrier-gls
Docs →
Carrier for BOX NOW
BOX NOW — GR, CY, BG, HR, SI
Locker delivery with the locker picker at checkout, cash on delivery, labels and tracking.
- Lockers
- Labels
- COD
- Void
- Reprint
- Tracking
craft-carrier-boxnow
Docs →
Carrier for National Posts
Hrvatska pošta, Pošta Slovenije, Magyar Posta, ELTA Courier
Four national posts: Paketomat and PostaPont lockers, cash on delivery, labels, tracking and the end-of-day close.
- Labels
- COD
- Lockers
- Post offices
- Tracking
- Day close
craft-carrier-posts
Docs →
Eight add-ons, sixteen carriers, plus store pickup and a Mock carrier built in. What each card lists is read from the carrier's own declaration. The add-ons were built from each carrier's published API documentation — test in the carrier's sandbox before you go live.
Carrier in the control panel
Real screens from a Craft 5 install running Commerce — your carrier accounts, a shipment with its tracking, a method's pricing, and the purchases that need a human.
Screenshots from a live install running the built-in Mock carrier, not mockups.
The storefront half
The picker renders nothing unless the cart is on a pickup-point method, so it is safe to drop into any shipping step. Everything else is a read.
{# On the shipping step: lockers, parcel shops and stores #}
{{ craft.carrier.pointPicker(cart) }}
{# Disable the Pay button until a point is chosen #}
{% if craft.carrier.needsPoint(cart) %}
<p>Choose where to collect your parcel.</p>
{% endif %}
{# On the order page: every parcel, tracked #}
{% for shipment in craft.carrier.shipments(order) %}
<a href="{{ shipment.trackingUrl }}">{{ shipment.trackingNumber }}</a>
— {{ shipment.trackingStatusLabel }}
{% for event in craft.carrier.events(shipment) %}
{{ event.occurredAt|date('short') }} {{ event.description }}
{% endfor %}
{% endfor %}
Frequently Asked Questions
The questions worth answering before you install it.
No. Carrier is $149 with a $129 annual renewal. Every carrier add-on is free, for every carrier on the list.
Because it is the small part. An add-on translates one carrier's API and nothing else; the packing, checkout pricing, claim-first label buying, storage, printing, tracking, picker and log are Carrier's, written once for all of them.
UPS, FedEx and USPS; six US LTL freight carriers (TForce Freight, Old Dominion, Estes, XPO, R+L and SAIA); DPD through EasyShip; GLS through MyGLS in seven countries; BOX NOW lockers; and Hrvatska pošta, Pošta Slovenije, Magyar Posta and ELTA Courier. Store pickup from your Commerce inventory locations is built in.
Not yet. Each was written against the carrier's published API documentation and passes the same conformance suite against recorded responses, and every point that could not be confirmed from a primary source is listed on its docs page. Test each connection in the carrier's sandbox before going live.
No. The purchase is claimed in the database before the carrier is called, under a unique key, so retries and double-clicks find the claim. A purchase interrupted after the request left is never bought again automatically — it waits on the Problems screen until someone checks the carrier's portal.
A live-rate method falls back to the price you set for that case, or is hidden if you set none. Checkout never fails because a carrier did.
Yes, for carriers that support it. Choose which payment gateways mean “pay the courier”, and orders paid through them ship with COD for their outstanding balance.
Yes. The built-in Mock carrier quotes, prints real PDF and ZPL labels, tracks parcels through to delivered and lists pickup points, and can simulate refusals, throttling and timeouts.
Because project config would deploy a staging site's sandbox credentials to production. Connections are environment data; checkout methods reference them.
Yes. Labels are stored in the database rather than on disk, and each checkout method can be limited to a store.
A carrier is one class against a documented interface, registered with a standard Craft event, and the conformance suite tells you when it is right. The guide is in the docs.
One price, every carrier
Carrier is $149 with a $129 annual renewal, single edition. The add-ons for your carriers are free, and so is the Mock carrier you can try the whole thing on first.