Beyond the Bandaid: Mastering Shopify Order Delivery Changes for Real-World Flexibility
Hey everyone! I've been diving deep into the Shopify community forums again, and a topic that keeps bubbling up is something I know many of you struggle with: changing an order's delivery method *after* a customer has already completed checkout. It sounds simple, right? A customer decides to pick up instead of having it shipped, or vice-versa. But as many of you have discovered, Shopify's native system throws a wrench in the works.
Our friend @Carla_s_Cookie_Box kicked off a really important thread on this, perfectly summing up the frustration: "I would like Shopify to add the ability for merchants to change the delivery method on an existing order after the customer has completed checkout." She detailed how crucial it is for flexibility — whether it's shipping to pickup, pickup to shipping, or even adjusting local delivery. And she hit the nail on the head about the biggest headache: losing the normal pickup workflow (Prepare for pickup, Ready for pickup notifications, Mark as picked up) if you manually try to "convert" an order.
It's a massive pain point. Cancelling and recreating an order just to change a delivery method can mess with everything from payment history and reporting to accounting, order numbers, and all your carefully built automations. As @ParkingMarker put it, "It's frustrating having to cancel and recreate a paid order just because the customer changes from shipping to pickup. Keeping the same order number and simply changing the fulfillment method would make much more sense." Absolutely!
The Core Problem: Why It's So Tricky
So, why is this such a big deal on Shopify? The community expert @Taha_Dev laid it out clearly: there's currently no native or API way to directly change an order's deliveryMethod once it's set at checkout. It's essentially read-only. Shopify staff have even confirmed it's a "known product gap." This means that any "conversion" you see an app claim to do is likely cancelling and recreating the order behind the scenes, or simply applying a workaround.
Because the original delivery method is fixed, Shopify's built-in workflows — especially for pickup orders — won't activate if you try to manually shift a "shipping" order to a "pickup" status. You lose those automatic "Ready for pickup" emails and the convenient buttons in the admin.
The "Bandaid" Fix (When You Need a Quick & Dirty Solution)
For simpler cases, or if you're not ready for a more technical solution, there's a basic manual workaround that many merchants resort to. It keeps the original order number and payment history intact, but be aware it won't trigger Shopify's native pickup notifications or workflows.
Switching from Shipping/Delivery to Pickup:
- Refund Shipping: On the order, click "Refund" and refund only the shipping/delivery charge.
- Add a Tag & Note: Add a tag like
switched-to-pickupand a timeline note so your team knows not to ship it. - Manual Communication: You'll need to message the customer yourself when their order is ready for pickup, as Shopify's automatic emails won't fire.
- Mark as Fulfilled: When the customer collects, mark the order as fulfilled, making sure to untick "Send notification" to avoid confusing emails.
The downside? The order history will still show "shipping," which isn't ideal for reporting or at-a-glance checks. As @optima-tiktok-shop1 suggested, you'll be "fulfilling it manually, and email the customer when their order is ready."
Switching from Pickup to Shipping/Delivery:
This direction is a bit trickier. Taha_Dev recommends collecting the delivery fee with a separate draft order invoice. Then, once the item is shipped, fulfill the original order and send the tracking information to the customer manually. Always test this on a dev store first!
The Deeper Dive: Automating the "Switch" for Real Flexibility
If the manual bandaid solution is driving you crazy because it breaks your automations (and Carla_s_Cookie_Box, I hear you!), Taha_Dev shared a much more robust, albeit custom, solution that tries to mimic native behavior as much as possible. This involves a little custom code or a specific third-party app.
1. A "Switch to Pickup" Button (Custom App)
This is the most comprehensive workaround. It involves creating a small, private custom app for your store (not something on the App Store). This app would add an action button directly to your order page. When staff click it and select a pickup location, it would perform several API actions:
- Edit the Order: Removes the original shipping line and adds a "Pickup – [location]" line at $0 using
orderEditBegin,orderEditRemoveShippingLine,orderEditAddShippingLine, andorderEditCommit. This makes the order, packing slip, and order list correctly show "Pickup." - Refund the Difference: Uses
refundCreateto refund the shipping cost. The order number and payment history remain untouched. - Move Fulfillment: Moves the fulfillment order to the chosen pickup location using
fulfillmentOrderMove. - Set a Metafield & Tag: Crucially, it sets a tag and an order metafield, e.g.,
custom.fulfillment_type = pickup. This is key for your automations.
Then, you'd need custom "Ready for pickup" and "Picked up" buttons that send your own notifications (since Shopify's native ones won't fire) and fulfill the order with notifications turned off.
Going from pickup to delivery/shipping works similarly in reverse: add the delivery address (which can recalculate tax on API 2026-10), add the delivery shipping line, and then send an invoice for the balance (orderInvoiceSend).
2. Point Your Automations at One Field (Metafields & Flows)
This is where your automations stop depending on Shopify's native, unchangeable delivery method. Instead, you'd use that custom metafield we just talked about.
- Set the Metafield on Creation: Use Shopify Flow to set the
custom.fulfillment_typemetafield on *every* new order, pulling the initial delivery method from the order itself.
Trigger: Order created
Action: Update order metafield
Namespace/key: custom.fulfillment_type
Value: {% for fo in order.fulfillmentOrders %}{{ fo.deliveryMethod.methodType }}{% endfor %}
-> SHIPPING / LOCAL / PICK_UP
- Update Your Flows: Change the conditions in your existing Shopify Flows (for prep lists, delivery runs, tagging, etc.) to read "
fulfillment_type is PICK_UP" instead of "delivery method is pickup."
Now, when your custom "Switch to pickup" button updates that metafield, the order automatically flows into the correct workflow! Just a heads-up: any third-party apps that *only* read Shopify's original delivery method might still be confused, so check if your apps can filter on a tag or metafield.
3. If You'd Rather Not Run Custom Code (Third-Party App)
For those who prefer an off-the-shelf solution, Taha_Dev mentioned Zapiet – Pickup + Delivery. This app manages pickup and delivery as its own layer, complete with its own statuses and notifications. It allows you to edit an order's checkout method, location, and date from the order's "More actions" menu. The catch is that you'd be moving your entire pickup and delivery setup onto their app, rather than using Shopify's native options. Make sure to confirm with them that switching existing orders works exactly how you need it to before committing.
What You Can Do to Help
Ultimately, a native solution from Shopify would be ideal. It would save countless hours and eliminate these complex workarounds. If this issue resonates with you, please do what @Taha_Dev and @optima-tiktok-shop1 suggested:
- Add your +1 to the developer forum thread (API mutation to update deliveryMethod on a FulfillmentOrder).
- Raise it directly with Shopify support, referencing your store and clearly detailing the knock-on effects on your operations, reporting, and accounting. The more real-world use cases and detailed impacts they hear, the higher it gets prioritized.
It's a common request, and with enough merchant voices, we can hopefully push for a proper, built-in solution that makes managing these changes seamless for everyone. Until then, these community-driven workarounds are your best bet for keeping things running smoothly!