---
title: "Shopify integration: getting started"
description: "How to connect a Shopify store to Sapera: the Shopify app, setup and settings, choosing products, the first sync, orders, gift cards and troubleshooting."
url: https://support.sapera.io/en/articles/765-shopify-integration-getting-started
collection: "WebShop (guides)"
updated: 2026-11-08
language: en
alternates: [da]
---

# Shopify integration: getting started

How to connect a Shopify store to Sapera: the Shopify app, setup and settings, choosing products, the first sync, orders, gift cards and troubleshooting.

### In short

Sapera can be connected directly to a Shopify store, so you maintain your products in one place only. The integration works both ways:

-   **From Sapera to Shopify:** products, variants, prices, images, tags, webshop categories (as collections, if turned on) and stock are sent to Shopify.
    
-   **From Shopify to Sapera:** paid orders are imported and become sales orders.
    

Sapera is the master for products, prices and stock. Changes you make to these fields directly in Shopify are overwritten by the next sync.

<table data-id="b19e2912-0af3-435c-8643-e2a2e75f7c41" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="b0b4b4bd-f9f4-42a1-b6b5-40d25f939bcb" style="text-align: left;"><strong>What</strong></p></td><td colspan="1" rowspan="1"><p data-id="199745a5-3877-49cc-89e6-5d761edb88bd" style="text-align: left;"><strong>Direction</strong></p></td><td colspan="1" rowspan="1"><p data-id="116febeb-56ff-49d4-bf9b-65a87fc60301" style="text-align: left;"><strong>How often</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="9c32b5a1-6257-4dfb-a5d5-76d7bdfdc8cc" style="text-align: left;">Products, variants, prices, images and tags</p></td><td colspan="1" rowspan="1"><p data-id="9dbded61-cf5d-49b9-bfc0-f9eeac6e380a" style="text-align: left;">Sapera → Shopify</p></td><td colspan="1" rowspan="1"><p data-id="85848dfc-e169-4bc3-9467-cd7b1220966f" style="text-align: left;">When you synchronize, and about 20 seconds after a change when automatic sync is on</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="5fe6d171-a4f6-451f-b31a-d0a8e14a6e1e" style="text-align: left;">Webshop categories as Shopify collections (if <strong>Sync categories as collections</strong> is on)</p></td><td colspan="1" rowspan="1"><p data-id="8a1052b2-afd0-4e10-9d9b-819b48da8caa" style="text-align: left;">Sapera → Shopify</p></td><td colspan="1" rowspan="1"><p data-id="e4ba0d24-894a-475d-ba2a-91530b9bc85c" style="text-align: left;">With every product sync</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="199a5f98-bdcc-4e49-b4bf-4bc4d7c1d284" style="text-align: left;">Available stock</p></td><td colspan="1" rowspan="1"><p data-id="b3a85e9c-00c1-4345-881f-50e11b002c8f" style="text-align: left;">Sapera → Shopify</p></td><td colspan="1" rowspan="1"><p data-id="d356bc4b-0e46-4556-9e26-0f5115049b34" style="text-align: left;">With every product sync, and when stock changes</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="540649ae-57f8-4eca-9a1a-ac94ae3db3f0" style="text-align: left;">Paid orders</p></td><td colspan="1" rowspan="1"><p data-id="94ace3ee-e4f7-452e-88c8-0dd6d239520a" style="text-align: left;">Shopify → Sapera (as sales orders)</p></td><td colspan="1" rowspan="1"><p data-id="5fa11faa-56bd-41c4-890d-c0ecb483ccfb" style="text-align: left;">Every 3 minutes</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="14e012ff-0691-4598-b496-9d6e07f7fe38" style="text-align: left;">Fulfillment of orders</p></td><td colspan="1" rowspan="1"><p data-id="43b52902-ee1e-4272-944d-171700a4a676" style="text-align: left;">Sapera → Shopify</p></td><td colspan="1" rowspan="1"><p data-id="416ce0a0-a314-47c3-91b8-e74487a0c8ea" style="text-align: left;">When the sales order is completed in Sapera</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="a774b7fe-4080-40b9-9807-a6fd9dec0b74" style="text-align: left;">Gift cards and their balances</p></td><td colspan="1" rowspan="1"><p data-id="fb0bee80-b24a-4151-9e64-395e26a882cf" style="text-align: left;">Both ways</p></td><td colspan="1" rowspan="1"><p data-id="bd1151f7-42b4-4ee7-a082-00c396f0155b" style="text-align: left;">When a gift card changes in Sapera, and every 10 minutes from Shopify</p></td></tr></tbody></table>

