Shopify Delivery Dilemma: How to Change Shipping, Local Delivery, or Pickup on Existing Orders
Hey fellow store owners! Let's talk about a common headache that's probably popped up in your store more times than you can count: a customer changes their mind about how they want to receive their order. One minute it's shipping, the next they want to pick it up. Or maybe they initially chose pickup, but now they need it delivered. Sounds familiar, right?
It sounds like such a simple request on the surface, but as many of us have discovered, changing an order's delivery method in Shopify after checkout isn't as straightforward as it should be. This issue recently sparked a really insightful discussion in the Shopify Community, started by @Carla_s_Cookie_Box, and it's something I've seen countless merchants grapple with. Let's dive into what the community uncovered and the best ways to navigate this tricky situation.
The Core Problem: Why Can't We Just Change It?
The frustration is real. As @Carla_s_Cookie_Box eloquently put it, if an order was originally placed for delivery or shipping, Shopify doesn't let you convert that same order into a true Pickup order. This isn't just about a label; it breaks the entire native pickup workflow:
- The "Prepare for pickup" status
- The "Ready for pickup" status and automated customer notification
- The "Mark as picked up" action
Similarly, switching from pickup to shipping creates its own set of hurdles. As @ParkingMarker highlighted, having to cancel and recreate an already paid order just to change the fulfillment method is a massive pain. It can mess with order numbers, payment histories, reporting, accounting, and even third-party apps and automations. It's a domino effect of inconvenience.
The Technical Reality: What Shopify Says
The hard truth, confirmed by @Taha_Dev and others in the developer forums, is that an order's delivery method is essentially fixed and read-only once checkout is complete. There's no native admin function or API endpoint to directly change it. Shopify staff themselves have acknowledged this as a "known product gap" with no timeline for a fix yet. This means any "conversion" solution you implement is really a clever workaround, not a direct modification of Shopify's core order type.
Workaround 1: The Manual "Bandaid" (No Custom Code)
Before diving into more complex solutions, let's look at the basic manual workaround that many merchants, including @Carla_s_Cookie_Box, are already using. It's not perfect, but it keeps the original order number and payment history intact.
Switching from Shipping/Delivery to Pickup:
- Refund the Shipping Fee: On the order page, click "Refund" and refund only the shipping or delivery charge.
- Add a Tag & Note: Add a tag like
switched-to-pickupto the order. Crucially, add a timeline note explaining the change so your team doesn't accidentally ship it. - Manual Customer Communication: Since Shopify's native "Ready for pickup" email won't fire, you'll need to manually message the customer when their order is ready.
- Mark as Fulfilled: When the customer collects the order, mark it as fulfilled, but make sure to untick "Send notification" to avoid confusion.
The Downside: The order will still show "shipping" in its history, and you lose the integrated pickup workflow. But your order number, payment, and basic reporting remain consistent.
Switching from Pickup to Shipping/Delivery:
This direction is generally harder. @Taha_Dev suggests collecting the new delivery fee with a separate draft order invoice. Then, once the order ships, fulfill the original order and send the customer tracking information yourself. Always test this thoroughly on a development store first, as pickup orders behave differently.
Workaround 2: Automating the "Bandaid" with a Custom App
If the manual process is breaking your automated workflows (and @Carla_s_Cookie_Box noted this is a "real pain"), @Taha_Dev outlined a more sophisticated, custom-code approach. This involves building a small, private Shopify app for your store. It's a bit more technical, but it dramatically streamlines the process.
What a Custom "Switch" App Can Do:
This app would add a custom action (e.g., a "Switch to Pickup" button) to your order pages. When clicked, it could:
- Edit the Order: Use the Admin API's order edit mutations (
orderEditBegin,orderEditRemoveShippingLine,orderEditAddShippingLine,orderEditCommit) to remove the original shipping line and add a "Pickup – [location]" line at $0. This makes the order, packing slip, and order list reflect the change. - Refund Automatically: Issue a refund for the shipping difference using
refundCreate. - Move Fulfillment: Shift the fulfillment order to the correct pickup location using
fulfillmentOrderMove. - Set Custom Data: Add a tag and an order metafield (e.g.,
custom.fulfillment_type = pickup) to mark the order's true fulfillment intention.
For custom notifications, your app could also add "Ready for Pickup" and "Picked Up" buttons that trigger your own custom emails and fulfill the order without Shopify's native notifications.
Integrating with Shopify Flow:
The real magic of this custom app approach is how it integrates with Shopify Flow. Instead of your Flows depending on Shopify's native, read-only deliveryMethod, you can point them to your custom metafield. Here's a sketch of how you'd set that up:
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
Then, you'd update your existing Flows (for prep lists, delivery runs, tags, etc.) to check for fulfillment_type is PICK_UP instead of delivery method is pickup. This way, when your custom app updates the metafield, your automations kick in correctly. Just be aware that some third-party apps might still read Shopify's original delivery method, so always check if they can filter by tags or metafields.
Workaround 3: The Dedicated App Solution
If building custom code isn't your jam, there are dedicated apps designed to handle complex pickup and delivery scenarios. @Taha_Dev mentioned Zapiet – Pickup + Delivery. This app essentially runs pickup and delivery as its own layer on top of your normal orders, with its own statuses and notifications. It offers the ability to edit an order's checkout method, location, and date from the order's "More actions" menu, directly addressing the core problem.
The key thing to remember with a solution like Zapiet is that it means moving your entire pickup and delivery setup onto their app, rather than relying on Shopify's native options. Make sure to confirm that switching existing orders works exactly as you need it to before making the leap.
Your Voice Matters: Pushing for a Native Solution
Ultimately, while these workarounds are helpful, the community consensus is clear: Shopify needs a native, robust solution for this. It's a fundamental aspect of order management for many businesses. Both @optima-tiktok-shop1 and @Taha_Dev encourage merchants to add their voices. You can do this by adding your +1 to the relevant developer forum threads and, perhaps even more effectively, by raising a direct ticket with Shopify support, referencing your store and spelling out the detailed knock-on effects (reporting, accounting, apps) that this limitation causes. Merchant tickets are actively counted when features are prioritized.
So, while we wait for Shopify to implement a more seamless solution, you've got a few solid options to consider. Whether it's a careful manual process, a custom app to automate your workflows, or a dedicated third-party solution, choosing the right approach depends on your store's complexity and your comfort level with technical solutions. It's all about finding what works best to keep your operations smooth and your customers happy, even when they change their minds!