GebaShop: a live Korean-skincare store taken off WordPress and rebuilt as one TypeScript app on Cloudflare’s edge — storefront, payments, shipping and a bilingual admin, no CMS behind it.
GebaShop was a working WordPress/WooCommerce store; it now runs as a single TypeScript application rendered on Cloudflare’s edge — storefront, customer accounts, a bilingual admin and every API route in one codebase, no CMS and no plugin layer. Card and Vipps payments clear real money, Posten Bring rates and labels are live, and the front end ships with no UI framework — no React, no jQuery, no page builders.
(01) — Challenge
Where it started
E-commerce · Norway
Migrating a live shop is a different job from building a landing page: the catalogue, order history, discount rules, content and — critically — the SEO weight of every old URL had to move without breaking. A plugin stack that had accreted for years needed replacing with code the studio fully controls, while the store kept taking orders. Every legacy WooCommerce address had to keep resolving, or the shop would lose the search ranking it already had.
(02) — Solution
What we built
Hand-coded. Design, build and handover by the same two people.
The engine is one Astro-SSR app on Cloudflare Workers over D1 (SQLite), R2 (images) and KV (sessions, rate-limits, reset tokens); prices are stored as integer øre, never floats. Billing is real: QuickPay v10 with Clearhaus acquiring, card and Vipps, capture and refund from the admin, and every webhook verified by HMAC-SHA256 over the raw body — the amount is always recomputed server-side from the cart, never trusted from the client. Shipping is live: Posten Bring rates by postcode and weight, pickup-point lookup, and one-click booking with label and tracking from the order screen. On top sits a from-scratch bilingual (Norwegian / Russian) admin over the same edge database, plus in-browser WebP resizing on upload, FTS5 search with Norwegian folding, and a bought-together block computed from real co-purchases. Security is not bolted on: PBKDF2-SHA256 at 100 000 iterations, parameterised SQL throughout, and a middleware guard that returns 401 rather than leaking data. Even product pages hold their speed: a product URL measured 99 on mobile and 100 on desktop on 11 August 2026, medians of three runs — a full shop with billing that still loads like a static site.
(03) — Result
What we delivered
(04) — Proof
Measured, not claimed
Third-party audits of gebashop.no. Every score is independently verifiable — the link re-runs the test on the live site.
PageSpeed Insights
Measured August 11, 2026
- 100
- Performance desktop
- 99
- Performance mobile
- 97
- Accessibility
- 100
- Best Practices
- 100
- SEO
- 3/3
- Agentic
Want results like these, in writing?
Send the 5-minute brief and a fixed written proposal comes back the same business day.