* * *

### How to access the setup

From the hamburger menu in the top left corner, open **Financial**, and in the left menu choose **Webshop**. Here you find **Webshops** (the connection itself), **Webshop categories** (which products to sell) and, under **Shopify**, the **Synchronization operations** screen where you follow the sync.

If you cannot see the menu item, you probably do not have permission to it. Contact support.

* * *

### Before you start

-   A Shopify store on a plan that allows custom apps. To sell or sync gift cards, the plan must include gift cards; development stores do not.
    
-   The Shopify store must show prices **including VAT**. Orders from stores with prices without VAT are not imported.
    
-   In Sapera: the products you want to sell, an organizational unit that will own the sales orders, and (optional) a category with your shipping products.
    

#### Create the Shopify app

Sapera can connect to Shopify in two ways, chosen in the **Shopify app type** field on the webshop. New webshops use **Dev Dashboard app (Client ID and secret)**. Since 2026 Shopify no longer allows creating new custom apps in the store admin, so only use **Legacy custom app (Admin API access token)** if you already have such an app.

**Dev Dashboard app (recommended)**

1\. Create an app in the Shopify Dev Dashboard under the organization that owns the store, for example named "Sapera". The app must be created by the organization that owns the store. If the app was created as a custom app in the store admin, Shopify rejects the request.

2\. Select the same access scopes as listed below, and release a version of the app.

3\. Also give the app access to **protected customer data** (name, email, phone and address), because the order import uses the customer's details.

4\. Install the app on the store.

5\. Copy the **Client ID** and **Client secret** from the app's settings. The secret is entered in Sapera. Sapera fetches access tokens itself and renews them automatically, so you do not need to store a token.

**Access scopes**

Both app types use these access scopes:

-   **write\_products** – create and update products, variants, images and collections
    
-   **write\_inventory** – set available stock
    
-   **write\_publications** – publish products to a sales channel
    
-   **write\_files** – upload product images
    
-   **read\_locations** – read the store's stock locations
    
-   **read\_orders** – import orders
    
-   **write\_merchant\_managed\_fulfillment\_orders** – fulfill orders
    
-   **write\_gift\_cards** and **write\_gift\_card\_transactions** – sync gift cards
    

**Legacy custom app (Admin API access token)**

1\. In Shopify admin open **Settings → Apps**, click **Develop apps**, then **Create an app**, for example "Sapera".

2\. Under **Configuration → Admin API integration** select the same access scopes as listed above.

3\. Order import needs the customer's name, email and address, so also request access to **protected customer data** (name, email, phone, address) for the app.

4\. Install the app and copy the **Admin API access token** and the **API secret key**.

> Shopify shows the Admin API access token only once. Keep the token and the API secret key somewhere safe until you have entered them in Sapera.

* * *

### Connect the store in Sapera

Open **Webshops**, click **New Webshop** and fill in:

<table data-id="dd203d91-00f8-4825-9a07-ad19dfb62a8d" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="e5625d18-968f-4fb3-8342-50290e7960a2" style="text-align: left;"><strong>Field</strong></p></td><td colspan="1" rowspan="1"><p data-id="74aa38da-9f6e-46d0-8831-795bae4f209c" style="text-align: left;"><strong>What to enter</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="cea1243f-a007-46c8-a1a6-548b570cd778" style="text-align: left;">Name</p></td><td colspan="1" rowspan="1"><p data-id="fd54f454-a584-4009-86c3-70e0d84bf801" style="text-align: left;">Any name for the webshop.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="adba51e0-5bcc-4528-ad52-a233a016c026" style="text-align: left;">Webshop type</p></td><td colspan="1" rowspan="1"><p data-id="3522c332-1e27-4c9a-9124-e26e800ba000" style="text-align: left;"><strong>Shopify</strong>.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="155e4614-bf47-4d2f-88ee-8916ad1e8468" style="text-align: left;">Organizational unit</p></td><td colspan="1" rowspan="1"><p data-id="826ff296-a94d-4848-b2ea-f22c8c775c78" style="text-align: left;">The unit that owns the sales orders. Its prices are sent to Shopify, and its stock is used when no stock organizational units are selected.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="5443e399-1f62-4498-8f2d-ef2d97301915" style="text-align: left;">Automatic sync</p></td><td colspan="1" rowspan="1"><p data-id="fe0f13ff-3805-4f83-b5f2-9f12f884aa1b" style="text-align: left;">Turn on to send changes automatically and to import orders every 3 minutes. Turn it on after the first sync has been checked.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="9bac715c-b2df-4a65-a88e-6cd237597bfc" style="text-align: left;">Stock organizational units</p></td><td colspan="1" rowspan="1"><p data-id="81a13481-c128-43bb-9026-fa5a898d3961" style="text-align: left;">The units whose stock is offered in Shopify. Leave empty to use the organizational unit above.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="01e6f565-c21e-4600-951f-56460906fd7f" style="text-align: left;">Shipping Category</p></td><td colspan="1" rowspan="1"><p data-id="8bb89c80-83bf-4e9c-8c05-8732775fc65f" style="text-align: left;">The Sapera category that holds your shipping products. Order shipping lines are matched to these products (see "Orders").</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="3960431f-6204-4d3b-9ed4-2714147c4816" style="text-align: left;">Shopify store URL</p></td><td colspan="1" rowspan="1"><p data-id="120deee7-a2c1-4a5a-b268-a902686cf375" style="text-align: left;">The store address, for example https://your-store.myshopify.com.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="d24518e4-e93d-4bf2-87dc-a72e6ec56e63" style="text-align: left;">Shopify app type</p></td><td colspan="1" rowspan="1"><p data-id="16a8a584-98d7-40f6-84c3-4dc941267e4a" style="text-align: left;"><strong>Dev Dashboard app (Client ID and secret)</strong> (default) or <strong>Legacy custom app (Admin API access token)</strong>. The fields below change with the choice.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="159807e1-a03e-4d0d-9e16-63e67f5a950a" style="text-align: left;">Client ID</p></td><td colspan="1" rowspan="1"><p data-id="194c254e-a566-4a0c-8e9c-6b13880ef281" style="text-align: left;">Dev Dashboard app only: the Client ID from the app.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="03f1e841-4dc9-4497-9518-e427fb76493c" style="text-align: left;">Client secret</p></td><td colspan="1" rowspan="1"><p data-id="2017fc06-f14b-4843-ba0e-8561c855e798" style="text-align: left;">Dev Dashboard app only: the Client secret from the app.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="3e920471-8e54-4db8-a2bf-383fa10de0d4" style="text-align: left;">Admin API access token</p></td><td colspan="1" rowspan="1"><p data-id="f29d11db-b699-477d-a3c2-fc571eef6f36" style="text-align: left;">Legacy custom app only: the token from the Shopify app.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="857d8431-95ea-449e-ad6b-dce203f1171b" style="text-align: left;">API secret key</p></td><td colspan="1" rowspan="1"><p data-id="213ad3bb-58a4-4a08-bee2-cc429de48998" style="text-align: left;">Legacy custom app only: the API secret key from the Shopify app. It is not used yet, but fill it in: Shopify shows it only once, and it will be needed if Shopify is later set up to notify Sapera about changes directly. Today Sapera checks Shopify at regular intervals, which is more stable.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="792bc730-2255-4d59-b0ef-383a2e8b67b0" style="text-align: left;">API version</p></td><td colspan="1" rowspan="1"><p data-id="e8502375-27d1-4ea6-9252-184623647ff3" style="text-align: left;">Pick the newest stable version. The button next to the field loads the versions Shopify supports.</p></td></tr></tbody></table>

Then click **Load Shopify info** to load the store's locations and sales channels, choose the settings described below, and click **Test configuration**. The test shows the store, its currency and time zone, and whether the API version, the access scopes, the location, the sales channel and (when enabled) gift cards are in order. Fix anything marked as missing before the first sync.

* * *

### Settings

