Connect Shopify Fulfillment Service to Pipe17

The Shopify Fulfillment Service connector positions Pipe17 as a registered fulfillment provider inside your Shopify store. Unlike the standard Shopify Sales connector (which syncs orders placed in Shopify), this connector makes Pipe17 the party responsible for fulfilling those orders - receiving fulfillment requests from Shopify, tracking them as shipping requests inside Pipe17, and reporting fulfilled shipments (with tracking information) back to Shopify.

Use this connector when your warehouse, 3PL, or ERP operations are managed in Pipe17 and you need Shopify to dispatch fulfillment work to Pipe17 rather than handle it internally.

Key capabilities:

  • Receive fulfillment requests from Shopify and create shipping requests in Pipe17
  • Accept or reject fulfillment requests (manually or automatically)
  • Push fulfillment confirmations (with tracking) back to Shopify
  • Sync inventory levels from Pipe17 to Shopify
  • Pull Shopify locations into Pipe17
  • Respond to cancellation requests from Shopify
  • Support for Shopify shipping method mapping (shipping_methods capability)

How It Works

Shopify's Fulfillment Service API allows third-party systems to register as a fulfillment provider. When Pipe17 is connected as a Fulfillment Service:

  1. Shopify assigns fulfillment orders to Pipe17 when a merchant's order contains items managed by this service.
  2. Pipe17 polls Shopify for assigned fulfillment orders in FULFILLMENT_REQUESTED status and converts them into Pipe17 shipping requests (orders).
  3. Shopify also sends CANCELLATION_REQUESTED signals - Pipe17 handles these by accepting or rejecting the cancellation depending on the current shipment status in Pipe17.
  4. When a fulfillment is confirmed in Pipe17 (accepted or rejected), Pipe17 pushes it back to Shopify via the Fulfillment API, updating the Shopify order status and optionally notifying the customer with tracking information.
  5. Inventory levels can be pushed from Pipe17 to Shopify on an incremental or scheduled basis.

Authentication: OAuth 2.0. Pipe17 connects using Shopify's OAuth flow and obtains a store-scoped access token. Required scopes: read_assigned_fulfillment_orders, write_assigned_fulfillment_orders, read_inventory, write_inventory.


Setup

Before You Begin

  • Disable pop-up blockers in your browser before connecting - Shopify's OAuth flow uses a pop-up window.
  • If you have multiple Shopify stores under one Shopify account, Shopify determines which store to connect based on the store selected in apps.shopify.com - not the store selected in the Shopify admin panel. Switch to the correct store in apps.shopify.com before connecting.

Steps

1. In Pipe17, go to Integrations and add a new integration.

2. Select Shopify Fulfillment Service from the connector list.

3. Click Connect: you will be redirected to Shopify's OAuth authorization page.

4. Authorize Pipe17 in Shopify. Once complete, the shopUrl field in connection settings will be populated automatically.

5. Configure your desired flows (see Flows below).

6. Define at least one Fulfillment Service Location (see Settings) so Pipe17 knows which Shopify location to associate with this fulfillment service.

7. Save and activate the integration.


Flows

Locations → Pipe17 (locations.in)

Pulls locations into Pipe17 and registers or updates fulfillment services in Shopify for each entry configured under Fulfillment service location.

