For Shopify merchants and app reviewers
ShipFlow for Shopify
ShipFlow is a warehouse management system operated by third-party logistics warehouses. The Shopify app connects a merchant's store to the warehouse that ships for them: fulfillment requests become warehouse orders, and shipments with tracking and stock levels go back to the store.
What the app does
- The merchant installs the app from their warehouse's ShipFlow portal using Shopify OAuth. The app requests an expiring offline access token and stores it encrypted; the token is refreshed before it expires and never leaves the warehouse's server.
- On install, ShipFlow registers itself as a fulfillment service in the store, which creates a location representing the warehouse, and subscribes to the webhooks listed below.
- When the merchant requests fulfillment of an order assigned to the warehouse location, ShipFlow accepts the request and creates a warehouse order. Line items are matched to warehouse items by SKU or barcode; anything that cannot be matched is held for the warehouse team, never guessed.
- Edits to the order are applied while nothing has been picked. Cancellation requests are accepted until picking starts, and rejected with a reason afterwards.
- When the warehouse ships, ShipFlow creates the fulfillment through the fulfillment order, with tracking number, carrier and the exact lines and quantities shipped. Partial shipments create partial fulfillments.
- Available stock at the warehouse location is pushed to Shopify when it changes. Inventory is never read from Shopify into the warehouse.
Access scopes and why each is needed
| Scope | Why the app needs it |
|---|---|
read_orders | Read the order behind a fulfillment request: order name, email, phone, note, shipping method and line items (SKU, title, price). Fulfillment-order line items carry no SKU or title, so the order is the only place to read them. |
write_fulfillments | Create the fulfillment when the warehouse ships, with tracking number, carrier and the exact fulfillment-order lines and quantities shipped (partial fulfillments included). |
read_products | Pull products and variants to link each variant to a warehouse item by SKU or barcode, and to keep the variant and inventory item ids used for stock updates. |
write_inventory | Set the available quantity at the warehouse location when stock changes in the warehouse. Inventory flows from the warehouse to Shopify only. |
read_locations | Find the location created for the warehouse's fulfillment service and route stock updates and fulfillment orders to it. |
write_merchant_managed_fulfillment_orders | Register the warehouse as a fulfillment service (which creates its location) and receive fulfillment orders assigned to it. |
read_assigned_fulfillment_orders | List fulfillment orders assigned to the warehouse location, including pending fulfillment and cancellation requests. This is the safety-net poll for a missed webhook. |
write_assigned_fulfillment_orders | Accept or reject fulfillment requests and cancellation requests on fulfillment orders assigned to the warehouse. Shopify only lets the service that accepted a request create its fulfillment. |
The app requests no scope it does not use. It does not read customers, discounts, price rules, payments, themes, content or analytics.
Data handled
- Order data for orders the merchant asks the warehouse to fulfil: order name, fulfillment-order id and line items, ship-to name, company, address, phone and email, shipping method, note. Used only to pick, pack, ship and prove the order.
- Product data: product and variant titles, SKUs, barcodes, variant and inventory item ids. Used to match items and update stock.
- Store data: the store domain, the fulfillment service and location ids, webhook subscription ids and the access token (encrypted at rest).
- Data is stored in the warehouse's ShipFlow tenant, isolated per client, in a US-hosted database, and is visible only to the warehouse's staff and to the merchant through their portal login.
- Nothing is sold, shared with advertisers or used to build profiles. Sub-processors are listed in the privacy policy.
Uninstall and compliance webhooks
The app subscribes to app/uninstalled. On uninstall the connection is disabled at once: no further orders are pulled and nothing is sent to the store. Existing warehouse orders are kept so the warehouse can finish or reconcile them.
The three mandatory compliance webhooks are served at these endpoints, verified with the app secret over the raw body (an invalid HMAC is answered with 401), acknowledged with 200 and processed by a background job:
| Topic | Endpoint | What ShipFlow does |
|---|---|---|
customers/data_request | https://api.3pltechflow.com/api/integrations/shopify/compliance/customers-data-request | Logs the request and lists the warehouse orders for that customer so the warehouse can provide them to the merchant. No customer data is held beyond those orders. |
customers/redact | https://api.3pltechflow.com/api/integrations/shopify/compliance/customers-redact | Anonymises the customer's name, address lines, phone, email and notes on the listed orders and strips the ship-to from the intake records, within the 30-day window. City, state, postal code and country remain for freight reporting. |
shop/redact | https://api.3pltechflow.com/api/integrations/shopify/compliance/shop-redact | Anonymises every order that came from the store, removes item links and unmatched-item records for the connection, and deletes the stored access token. |
Each request and what was done is recorded and visible to the warehouse and, for their own store, to the merchant in the portal.
Support
Merchants are supported by their warehouse first; the warehouse is supported by 3PL TechFlow at support@3pltechflow.com. See also the privacy policy, the terms of service and the security overview.