<table data-id="d03ea461-5d2e-4ec0-9f1e-3e6cf15d4ea6" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="75c286b6-f2a6-404c-af6a-63a0b374a0f7" style="text-align: left;"><strong>Setting</strong></p></td><td colspan="1" rowspan="1"><p data-id="ea8b50b7-ae00-44a1-ae17-6397b18d919e" style="text-align: left;"><strong>What it does</strong></p></td><td colspan="1" rowspan="1"><p data-id="c9cf7f17-ceb9-4124-8262-21ae25b12900" style="text-align: left;"><strong>Default</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f9e4883d-d356-4656-947a-bdfa8aa556e9" style="text-align: left;">Sales channel</p></td><td colspan="1" rowspan="1"><p data-id="cc92800b-17ae-4c90-9c3f-dfa976798a56" style="text-align: left;">Products are published to this Shopify sales channel, usually the Online Store.</p></td><td colspan="1" rowspan="1"><p data-id="4f803d5d-efff-4dfd-8a50-0b0f4310afbd" style="text-align: left;">Empty</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e9a5d69c-4eb5-4886-a997-256810ba0701" style="text-align: left;">Brand handling</p></td><td colspan="1" rowspan="1"><p data-id="c7decea6-40b2-4b87-a698-a0720626e743" style="text-align: left;">Vendor field: the product's brand search tag is sent as the Shopify vendor. Do not sync: no vendor is sent. <strong>Collection</strong>: not supported yet, and the product sync fails if it is selected. Do not select it.</p></td><td colspan="1" rowspan="1"><p data-id="a30eac94-3139-4cb4-8f2a-ef3752d249e3" style="text-align: left;">Vendor field</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="72e0c336-0999-406f-bb03-14168c28fb2c" style="text-align: left;">Sync categories as collections</p></td><td colspan="1" rowspan="1"><p data-id="9d67b1c4-2210-4aac-b733-4fead2bc2c31" style="text-align: left;">When on, each webshop category becomes a Shopify collection with the same name, and the products are put in the collections they match. Turn it off if you build your own collections in Shopify, for example as automated collections on tags or vendor.</p></td><td colspan="1" rowspan="1"><p data-id="9a574eca-71f3-4061-aa57-1284bbfa662d" style="text-align: left;">Off</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="29580341-ab12-4c92-842c-cefddbe3014e" style="text-align: left;">Stock location handling</p></td><td colspan="1" rowspan="1"><p data-id="f4e44b95-b86c-4245-bc0d-bb66e2dd4613" style="text-align: left;"><strong>Sum all units into one location</strong>: the stock of all stock organizational units is added up and sent to the chosen <strong>Shopify location</strong>. <strong>Map each organizational unit to a location</strong>: pick a Shopify location for each unit; units without a location are not sent.</p></td><td colspan="1" rowspan="1"><p data-id="ffdb6334-31e4-42d6-b25d-7b1f21a5669c" style="text-align: left;">Sum all units into one location</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="bb19789c-cca1-489c-a39f-1731ff0de26b" style="text-align: left;">Allow update of product descriptions</p></td><td colspan="1" rowspan="1"><p data-id="7f21fbc7-bf75-4dcc-9677-05678c130aad" style="text-align: left;">When off, descriptions are only sent when a product is created, so you can edit them in Shopify.</p></td><td colspan="1" rowspan="1"><p data-id="e09a527d-1430-4048-9bac-159d85f934df" style="text-align: left;">On</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="14869bf8-bfd9-4936-ac6f-a1b39e662655" style="text-align: left;">Allow update of product images</p></td><td colspan="1" rowspan="1"><p data-id="280ba7ae-5343-480a-b3cf-4fbb247ade73" style="text-align: left;">When off, images are only sent when a product is created.</p></td><td colspan="1" rowspan="1"><p data-id="d9578df0-7165-4c30-b638-05412ca593f1" style="text-align: left;">On</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="6d1dbda2-f061-44b5-afbd-03e2d44e654f" style="text-align: left;">Allow update of product other properties</p></td><td colspan="1" rowspan="1"><p data-id="333cd6e3-f054-4b61-9a23-827bc2463f2e" style="text-align: left;">When off, title, tags and vendor are only sent when a product is created.</p></td><td colspan="1" rowspan="1"><p data-id="a3f0bbe2-6628-4eef-a1c9-c5ffcfc587df" style="text-align: left;">On</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="5cd500a2-d926-4cde-8fc0-4153ea0f1802" style="text-align: left;">Create products in draft state</p></td><td colspan="1" rowspan="1"><p data-id="4aefbfd3-3876-4e57-a40e-e3b164533a78" style="text-align: left;">When on, new products are created as drafts and Sapera never changes their status, so you publish them in Shopify yourself. When off, every sync sets synced products to Active.</p></td><td colspan="1" rowspan="1"><p data-id="981ded8c-f44b-4602-b394-6108973a0609" style="text-align: left;">Off</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="12e3384c-5bc9-4270-a4a2-4a44ae2bf377" style="text-align: left;">Continue selling when out of stock</p></td><td colspan="1" rowspan="1"><p data-id="85af3402-3925-43e5-ad4c-c735802e81f4" style="text-align: left;">Not used yet. Set the inventory policy in Shopify.</p></td><td colspan="1" rowspan="1"><p data-id="bdb77909-13d7-4371-b7ef-2af0a89396f4" style="text-align: left;">Off</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="c4ad957c-c553-4c8d-aeb6-fa3285d51cd1" style="text-align: left;">Sync gift cards</p></td><td colspan="1" rowspan="1"><p data-id="96704342-f736-46af-8bab-d391303990ad" style="text-align: left;">Syncs gift cards and allows selling gift card products in Shopify (see "Gift cards").</p></td><td colspan="1" rowspan="1"><p data-id="875c1bf5-d3a0-4bb2-9ade-e26150ffb60c" style="text-align: left;">Off</p></td></tr></tbody></table>

