Before you start
You'll need three things. If any are missing, line them up first — pausing halfway through to hunt a password will make this feel harder than it is.
- Shopify admin access to the store you're connecting (not just staff access — you need permission to install custom apps).
- At least one Ops2Sell warehouse configured. If you haven't done that yet, finish the warehouse guide first — channel orders have nowhere to land otherwise.
- Decide whether Ops2Sell is the source of truth for stock or Shopify is. Most merchants flip this to Ops2Sell after a week or two, but there's no harm starting read-only and promoting later.
Step 1 · Enable custom apps in Shopify
In Shopify admin, go to Settings → Apps and sales channels → Develop apps. If this is the first custom app on the store, click Allow custom app development, read the banner, and confirm. Then click Create an app.
Name the app Ops2Sell. The developer email can be yours — it's used for security notifications, not anything customer-facing.
Step 2 · Grant the access scopes Ops2Sell needs
On the new app's Configuration tab, click Configure Admin API scopes. Tick the following:
- Products — read_products, write_products
- Inventory — read_inventory, write_inventory
- Orders — read_orders, write_orders
- Fulfillments — read_fulfillments, write_fulfillments (for pushing tracking numbers back)
- Locations — read_locations (we map these to your Ops2Sell warehouses)
- Customers — read_customers (optional — only needed if you want Customer Analytics to show repeat-buyer data)
Do not grant any scope marked "deprecated" or the full read_all_orders scope unless Shopify specifically asks for it — the narrower scopes above cover every feature.
Save, then go to the API credentials tab and click Install app. Shopify will generate an Admin API access token. It starts with shpat_ and is shown once — copy it to your clipboard now.
Step 3 · Add the channel in Ops2Sell
In Ops2Sell, go to Channels → Add channel → Shopify. Paste:
- Store URL — the
.myshopify.comaddress (not your custom domain). Ops2Sell will normalise it. - Admin API access token — the
shpat_...token from Step 2. - Webhook secret — leave blank; Ops2Sell generates one when you save and registers the webhook automatically.
Click Test connection. If you see "Connected — 12 products visible" (or similar), the token works. If you get a 401, re-check the token. A 403 usually means a scope is missing — double-check Step 2.
Step 4 · Map warehouses to Shopify locations
Shopify has its own concept of "locations" — one for each physical place stock lives. Ops2Sell mirrors this: each Shopify location maps to exactly one Ops2Sell warehouse.
On the channel's detail page, you'll see a table of your Shopify locations. Pick the Ops2Sell warehouse each should sync with. If you only have one warehouse, this is a one-click mapping; with multi-warehouse setups, make sure every Shopify location has a mapping — orders that reference an unmapped location won't sync.
Step 5 · Run the first sync
Click Sync now → Products. Ops2Sell pulls products in pages of 250. For a catalogue under ~2,000 SKUs this takes well under a minute. Larger catalogues run in the background — refresh the page when the status bar says "Completed".
Once products are in, click Sync now → Orders. By default Ops2Sell pulls the last 30 days of orders; adjust the lookback in Channel settings → Order sync if you want history further back.
Step 6 · Verify it worked
You should now see:
- Products page — your Shopify SKUs with a Shopify badge, stock levels per warehouse, and the Shopify product URL on each detail page.
- Orders page — recent orders with a Shopify source, the Shopify order number as external ref, and matching line items.
- Integration Health widget on the dashboard — "Shopify · Connected · Last sync <2 min ago".
To prove the webhook is live, place a 1 GBP test order in Shopify (or a free-gift order you can cancel). Within 10 seconds it should appear in Ops2Sell with status received. If it takes longer than 60 seconds, Shopify couldn't reach the webhook — check Settings → Notifications → Webhooks in Shopify for delivery errors.
Turning on stock sync back to Shopify
By default the channel is read-only — Ops2Sell pulls from Shopify but doesn't push anything except tracking numbers back. To make Ops2Sell the stock source of truth:
- On the channel detail page, toggle Stock sync → on. Pick a safety buffer (default 2 units) and the warehouses to publish from.
- After the first push, watch a product's inventory in Shopify's UI for 2–3 minutes. It should settle to (Ops2Sell available) − (buffer). If Shopify rejects the write, a red pill appears in Integration Health with the error.
Important: once you flip this on, edits made directly in Shopify's product page for stock levels will be overwritten on the next sync tick. If your team is used to editing stock in Shopify, retrain them to do it in Ops2Sell first.
Common issues
- "401 Unauthorized" during test connection — the token is wrong or was regenerated. Re-install the custom app in Shopify and paste the new token.
- Orders sync but products don't match — Shopify SKUs have channel prefixes like
SHP-ABCthat differ from your Ops2Sell SKUs. Go to Products → Review duplicates and merge. Ops2Sell also offers per-channel SKU aliases on the product detail page. - Stock pushes are rejected for one product — that product is probably not tracked by inventory in Shopify. Edit the Shopify variant and tick Track quantity.
Next
With Shopify wired up, connect a carrier so outbound orders get labels and tracking back into Shopify automatically.
Royal Mail guide