Specifically, during each poll cycle:

  • Each configured fulfillment service location is synced into Pipe17 as a location record.
  • Pipe17 registers itself as a Fulfillment Service in Shopify for each matching location (creating it if it doesn't exist, updating it if the name, inventory management flag, or tracking support flag has changed).
  • The location's address in Shopify is kept in sync with Pipe17's location record.

This flow must run at least once after initial setup for fulfillment order routing to work correctly.

  • Trigger: Vendor Poll (polling Shopify for new fulfillment orders) and Pipe17 Poll (responding to Pipe17-side order events)
  • Enable via: Pull locations from Shopify toggle
  • Manual action: Pull locations from Shopify (available from the integration's Actions menu)

Orders (Fulfillment Requests) → Pipe17 (orders.in)

Polls Shopify for assigned fulfillment orders and creates or updates shipping requests in Pipe17.

What is polled:

  • FULFILLMENT_REQUESTED - orders where Shopify is asking Pipe17 to fulfill items.
  • CANCELLATION_REQUESTED - orders where the merchant has requested a cancellation.

Fulfillment Request handling:

  • If ordersAcceptAuto is enabled, Pipe17 automatically accepts every incoming fulfillment request in Shopify.
  • ordersAcceptStatuses operates independently of ordersAcceptAuto. When a Pipe17 order is updated and its status matches one of the listed values, Pipe17 accepts the corresponding Shopify fulfillment request — regardless of whether ordersAcceptAuto is enabled.

Cancellation Request handling:

  • If the Shopify fulfillment order is IN_PROGRESS, Pipe17 accepts the cancellation request and marks the Pipe17 shipment as canceled.
  • If the fulfillment order is not in progress, Pipe17 rejects the cancellation request.
  • The Pipe17 order is marked canceled if it was not already.

Enable via: Pull orders from Shopify toggle

Manual actions:

  • Pull orders from Shopify by ID - specify order IDs manually; optionally bypass configured filters.
  • Pull orders from Shopify by date - specify a start date and time window (1h–48h).

Statuses polled in Pipe17: new, readyForFulfillment, sentToFulfillment, partialFulfillment, fulfilled, canceled

Fulfillments → Shopify (fulfillments.out)

Pushes fulfillment outcomes from Pipe17 back to Shopify.

For accepted fulfillments:

  • Creates a Shopify fulfillment record with tracking number(s), tracking URL(s), and carrier name.
  • Duplicate tracking numbers are detected - if a tracking number was already submitted for this order, Pipe17 skips re-submission and logs a warning.
  • If the fulfillment request has not yet been accepted in Shopify, Pipe17 accepts it first before posting the fulfillment.

For rejected fulfillments:

  • Rejects the Shopify fulfillment order request.

Fulfillments polled from Pipe17: accepted and rejected types.

Enable via: Push fulfillments to Shopify toggle

Inventory → Shopify (inventory.out)

Pushes inventory quantities from Pipe17 to Shopify.

  • Pipe17 resolves each SKU to a Shopify inventory item and calculates the delta between Pipe17 and Shopify quantities.
  • Inventory is pushed per location. If inventoryTotalsLocation is set, all active Pipe17 locations are aggregated into a single Shopify location.
  • Update mode controls whether available or on_hand quantities are pushed.
  • SKU include/exclude filters (plain string or regex) allow targeting specific products.
  • Bundles and untracked items are automatically skipped.

Daily Resync: When enabled, Pipe17 performs a nightly reconciliation between 12:00 AM – 2:00 AM PST for SKUs modified since the last resync. This corrects discrepancies that may have accumulated from incremental sync misses.

Exclude Increase (outside resync hours): When enabled, Pipe17 will not push increased inventory levels outside the dedicated resync window. Only decreases are applied in real time.

Enable via: Process inventory updates toggle

Shipments → Shopify (Fulfillment Order Close)

When a Pipe17 shipment is canceled, this behavior optionally closes the associated Shopify fulfillment order. This is part of the fulfillments.out flow — Push fulfillments to Shopify must be enabled for this to run.

  • Triggered only when ordersCloseStatuses includes canceled (and/or partialFulfillment).
  • If the Shopify fulfillment order is IN_PROGRESS, Pipe17 closes it with the message "Cancelled in Pipe17."
  • If the fulfillment order is already INCOMPLETE or CLOSED, the action is skipped.

Default behavior: Disabled by default — ordersCloseStatuses is empty.


Settings

Connection Settings

Setting Description
Shopify shop URL Read-only. Populated automatically after OAuth.
API Token Hidden/encrypted. Set automatically during OAuth.

Locations

Setting Description Default
Pull locations from Shopify Enables the locations.in flow. Off
Fulfillment Service Locations List of fulfillment service entries to register in Shopify. Each entry has: name (fulfillment service name in Shopify), whether the service tracks inventory (inventory_management), and whether it provides tracking numbers (tracking_support). Empty

Note: At least one fulfillment service location must be configured for the orders and fulfillments flows to operate correctly.

Orders

Setting Description Default
Pull orders from Shopify Enables the orders.in flow. Off
Exclude orders created before this date Only orders created after this date are ingested. Defaults to integration creation date if left empty. $now()
Accept Shopify fulfillment requests automatically If on, all incoming fulfillment requests are accepted immediately in Shopify. Off
Accept Shopify fulfillment requests only for orders with specified statuses Controls which Pipe17 order statuses trigger acceptance of Shopify fulfillment requests. new, readyForFulfillment, sentToFulfillment, partialFulfillment, fulfilled.
Close Shopify fulfillment orders for shipments with specified statuses When a Pipe17 shipment reaches one of these statuses, its Shopify fulfillment order is closed. Available values: canceledpartialFulfillment. Empty (disabled)

Fulfillments

Setting Description Default
Push fulfillments to Shopify Enables the fulfillments.out flow. Off

Inventory

Setting Description Default
Process inventory updates Enables the inventory.out flow. Off
Report inventory totals from Pipe17 to dedicated Shopify location If set, all active Pipe17 locations are aggregated and pushed to this single location. Use the location picker to select a Pipe17 location that corresponds to your target Shopify location. Empty
Update inventory quantities Controls which quantity type is pushed: Available or On Hand. Available
Apply inventory updates only for SKUs matching following patterns Whitelist filter. Plain string = exact match (case-insensitive); wrap in // for regex (e.g., /^SKU-/). Empty (all SKUs)
Apply inventory updates only for SKUs not matching following patterns Blacklist filter. Same pattern syntax as above. Useful for pausing inventory on specific products (e.g., during flash sales). Empty
Enable periodic inventory reconciliation between 12:00AM PST – 2:00AM PST Nightly full resync of SKUs modified since the last reconciliation. Helps recover from incremental sync gaps. Off
Increase Shopify inventory only during dedicated hours (inventory resync) When on, inventory increases are only applied during the nightly resync window. Real-time updates only apply decreases. Off
Force inventory resync Triggers a one-time full inventory resync from Pipe17 to Shopify. Resets automatically after completion. Off

Troubleshooting

Issue Possible Causes What to Check / Do
Orders are not being pulled from Shopify Flow disabled; missing fulfillment service location; Shopify has not assigned orders to Pipe17 Verify Pull orders from Shopify is on. Confirm at least one Fulfillment Service Location is configured and its name matches the registered service in Shopify. Check in Shopify admin that fulfillment orders are assigned to Pipe17. Use the manual action Pull orders from Shopify by ID to test a specific order.
Fulfillments are not being pushed to Shopify Flow disabled; unsupported fulfillment type; duplicate tracking number; fulfillment order already closed Verify Push fulfillments to Shopify is on. Confirm fulfillment type is accepted or rejected. Check integration logs for fulfillments:apply:order:exist:tracking warning (duplicate tracking detected). Verify the Shopify fulfillment order is still open.
Inventory is not updating in Shopify Flow disabled; SKU is untracked or a bundle; SKU excluded by filter; inventory increase blocked outside resync hours; SKU not activated at target location Verify Process inventory updates is on. Check that the SKU is tracked in Shopify and is not a bundle (requiresComponents). Review inventorySKUsExclude patterns. If Increase Shopify inventory only during dedicated hours is on, increases outside 12 AM–2 AM PST are blocked by design. Check logs for inventory:update:query:failed if auto-activation failed.
Cancellation requests are not being handled Orders.in flow disabled; Shopify fulfillment order moved out of CANCELLATION_REQUESTED status before Pipe17 polled Ensure Pull orders from Shopify is enabled. Check integration logs for orders:poll:item:cancel entries to see whether the cancellation was accepted, rejected, or missed.
Authorization timed out OAuth not completed within 15 minutes of integration creation; wrong Shopify store connected; pop-up blocker active Delete and recreate the integration to restart OAuth. Before reconnecting, go to apps.shopify.com and switch to the correct store. Disable pop-up blockers in your browser.
Duplicate tracking number warnings in logs Tracking number already exists on a previous Shopify fulfillment for the same order This is expected behavior. Pipe17 detects duplicates and logs fulfillments:apply:order:exist:tracking. The fulfillment is still submitted unless the duplicate spans more than one fulfillment record.

Need Help?

If you need additional assistance:

We're here to help you succeed with your operations.

Was this article helpful?
0 out of 0 found this helpful

Comments

0 comments

Article is closed for comments.

Have more questions?
Submit a request
Share it, if you like it.