* * *

### Choose which products to sell

Products are chosen through **Webshop categories** (select the webshop at the top). A product is sent to Shopify when it matches any category of the webshop through one of its mappings:

-   it is in a mapped Sapera category,
    
-   it is one of the products picked in a mapping,
    
-   it has one of the mapped search tags, or
    
-   its manufacturer is one of the mapped manufacturers.
    

Which products are sent to Shopify is decided by the webshop categories. If **Sync categories as collections** is on, each webshop category also becomes a Shopify collection with the same name, holding the products that match it. When a product stops matching every category, it is set to Draft in Shopify and removed from the collections Sapera has put it in. It is not deleted in Shopify, and if it later matches again, it is linked by SKU and updated again.

#### How a product looks in Shopify

-   **Title and description:** the web display name and web description, or the normal ones when these are empty.
    
-   **SKU and barcode:** the product or variant number and the GTIN.
    
-   **Price:** the current sales price of the organizational unit, converted to the store currency with the Sapera exchange rate. When the product is on sale, the regular price is shown as the compare-at price.
    
-   **Variants:** the visible fields of the variant template become Shopify options. Shopify allows at most 3 options.
    
-   **Tags:** the product's search tags whose tag type is marked for the web.
    
-   **Images:** product images first, then variant images. Images you add directly in Shopify are kept.
    

Products that already exist in Shopify are linked by SKU instead of being created again.

* * *

### First synchronization

1\. Open **Webshop categories** and select the webshop.

2\. Click **Synchronize**. The message "Shopify synchronization has been initiated" confirms it is queued.

3\. Follow the progress in **Shopify → Synchronization operations**, tab **Product sync**. When it completes, read the **Summary** for skipped or failed products.

4\. Check a few products in Shopify, then turn on **Automatic sync** for the webshop.

**Synchronize** sends the products changed since the last successful sync (all of them the first time). **Force full resynchronization**, available to administrators, sends every product again and also deletes images in Shopify that no product uses any more.

> Order import starts from the moment the first product was synced, so older Shopify orders are not imported.

* * *

### Automatic sync

With **Automatic sync** on, and after the first sync has completed:

-   product, variant and stock changes are sent to Shopify about 20 seconds after they happen,
    
-   when a search tag changes, the products with that tag are updated,
    
-   paid orders are imported every 3 minutes,
    
-   completed sales orders are fulfilled in Shopify,
    
-   gift cards are synced (when enabled).
    

While a manual synchronization runs, automatic updates wait until it finishes.

* * *

### Following the synchronization

**Shopify → Synchronization operations** shows everything the integration does, one tab per kind of work:

