The simplest way to improve speed – upgrade!
If you just want the maximum speed, you can upgrade your plan to Big Plan or even Enterprise Plan.
Big Plan has the 5 threads importing data in parallel.
Enterprise Plan has 10 (or more) threads importing data in parallel.
A thread is an independent process that works with a piece of your import/export data. Several threads can work in parallel – each with different items.
That gives a significant boost on the speed.
But there are Shopify API speed limits which can be improved even further – by organizing import data in a way to minimize requests needed to the Shopify API.
Conserve Shopify API Speed Limit Credits
Read on if you like to dig into the details of it…
I will describe two basic import scenarios – one for importing with the goal to create new items, the other – with the goal to update existing items.
“Items” mean Products, Collections, Customers, Discounts, Orders, and so on.
Private App for Enterprise Shopify Plus stores
For Shopify Plus stores – Shopify is able to increase the API Speed Limits for the Private Apps.
If you are also an Excelify Enterprise user then we can set up the Excelify to connect to your store as a Private App and use its new API limit to gain even higher speed.
Read more about what you need to do to run Excelify as a Private App.
Overall import logic
A bit of background logic, how importing to Shopify happens.
At first, an item is identified by “ID” column value. ID is the Shopify internal identifier for an item. You can’t assign them by yourself – you can only get them out by exporting existing items.
If the ID column value is empty or such ID doesn’t exist – then it tries to find the existing item by “Handle” value. In Discounts case the handle is the “Code” column value; in Customers case that is an “Email”, but for the sake of common terminology – the app will refer to them as “Handle” in all those cases.
If it finds an existing item by ID or by Handle, then it will update that item by changing only fields you provided in the import, and leaves other fields as they were. If it will not find such item, then it will create New.
So if you really want the fastest possible import speed, here’s what you do in each scenario.
Fastest import of New items
Keep the ID column empty, or remove it entirely from the import file.
Then it will not even try to find existing by ID, it will only check if an item with such Handle exists – that is needed to determine if it needs to create New or do the Update of existing.
If your store is relatively small, import speed by Handle will be the same as by ID.
Fastest Update of existing items
First – help the app to identify existing items quickly
Have the ID column with ID values from the export file.
If you have an ID for each item, and if the item with such ID actually exists, then it will be the fastest way to update them – it will do one single “push”, and that’s it.
You don’t have to have an ID – you can have just the Handle. Then it will find by Handle – it will be roughly two times slower, but still ok.
You will have the slowest speed if you have IDs which don’t exist. Because Then it will try to update by ID, which it will not find, then it will need to search by Handle, and then do the update. So it will be three times slower.
So – whenever you can, update by ID, the correct one.
Second – import only fields you need to update
When you import your data, whatever item columns you import, all of them be sent to Shopify. So to improve the speed, import only those columns, which you really need to update, and avoid importing columns, which you are sure, are already correct.
The especially big difference is made with uploading images. Every time you import an image, Shopify will re-download that image. That adds at least one second to each item import, which might not seem a big deal, but it accumulates big time – imagine if you are importing several thousands of items. So, if you know you have your images already in place, just remove image columns from the import file.
A similar principle is about “related” details for each item. For example, do you need to update Product Variant data, when you are updating the Product Tags? Probably not. If you need to just update Product Tags, then you just remove all the Variant columns (and rows), and it will not have to touch Variants at all, again, gaining a bit of speed per item. Similarly, if you don’t need to update related Products for Manual Collections (Custom Collections), just remove those columns (and rows) form import file.
The same also with Metafields.
In certain cases, the app will “pre-load” existing items from your store, to make the searching existing items faster. That’s because pre-loading is 250 times faster than identifying items one by one, so you can imagine the impact it has on overall import speed.
If you start the import and it seems like it’s not doing anything, give it a minute or two, because it decided that in total it will be quicker to pre-load your existing items, and then do the update on them.
Fastest import when copying from another store
When you copy your data to another store, those IDs don’t exist in the new store, so that causes the app to make an additional request to API to find that out. You can improve the speed by checking the “Ignore ID” box in the Import Options. That will tell the app not to try to use those IDs.
Which scenario was chosen?
You can see, how the existing item was identified, when you look in the Import Results Excel file (which you can download after the import has finished).
In the “Import Comment” column you will see the following comments (in the order starting from fastest):
|UPDATE: Pushed by ID||If you see this, it means you did the best job in helping the app to identify the existing item.|
|UPDATE: Found by ID (pre-loaded)||Here the app searched for the existing item by ID in the pre-loaded items list, because it can’t push it, it needs additional data about the item to be able to do the update. You can improve this by removing columns, which you don’t need to update.|
|UPDATE: Found by ID||The same reason as for pre-loaded, just app decided that in this case searching items one by one is faster than pre-loading all existing.|
|UPDATE: Found by Handle (pre-loaded)||Either you don’t have the ID, or the item with such ID doesn’t exist in this store. But it exists with the same Handle (or Code in case of Discounts, or Email in case of Customers). Also, app decided that pre-loading items will be the fastest way to find them.|
|Found by Handle||The same reason as for pre-loaded, just app decided that in this case searching items one by one is faster than pre-loading all existing.|
|Found by SKU (pre-loaded)||For Products, when Product is being identified by Variant SKU – it will always be pre-loaded, because the app will essentially load all the store into memory, to know, which SKU belongs to which Product.|
|NEW||The new item was created – meaning, that it didn’t find any existing item by ID or by Handle.|
Summary import speed tips
- Identify items by correct ID.
- Remove columns and rows form import file which you don’t need to update.
What to do next?
- Review the “How it works?” tutorial.
- Install the “Bulk Import Export Update with Excel” app if you haven’t already.
- Upgrade to Big Plan or Enterprise Plan to give yourself to enjoy all the other benefits that come with them.
- If you need to make your app work even faster than that, read those suggestions about making it work as a Private App.