Freight · Shopify · Natural stone

What breaks when you wire an LTL carrier into Shopify checkout.

Filed
2026.02
Layer
Freight
Surface
CarrierService API
Read
6 min

Flat-rate shipping works until the box weighs 900 kilos. For a stone and tile catalogue it stops working immediately — the difference between a pallet going to a commercial dock in New Jersey and a residential driveway in Montana is several hundred dollars, and no flat rate absorbs that. So you wire the carrier into checkout and let it quote in real time. Here is what nobody tells you about the four weeks after that decision.

The shape of the integration

Shopify exposes a CarrierService endpoint. You register a callback URL; at checkout Shopify posts the cart and destination to it and waits for a list of rates. Return an empty list and the shopper sees no shipping options at all. Return slowly and Shopify gives up and shows nothing. The whole integration lives inside a few seconds, with no retry and no error surface — which is why the failures below are all silent.

Everything after this point assumes that skeleton is in place and returning rates for a clean test address. That is the easy day. These are the other days.

N°01

The city has to match the postal code

Carrier rating endpoints validate the destination against their own address book. Shopify sends whatever the shopper typed. A shopper in Falls Church who types "Washington" because that is what their mail says will fail rating — not with a bad address error, but with an empty rate set, which Shopify renders as "no shipping available at this address."

FixNormalize the destination server-side before rating. Resolve the city from the postal code, ignore the typed city entirely, and keep the shopper's version only for the label.

N°02

Consignee fields are not optional, even when they are

The documentation marks several consignee parameters as optional. In practice, omitting them returns a rate well below what the carrier will actually bill, because the default assumes a commercial dock with a forklift. Residential delivery, liftgate, and limited access are all surcharges that only appear if you declare the accessorials up front.

FixDeclare accessorials on every request. Infer residential from an address type lookup, and let the shopper correct it in the cart rather than discovering it on the invoice.

N°03

Nobody picks up on Sunday

Rating requests carry a pickup date. Send today's date on a Saturday evening and the carrier rejects the request outright. Send it during a holiday week and you get a transit estimate that is quietly two days short, which becomes a delivery promise the storefront cannot keep.

FixCompute the next valid pickup date against the carrier's own calendar, not a generic business-day helper. Cache the holiday list and refresh it quarterly.

N°04

One order is not one shipment

A pallet of travertine has a weight ceiling and a linear footage ceiling. Past either one, the shipment is no longer a single rating unit — but the carrier will still return a number, and that number will be wrong. Large orders are exactly the orders you cannot afford to misquote.

FixSplit the cart into pallets before rating, rate each pallet, and sum. Splitting logic belongs in your code, not in the carrier's assumptions.

Log the whole exchange, from day one

Every one of the four failures above presents identically to the shopper: no rates, no explanation. You cannot debug that from the storefront, and the shopper who hit it has already left. The only way back is a log that captures both sides of every rating call.

  • Raw cart payload as received from Shopify
  • Normalized destination after postal code resolution
  • Full outbound request body
  • Carrier response, including empty rate sets
  • Pallet split decisions and resulting weights

Keep thirty days of it. The pattern in a failing integration is almost never visible in one request — it shows up as a cluster of empty responses from one state, or every Saturday night, or only on carts above a certain weight.

What this actually costs

The engineering is a week. The four weeks after it are address edge cases, and they are the part worth budgeting for. If you are quoting this work, quote the tail — a freight integration that rates correctly for the first fifty orders and then silently stops rating for Alaska is worse than a flat rate, because nobody notices until the quarter closes.


We build freight, catalogue, and feed systems for brands shipping material — stone, tile, wood, furniture. Start a project →