Shopify
The Shopify integration connects Endless Commerce to Shopify so product, order, inventory, and fulfillment data can move between the two systems.
Setting up the integration
New Shopify connections use OAuth: you approve access in Shopify, and Endless saves the access token and store address automatically. You do not enter an API token or store address in Endless.
Prepare the Shopify app
Ask Endless Support to prepare the app for your store. If you manage the app yourself, create it in Shopify’s Dev Dashboard, choose its distribution, configure the required permissions, and release the app version before installing it. See Shopify’s distribution guide.
Use these production settings:
| Setting | Value |
|---|---|
| App URL | https://api.endlesscommerce.com/shopify/install |
| Allowed redirection URL | https://api.endlesscommerce.com/shopify/callback |
| Embedded app | No |
For a sandbox connection, use api-sandbox.endlesscommerce.com for both URLs and prepare the integration in sandbox.endlesscommerce.com.
Configure the permissions for the features you use with Endless. Support can help choose them. Keep the app’s Client ID, Client secret, and Shopify installation link for the next step. Do not send the secret to the person installing the app.
API scopes
Configure these Admin API scopes in the Shopify app version before releasing it. This is the setup scope list for the integration; ask Endless Support about a smaller set if you use only some features.
read_assigned_fulfillment_orders,write_assigned_fulfillment_orders,read_companies,write_companies,read_customers,write_customers,read_price_rules,write_price_rules,write_draft_orders,read_draft_orders,read_fulfillments,write_fulfillments,write_inventory,read_inventory,write_locations,read_locations,read_merchant_managed_fulfillment_orders,write_merchant_managed_fulfillment_orders,write_order_edits,read_order_edits,read_orders,write_orders,read_product_listings,read_products,write_products,read_purchase_options,write_purchase_options,read_returns,write_returns,read_shipping,write_shipping,read_third_party_fulfillment_orders,write_third_party_fulfillment_orders
read_all_orders is deliberately excluded from this list. Add it only when you need orders older than 60 days, using Adding read all orders below. Endless uses the permissions configured in Shopify; saving app credentials in Endless does not add permissions.
Prepare the Endless integration
- Create a Shopify integration in Endless. You can save it with just a name and finish setup later.
- In its details, save the Shopify Client ID and Client secret.
- In Settings, save the Shopify installation link and select the sales channel for incoming orders.
- Select “Connect Shopify” to continue yourself, or “Copy connection link” to send an Endless connection link to the store owner.
Use one Endless integration per store, including when several Shopify Plus stores share the same app. Start each store’s installation from its own Endless integration or connection link.
Approve the connection
Open the Endless connection link, sign into the intended Shopify store, and approve the app’s access. Complete the process in the same browser. You do not need to be logged into Endless to use this link.
Shopify returns you to an Endless success page. You can log into Endless from there or contact Endless for login details. The integration shows the store address Shopify supplied; that address is read-only.
The copied Endless link expires after seven days. If it expires, copy a new one from the integration. For a new connection, send this Endless link rather than the raw installation link from Shopify: it identifies which Endless integration the store should connect to.
Reconnect or reinstall
Use “Connect Shopify” on the existing integration to authorize again, or copy a new connection link for the store owner. A working OAuth connection can reconnect without using the saved Shopify installation link.
If the app has been uninstalled, Endless needs a valid Shopify installation link to install it again. Ask whoever manages the Shopify app to replace an expired link in Settings, then start again from “Connect Shopify.” Keep the existing Endless integration to preserve its settings, mappings, and history.
Adding read all orders
Regular setup does not require read_all_orders. Add it when a customer needs to import orders created more than 60 days ago. It supplements read_orders or write_orders; keep those existing order permissions.
- Request approval for the app. In Shopify’s Partner Dashboard, open Apps, select the app, and open API access. Under Access requests, find Read all orders and select Request access. Explain why the app needs older orders and submit the request. Endless Support can handle this for apps we manage. See Shopify’s orders permission instructions.
- Wait for Shopify to approve the request before adding the scope. Selecting custom distribution alone does not replace this approval.
- In the Dev Dashboard, create a new version of the same app. Add
read_all_ordersto its required access scopes, keep the existing scopes, and release that version. Saving an unreleased version does not update the installed app. - Open the existing integration in Endless and select “Connect Shopify,” or use “Copy connection link” to send a fresh link to the store owner. Have them finish Shopify’s permission approval. You do not need to recreate or reset the integration.
- Run the historical import. Endless checks the permissions currently granted by Shopify before importing older orders. A successful connection by itself does not confirm that
read_all_orderswas granted.
If Shopify will not let you add the scope, check that approval was granted to the same app. If the import still reports missing access, check that the updated version was released and the store owner completed approval. Simply adding the scope to Shopify’s optional-scopes list does not grant it; the steps above use required scopes for the app that needs historical access.
If several stores share this Shopify app, changing its required scopes affects that shared app. Coordinate the change with the other stores.
See Shopify’s scope management guide for releasing permission changes and checking granted access.
Existing legacy connections
An integration labelled “Connected using a legacy Shopify app” continues using its saved token. You do not need to change a working connection, and the manual API Token field is no longer available.
When you need to replace or change that legacy authentication, ask Endless Support to prepare a new Shopify app for the same store. Save the new app’s Client ID, Client secret, and installation link on the existing integration, then select “Connect Shopify.” Endless uses OAuth after authorization, while keeping the integration’s settings, mappings, and history.
Do not reset the integration or remove the old Shopify app before the new connection succeeds.
Importing products from Shopify
If you have an integration configured with Shopify, you can run a one-time product import action. This will import all of your Shopify product data into Endless. To run this bulk import, navigate to Integrations and use the actions menu.
How the import tool works
The Shopify product import tool processes each product variant as a separate product in Endless. For each variant, the following rules apply:
- Each variant becomes its own product in Endless
- The product name is constructed by combining the Shopify product title with the variant title
- Every variant must have a unique SKU assigned in Shopify to be imported
- If a variant is missing a SKU, it will be skipped during import
Shopify product variants with the following attributes will also be skipped during import:
- Gift cards
- Shopify product variants that do not require shipping
- Shopify product variants with a Draft or Archive status
- Shopify product variants that meet the skip_by_tag or skip_by_type criteria as entered through the app
Understanding which data fields are mapped
When products are imported from Shopify into Endless, the following fields are populated:
| Field | Description | Source |
|---|---|---|
product_id | Unique identifier for the product | Generated UUID |
name | Product title | Shopify product title |
brand_id | Brand identifier | From Shopify integration settings |
sku | Stock keeping unit | From Shopify variant |
upc | Universal product code | From Shopify barcode |
price | Product price | From Shopify variant price |
status | Product status | Set to active |
weight | Product weight | Converted from Shopify’s weight measurement |
product_type | Type of product | From Shopify product type |
description | Product description | From Shopify product’s HTML description |
source | Source of the product | Set to SHOPIFY |
source_id | Source system identifier | Shopify variant ID |
source_updated_at | Last update timestamp | Shopify variant’s updated timestamp |
supplier | Product supplier | From Shopify product vendor |
Product images
Product images, including the featured image, are imported from Shopify.
Additional import details
Products are imported in batches of 50 at a time. If a last import timestamp exists in the integration logs, only products created after that timestamp will be imported. The import process is idempotent: existing products with the same SKU will be skipped.
- Duplicate prevention: The system checks for duplicate SKUs before importing.
- Timestamp tracking: Updates the last import and sync timestamps in the Shopify integration settings.
- Warehouse management: Creates warehouses if they do not exist for Shopify locations.
- External data: Sets up external product data to maintain the connection with Shopify.
Importing a single product
You can also import a single product at a time. To import a single product, open the integration and use the Import Product action. You will be prompted to enter the product ID and should use the product ID that is found in the URL of your Shopify admin.
Managing Shopify orders
Edit Sales Order products and quantities in Shopify. Manage Fulfillment Orders in Endless, including item assignments, splits, and building changes.
Shopify supplies the initial fulfillment plan. Later changes to that plan do not create, resize, move, or split Fulfillment Orders in Endless.
- When you add items or increase quantities, import the change and assign or route the unassigned quantities in Endless.
- When you reduce quantities, review the affected Fulfillment Orders. Existing fulfillment quantities, reservations, and Shipments do not change.
- Removed items appear in the Sales Order’s Removed section, with their original quantities when recorded.
“Reload Order” retrieves current Sales Order information and the latest Shopify fulfillment plan. Shopify updates can overwrite Sales Order fields edited in Endless.
Review and update the fulfillment plan
Select “View requested fulfillment plan” in the order’s source panel to review Shopify’s saved locations, items, and quantities. Order Signals identify differences from the Endless plan.
To send the Endless plan to Shopify, select “Update Fulfillments…” from the Actions menu. Before you send the update:
- Fulfillment quantities must match the Sales Order.
- Buildings must have matching Shopify locations.
- Shopify’s fulfillment state and remaining quantities must allow the changes.
If the update fails, check the order timeline.
See Managing Fulfillment Orders for the steps to update assignments and compare plans. See Orders connected to a source for source updates and Shipments for shipment reporting.