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_methodscapability)
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:
- Shopify assigns fulfillment orders to Pipe17 when a merchant's order contains items managed by this service.
- Pipe17 polls Shopify for assigned fulfillment orders in
FULFILLMENT_REQUESTEDstatus and converts them into Pipe17 shipping requests (orders). - Shopify also sends
CANCELLATION_REQUESTEDsignals - Pipe17 handles these by accepting or rejecting the cancellation depending on the current shipment status in Pipe17. - 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.
- 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 Shopifytoggle - 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
ordersAcceptAutois enabled, Pipe17 automatically accepts every incoming fulfillment request in Shopify. -
ordersAcceptStatusesoperates independently ofordersAcceptAuto. When a Pipe17 order is updated and its status matches one of the listed values, Pipe17 accepts the corresponding Shopify fulfillment request — regardless of whetherordersAcceptAutois enabled.
Cancellation Request handling:
- If the Shopify fulfillment order is
IN_PROGRESS, Pipe17 accepts the cancellation request and marks the Pipe17 shipment ascanceled. - If the fulfillment order is not in progress, Pipe17 rejects the cancellation request.
- The Pipe17 order is marked
canceledif 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
inventoryTotalsLocationis set, all active Pipe17 locations are aggregated into a single Shopify location. - Update mode controls whether
availableoron_handquantities 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
ordersCloseStatusesincludescanceled(and/orpartialFulfillment). - If the Shopify fulfillment order is
IN_PROGRESS, Pipe17 closes it with the message "Cancelled in Pipe17." - If the fulfillment order is already
INCOMPLETEorCLOSED, 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: canceled, partialFulfillment. |
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:
- Use Ask Pippen, our AI agent, located at the top of the app page.
- Submit a support request with as much relevant detail as possible. Learn how to submit a request.
- For urgent issues, email us directly at support@pipe17.com.
We're here to help you succeed with your operations.
Comments
0 comments