Work About Services Pricing Process Why Bunker41 Blog Get a Quote Sault Ste. Marie, Ontario
← All Posts
Practical

Why your Shopify carrier shows 'configured' but quotes nothing at checkout

A Shopify carrier can show as configured in your shipping profile and still return zero rates at checkout. Here's the silent failure mode, the dependency chain, and the fix.

May 28, 2026 · 7 min read · By Jason McBride

I lost three days last week to a Shopify carrier that looked configured and wasn’t. The shipping profile said “Calculated, 2 services, Purolator Express, Purolator Ground.” Checkout said “Shipping not available.” There was no error, no warning, no log line saying we tried to ask Purolator and got nothing back. Just a missing rate and a stuck customer.

If you’re hitting that exact symptom, the cause is almost always the same. Shopify’s “Discounted rates from Shopify” carriers depend on Shopify Shipping being enabled on the account, not just on the carrier being added to a profile. If Shipping isn’t turned on, the carrier shows up in the UI, accepts the configuration, and silently returns nothing at quote time.

This post is the debugging journal. Skip to the checklist at the bottom if you just want the fix.

What the silent failure looks like

The build was an office furniture e-commerce site I’m setting up for a recent client. The store needed two carriers at checkout: Purolator for parcel-size items (chairs, lamps, small accessories) and a separate LTL freight carrier for the heavy stuff (desks, file cabinets, anything that needs a pallet).

The LTL freight piece was a custom integration I’d written as a Cloudflare Worker against Shopify’s Carrier Service API. That worked the first time. I’ll come back to why.

The Purolator side was supposed to be the easy half. Shopify offers “Discounted rates from Shopify” as a built-in integration. You add it, you pick the services you want, you’re done. I added it, picked Express and Ground, saved, and moved on.

Test order. 8 lb folding chair, dimensions 25 by 28 by 48 inches. That’s well inside Purolator Express parcel limits (66 lb max, 165 inches max length plus girth). Real Canadian shipping address with a valid postal code. Hit checkout.

Only the LTL freight rate showed up. No Purolator.

Removed the LTL carrier to isolate. Refreshed checkout. “Shipping not available.”

Shopify’s shipping profile still said Calculated, 2 services, Purolator Express, Purolator Ground. Everything looked right. Nothing was working.

What I checked first (and why none of it was the problem)

Standard debugging order for carrier-calculated shipping when rates don’t return:

  1. Product weight and dimensions. Confirmed. 8 lb, 25x28x48 inches. Inside Purolator’s parcel envelope.
  2. Origin and destination address validity. Both real, both Canadian, both with correct postal codes.
  3. Shipping profile assignment. The product was in the General profile, which is where Purolator was configured. Not split across a custom profile.
  4. Zone coverage. Canada was the only zone, and the destination was inside it.
  5. Service selection. Both Express and Ground were checked.
  6. App conflicts. No third-party shipping apps installed.

All clean. The carrier was sitting right there in the profile, two services selected, and the checkout was getting nothing back.

This is the part where the documentation stops being helpful. Shopify’s help docs cover “no rates returned” by walking you through that exact list above. If your problem is one of those six, you’d have found it. If it’s not, you’re on your own.

Where the real dependency lives

The thing that broke this for me was a chance click on Settings, Shipping and delivery, scrolling past the carrier section, and noticing this line under “Shipping labels”:

Shopify Shipping: None

Shopify Shipping is the umbrella service that lets you buy and print shipping labels through Shopify, using the discounted rates Shopify negotiates with carriers. Most stores treat it as a label-printing convenience. It’s that, but it’s also something else.

“Purolator (Discounted rates from Shopify)” as a checkout carrier depends on the Shopify Shipping umbrella being active. The discounted rates exist because of that relationship. The rate-quote API call at checkout time goes through the same backend. If Shipping is off, that call returns nothing.

The UI does not warn you about this. It lets you add the carrier to your profile, lets you pick services, lets you save the configuration, and lets the storefront fail silently at checkout. The “Shipping labels: None” line is the only hint anywhere in the admin that something is wrong, and it’s three sections away from where you’d think to look.