<table data-id="e0293775-8006-444d-a70b-af7007d95ade" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="d81dc743-1bb7-45e7-a0a9-7b23f29cd627" style="text-align: left;"><strong>Tab</strong></p></td><td colspan="1" rowspan="1"><p data-id="b02ba773-15e5-4dca-a65c-c7b777cf92ca" style="text-align: left;"><strong>Shows</strong></p></td><td colspan="1" rowspan="1"><p data-id="384c764b-9486-48d9-bfc3-2d628338e46d" style="text-align: left;"><strong>Actions</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="5a27c486-8846-4350-8c76-a205eaab9476" style="text-align: left;">Product sync</p></td><td colspan="1" rowspan="1"><p data-id="c5db11a8-dac2-4a2b-a87c-fc64fb40efbb" style="text-align: left;">Manual synchronizations, with kind (Full / Changes), synced products, times and a summary.</p></td><td colspan="1" rowspan="1"><p data-id="78858da0-e3ed-438a-aeb1-79f564b86a4b" style="text-align: left;">Copy summary, Copy error</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="311a0b14-c4c3-4b78-af9b-cd8d529a2c83" style="text-align: left;">Product updates</p></td><td colspan="1" rowspan="1"><p data-id="fa5be5bd-31e5-49d2-aec3-b8e93f39f352" style="text-align: left;">Automatic product and stock updates.</p></td><td colspan="1" rowspan="1"><p data-id="64088785-9c47-4a61-8704-1aaac55a9ad9" style="text-align: left;">Re-enqueue failed, Open product, Copy error</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="2fffae0f-67aa-4974-a2c5-cb1848411ff0" style="text-align: left;">Search tag updates</p></td><td colspan="1" rowspan="1"><p data-id="7ca7e755-548c-4787-8c97-99815c3247c8" style="text-align: left;">Search tag changes and how many product updates they queued.</p></td><td colspan="1" rowspan="1"><p data-id="2917a7d4-51cc-48bd-9ced-ef1b6cee098c" style="text-align: left;">Re-enqueue failed, Copy error</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="66250e34-5457-439f-a951-944d89be90b4" style="text-align: left;">Gift card updates</p></td><td colspan="1" rowspan="1"><p data-id="d4481ce9-9a84-48d9-aa84-3f2886d443d3" style="text-align: left;">Gift card syncs.</p></td><td colspan="1" rowspan="1"><p data-id="740c621e-c72e-4cc0-b10f-1a660c560223" style="text-align: left;">Export gift cards, Re-enqueue failed, Copy error</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="6a85e657-46ee-4cb4-8e80-20d3dc0d5255" style="text-align: left;">Order imports</p></td><td colspan="1" rowspan="1"><p data-id="8f22471d-2a78-4a2d-bec1-712f8c7485d1" style="text-align: left;">Imported Shopify orders and the sales orders created from them.</p></td><td colspan="1" rowspan="1"><p data-id="b30c207f-9506-4c11-8756-0d64bc377c59" style="text-align: left;">Import orders, Reimport order, Show replaced, Copy error</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="8d6e16a1-20fc-4b1f-8d52-c46baa60a9a9" style="text-align: left;">Order exports</p></td><td colspan="1" rowspan="1"><p data-id="7c671e5a-f9e5-4202-a30e-b4c2cd3dc744" style="text-align: left;">Fulfillments sent to Shopify.</p></td><td colspan="1" rowspan="1"><p data-id="d8d452e9-8472-4d97-8df9-d751d20a9a52" style="text-align: left;">Re-enqueue failed, Copy error</p></td></tr></tbody></table>

* * *

### Orders

Every 3 minutes Sapera imports Shopify orders that are **paid and not cancelled**. **Import orders** on the Order imports tab checks right away. Each order becomes a sales order in the webshop's organizational unit:

-   **Customer:** an existing customer is reused when the email, the name and phone, or the company name match; otherwise a new customer is created from the billing details.
    
-   **Lines:** matched to the synced products; products created outside Sapera are matched by SKU and marked "please check correctness". Discounts are kept as line discounts.
    
-   **Shipping:** matched to a product in the Shipping Category by its number (the Shopify shipping code) or its name (the shipping title); otherwise the first product in that category is used. Without a Shipping Category, shipping is not imported.
    
-   **Stock:** when stock organizational units are set, the line is taken from a unit that has enough stock.
    
-   **Reference and notes:** the Shopify order name becomes the customer reference; the order note, payment method and shipping method go to the public note.
    
-   **Currency:** the order currency must exist in Sapera and, if it is not the default currency, have an exchange rate for the order date.
    

If some lines cannot be found, the sales order is still created and its internal note lists what is missing. No payment is registered on the sales order.

#### Reimporting an order

To import an order again, discard its sales order in Sapera, then select it on the **Order imports** tab and click **Reimport order**. The order is read from Shopify again. A failed import is also retried automatically when the order is changed in Shopify.

#### Fulfillment

When the sales order is **Completed** in Sapera, the order is marked as fulfilled in Shopify (Order exports tab). Shopify does not send the customer a shipping notification for it.

> Orders with more than 100 lines: only the first 100 are imported, with a note on the sales order. Refunds and cancellations made in Shopify after an order was imported are not reflected in Sapera.

