The Shopify connector enables integration between your Shopify storefront and Pipe17. Shopify is a leading cloud-based eCommerce platform supporting direct-to-consumer and wholesale sales, with built-in order management, product catalog, and inventory tracking.
Key capabilities:
- Pull orders from Shopify into Pipe17 for routing and fulfillment
- Push fulfillment confirmations and tracking back into Shopify
- Pull fulfillments from Shopify into Pipe17
- Push orders from Pipe17 into Shopify
- Sync inventory levels from Pipe17 into Shopify to keep stock counts accurate
- Detect cancellations in Shopify and update Pipe17 order statuses accordingly
- Sync returns between Pipe17 and Shopify in both directions
- Pull payout statements from Shopify into Pipe17
Supported API version: Shopify REST Admin API 2024-10
Authentication: OAuth
Rate limits: 2 requests/sec REST (leaky bucket, 40-request burst), 1,000 points/sec GraphQL
Setup
Prerequisites
Before configuring the connector, ensure you have:
- A Shopify store on the Basic plan or higher.
- A Shopify account with Owner permissions or the Apps and sales channels staff permission.
- Your store's myshopify.com subdomain (e.g.,
yourstore.myshopify.com).
Steps
1. Start the OAuth flow
- In Pipe17, navigate to Integrations → Add Integration.
- Select Shopify from the catalog.
- Enter your Store URL (e.g.,
yourstore.myshopify.com) and click Connect. - You will be redirected to Shopify to authorize the Pipe17 app. Log in with an account that has Owner or Apps permissions.
- After approving the required scopes, you will be redirected back to Pipe17. The connection is created automatically - no manual token entry is required.
If you have multiple Shopify stores, you can repeat this process to connect additional stores.
2. Configure webhooks in Shopify
- The connector automatically registers the required webhooks on first save.
- To verify, go to Shopify Admin → Settings → Notifications → Webhooks.
- If webhooks are missing, re-save the connector to re-register them.
You can read more about staff permissions on Shopify's help documentation.
Settings
Connection settings
| Setting | Description | Default |
|---|---|---|
| Store URL | Your Shopify store's myshopify.com domain (e.g., yourstore.myshopify.com). Set automatically after OAuth - read-only. |
None |
Integration settings
Orders
| Setting | Description | Options / Default |
|---|---|---|
| Exclude orders created before this date | Orders created before this date are not pulled into Pipe17. If left blank, the default is the date the integration was created. | Date/time field; defaults to integration creation date |
| Process only regular Shopify orders, POS Shopify orders, or both types of orders from Shopify | Controls which Shopify order types the app ingests. | Regular orders / POS orders / Both; default: Regular orders |
| Process only orders assigned to specific channels in Shopify | Restricts order ingestion to specific Shopify sales channels. Leave blank to pull from all channels. | Text field; blank = all channels |
| Never process orders matching following Shopify note attributes values | Orders with note attributes matching any value in this list are excluded. Each element is an attribute name and match pattern separated by a semicolon. | Text field |
| Process only orders with specific order ID patterns | Restricts ingestion to orders whose IDs match the specified patterns. Pure string value = precise match (case-insensitive); string wrapped in / / = regex pattern. |
Text field |
| Process only orders with following financial statuses | Limits ingestion to orders with the specified Shopify payment statuses. If blank, only paid, refunded, and partially refunded orders are pulled. | Multi-value tag field; default: paid, refunded, partially refunded |
| Process only orders with following fulfillment statuses | Limits ingestion to orders with the specified Shopify fulfillment statuses. If blank, orders of any fulfillment status are pulled. | Multi-value tag field; blank = all statuses |
| Process only orders assigned following tags | Only orders carrying these Shopify tags are pulled. If left blank, all orders are pulled. | Text field; blank = all orders |
| Only process line items with unmatched SKUs | Pulls only line items whose SKUs do not exist in Pipe17's catalog. Pure string = precise match (case-insensitive); string wrapped in / / = regex pattern. |
Regex/string field |
| Never process line items with matched SKUs (regex) | Excludes line items whose SKUs match the specified pattern. | Regex/string field |
| Pull only orders allocated to warehouses tied with fulfillment locations in Pipe17? | When enabled, only orders allocated to warehouses linked to Pipe17 fulfillment locations are pulled. | Toggle; default: off |
| Always pull Amazon Buy with Prime orders | When on, orders containing Prime line items are pulled without a warehouse allocation check. | Toggle; default: off |
| Adjust order line item price when taxes are reported as included in price by Shopify | When enabled, the app adjusts line item prices to back out tax amounts reported as included by Shopify. | Toggle; default: off |
| Pull payments information available for Shopify orders | When enabled, payment details associated with Shopify orders are pulled into Pipe17. | Toggle; default: off |
| Collect localized fields for orders when order shipping country is not in the list below | Pulls localized order fields when the shipping country is outside the specified list. Empty value means localized fields are collected for all orders. | Country code list field; default: US |
| Fetch company profile while pulling orders from Shopify | When enabled, the company profile associated with each order is fetched from Shopify during order ingestion. | Toggle; default: off |
| Update Shopify order note with a link to the Pipe17 order page | When enabled, the app appends a link to the corresponding Pipe17 order page in the Shopify order note field. | Toggle; default: off |
| Apply following tag to Shopify order, when order is successfully created in Pipe17 | This tag is added to the Shopify order when the order is successfully ingested into Pipe17. | Text field; default: pipe17_accepted
|
| Apply following tag to Shopify order, when order is sent to fulfillment in Pipe17 | This tag is added to the Shopify order when the order is sent to fulfillment in Pipe17. | Text field; default: pipe17_routed
|
| Apply following tag to Shopify order, when order is cancelled in Pipe17 | This tag is added to the Shopify order when the order is cancelled in Pipe17. | Text field; default: pipe17_cancelled
|
| Push order tags updates from Pipe17 to Shopify | When enabled, tag changes made in Pipe17 are pushed back to the corresponding Shopify order. | Toggle; default: off |
| Automatically resolve conflicts caused by duplicate customer email or phone while pushing orders to Shopify | When enabled, the app resolves duplicate email or phone conflicts automatically when pushing orders to Shopify. | Toggle; default: off |
| Automatically remove incorrect values for customer email and/or phone while pushing orders to Shopify | When enabled, invalid email or phone values are stripped before orders are pushed to Shopify. | Toggle; default: off |
| Split shippable order lines according to Fulfillment Order(s) statuses in Shopify | When enabled, shippable line items are split based on Shopify Fulfillment Order statuses. | Toggle; default: off |
| Collect delivery method information according to Fulfillment Order(s) in Shopify | When enabled, delivery method details are collected from Shopify Fulfillment Orders. | Toggle; default: off |
| Update Shopify fulfillment order structure to reflect Pipe17 shipments | When enabled, the Shopify fulfillment order structure is updated to match how Pipe17 has split and routed shipments. | Toggle; default: off |
| Only allow order updates for orders with a matching Pipe17 order status | Restricts outbound order updates to orders that have one of the specified Pipe17 statuses. If blank, updates apply to orders in any status. | Multi-value tag field; e.g., draft, new, onHold, toBeValidated, reviewRequired, readyForFulfillment |
Outbound orders matching
| Setting | Description | Options / Default |
|---|---|---|
| Apply rules below only to orders with matching Pipe17 status | Scopes the outbound order rules to orders with the specified Pipe17 statuses. Only orders with the specified statuses are processed. | Text field; blank = all statuses |
| Apply rules below only to orders with matching Pipe17 order sources | Scopes the outbound order rules to orders originating from the specified Pipe17 sources. Empty value matches any order source; specific source value defines a precise match; regex pattern can be wrapped in / / (e.g., /tagValue/). |
Text field; blank = all sources |
| Apply rules below only to orders with matching Pipe17 tags | Scopes the outbound order rules to orders carrying the specified Pipe17 tags. Empty value matches any order tag; specific value defines a precise match; regex pattern can be wrapped in / /. |
Text field; blank = all tags |
Order flow
| Setting | Description | Options / Default |
|---|---|---|
| Matched orders should be pushed to Shopify for fulfillment process | Matched orders are sent to Shopify to initiate the Shopify fulfillment process. | Radio button |
| Matched orders should be pushed to Shopify for order tracking | Matched orders are sent to Shopify for tracking purposes only, without initiating fulfillment. | Radio button |
| Once order is pushed to Shopify, mark it as 'sentToFulfillment' in Pipe17 | When enabled, the order status in Pipe17 is updated to sentToFulfillment as soon as it is pushed to Shopify. |
Toggle; default: off |
| Default orders location | The default Shopify location matched orders are pushed to. | Dropdown |
| Hold & release fulfillment orders in Shopify according to Pipe17 order status | When enabled, Shopify fulfillment orders are held or released based on the corresponding Pipe17 order status. | Toggle; default: off |
| Allow applying updates to orders in Shopify | When enabled, subsequent updates to orders in Pipe17 are applied to the corresponding orders in Shopify. | Toggle; default: off |
Fulfillments
| Setting | Description | Options / Default |
|---|---|---|
| Disable sending shipping notification for specific Shopify order ID patterns | Suppresses the Shopify shipping notification for orders whose IDs match the specified pattern. Pure string = precise match (case-insensitive); string wrapped in / / = regex pattern. |
Regex/string field |
| Allow swap to actual fulfillment locations | When enabled, the app swaps fulfillment location assignments to reflect the actual locations used during fulfillment. | Toggle; default: off |
| Allow pulling fulfillments for orders originated in Shopify and fulfillable in Pipe17 | When enabled, fulfillments for Shopify-originated orders that can be fulfilled in Pipe17 are pulled into the app. | Toggle; default: off |
| Cancel order line items in Shopify for rejected fulfillments | When enabled, line items are cancelled in Shopify when their associated fulfillment is rejected in Pipe17. | Toggle; default: off |
| Cancel order line items in Shopify for canceled shipping requests | When enabled, line items are cancelled in Shopify when their associated shipping request is cancelled in Pipe17. | Toggle; default: off |
| Cancel order in Shopify when all order line items are canceled | When enabled, the entire Shopify order is cancelled once all its line items have been cancelled. | Toggle; default: off |
Returns
| Setting | Description | Options / Default |
|---|---|---|
| Only pull returns with shipping information defined in Shopify | When enabled, only returns that include shipping details in Shopify are pulled into Pipe17. | Toggle; default: off |
| Only pull returns associated with fulfillable location in Pipe17 | When enabled, only returns linked to a fulfillable Pipe17 location are pulled. | Toggle; default: on |
| Pull returns only created with following Shopify Apps | Restricts return ingestion to returns created by the specified Shopify apps. Pure string = precise match (case-insensitive); string wrapped in / / = regex pattern. |
Text field; blank = all apps |
| Pull returns not created with following Shopify Apps | Excludes returns created by the specified Shopify apps. Pure string = precise match (case-insensitive); string wrapped in / / = regex pattern. |
Text fiel |
Products
| Setting | Description | Options / Default |
|---|---|---|
| Apply product updates only for specific SKUs | Restricts product sync to SKUs matching the specified values. Pure string = precise match (case-insensitive); string wrapped in / / = regex pattern. |
Text field; blank = all SKUs |
| Apply product updates only for products with specific tags | Restricts product sync to products carrying the specified Shopify tags. Pure string = precise match (case-insensitive); string wrapped in / / = regex pattern. |
Text field; blank = all products |
| Apply product updates only for products with specific types | Restricts product sync to products of the specified types. | Multi-value tag field; options: Parent, Child, Simple |
| Use following Pipe17 product price names as product 'Price' in Shopify | Specifies which Pipe17 price name is mapped to the 'Price' field in Shopify. Pipe17 uses this name when pushing price updates. | Text field; default: price
|
Inventory
| Setting | Description | Options / Default |
|---|---|---|
| Apply inventory updates only for SKUs matching following patterns | Restricts inventory sync to SKUs that match the specified patterns. Pure string = precise match (case-insensitive); string wrapped in / / = regex pattern. |
Text field; blank = all SKUs |
| Apply inventory updates only for SKUs not matching following patterns | Restricts inventory sync to SKUs that do not match the specified patterns. | Text field |
| Apply inventory updates only for products matching following tags | Restricts inventory sync to products carrying the specified tags. Pure string = precise match (case-insensitive); string wrapped in / / = regex pattern. |
Text field; blank = all products |
| Apply inventory updates only for products not matching following tags | Restricts inventory sync to products that do not carry the specified tags. | Text field |
| Enable periodic inventory reconciliation between 12:00AM PST – 2:00AM PST | When enabled, the app runs a scheduled inventory reconciliation job nightly during the 12:00AM–2:00AM PST window. | Toggle; default: off |
| Increase Shopify inventory only during dedicated hours between 12:00AM PST – 2:00AM PST | When enabled, inventory level increases are only pushed to Shopify during the 12:00AM–2:00AM PST window. Pipe17 will not post increased inventory levels outside these hours. | Toggle; default: off |
| Force inventory resync | Triggers a full inventory resync between Pipe17 and Shopify. | Toggle |
Statements
| Setting | Description | Options / Default |
|---|---|---|
| Exclude Statements created before this date | Statements created before this date are excluded from processing. | Date field |
Flows
Orders in: Pipe17 ← Shopify
Pulls new and updated orders from Shopify into Pipe17 for routing and fulfillment.
Trigger: Shopify webhook (orders/create, orders/updated) with polling fallback every 15 minutes.
- Only orders matching the Order financial status filter setting are imported
- Orders can be further filtered by type, sales channel, note attributes, and creation date using the corresponding settings
- Orders containing unrecognized product variants are flagged for review in Pipe17
- Shopify draft orders are excluded unless explicitly converted to orders in Shopify
Orders out: Pipe17 → Shopify
Pushes orders from Pipe17 into Shopify.
Trigger: Pipe17 poll for orders designated for outbound push to Shopify.
Fulfillments out: Pipe17 → Shopify
Pushes Pipe17 fulfillment records back into Shopify, marking orders as fulfilled and adding tracking information.
Trigger: Pipe17 poll for fulfillment records linked to Shopify orders in fulfilled status.
- Partial shipments create partial fulfillments in Shopify, one per shipment
- Tracking number and carrier are mapped from the Pipe17 fulfillment record
- Customer shipping notifications can be suppressed per order using the Disable sending shipping notification for specific Shopify order ID patterns setting
Fulfillments in: Pipe17 ← Shopify
Pulls fulfillment records from Shopify into Pipe17.
Trigger: Shopify webhook (fulfillments/create, fulfillments/update) with polling fallback.
- Useful when fulfillments originate in Shopify or a Shopify-native fulfillment app rather than being pushed from Pipe17
Inventory out: Pipe17 → Shopify
Pushes current inventory quantities from Pipe17 into Shopify by location.
How it works:
- Pipe17 computes the available quantity per SKU per fulfillment location
- Inventory levels are read via the Shopify REST
inventory_levelsendpoint - Quantity updates are applied using GraphQL-based quantity resolution
Scheduling: Syncs run every 15 minutes by default. Use Force Inventory Resync to trigger an immediate full update outside the normal schedule.
- Use the Apply inventory updates only for SKUs matching following patterns setting to limit updates to specific products
- Inventory is location-aware - each Shopify location must be mapped to a Pipe17 fulfillment node
Manual action: Pull orders by ID
The connector supports an on-demand action (orders.in.by.id) to pull one or more specific Shopify orders immediately, without waiting for the next scheduled poll. Use this to recover a missed order or reprocess an updated one.
Returns in: Pipe17 ← Shopify
Pulls return requests initiated in Shopify into Pipe17.
Trigger: Shopify webhook for return events with polling fallback.
- Both full and partial returns are supported
- Restocked line items are reflected in Pipe17 inventory adjustments if restock is enabled in Shopify
Returns out: Pipe17 → Shopify
Pushes return requests from Pipe17 into Shopify.
Trigger: Pipe17 poll for return records designated for Shopify.
Locations in: Pipe17 ← Shopify
Pulls Shopify fulfillment location data into Pipe17 to support inventory and fulfillment mapping.
Trigger: Vendor poll against Shopify's locations endpoint.
Cancellations in: Pipe17 ← Shopify
Detects orders canceled in Shopify and updates the corresponding Pipe17 order status.
Trigger: Shopify webhook (orders/cancelled) with polling fallback.
- When a cancellation is detected, the Pipe17 order is updated to the status configured in the Fulfillment canceled action setting
- Default status applied is
canceledRestock - Available statuses:
reviewRequired,canceled,canceledRestock,failed - Partial cancellations (line-item level) are not supported - the entire order status is updated
Statements in: Pipe17 ← Shopify
Pulls Shopify Payments payout statement data into Pipe17.
Trigger: Vendor poll against Shopify's payouts endpoint.
- Requires the
read_shopify_payments_payoutsscope - Only available for stores using Shopify Payments as their payment provider
Troubleshooting
Connection test fails
| Symptom | Likely cause | Resolution |
|---|---|---|
| OAuth authorization error | Insufficient permissions to install the app | Ensure you are logged into Shopify as an Owner or a staff account with Apps and sales channels permission |
| Store not found | Incorrect Store URL format | Confirm the URL is formatted as yourstore.myshopify.com with no https:// prefix or trailing slash |
| Forbidden error after OAuth | Token missing required OAuth scopes | Reinstall the app via the OAuth flow to reauthorize with the current full scope set |
Orders not appearing in Pipe17
- Confirm the order's financial status matches one of the values in the Order financial status filter setting - the default includes
paid,partially_refunded, andrefunded - Check whether the Order ID filter, Order types, Order channels, or Order note attribute exclusions settings are active and inadvertently excluding orders
- Check whether
orders.in.filter.sinceis set to a date that excludes the orders you expect - Verify webhooks are registered under Shopify Admin → Settings → Notifications → Webhooks - re-save the connector if any are missing
- Review Pipe17 error logs for import validation failures; the log will indicate which field or variant was rejected
Fulfillments not pushing to Shopify
- Confirm the Pipe17 fulfillment record status is
fulfilled- records in other statuses will not be pushed - Check that the Shopify order has not already been fully fulfilled or canceled - Shopify will reject fulfillment requests for closed orders
- Verify the tracking carrier value in Pipe17 maps to a carrier recognized by Shopify
- Ensure the fulfillment location in Pipe17 is correctly mapped to a valid Shopify location; use fulfillmentSwapLocations if IDs differ
Fulfillments not pulling from Shopify
- Confirm the
fulfillments/createandfulfillments/updatewebhooks are registered in Shopify Admin → Settings → Notifications → Webhooks - Verify the originating Shopify fulfillment is associated with an order that was imported into Pipe17 - fulfillments for unknown orders will be skipped
Inventory counts are incorrect in Shopify
- Inventory sync runs on a 15-minute schedule; use Force Inventory Resync to trigger an immediate update
- If you only need to update specific products, use the Inventory SKUs setting to scope the sync
- Check that the Pipe17 fulfillment node is correctly mapped to the target Shopify location - mismatched locations update the wrong stock level
- Confirm the token has
write_inventoryscope - a missing scope causes silent failures on inventory updates
Cancellations not reflecting in Pipe17
- Confirm the Fulfillment canceled action setting is configured to the intended target status
- Verify the order was fully canceled in Shopify, not just placed on hold or partially refunded - partial cancellations do not trigger the cancellation flow
- Check that the
orders/cancelledwebhook is registered in Shopify Admin
Returns not syncing
- For returns in: confirm the return-related webhooks are registered in Shopify Admin → Settings → Notifications → Webhooks
- Verify the original order exists in Pipe17 - returns for orders not imported into Pipe17 will be skipped
- For returns out: check Pipe17 error logs for mapping failures; confirm the
write_returnsscope was granted during OAuth
Request limit errors
Rate limit retries are handled automatically - the connector backs off and retries based on Shopify's REST and GraphQL rate limit headers. If you are consistently hitting limits, reduce the frequency of manual actions or avoid triggering bulk inventory resyncs during peak order volume periods.
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