Why does Shopify keep emailing "your order has shipped" for pickup and subscription orders that were never shipped?

Subscription rebills and local pickup orders keep triggering Shopify's standard "your order has shipped" email even though nothing was shipped — here's why, and how to fix it without silencing shipping confirmations for every other order.

notificationsfulfillmentsubscriptionslocal-pickupshopify-flow

What's going on

A customer picks up their order in-store, or a subscription box gets fulfilled through a recurring-billing app, and they still get an email from your store telling them their package "has shipped" with tracking language that doesn't apply. It's confusing for the customer and makes the store look sloppy, especially for merchants doing local pickup, local delivery, or subscription rebills where there's no carrier, no tracking number, and sometimes no physical shipment at all that day.

The root of it is that Shopify treats "a fulfillment was created" and "a shipment happened" as the same event by default. Anything that marks an order fulfilled — you clicking a button in admin, or an app calling the fulfillment API on your behalf — can trigger the standard Shipping confirmation (and later Out for delivery / Delivery) notification unless something explicitly tells Shopify not to send it, or tells it this order is a pickup/local-delivery order with its own templates.

Subscription and pickup merchants run into this more than most because the apps that automate their fulfillments were often built around the plain fulfillment API, without wiring up the delivery-method flags or notification toggles that would let Shopify route the right message. The result is two problems layered together: a wrong-sounding email, and often a second, separate confirmation from the subscription or pickup app itself, so the customer gets told twice in two different ways.

Why it happens

Shopify's default customer notifications are tied to the creation of a Fulfillment object on an order, not to any real-world shipping event. Every time a fulfillment is created — whether you click "Fulfill items" in admin, or a subscription/fulfillment app calls the equivalent API — the Shipping confirmation template fires unless it's explicitly suppressed for that fulfillment, or the order's delivery method is set to Pickup or Local Delivery, which routes it to Shopify's separate pickup/delivery templates instead.

Manual fulfillment in admin exposes a checkbox to skip that notification for a single order, and the Admin GraphQL fulfillment-creation mutation exposes a notifyCustomer flag for the same purpose programmatically. The mismatch merchants hit almost always comes down to one of two things: the app automating fulfillment for subscriptions or pickup never sets that flag (or doesn't expose it to the merchant at all), or the order's delivery method was never correctly set to Pickup/Local Delivery in the first place, so Shopify has no reason to use anything other than the generic shipping template.

5 ways to fix it

1

Turn off the shipping email at the fulfillment step, not globally

When you fulfill an order manually in Shopify admin, there's a "Send shipping confirmation to customer" checkbox you can uncheck before confirming. If a subscription, pickup, or custom fulfillment app is doing this programmatically via the Admin GraphQL API, the fulfillmentCreate mutation accepts a notifyCustomer boolean — set it to false for fulfillments that don't correspond to a real carrier shipment. This suppresses the email for that specific order instead of turning off shipping confirmation for your whole store, which is the safest fix if the app or your developer can access that flag.

2

Set up Local Pickup or Local Delivery profiles so Shopify's own templates take over

Shopify ships dedicated notification templates for orders fulfilled through Local Pickup and Local Delivery (things like "Ready for pickup" and "Order picked up") that automatically replace the generic Shipping confirmation and Out for delivery emails — but only when the order's delivery method is actually set to Pickup or Local Delivery in your shipping settings. If your subscription or pickup workflow creates orders without that delivery method attached, Shopify falls back to standard shipping language even though nothing was shipped. Auditing your delivery profiles so pickup/local orders are correctly flagged fixes the mismatch at the source, for free.

3

Map out who owns each customer touchpoint, then mute the duplicate

The recurring complaint from subscription and pickup merchants isn't just an incorrect email, it's two systems talking at once — Shopify's native notification and the subscription/fulfillment app's own confirmation message. Before touching templates, decide which one is the system of record for "your order is ready." If the app owns that message, disable or edit Shopify's equivalent template in Settings > Notifications rather than running both, since merchants only need one and mismatched wording (shipping language for a pickup order) erodes trust more than a missing email would.

4

Add conditional logic to the notification template with order tags

Shopify's notification templates support Liquid, so you can tag subscription or pickup orders (manually, or automatically with a Shopify Flow workflow) and then wrap the Shipping confirmation and Out for delivery templates in a Liquid condition that checks for that tag and either suppresses shipping-specific content or swaps in pickup/subscription-appropriate copy. This is a template edit under Settings > Notifications, not code deployed to your storefront, so it's within reach for most merchants or a theme developer, though it only changes wording — it won't stop the email from sending unless you also unpublish/empty the template output for tagged orders.

5

If the app can't expose fulfillment notification controls, get it patched or audited

Some subscription and fulfillment apps don't expose a notifyCustomer toggle at all, which means every fulfillment they trigger fires Shopify's default shipping emails regardless of what actually happened. In that case the realistic fix is asking the app's support team to add the option, or having a developer adjust the integration's fulfillment calls. This is a configuration and integration problem rather than something a new app solves by itself — if you're not sure where the mismatch is coming from, a one-time notification and fulfillment-flow audit (mapping every app that creates fulfillments against every template that can fire) is more useful than adding another tool.

Bottom line

This is fundamentally a plumbing problem, not a missing-feature problem: Shopify already lets you suppress or replace shipping-specific emails per fulfillment, but only if whatever creates that fulfillment (you, manually, or your subscription/pickup app) actually sets the right flag or delivery method. Start with the free native controls — the notify checkbox, Local Pickup/Delivery profiles, and notifyCustomer on the API — before assuming you need new software; if your stack genuinely can't expose those controls, what you need is a targeted fulfillment/notification audit or a developer patch, not a general-purpose app.

Still Stuck?

Browse the rest of the problem library, run a free storefront scan to catch issues like this automatically, or email us and we'll work out a custom solution for it.