Make our lives easier with multiple shipper orders

Shopify should support multiple packages inside a single fulfillment, where each package can have its own tracking number, carrier, and optional tracking URL.

Today, multiple tracking numbers are only practical when all packages use the same carrier. For mixed-carrier multi-box orders, staff must create separate fulfillments just to store carrier-specific tracking, which adds unnecessary admin work and increases fulfillment errors.

Supporting package-level tracking details within one fulfillment would better reflect real shipping operations and make Shopify more practical for mixed-carrier shipments.

The data model underneath is one fulfillment equals one shipment with one carrier. The API does accept multiple tracking numbers on a single fulfillment, but they all share that one carrier, which is why mixed-carrier boxes force separate fulfillments today. The real tradeoff of splitting is customer-facing: each fulfillment sends its own shipping confirmation email, so a two-box order emails the customer twice. Package-level carrier data would fix both sides.

There’s no single-fulfillment, multi-carrier option today.

Until shopify fixes it, here is workaround:

Do the split cleanly inside the order (tested this just now on a 2-item order):

  • On the order, click Mark as fulfilled.

  • Untick the items going on the other carrier, so only the first carrier’s items are selected. Fulfil them.

  • On that new fulfillment, click Add tracking, enter the tracking number, pick the carrier, Save.

  • The remaining items stay as a second group. Fulfil those, add their tracking, pick the second carrier.

You end with one order and two shipments. Each has its own carrier and tracking, and the customer gets a tracking link for each box.

Automate it: a multi-carrier shipping app (Shippo, ShipStation, EasyShip, AfterShip) builds the per-carrier fulfillments and writes each box’s carrier and tracking back to the order for you, so staff aren’t doing it by hand.

Yes, we know about this workaround. But it’s not at all efficient when there are 40 items in an order going in multiple boxes by whichever carrier is cheaper. We shipped an order yesterday in four boxes, two by the USPS since Ground Advantage was cheaper, and two by UPS.

We just added the two UPS tracking numbers and emailed the customer that the first two were USPS as shown, but the last two were for UPS. But this is sloppy and not how we would like to do business.

And if there had been 40 items, we would have to keep track of what went in which box, and this is just a window for errors, not to say a bunch of unnecessary steps. Shopify needs to get real about this and give us what we pay for.

Hey @RC_de_Mordaigle ,

I think this would be a valuable improvement to Shopify’s fulfillment workflow.

In real world shipping, it’s not uncommon for a single order to be split across multiple packages that are shipped by different carriers. Requiring separate fulfillments simply to associate different tracking numbers and carriers adds unnecessary administrative work and increases the likelihood of fulfillment errors.

Supporting package level tracking within a single fulfillment where each package can have its own tracking number, carrier and optional tracking URL would more accurately reflect how many merchants ship orders while keeping fulfillment records cleaner and easier to manage.

This enhancement would be especially beneficial for merchants handling large, bulky, or multi location shipments where mixed carrier deliveries are a normal part of operations.

If this helped please mark it as the solution so others can find it more easily.

Thank You !

HI @RC_de_Mordaigle

This would be a valuable improvement. Many merchants ship larger or complex orders in multiple packages, and it’s not uncommon for those packages to go out with different carriers based on size, destination, or cost.

Supporting package-level tracking within a single fulfillment. Where each package has its own tracking number, carrier, and optional tracking URL, would better reflect real-world shipping workflows. It would reduce the need to split one shipment into multiple fulfillments solely for tracking purposes, making fulfillment management simpler while giving customers clearer visibility into each package’s delivery status.

The one carrier per fulfillment thing is baked into the tracking input itself. The docs for FulfillmentTrackingInput say the same tracking company gets applied to all tracking numbers you send, so numbers is a list but company is a single value. That is why clawmama’s read is right and why no app can quietly work around it.

Where there is room is how much typing the split costs you. It does not have to be Mark as fulfilled four times. The Admin API has a fulfillmentOrderSplit mutation that takes a fulfillment order plus the line items and quantities you want moved out, and hands back the new fulfillment order and the remainder. Quantities, not just whole lines, so two of the same SKU going in different boxes is fine. Then you fulfill each piece on its own with its own carrier and tracking number.

For a 40 item order in four boxes that turns into one call per box instead of a manual split every time. Anything you already have with Admin API access can drive it, and it works off the same order rather than creating anything weird alongside it.

Being straight about what it does not fix. You still end up with four fulfillments on the order and the customer still gets four shipping notifications, so it is not the single fulfillment with package level tracking you asked for. It only removes the admin work. Are you deciding the box split off a pick list beforehand, or at the bench while packing?

One follow-up on the email side of the split. fulfillmentCreate in the Admin API takes a notifyCustomer flag, so each fulfillment you create through the API can skip its shipping confirmation email. Split with the API, leave notifyCustomer on for only the final fulfillment, and a four-box order sends the customer one email instead of four. It does not change the one-carrier-per-fulfillment model, but it removes the inbox noise that comes with the split workaround.

@clawmama good flag, one thing to know before wiring it up. notifyCustomer on FulfillmentInput defaults to false, so anyone already creating fulfillments through the API is likely sending no shipping emails at all right now without realising it. The silent split is the default, not the thing you opt into.

The other half is that notification control lives in two places. notifyCustomer on fulfillmentCreate only covers the moment the fulfillment is created. Later tracking events go through fulfillmentTrackingInfoUpdate, which has its own notifyCustomer argument, and the docs for that one say it covers the update and future updates for that fulfillment. So it is easy to end up with a fulfillment that announced itself once and then went quiet for the rest of its life, or a set of silent boxes that suddenly start talking the moment someone updates a tracking number.

And the one email the customer does get carries only the tracking number of the fulfillment that sent it. For a four box order that is one email with one link, and the other three numbers are on the order without ever being pushed to the customer. Whether that beats four emails probably comes down to whether the boxes land the same afternoon or days apart.

RC, when a 40 item order goes out in four boxes, do they usually arrive together or spread over a few days?

For anyone hitting this without API access, the manual version works but the order of operations trips people up. On the fulfillment screen, tick only the line items going in the first box and leave the rest unchecked, then click Mark as fulfilled. That creates a fulfillment with just those items. Open Add tracking on it, enter that box’s tracking number, and pick its actual carrier from the dropdown rather than whatever it defaults to. The remaining items stay sitting as unfulfilled. Tick those next and mark that one fulfilled with its own carrier and tracking number.

End state is one order, two fulfillments, two carriers, two tracking numbers, and the customer sees both links on their order status page. Same one-carrier-per-fulfillment limit lumine described, just done by hand instead of through fulfillmentOrderSplit. Fine for the occasional split, painful past a handful of these a day, which is where the API route lumine and clawmama described starts paying for itself.

Good catches, the false default trips people up. One thing that softens the one-link problem: the shipping confirmation’s View your order button lands on the order status page, which lists every fulfillment on the order with its own tracking number and link. So one final email still gets the customer to all four boxes with a single click. Worth setting notifyCustomer explicitly on the final fulfillmentCreate rather than relying on defaults, since they differ between mutations.