At SommCellar we recently switched from using Shopify to handle e-commerce over to a custom system centred around Stripe. The change was based on Shopify limitations as well as the reduced transaction fees on offer from Stripe.
When we first launched the business our number one concern was getting up and running quickly without an extended development period.
Hearing the positive experiences of others and knowing that we could get a high-quality site launched in a matter of minutes we chose Shopify to power our online shop.
Shopify offers a great all-in-one platform to manage the online sale of physical goods. The speed at which we could get the site up and running was amazing and the initial costs of using the platform were reasonable.
Our launch site may not have been exactly what we envisioned but it allowed us to begin making sales and generate revenue.
While at the start Shopify was great, when we looked to expand the site by adding new features we quickly began hitting barriers.
It turned out that adding near anything beyond the requirements of a basic site requires plugins.
Perhaps calling the requirement for plugins an "issue" is wrong — Shopify themselves market plugins as a feature — but by the time we had priced a few plugins for the site our monthly hosting cost was going to triple.
What we were looking for wasn't lavish, just some tools to help with delivery pricing, bookkeeping feeds, and the like but the total cost quickly crept up.
We were also concerned that the all-in-one platform from a single provider that we had originally signed up for, had fast turned into a melody of service providers that we had to rely on to run our business and provide our customers with great service. Each service provider would become a link in a growing chain of dependencies, and we would be at their mercy if they wanted to make changes to their link because Shopify hadn't built the functionality into their own system themselves.
The final kick in the teeth was a notice from Shopify that app developers would receive their first million dollars of revenue fee-free, while those of us using them to run our shops had to pay fees from the first sale. As a shop owner, it felt like they were rewarding the developers who were helping them build their platform, while ignoring their customers.
We didn't take the decision to move away from Shopify lightly and spent a long time researching other options. There are a number of e-commerce platforms out there, but we didn't find any that weren't either missing features or exorbitantly expensive.
In a rare moment of clarity, we realised that (ignoring card processing) for small businesses, e-commerce reduces to a glorified CRUD app. At its core, we are only concerned with products, customers, and orders. If we could handle emails, card payments, and wrap everything in a fancy admin UI there was nothing stopping us from running our own platform and customising it exactly to our needs.
Saying we "built our own e-commerce platform" is very grandiose. In reality we wrote down our customer journey and built functionality into our system as the next step on the journey arrived.
By focusing on our own needs only we were able to eliminate irrelevant features and postpone others to a later date. For example, at the moment our products are managed by running SQL queries directly against the database instead of via the admin UI. Adding the ability to manage products via the admin UI will certainly be added in the near future but for now it has saved us the time of building out a management interface, allowing us to concentrate on other areas.
An area that received increased attention was payments. As the centre of the business, it was important we got it right. All our payments are handled by Stripe. Users add items to their shopping bag and enter their delivery information on the SommCellar website. When they hit "Continue to payment" they are redirected to Stripe Checkout, which takes care of charging the customer's card. Users are then redirected back to the success page on our website.
We decided to handle products solely on our own system instead of making use of Stripe's products API. When creating the payment intent we pass Stripe a list of products, including the title, price, and quantity, and Stripe simply calculates the total and charges the user. This saves us from having to maintain two collections of products across our own system and Stripe's.
Using webhooks, Stripe lets us know when payment have been charged successfully and we update the order to reflect the new payment status, after which we begin fulfilment.
For the time being our system is incredibly disjointed but for our small team, that all works in the same space, any issues can be sorted by simply turning to the person sitting next to them.
Our final tech stack is Postgres, Express, Stripe and Next.JS.
While we've managed to move over to a system that does exactly what we want and will help us to develop into the future, we aren't left with nothing to do.
When using someone else's system, they are responsible for performance, maintenance, and uptime, activities that now fall to us. We always knew this would be a trade-off and decided that the benefits of creating our own system outweighed the task of running it.
In the effort to get our own system launched, running activities have taken a back seat and will be added to the tech debt pile. While the business is small, these issues are relatively low impact. We will incorporate performance tasks into the general development of the system and tackle issues as they become apparent.
For us, our main concern is to be aware of any problems as quickly as possible, so we can communicate any issues with our customers. Heavy use of monitoring and automation will be useful to make sure we can stay on top of issues as they come up.
After writing a whole post outlining the reasons we decided to move away from Shopify it may be expected that I would recommend everyone did the same. But that's not the case.
I'm happy we gave Shopify a go, and despite finding their platform didn't suit us, I think they have a good offering perfectly suited to many uses.
If you are running an online shop and you're not looking to deviate from a fairly standard setup then Shopify will work well and will take care of a lot of the challenges of running your shop.
I do think the pricing of plugins can be excessive and quickly lead to a high monthly hosting cost. I also feel for non-technical shop owners who have no choice but to accept the costs as the cost of rolling their own is prohibitive.
Overall, I am happy we went down the route of an in-house e-commerce system. The control and flexibility in developing the system into the future will allow us to maintain a sharp focus on delivering the best possible service to our customers.