All cases

VARENO2026vareno.fun

An online store for 27 EU countries with VAT, shipping, admin and Google Ads — built in one working day

The gist in 10 seconds

An EU store of original building sets for 27 countries under the “look what I found” concept: VAT by country, 135 shipping rates, a 6-role admin, 7 languages and Google Ads on 3,856 keywords. Built in one working day.

36
pages
75
DB tables
27
VAT countries
7
languages
135
shipping rates
960
optimised images
3,856
ad keywords
1
day for everything
VARENO

Task

The client needed a complete EU store end to end: catalogue, cart, checkout with correct taxes, an admin for the team, legal documents and ready ads — fast.

Result

48 commits and 39 thousand lines in a day: a working store with 74 products, 819 sitemap URLs, green tests and ads on 3,856 keywords. Payment acceptance awaits the gateway contract and image rights.

What was done

  • Next.js 16 App Router + Drizzle ORM + PostgreSQL: 22 storefront pages, 14 admin pages, 9 API routes, 18 server actions, 32 components
  • Database: 75 tables, 16 enums, migrations; catalogue of 74 products, 9 colour-coded categories, 14 brands, 518 translations
  • Money: integer cents, VAT from the database for 27 countries (OSS/domestic), 2 shipping methods × 27 countries × weight, promo engine, transactional stock reservation
  • Orders: an 18-state machine, success/failure pages, account via passwordless magic link
  • Admin: orders, products, inventory, pricing, customers, support, search, legal, settings, audit log; 6-role RBAC
  • Search: PostgreSQL full-text + pg_trgm with intent parsing (“mclaren” goes straight to the collection)
  • Images: 207 sources → 960 webp/avif via sharp in own storage
  • SEO: hreflang for 7 languages, 819-URL sitemap, schema.org Product and Breadcrumb, robots closing internal paths
  • Security: strict CSP, HSTS, rate limit, audit_log, passwordless login
  • Integrations: geoip for country and currency, Telegram order-event funnel, GA4 and Google Ads with Consent Mode v2
  • Google Ads: 7 Search campaigns by language, 448 groups “1 set = 1 group”, 3,856 keywords, 331 negatives, 448 RSAs, three-phase strategy
  • Tests: 39 automated tests plus a mobile Playwright funnel — all green

Screens

Explore the details — the full picture

Idea and concept

The client — a seller from Kraków — wanted a European store of sets that does not look like yet another catalogue. We started with buyer research and framed the concept “look what I found”: we sell the “daaad, look what I found!” moment and the calm of the one who pays. Hence three navigation entries, a three-question gift finder, a story card instead of a spec table, hand-written copy and an accent colour per category.

Storefront

22 pages: a home with a locomotive hero and Rare/New/Favourites shelves, categories and brands inside them, a product page with gallery, what's inside, build time, who will love it and JSON-LD Product, live search with intent parsing (“mclaren” goes straight to the collection), curated sections, a cart that recalculates tax and shipping when the country changes, checkout, result pages, a magic-link account.

74 products from €16.99 to €936.99, 9 categories, 14 brands, 518 translations in 7 locales, 207 source images turned into 960 webp/avif via sharp in own storage.

Money mechanics

All amounts are integer cents. VAT comes from the database for 27 countries in OSS and domestic modes. Shipping — two methods for 27 countries with weight steps, 135 rates. A promo engine, a Mystery Gift mechanic (off until legal review), an 18-state order machine, transactional stock reservation via FOR UPDATE so two buyers cannot buy the last set.

Pricing relies on BrickLink and brickwatch data: market median minus 7.5%.

Admin and security

14 admin pages: orders, products, inventory, pricing, customers, support, search, legal, settings, audit log. 6-role RBAC, passwordless magic-link login, an audit_log of every action. Strict CSP, HSTS, rate limit.

SEO, integrations, ads

hreflang for 7 languages, an 819-URL sitemap, schema.org Product and Breadcrumb, robots closing internal paths. geoip-lite detects country and currency offline. Telegram receives order funnel events. GA4 and Google Ads are wired through Consent Mode v2.

Google Ads: 7 Search campaigns by language for EU-27, 448 groups on the “one set — one group” principle, 3,856 Exact/Phrase keywords, 331 negatives, 448 responsive ads, sitelinks and callouts, a three-phase strategy in the README.

How it fit in a day

48 commits, 259 files, 39,195 lines on 7 September 2026: audit, buyer research, code, migrations, catalogue seed, legal drafts, ad files. AI was used openly at every step; 39 automated tests and a mobile Playwright funnel are green.

Honest: what is not finished

  • Payment is a redirect adapter to the owner's external form; server-side verification awaits the gateway contract.
  • Rights to the 207 product images are not confirmed; 12 legal documents are drafts pending a lawyer.
  • SMTP is not connected (e-mails go to the console) and the app runs without a systemd unit — both on the launch checklist.

Stack Next.js 16React 19Drizzle ORMPostgreSQLsharpTailwindPlaywrightGoogle AdsGA4Telegram API

request

Tell us the idea. A couple of lines is enough.

We reply within a business day in the messenger you choose. No newsletters.

Or straight to Telegram: @moreteploe

We need a @handle, phone or e-mail — otherwise we cannot find you.
Preferred channel

By sending you agree to data processing needed to answer your request.