JAI CRM
Home Documentation Integrations Shopify

Shopify

Products, stock, orders and fulfilment both ways — and the two decisions that can take a storefront down if you guess at them.

This keeps a Shopify shop and this business in step: collections, products, locations, vendors, checkout buyers and orders come in; stock levels and fulfilment go back out. Each half is a switch, so you can take only what you want.

Two settings here are not obvious and cannot be guessed for you: whether your stock figures are good enough to overwrite what the storefront believes it has, and whether product photographs live on Shopify’s servers or on this one. Both default to the safe answer. Both are explained below before you meet them.

Settings, Shopify. A card for the shop address and access token with Test the connection and its own Save, the scopes the app needs, and a list of what to sync: collections, products, locations, vendors, customers and orders, each with its own switch.
Connect the shop first, then choose what crosses between it and here.

Shopify is an integration, free on every plan that has Inventory. Its screen is reached from Settings → Integrations: press Set up on the Shopify card. On a plan without Inventory the card says Needs Inventory instead, because there would be no items for the products to become.

Connecting the shop

  1. In Shopify: Settings → Apps and sales channels → Develop apps.
  2. Create an app, configure the Admin API scopes it lists on this screen, then install it.
  3. Shopify shows the access token once. Copy it then.
  4. Back here, enter the shop address, your-shop.myshopify.com, and paste the token. It starts with shpat_. It is stored encrypted and never shown again in full.
  5. Press Save on that card. Saving tests the connection straight away: it answers with the shop it reached, which is also how the location list below gets filled in. Test the connection runs the same check again at any time.

Two of the scopes are write scopes, and they are used for exactly two things: pushing stock, and marking an order fulfilled. Leave them off and everything else still works — which is a reasonable way to start.

Each card on this screen has its own Save. A card says Not saved yet until you press it, and saving one card sends only that card, so a change waiting on another card is left as it is.

If Shopify refuses the token

Test the connection says Shopify refused the access token when Shopify will not take what was saved. In order of how often it happens:

  1. The wrong value was pasted. The same Shopify page shows the API key and the API secret key (shpss_) as well as the access token. Only the Admin API access token, shpat_, works here. This screen refuses the secret key, and anything with a space in it, before saving.
  2. The scopes changed after the app was installed. Shopify applies new scopes only to a fresh install. Uninstall the app in Shopify, install it again, and paste the new token.
  3. The token is from another app or another shop. After saving, the box shows the last four characters of the saved token. Shopify shows the same four on the app’s API credentials. If they differ, it is not the same token.

Shopify shows a token once. If you no longer have it, uninstall the app and install it again: Shopify then shows a new one, once, and the old one stops working.

What to sync

SwitchWhat it doesWorth knowing
Collections → categoriesShopify collections become your categoriesShopify’s collections are flat, so Clothing > Shirts becomes Shirts under Clothing. A slash, a pipe or a dash between spaces works the same way; a hyphen inside a word does not, so T-Shirts stays one name
Products → itemsProducts become items, matched on SKUA product with options becomes a parent with one item per variant, each holding its own stock
Locations → warehousesShopify locations become warehousesMatched on name where one already exists, so you do not end up with two of the same warehouse
Product vendors → vendorsThe vendor named on a product becomes a vendor hereThey arrive in the pool, unapproved. Shopify does not vet them and neither should this
Checkout buyers → customersPeople who check out become customersMatched on email, then phone, so a repeat buyer does not become a second record
Orders → confirmed sales ordersShop orders arrive as sales ordersNo invoice and no payment — that decision stays yours

Matching on SKU is what holds all of this together. Products without a SKU on both sides cannot be matched, and a SKU typed differently in the two places makes two items out of one. It is worth an hour with a spreadsheet before switching products on.

How often, and the webhook

Check for changes every sets the sweep, from five minutes to a day. With a webhook, orders also arrive within seconds and the sweep is the safety net; without one, orders wait for the sweep.

The webhook is optional. To set it up:

  1. In Shopify, open Settings → Notifications → Webhooks and press Create webhook.
  2. Choose the event Order creation, format JSON, the address shown on the Orders within seconds card (https://app.jaicrm.ai/api/integrations/shopify/webhook) and the latest API version. Make a second one for Order update.
  3. That Shopify page says Your webhooks will be signed with a key. Paste that key into Webhook signing secret on the card, and press the card’s Save.

The key is the one on Shopify’s Notifications page, not the app’s API secret key. Webhooks made on that page are signed with that page’s key, and one signed with anything else is refused, because it cannot be told from somebody else posting to the address.

An order arrives as chooses Confirmed or Draft. Draft is the cautious start: nothing is committed until somebody looks.

Product photographs

Either way the pictures show on the item. What differs is who serves them, and what happens when a product is deleted from the shop.

ChoiceWhat happensChoose it when
Point at ShopifyNothing is copied. Fast, and uses no disk here — but if the product is deleted from Shopify, the picture goes with itThe shop is the source of truth and always will be
Keep a copy hereDownloaded onto this server. Survives the product being deleted and prints without a network, at the cost of diskPictures go on quotations and printed documents, or the catalogue changes often

Pushing stock: read this before switching it on

This is the one setting here that can take a live storefront down, so it is off until you turn it on and it says so rather than being switched on quietly with everything else.

The "Push stock levels to Shopify" card, switched off, with an amber warning that the first push overwrites what Shopify believes it has, then a row for a Shopify location with the warehouse that feeds it chosen, and Not saved yet beside Save.
The warning is the point of the card. The first push overwrites the storefront, in whichever direction your figures are wrong.

Once items are matched on SKU, this sends what is free to sell here to the shop, so it stops selling what you do not have. Stock reserved against an order is not offered — which is why the shop may show fewer than the item page does, and is the whole point of it.

The first push overwrites what Shopify believes it has. If your counts here are not right yet, that is an outage on your storefront — either it stops selling things you have, or it sells things you do not. Set your stock, check it against a shelf, and only then switch this on.

Each Shopify location has its own row: choose the warehouse whose stock it is told. The rows list the locations the sync has made warehouses of, and any that Test the connection finds. Pair them as the sync did fills each row with the warehouse of the same name. Choose Don’t push to this location to leave one alone, save the card, then switch the push on.

A warehouse feeds one location only. Feeding two would offer the same stock for sale twice, so the screen will not allow it.

On an item linked to Shopify, the line at the top says whether its stock is being sent, and from which warehouse to which location. With the push off it says so: Shopify then keeps its own count, which is why the two can differ.

If you never connect it

The shop and this business are two separate records of the same trade, reconciled by somebody at the end of the month. That works, and it is what most businesses did before. What it costs is the overselling — a storefront that cheerfully takes an order for the last one you sold over the counter this morning.

A worked example

Pixel Perfect Studios connect their shop with read scopes only, switch on products, customers and orders, and leave orders arriving as Draft. For a fortnight they watch orders appear and confirm them by hand, and fix eleven SKUs that did not match. Then they add the write scopes, set the warehouse and location, check a shelf against the item page, and switch on the stock push. The storefront stops overselling the same week.

Next in integrations IndiaMART → Just Dial →

Something missing or wrong here? Tell us. A question that needed asking usually means a page that needed writing.