How to Fix Broken ShipStation Fulfillment Notifications on Shopify

How to Fix Broken ShipStation Fulfillment Notifications on Shopify

Introduction

The workflow seems simple: an order comes into Shopify, ShipStation picks it up, a label is printed, the shipment is marked as shipped — and the customer receives a tracking email automatically. Clean, automated, professional.

Except it's not working. Customers are emailing asking where their order is. Tracking numbers exist in ShipStation but never reached the customer. Or the fulfillment shows as complete in Shopify but no notification was sent. Or the email fires but contains no tracking link.

This is one of the most common — and most damaging — integration failures between Shopify and ShipStation. A missed fulfillment notification erodes customer trust instantly. This guide covers every known root cause and the fix for each one.


Understanding the Data Flow

Before diagnosing the problem, you need to understand exactly how a fulfillment notification is supposed to travel from ShipStation to the customer:


Order placed in Shopify
    ↓
ShipStation pulls order via Shopify API
    ↓
ShipStation generates shipping label
    ↓
ShipStation marks shipment as "Shipped"
    ↓
ShipStation pushes fulfillment + tracking number back to Shopify via API
    ↓
Shopify marks order as "Fulfilled"
    ↓
Shopify triggers "Shipping confirmation" notification email
    ↓
Customer receives tracking email

The failure can happen at any step in this chain. The diagnostic process is about isolating exactly which handoff broke.


Who This Affects

  • Shopify stores using ShipStation as their primary fulfillment and shipping platform
  • Stores that recently updated ShipStation, changed API credentials, or modified notification settings
  • Stores that migrated to a new Shopify plan or changed their notification templates
  • Multi-location stores where fulfillment location assignment affects which notifications fire
  • Stores using custom fulfillment workflows or third-party logistics (3PL) integrations through ShipStation

Diagnostic Framework: Where Did It Break?

Run through these three questions first — they point you to the right section of this guide:

Question 1: Does the order show as "Fulfilled" in Shopify after ShipStation ships it?

  • Yes → The ShipStation→Shopify API sync is working. The problem is in Shopify's notification layer. Go to Section B.
  • No → The fulfillment data is not reaching Shopify at all. Go to Section A.

Question 2: Does the fulfilled order in Shopify have a tracking number populated?

  • Yes → Data is syncing. The notification email is the failure point. Go to Section B.
  • No → Tracking number is not being passed from ShipStation to Shopify. Go to Section A, Step 3.

Question 3: Did the customer receive an email but with no tracking link or broken link?

  • Yes → Tracking number format or notification template issue. Go to Section C.

Section A — ShipStation Is Not Updating Shopify


A1 — Check the ShipStation → Shopify API Connection

The most common cause of total sync failure is a broken or expired API connection between ShipStation and Shopify.

In ShipStation:

  1. Go to Settings → Selling Channels → Store Setup
  2. Find your Shopify store connection
  3. Click "Refresh" or "Test Connection"
  4. Look for any error messages — common ones include:
    • 401 Unauthorized — API credentials have expired or been revoked
    • 403 Forbidden — App permissions have changed
    • Connection timed out — Network or rate limit issue
    • Store not found — The Shopify store URL has changed (e.g., domain migration)

Fix — Re-authenticate the connection:

  1. In ShipStation → Settings → Selling Channels → Store Setup
  2. Click your Shopify store → Edit
  3. Click "Connect to Shopify" and go through the OAuth flow again
  4. Ensure you grant all requested permissions — particularly write_fulfillments and read_orders
  5. Save and test with a new order

A2 — Verify Shopify API Permissions for ShipStation

ShipStation requires specific Shopify API scopes to write fulfillment data back to Shopify. If permissions were revoked or the app was reinstalled without full scope approval, the sync will silently fail.

Check in Shopify:

  1. Go to Shopify Admin → Settings → Apps and sales channels
  2. Find ShipStation in the list
  3. Click it and review the listed permissions
  4. Confirm these scopes are present:
    • read_orders — to pull new orders
    • write_orders — to update order status
    • read_fulfillments — to read existing fulfillments
    • write_fulfillments — critical — to create fulfillment records
    • read_shipping — for carrier and rate information

If any critical scope is missing:

  1. Uninstall the ShipStation app from Shopify
  2. Reinstall from the Shopify App Store
  3. Accept all permission requests during reinstall
  4. Re-authenticate in ShipStation's Store Setup

