kvaro.me
← All work

Kozmetika z prírody

Headless commerce platform replacing a Shopify store

Status
Built
Built and demoed; the live shop is still on the old platform
Period
2026
My role
Sole developer
Client
Natural cosmetics retailer
Stack
Next.js 15 · TypeScript · Prisma · PostgreSQL · Redis · Docker · GitLab CI

The problem

A working Shopify store with 179 products, a monthly fee, and no way to change what the platform would not let them change.

How it was built

Migration had to be idempotent

The Shopify catalogue import can run again without duplicating anything or overwriting later edits. A migration you can only run once is a migration you are afraid of.

Slovak payments and shipping, properly

GoPay for payments and Packeta for delivery. The payment callback reads the payment back from GoPay by stored id and only applies legal status transitions — it never trusts a status handed to it by the caller.

The demo does not compete with the client

The staging build sits behind a password and sends X-Robots-Tag: noindex, so it can never outrank the shop that is still paying the bills.

Where it landed

  • 179 products migrated, seed idempotent across redeploys
  • Runs on the client's own infrastructure — no per-month platform fee

The callback is the part that matters

Every payment integration has one endpoint that decides whether an order is paid. Getting that endpoint to distrust its own input is most of the security work in a small shop.

← All work