* * *

### Gift cards

Turn on **Sync gift cards** in the webshop settings. It also needs:

-   a Shopify plan that includes gift cards (Test configuration reports "This Shopify plan doesn't include gift cards" otherwise),
    
-   **Generate Gift Card Web codes** turned on in the gift card settings, because the web code becomes the Shopify gift card code. The settings show a warning when no organizational unit generates web codes,
    
-   Automatic sync.
    

#### Gift cards sold in Sapera

-   A sold gift card is created in Shopify with the same code and balance. Gift card types that allow only one withdrawal are not synced, because Shopify cannot enforce that.
    
-   Withdrawals and discards in Sapera change the Shopify balance.
    
-   Money spent in Shopify comes back to Sapera as a withdrawal ("Used in Shopify webshop …"), checked every 10 minutes.
    
-   To send existing gift cards once, click **Export gift cards** on the Gift card updates tab.
    

#### Selling gift cards in Shopify

The product of a Sapera gift card type is sent to Shopify as a Shopify gift card product when the type has a **fixed amount** and allows multiple withdrawals. When a customer buys it, Shopify issues the gift card and emails it to the customer; the order import registers a matching gift card in Sapera, and its balance is synced from then on.

> Gift cards issued by Shopify can be used in Shopify only: Shopify does not reveal their code, so they cannot be redeemed at the POS by web code. If the store does not fulfill gift cards automatically, the order import waits for them: fulfill the gift card lines in Shopify, then reimport the order.

* * *

### Troubleshooting

<table data-id="04a18be0-96c5-4e84-b366-f4f7bbef5924" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="de41334a-7d7a-417e-a63d-810a5d7ace65" style="text-align: left;"><strong>Message</strong></p></td><td colspan="1" rowspan="1"><p data-id="ef7b86a8-6fa1-4563-9fcc-8289244e972e" style="text-align: left;"><strong>What to do</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="27bbb9ee-a0e4-4307-939c-52055c0b0216" style="text-align: left;">Test configuration: access scopes "missing …"</p></td><td colspan="1" rowspan="1"><p data-id="5a5861dc-a77d-4bff-ac59-b98a8735ea9a" style="text-align: left;">Add the scope to the Shopify app, reinstall it and update the token in Sapera if Shopify issued a new one.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="7ea0314e-6e39-416e-b4d5-3f1944d3d32d" style="text-align: left;">"Shopify refused to issue an access token (shop_not_permitted)..."</p></td><td colspan="1" rowspan="1"><p data-id="f5501d1d-52c5-448b-baca-31f596bc1d21" style="text-align: left;">The Client ID and Client secret must belong to an app created in the Dev Dashboard by the organization that owns the store, and the app must be installed on the store. A custom app created in the store admin cannot be used with this app type.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="6feddbf5-ad81-4661-b796-b4a468c67ee8" style="text-align: left;">"Shopify did not accept the Client ID and Client secret, or the app is not installed on the store"</p></td><td colspan="1" rowspan="1"><p data-id="aeb2aba4-b845-495c-9cd9-439e47e9e357" style="text-align: left;">Check the Client ID and secret, and install the app on the store.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="60a10c63-a7a3-4082-8d25-3df792a9c0bf" style="text-align: left;">"[product] skipped: Product has N variant attributes, Shopify allows at most 3"</p></td><td colspan="1" rowspan="1"><p data-id="eaeec3da-ed40-4a44-b31d-0ef9bd5806c3" style="text-align: left;">Reduce the visible fields of the product's variant template.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="571cf063-21a3-4f04-835c-ebfe763bb58b" style="text-align: left;">"[product] skipped: SKU … is used by N Shopify variants" / "its SKUs are spread over N Shopify products"</p></td><td colspan="1" rowspan="1"><p data-id="630410d7-da9a-4d9a-8edf-5bd926922c38" style="text-align: left;">Clean up the duplicate SKUs in Shopify, then synchronize again.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="10bd285e-c69d-4c9d-a9e6-d90af191f038" style="text-align: left;">"Stock is not synced: no Shopify location is configured"</p></td><td colspan="1" rowspan="1"><p data-id="57aabb5b-e0d5-4f82-af31-0a9cd3323f32" style="text-align: left;">Choose a Shopify location (or one per unit) in Stock location handling.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f1023d37-2d4f-4162-8b35-568dfbff8d81" style="text-align: left;">"… has prices without VAT, only shops with prices including VAT are supported"</p></td><td colspan="1" rowspan="1"><p data-id="a1ca035e-8c86-4f1f-95df-fcbfcaa339e9" style="text-align: left;">Set the Shopify store to show prices including taxes.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="8c359d1b-cea6-48e6-9df8-b7ef96952048" style="text-align: left;">Customer data missing (order import)</p></td><td colspan="1" rowspan="1"><p data-id="da5defe6-07a6-4855-b051-dacd021a089e" style="text-align: left;">Give the Shopify app access to protected customer data.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="69b4a03f-6a48-46ea-8e97-153c8ecfd005" style="text-align: left;">"No exchange rate defined for …"</p></td><td colspan="1" rowspan="1"><p data-id="f0c6a5c2-678e-43a1-a1fa-25d12a55eae4" style="text-align: left;">Add an exchange rate for the order currency and date, then reimport the order.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="4d962cd2-4df3-4ee7-ade0-eac472c0857e" style="text-align: left;">"Shopify order … is already imported as sales order …"</p></td><td colspan="1" rowspan="1"><p data-id="96374c12-e992-42f9-a45d-48d0869930c6" style="text-align: left;">Discard that sales order first if the order really has to be imported again.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="db49617f-2621-43f9-9959-20873596fed0" style="text-align: left;">"… cannot be fulfilled while its fulfillment orders are …"</p></td><td colspan="1" rowspan="1"><p data-id="737ed9dc-801c-452a-9ba8-747047db4c36" style="text-align: left;">The order is on hold or already handled in Shopify; resolve it there, then Re-enqueue failed.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="0ab28355-62fe-4467-ada6-d644b950862a" style="text-align: left;">"Webshop … has not completed its first Shopify sync"</p></td><td colspan="1" rowspan="1"><p data-id="e8c66491-0855-4242-9c3e-ad0180dd2226" style="text-align: left;">Run Synchronize once; automatic updates start after it completes.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="d9be1fb5-ed18-435a-be30-d362a8980264" style="text-align: left;">"Shopify throttled …"</p></td><td colspan="1" rowspan="1"><p data-id="ed0c7a31-51f2-44da-8dbc-38984725f8db" style="text-align: left;">Nothing: Shopify asked Sapera to slow down and the work is retried automatically.</p></td></tr></tbody></table>

