North Macedonia's largest online grocer migrated from WooCommerce to Vendure as the basis for their online marketplace
The goal of Paket.mk is to build a local equivalent of Amazon, but starting from groceries instead of books. When we joined six months ago it was already 3½ years old and the dominant online grocery store in Macedonia. Paket has its own delivery logistics, state-of-the-art warehouse management processes and the capability to physically scale a lot more.
At the time Paket.mk was running a Woocommerce deployment, but it was clear to the founder (and to us) that if we were to dominate Macedonian e-commerce, we would need to make an engineering team and take full control over the software platform.
What we needed was a foundation to build the platform on and, more importantly, to build a team around in the future. We needed the basics handled for us but at the same time the ability to take the platform anywhere the business wants us to. This clearly meant a few things: 1) Api-first design (headless), 2) Open Source 3) Rich ecosystem.
As for WordPress - it had to go because it’s just not a suitable platform to use as the foundation of a project like ours. The codebase is meant for a blog engine and everything else is an afterthought - orders are posts, products are posts and so on. WooCommerce is amazing if you have no tech team and have to do everything yourself. I always recommend it to people that start out and frankly Paket.mk would not have been possible without Woocommerce.
But once you start growing, integrating with other systems and automating custom processes, it quickly becomes a problem. We estimated that less than a year down the line we would start saving time if we ditched WordPress and spent time rebuilding the platform - especially since many of the processes like stock management and accounting were already handled by other platforms.
I was surprised to see that there are very few serious e-commerce platforms that fit the bill.
Firstly, we discarded all closed-source SaaS platforms like Shopify, BigCommerce, etc. These platforms are geared towards the individual smaller shop owner, and the level of control and sophistication of integrations that we required - custom fulfillment, slot-shipping, backorders, automations, etc. - would simply not be possible.
Secondly, we discarded Magento, WooCommerce and Sylius because they are older and/or based on the PHP ecosystem. In today’s world building software is really more like assembling it from a lot of pre-made blocks. The Node.js ecosystem is bigger and more varied, whereas we found that PHP’s ecosystem heavily revolves around WordPress.
Finally, we were left with only a handful of platforms: Saleor, Reaction, Unchained and Vendure. Vendure is just miles better than the rest because of a few reasons:
- Technology choices: It uses TypeScript, GraphQL and NestJS - so it’s easy to extend and scale an engineering team around if need be.
- It does not take 6GB of ram to start 100 containers and 1000 microservices. Honestly, it took me 20 minutes to just download the images and spin up the containers for other platforms we were evaluating. There are some wildly over-engineered architectures out there.
- It is actively maintained and has a strong and growing community.
- We have prior experience with all the technologies.
We started with a simple goal: Make a working store that could be used in parallel with the production WordPress store as soon as possible. We gave ourselves 6 weeks to do it. This immediately revealed all the integration points with the business.
Paket.mk uses Dearsystems for inventory management, picking, packing order fulfillment and accounting. This is the source of truth for stock levels as it handles purchases and is linked to the warehouse operations directly. Then we have Detrack for delivery management and tracking. Lastly we had the current running Woocommerce store which was the source of truth for the catalog, categorization and customer orders.
During a six-week beta phase, we used custom scripts to copy the catalog, users and historical orders over to Vendure and since all products have a unique SKU, it was easy to keep track across systems.
On the technical side - we are really just using the Detrack and Dearsystems APIs and we also have custom scripts to download and process data locally. We currently have around 7,000 products, and catalog maintenance is done in Dearsystems, so we built a one-way integration to sync the data into our Vendure instance. We also made it easy to import a full stock level report from Dearsystems into Vendure as CSV, for example.
Some other integrations include Typesense for fast keyword search & a Facebook authentication strategy because everyone has a Facebook account here.
We used Next.js and React for the storefront because we know and like React. We drew up some mockups and got a designer to turn them into designs and got cracking.
We also made a React admin site to code some custom admin tools to extend the built-in Vendure Admin UI. It took me a week to make category, product and facet listing screens as well as a bulk facet editor (we use facets a lot). This just speaks of how easy it is actually to work with GraphQL. I should add that I had no GraphQL experience prior to this project.
As I said, our plan is to grow Paket.mk to a marketplace platform. Frankly, we haven’t thought about how that’s gonna look. The market is still very young in Macedonia, but it’s picking up some speed and people are more and more interested in online retail.
What is obvious is that building a marketplace is not just a matter of building the website. There are a million other things that need to be solved. Logistics, insurance, removing expired items, automatic re-ordering, storage, backorder comms and preparation and so on. All these processes need to coordinate somehow. We tend to look at Vendure as the central hub for our business. For example, we have some code that automates some processes running as a Vendure service - every day at 5am it checks the expiry dates of all products and delists the ones that expire in the next 3 days - and we have ideas for others as well.