I wrote a program to transfer 496 ecommerce products from Wix to Shopify.
We performed this transfer for Rachel, the owner and operator of Essence & Soul on King William Road in Adelaide, South Australia.
She previously utilised a Wix store to sell her catalogue of over 496 products but we recommended she move to Shopify as we flat out refuse to build ecommerce stores with use of Wix due to its inferiority.
Therefore, on our recommendation she required a full transfer to the new Shopify powered store that we built for her.
Screeeeeech, pull the brakes.
One big problem: to upload 496 products by hand would consume a significant amount of time and Wix provides no native way to automatically transfer to another vendor.
Luckily this was not our first rodeo to automatically transfer a significant amount of products, we previously transferred around 30-50 products for another client of ours called Portrush Flowers. However, it consisted of a transfer between WooCommerce and Shopify, not Wix.
We built a custom program to transfer the products for Portrush Flowers to help automate the majority of the transfer. I say “automate the majority” because very few systems perform a perfect transfer, I will explain why later.
WooCommerce made it easy enough to use their API to transfer products to Shopify. However, Wix is notoriously difficult to transfer away from, they love to keep you as a customer, even if you give them the good old “its me not you”.
The creator of WordPress Matt Mullenweg wrote a fantastic and authentic blog post which criticises Wix and their anti competitive behaviour. The Wix CEO then replied with a very underwhelming and PR sounding response.
I digress, my point is that Wix, like a bitter ex partner, makes it difficult to transfer away from their platform.
To my surprise Wix provides an API that allowed me to build a custom program to transfer the products. Not an automated transfer by any means, with a very poorly made API which contained very average documentation but alas, better than nothing.
To perform the transfer I first created custom code that talked to the Wix API to retrieve all of the products. I then studied the data to ensure consistency and built an internal abstraction model, which I will discuss later, to represent the ecommerce products and their collections.
The most difficult parts of retrieving products from the Wix API consisted of,
- Poorly written documentation with very contrived examples.
- A terrible sandbox environment to test the API, with around a 3 hour limit for each generated token.
- No usage of Private Applications for Wix stores, they require you to publish the application to their app store. Shopify allows private applications but Wix wanted to make it just that bit harder.
The Shopify part of the transfer proved much easier, hence why I utilise them to begin with. Shopify provides excellent API and documentation with very good examples.
I wrote the application code to save the products to Shopify with use of their GraphQL API. Of course some challenges arose with their API and there were some questionable constraints with lack of decent defaults. However, overall nothing I couldn’t overcome with a few clever solutions.
Once I created the functionality to pull all the products from Wix and to save the products to Shopify I implemented the final and most difficult part of the application, the transformation of the information.
The transform proved difficult because Wix represents the information about the products and collections in a completely different way to Shopify. To solve this problem I created an intermediary internal representation of an ecommerce product and their collections.
For the interest of technical individuals I utilised the Rust programming language as I find data representation through algebraic and struct types to provide an excellent basis to create an abstract intermediary model.
Once I created the model I transferred the product and collection information from Wix into my custom intermediary model. I then leveraged my intermediary model to transfer the information into the Shopify product and collection model.
Once I internally transformed the information into the Shopify product and collection model my program automatically created all the products and their collections into my clients Shopify store with use of the Shopify API.
Boom, after a decent amount of effort I successfully transferred the products, goodbye to Wix! Thanks to Wix for making it difficult, not impossible. Thanks to Shopify for building a fantastic API.
No Perfect Transfer Exists
Some companies that sell off-the-shelf migration programs, like the one I custom built, say that they will perform a perfect transfer, just cough up the cash, and they will get the job done. Lies! Transfers will always run into issues due to several reasons, for example,
- Software Updates: Software products change over time, for example, Shopify and Wix perform regular updates that break previous versions.
- Edge Cases: Weird edges cases pop up, such as odd formatting or missing information from Shopify or Wix.
- API Bugs: Bugs within the software API that cause malformed data, as in this case, the Shopify API and Wix API.
- Migration Software Bugs: Bugs in the migration software like the program I wrote.
Therefore, in my opinion, a human must manually check the products, which we performed for Essence & Soul. Luckily we double checked because a weird edge case led to a bug in my migration application, which we fixed immediately. The bug only affected one product range so we fixed it quite easily.
We successfully migrated 496 products for Rachel from Essence & Soul. Several challenges appeared out of the wood works but nothing that stopped me from performing a full transfer of products and their collections from Wix to Shopify
I love working with awesome locals like Rachel, it gives me joy to know that my skills as a Software Engineer enables me to liberate people from a software giant like Wix. I highly recommend you check out the custom Shopify store we built for Rachel for Essence & Soul, go buy a product and support a local.