Shopify App Store

Shopify shipping confirmation email: the four lines that prevent "where is my order?"

What to add to the default template, with the exact Liquid variables. Ten minutes, no app. Updated October 2026.

Shopify's default shipping confirmation email is fine, but it was written to be generic. Four small additions turn it into the email that answers the question before the customer asks it. Everything below goes in Settings → Notifications → Customer notifications → Shipping confirmation → Edit code. Make a copy of the template first (there is a "Revert to default" link if something breaks).

1. A tracking link the customer can tap, with the carrier name

If a fulfillment has a tracking number but the template prints it as plain text, people copy it into Google and then email you anyway. Shopify exposes three fulfillment properties for this:

{% if fulfillment.tracking_numbers.size > 0 %} {% for tracking_number in fulfillment.tracking_numbers %} {% assign tracking_url = fulfillment.tracking_urls[forloop.index0] %} {% if tracking_url %} Track with {{ fulfillment.tracking_company }}: <a href="{{ tracking_url }}">{{ tracking_number }}</a> {% else %} {{ fulfillment.tracking_company }} tracking number: {{ tracking_number }} {% endif %} {% endfor %} {% endif %}

Two things decide whether this renders a link: the carrier was selected when the order was fulfilled (that sets tracking_company), and a tracking URL exists on the fulfillment. If you fulfil through a 3PL, check an order in admin: a number without a link means their integration isn't writing the URL back, and no template change will fix that.

2. A delivery window in plain words

Customers write in when they don't know what "normal" looks like. Shopify has fulfillment.estimated_delivery_at, but it is only populated for carrier-calculated rates with a handful of carriers (USPS, FedEx, UPS, Canada Post), so most stores should fall back to their own promise:

{% if fulfillment.estimated_delivery_at %} Estimated delivery: {{ fulfillment.estimated_delivery_at | date: "%A, %B %-d" }} {% elsif shipping_method.title contains "Express" %} Express orders usually arrive in 1–3 business days. {% else %} Standard orders usually arrive in 4–7 business days from this email. International orders can take 10–20 business days plus customs. {% endif %}

Use "usually" and "from this email", never a hard date you don't control. If your windows differ by country, branch on shipping_address.country_code the same way.

3. What to do if it's late (so they don't guess)

One sentence that tells the customer what counts as late and what will happen. It stops the day-5 "just checking" email and the day-9 angry one:

If tracking hasn't moved for 4 business days, or the estimate above has passed, reply to this email with your order number and we'll chase the carrier for you.

If you run an order-aware chat widget, point here instead: "Ask the chat on our site and it will check this order for you." Just be sure it actually reads the order, otherwise you've added a step.

4. A link to the order status page, named as such

The default template has a "View your order" button. Rename it so people know what's behind it:

<a href="{{ order_status_url }}">Check delivery status for order {{ order.name }}</a>

The order status page shows fulfillment state and tracking from the same data as this email, so the two never disagree. Put the same link in your footer as "Track your order" and you've covered the customer who deleted the email.

Before you save

  1. Send a test from the template editor and open it on a phone. The tracking link should be tappable above the fold.
  2. Fulfil a real test order with a carrier and tracking number, then read the email you receive. If the link is missing, the problem is the fulfillment data, not the template.
  3. If you use Shipping update emails (the ones sent when tracking changes), apply the same block there; it uses the same fulfillment object.

Disclosure: we build Pigeon, a Shopify chat widget for the customers who ask anyway: it reads the order from Shopify and answers "where is my order?" with status, carrier, tracking link and ETA, and hands everything else to your inbox. Free for 100 conversations a month.

See Pigeon on the Shopify App Store

Related: Cut "where is my order?" emails · Shipping delay email templates · The Shopify order status page