Boneappetitedk — Building a Subscription eCommerce Webshop from Scratch

How I designed and built a Copenhagen dog-food subscription webshop from the ground up using .NET Core, Vue.js, PostgreSQL, and Stripe — without relying on Shopify or any off-the-shelf platform.

My recent project Boneappetitedk 💖My recent project Boneappetitedk 💖
July 1, 2025

How it started

When I first got this project I honestly didn't know much about calculating calorie needs for dogs. That was a whole new domain for me. The client was a Copenhagen-based dog-food company that needed a webshop, but not a typical one — they wanted a subscription model where customers could get recurring deliveries based on their dog's specific dietary needs.

My first instinct was Shopify. I'd used it before and it's the obvious choice for eCommerce. But it quickly became clear it wasn't going to work here. The cost was too high for what the project needed, and getting the level of customisation required — especially for a calorie calculator and a proper subscription flow — meant relying on plugins that either didn't exist or didn't do quite what I needed. Every workaround felt fragile.

I then looked at MedusaJS, which is an open-source headless commerce platform. It was promising but the version available at the time was 1.x.x and the documentation for subscriptions was really lacking. I couldn't find a clear path forward with it.

So I decided to just build it myself from scratch.

The stack

I went with .NET Core for the backend, Vue.js for the frontend, PostgreSQL as the database, and Stripe for payments. I had used Stripe in a previous project so I was already comfortable with how it works, which made the payment side of things much less daunting.

The main reason I kept the frontend and backend completely separate was to make the project easier to maintain and scale over time. If the client ever wants to redesign the storefront later, none of the business logic needs to change. It also means the backend could serve a mobile app or an admin panel down the road without any restructuring.

Subscriptions and billing

This was the part I had to learn the most for. I'd built webshops before with WooCommerce and Shopify where it's basically just products and a checkout — subscriptions are a completely different beast. I spent a good amount of time reading through Chargebee's subscription management docs and Stripe's own documentation to properly understand the model before writing a single line of code.

Once I had a solid understanding, Stripe's subscription API turned out to be really well thought out. It handles the recurring billing cycles, plan changes, failed payments, and invoicing in a way that integrated cleanly with the .NET Core backend. I'm glad I chose it over trying to roll my own billing logic.

The colour change problem

At one point during the project the client was going back and forth a lot on the colour scheme. I had components built, but manually updating button colours, backgrounds, and accents across all of them was slow and honestly a bit annoying.

Around that time PrimeVue 4.0 Beta came out, which introduced design tokens — basically a single place where you define your colours and the entire UI picks them up. I decided to migrate the project to PrimeVue 4.0, which took less than half an hour since I already had all the components in place.

After that, responding to a colour change request from the client went from an hour of hunting through files to just updating a couple of token values. It was one of those decisions that felt slightly risky at the time (migrating to a beta version mid-project) but paid off immediately. I wrote a bit more about it in the PrimeVue Styled Mode docs if you want to dig into how the token system works.

What I took away

This project pushed me into areas I hadn't worked in before — subscription billing, domain-specific calculators, and building a full custom eCommerce solution without leaning on an existing platform. It was one of the more challenging projects I've done, but also one of the most satisfying to ship.

The biggest lesson for me was around making smart architectural choices early. Decoupling the frontend and backend, and later adopting design tokens, both felt like small decisions at the time but made a real difference as the project grew and the client's requirements kept evolving.

And that's a wrap for this one. Hope you enjoyed the read 💖