That’s the dependency chain Shopify doesn’t document well:

  1. Shopify Shipping must be enabled on the account.
  2. Then the discounted-rates carriers can be added to a profile.
  3. Order matters. If the carrier was added first and Shipping was never enabled, the profile entry is stale and won’t bind.

The fix

Two steps, in this order:

  1. Enable Shopify Shipping under Settings, Shipping and delivery, Shipping labels. For a Canadian store this means accepting the Shopify Shipping terms and confirming the origin address Shopify will use as the ship-from.
  2. Remove Purolator from the shipping profile, then re-add it. This is the non-obvious one. Enabling Shipping does not retroactively wake up a carrier that was added before Shipping existed on the account. You have to delete the profile entry and add it again so Shopify re-binds the entry to the now-active service.

Hit checkout. Purolator Express and Purolator Ground both quote. Done.

The dead end worth flagging

While I was debugging this, I tried the “Calculate rates” button that lives in the Shipping labels section of the admin. Punched in the same destination, same package, hit calculate. UPS rates came back.

UPS was not enabled in checkout. UPS was nowhere in my shipping profile. I had not configured UPS. And here was the admin happily returning UPS rates.

That sent me an hour down the wrong rabbit hole. The explanation: that “Calculate rates” button calls the label-printing rate API, not the checkout rate API. They’re two separate systems sharing one admin UI. The label system returns rates for any carrier Shopify has a relationship with, regardless of your checkout configuration, because the use case is “I want to print a label, what are my options.” The checkout system only returns rates for carriers explicitly enabled in a profile.

Two systems, one button. No warning. If you’re debugging a missing checkout rate and you use this button to sanity-check the carriers, you’ll get answers that look correct and tell you nothing about why checkout is broken.

Why the custom Carrier Service API didn’t break

The other half of the build, the LTL freight integration via the Carrier Service API, worked through all of this without issue. That’s because it doesn’t go anywhere near Shopify Shipping.

A custom carrier registered through the Carrier Service API is just a callback URL. Shopify hits the URL at checkout time with the cart contents and destination, the endpoint returns a JSON array of rate options, Shopify shows them. There’s no umbrella service, no label-printing relationship, no profile-binding subtlety. Your endpoint either responds or it doesn’t.

If you’re building anything custom against Shopify shipping, this is a real argument for the Carrier Service API over the built-in carriers, even when a built-in carrier would technically do the job. Fewer dependencies, more visible failure modes, and you control the contract.

Debugging checklist for “carrier configured, nothing at checkout”

Run these in order before you spend three days on it:

  1. Confirm Shopify Shipping itself is enabled under Settings, Shipping and delivery, Shipping labels. If it says “None,” that’s your problem.
  2. If you just enabled it, remove the affected carriers from your shipping profile and re-add them. Existing entries don’t auto-bind.
  3. Verify your product has weight and dimensions set, and is inside the carrier’s max envelope. For Purolator Express, that’s 66 lb and 165 inches length plus girth.
  4. Verify the destination is inside a zone you’ve configured for that profile.
  5. Verify the product is in the same shipping profile the carrier is configured under. A product silently sitting in a different profile is a common gotcha when you have more than one.
  6. Do not use the “Calculate rates” button in the Shipping labels section to validate checkout behaviour. It calls a different API and will lie to you.
  7. If you’ve ruled out all of the above and you have a custom Carrier Service API integration, check whether your endpoint is throwing on the specific cart contents being tested. The Carrier Service API silently drops carriers that error out.

If you’re running into this on your own store and the checklist doesn’t get you there, the Shopify partner channel is faster than support for shipping issues. Shipping is one of the platform areas where the docs and the actual behaviour have drifted apart enough that the people fixing it are the people who’ve already fixed it once.


Bunker41 is a one-person studio in Sault Ste. Marie, Ontario building custom websites and web apps for small businesses. If you’re stuck on a Shopify build that’s misbehaving and the docs aren’t helping, say hello.

Written by
Jason McBride · Bunker41
Web design and development from a basement office in Sault Ste. Marie, Ontario.
Start a project → or book a 30-min call
Book a call