For any failed row, **Copy error** copies the full message for support.

* * *

_If you need help with the setup, you are always welcome to contact support._

* * *

**Want to know more?**

Read more in these related articles:

[

Webshop categories

Create and manage categories in your webshop, and link them with inventory categories and products from Sapera.

](https://support.sapera.io/en/articles/540.md)[

WooCommerce integration: what data is exchanged

A complete, non-technical walkthrough of Sapera's WooCommerce integration: which product, stock and price data Sapera sends to the webshop, what comes back when an order is created, and all configuration options.

](https://support.sapera.io/en/articles/579.md)[

Sapera integration to Woo Webshop

This guide explains how to create an API user, generate API keys, and synchronize Sapera with WooCommerce

](https://support.sapera.io/en/articles/253.md)[

WebShop settings

An overview of the settings for Sapera's webshop integration and how to access them.

](https://support.sapera.io/en/articles/425.md)[

Integrations — webshop, payment and bank

An overview of what Sapera can be connected to, and when to take it on.

](https://support.sapera.io/en/articles/674.md)[

Gift cards

Manage gift cards in Financial: create, sell, redeem and cancel gift cards, and set up gift card types as templates.

](https://support.sapera.io/en/articles/133.md)[

Settings for gift cards

Overview of the settings for gift cards in Sapera, including automatic creation on sale, restriction to the cash register and generation of web codes.

](https://support.sapera.io/en/articles/189.md)

## Related

- [Sapera integration to Woo Webshop](https://support.sapera.io/en/articles/253-sapera-integration-to-woo-webshop.md)
- [Return an order](https://support.sapera.io/en/articles/325-return-an-order.md)
- [WooCommerce integration: what data is exchanged](https://support.sapera.io/en/articles/579-woocommerce-integration-what-data-is-exchanged.md)
- [Video library](https://support.sapera.io/en/articles/1-video-library.md)
- [Getting started - What do you need to know as a customer?](https://support.sapera.io/en/articles/317-getting-started-what-do-you-need-to-know-as-a-customer.md)