A3 — Check ShipStation's "Update Order Status" Setting

ShipStation has a specific setting that controls whether it pushes fulfillment data back to Shopify. If this is disabled, ShipStation ships the order internally but never tells Shopify about it.

In ShipStation:

  1. Go to Settings → Selling Channels → Store Setup
  2. Click your Shopify store → Edit
  3. Scroll to "Store-Specific Settings" or "Shipping Notification Settings"
  4. Find "Update order status in store when shipped" — confirm it is enabled
  5. Find "Send tracking number to store" — confirm it is enabled
  6. Find "Notify marketplace of shipment" — confirm it is enabled

If any of these were disabled (accidentally or during a configuration change), re-enable them and test with the next shipment.


A4 — Check for Fulfillment Service Conflicts

If your Shopify store has multiple fulfillment services configured (e.g., ShipStation plus a 3PL, or ShipStation plus Shopify Fulfillment Network), there may be a conflict over which service owns the fulfillment for a given order.

In Shopify:

  1. Go to Settings → Shipping and delivery → Fulfillment services
  2. Review all active fulfillment services
  3. Confirm ShipStation is listed and set as the service for the correct products/locations

In ShipStation:

  • Confirm the order is being pulled into ShipStation (check the Orders tab for the specific order)
  • If the order doesn't appear in ShipStation, it may have been claimed by another fulfillment service before ShipStation could pull it

Fix:

  • Assign the correct fulfillment service to each product in Shopify: Product → [Product] → Shipping → Fulfillment service → ShipStation
  • For location-based fulfillment, ensure the ShipStation location is correctly mapped

A5 — Check ShipStation's Order Import Filters

ShipStation has configurable filters that control which orders it imports from Shopify. If filters are too restrictive, some orders may not be imported — and therefore never fulfilled via ShipStation.

In ShipStation:

  1. Go to Settings → Selling Channels → Store Setup → [Your Shopify Store] → Edit
  2. Review "Order Import Criteria" or "Import filters"
  3. Check for filters on:
    • Order status (only importing "Paid" orders — may miss "Partially paid" or "Pending")
    • Order tags (filtering to specific tags may exclude orders)
    • Order date range (check if there's an accidental date cutoff)
    • Product SKUs or types

Fix: Broaden filters to ensure all relevant orders are imported, then re-import any orders that were missed using ShipStation's manual import option.


Section B — Shopify Is Not Sending the Notification Email

The order is fulfilled in Shopify with a tracking number — but the customer email never fires. This is a Shopify-side configuration problem.


B1 — Verify the "Shipping Confirmation" Notification Is Enabled

Shopify's fulfillment email is called the "Shipping confirmation" notification. It must be enabled for it to fire.

In Shopify:

  1. Go to Settings → Notifications
  2. Find "Shipping confirmation" under the Shipping section
  3. Confirm it is enabled (toggle should be on)
  4. Click it to preview the template — confirm the template is not blank or broken

Common issue: Someone disabled the notification to stop it firing during a data migration or bulk fulfillment import — and never re-enabled it.


B2 — Check Whether ShipStation Is Sending Its Own Notification (Duplication Conflict)

ShipStation can send its own shipping confirmation email to customers independently of Shopify. If both are enabled, customers receive two emails — which often leads teams to disable one. The wrong one sometimes gets disabled.

Check ShipStation's email settings:

  1. Go to ShipStation → Settings → Selling Channels → Store Setup → [Shopify Store] → Edit
  2. Look for "Send email confirmation to buyer when shipped"
  3. Note whether this is enabled or disabled

Check Shopify's notification:

  1. Go to Shopify Admin → Settings → Notifications → Shipping confirmation
  2. Note whether this is enabled or disabled

Recommended configuration:

  • Option A (Shopify sends): Disable ShipStation's customer email. Enable Shopify's Shipping confirmation. Shopify sends one clean email with Shopify-branded tracking.
  • Option B (ShipStation sends): Disable Shopify's Shipping confirmation. Enable ShipStation's customer email. ShipStation sends its own branded email.
  • Never have both enabled simultaneously — customers get duplicate emails, eroding trust.

Decide which system owns customer communication and disable the other.


B3 — Verify the Customer Email Address on the Order

If the customer's email address is missing or malformed on the Shopify order, the notification has nowhere to go — and Shopify silently skips it.

Check:

  1. Go to Orders → [Affected Order]
  2. Confirm a valid email address appears in the Customer section
  3. If the email is missing, it may have been a phone-only checkout (SMS notifications only) or a POS order

Fix:

  • For missing emails: contact the customer through other means and manually send tracking info
  • For future prevention: require email at checkout (Settings → Checkout → Customer contact method → Email)
  • If using SMS-only checkout: ensure your SMS notification provider is configured to send shipping updates separately

B4 — Check Shopify's Email Notification Logs

Shopify logs all notification sends at the order level. This tells you definitively whether an email was attempted.

In Shopify:

  1. Go to Orders → [Affected Order]
  2. Scroll to the Timeline section at the bottom
  3. Look for entries like:
    • ✅ "Shipping confirmation" email was sent to customer@email.com
    • ❌ No entry at all → email was never triggered
    • ⚠️ Email could not be sent → delivery failure

If no entry exists: The notification was never triggered — this points back to Section A (fulfillment not registering correctly) or B1 (notification disabled).

If an entry exists but customer didn't receive it: The email was sent but not delivered — go to Section B5.


B5 — Diagnose Email Deliverability Issues

Shopify sends notification emails from its own email infrastructure. If those emails are landing in spam or being blocked, the customer never sees them even though Shopify technically sent them.

Ask the customer to:

  1. Check their spam/junk folder for an email from noreply@shopify.com or your store's sender address
  2. Search for your store name in all mail folders
  3. Add your sending address to their contacts/safe senders list

Check your store's sender email:

  1. Go to Settings → Notifications → Sender email
  2. If you're using a custom sender email (e.g., orders@yourstore.com), verify that:
    • SPF record is configured correctly for your domain
    • DKIM record is set up (Shopify provides DKIM keys for custom sender addresses)
    • DMARC policy is not blocking Shopify's sending infrastructure

How to check SPF/DKIM:

  • Use MXToolbox → enter your domain → check SPF and DKIM
  • Use Mail-Tester — send a test email and get a deliverability score

B6 — Check Shopify Flow or Third-Party App Interference

If you use Shopify Flow or any email marketing/automation app, a workflow may be intercepting or suppressing the fulfillment notification.

Check Shopify Flow:

  1. Go to Shopify Admin → Flow
  2. Look for any active workflows triggered by "Fulfillment created" or "Order fulfilled"
  3. Check if any workflow has a "Cancel notification" or "Suppress email" action
  4. Temporarily disable suspicious workflows and test

Check installed apps:

  • Email marketing apps (Klaviyo, Omnisend, Mailchimp) sometimes override Shopify's native notifications
  • If you've configured a "Shipping confirmation" flow in Klaviyo AND Shopify's native notification is also enabled, there may be a suppression rule
  • In Klaviyo: check Flows → Fulfillment → Settings for suppression conditions
  • In Omnisend: check Automation → Shipping Confirmation for active/inactive status

Section C — Tracking Number Is Missing or Broken in the Email

The email fires, but the tracking link doesn't work, is missing, or goes to the wrong carrier page.


C1 — Verify the Tracking Number Format in Shopify

In Shopify:

  1. Go to Orders → [Affected Order] → Fulfilled
  2. Click "View fulfillment"
  3. Check the Tracking number and Carrier fields
  4. Confirm:
    • The tracking number is present and complete (not truncated)
    • The correct carrier is selected (UPS, FedEx, USPS, DHL, etc.)
    • The tracking URL resolves correctly — click it to test

Common issues:

  • ShipStation passes the tracking number but no carrier — Shopify can't build a tracking URL without a carrier
  • The carrier name from ShipStation doesn't match Shopify's carrier list exactly (e.g., "United Parcel Service" vs. "UPS")
  • The tracking number includes spaces or special characters that break the URL

C2 — Fix Carrier Mapping Between ShipStation and Shopify

ShipStation uses its own carrier names internally. When it pushes fulfillment data to Shopify, the carrier name must map to one Shopify recognizes.

In ShipStation:

  1. Go to Settings → Selling Channels → Store Setup → [Shopify Store] → Edit
  2. Look for "Carrier Mapping" or "Tracking URL settings"
  3. Confirm each carrier used in ShipStation maps to the correct Shopify carrier name

Shopify's recognized carrier names (for reference):

Carrier Shopify Accepted Name
USPS USPS
UPS UPS
FedEx FedEx
DHL Express DHL Express
Canada Post Canada Post
Australia Post Australia Post

If ShipStation sends an unrecognized carrier name, Shopify displays the tracking number without a clickable link.

Fix: In ShipStation's carrier mapping settings, match each carrier to Shopify's exact accepted string. For carriers not on Shopify's recognized list, provide a custom tracking URL in ShipStation's settings.


C3 — Check the Shopify Notification Template for Tracking Variables

If tracking numbers are in Shopify but not appearing in the email, the notification template may have been accidentally modified to remove the tracking variable.

In Shopify:

  1. Go to Settings → Notifications → Shipping confirmation
  2. Click "Edit code"
  3. Search for tracking_number and tracking_url in the template
  4. Confirm these Liquid variables are present:

{% if fulfillment.tracking_number %}
  Tracking number: {{ fulfillment.tracking_number }}
  Track your package: {{ fulfillment.tracking_url }}
{% endif %}

If the variables are missing: They were accidentally deleted during a template customization. You can restore the default template by clicking "Revert to default" — but note this will remove any custom styling you've added.

Recommended approach: Copy your current customized template to a text editor, revert to default to confirm the variables are present in the original, then re-apply your customizations around the tracking block.


C4 — Handle Multiple Fulfillments / Partial Shipments

If an order ships in multiple packages (partial fulfillments), each fulfillment should trigger its own shipping confirmation. ShipStation supports split shipments, but the Shopify notification template must be configured to handle multiple fulfillment objects.

Check:

  1. Go to Orders → [Affected Order]
  2. Look for multiple fulfillment records under the order
  3. Confirm each fulfillment has its own tracking number

In the notification template:


{% for fulfillment in fulfillments %}
  {% if fulfillment.tracking_number %}
    Package {{ forloop.index }}: {{ fulfillment.tracking_number }}
    Track: {{ fulfillment.tracking_url }}
  {% endif %}
{% endfor %}

If your template only references fulfillment (singular) instead of iterating fulfillments (plural), only the first package's tracking information appears in the email.


Complete Fix Checklist

Work through this end-to-end after reading the relevant sections:

ShipStation Side:

  • API connection to Shopify is active and authenticated
  • write_fulfillments permission is granted
  • "Update order status when shipped" is enabled
  • "Send tracking number to store" is enabled
  • Order import filters are not excluding affected orders
  • Carrier names are correctly mapped to Shopify's accepted values
  • ShipStation's own customer email is configured intentionally (on or off)

Shopify Side:

  • "Shipping confirmation" notification is enabled in Settings → Notifications
  • Customer email address is present on affected orders
  • Order timeline confirms notification was sent (or identifies it wasn't)
  • Notification template contains fulfillment.tracking_number and fulfillment.tracking_url
  • No Flow workflow is suppressing the notification
  • No email marketing app is overriding or suppressing Shopify's native notification
  • Custom sender email has valid SPF and DKIM records

Tracking Link:

  • Tracking number appears in the fulfilled order in Shopify
  • Carrier is correctly identified on the fulfillment
  • Tracking URL resolves to the correct carrier tracking page
  • Notification template handles multiple fulfillments if orders split ship

Testing the Full Flow

After making fixes, test with a real order (use a test order with a real shipping label if possible):

  1. Create a test order in Shopify
  2. Import it into ShipStation
  3. Print a label and mark it as shipped in ShipStation
  4. Within 5 minutes, check:
    • Shopify order status → should show "Fulfilled"
    • Order timeline → should show tracking number populated
    • Order timeline → should show "Shipping confirmation sent to [email]"
  5. Check the test email inbox → confirm email arrived with correct tracking link
  6. Click the tracking link → confirm it goes to the carrier's tracking page with the correct number

When to Contact Support

Contact ShipStation Support if:

  • The API connection repeatedly fails to authenticate
  • Orders aren't importing despite correct filter settings
  • Tracking numbers aren't being pushed to Shopify despite the setting being enabled
  • You're getting specific API error codes (document the exact error message)

Contact Shopify Support if:

  • Notifications show as sent in the timeline but customers consistently don't receive them
  • The fulfillment API is returning errors when ShipStation tries to write fulfillments
  • The notification template appears correct but emails are still missing tracking data

When contacting either: Always provide the specific Order ID, the timestamp of the fulfillment, and the exact behavior you observed — vague reports result in slow resolutions.

Back to blog

Leave a comment