GS//DIGITAL ANCHOR

DEPLOYMENTS / GLOWINFACE

STUDIO · TRAINING · SHOP

Glowinface

One Next.js codebase running three businesses under two brands: the Glowin Studio physical clinic site (treatments, workshops, masterclasses), the Glowinface digital training platform (Vimeo lessons, membership, teacher-training), and a full Stripe + GLS + Minimax e-commerce shop. 632 commits, 500+ deployments, still shipping weekly.

CLIENT

Glowin Studio

YEAR

2025 — ongoing

SYSTEMS

WEB

STATUS

DEPLOYED

632

commits of continuous delivery

500

production deployments

10

external integrations, one codebase

[ THE BRIEF ]

The challenge we walked into.

The client didn't want three websites, three CMSes and three invoicing setups. They wanted one platform that could sell an in-studio treatment, an online training subscription, a physical product with GLS shipping, and issue a proper Slovenian invoice — all from the same customer account. Off-the-shelf platforms couldn't span the surface without a plugin stack that would rot within a year.

[ TOPOLOGY ]

How the system is wired.

auth + ordersPaymentIntentplayerlabelsinvoice synceventsreceiptsabandoned-cart sweepwebhook(glowinface)TRAINING + SHOP(glowinstudio)CLINICNext.js 16APP ROUTERSupabaseAUTH · DB · STORAGEStripePAYMENTS + SUBSVimeoCOURSE VIDEOGLS APISHIPPINGMinimaxINVOICESKlaviyoLIFECYCLEResendTRANSACTIONALVercel CronABANDONED + HK

// SYSTEM TOPOLOGY

[ WHAT WE SHIPPED ]

Feature by feature.

[ FEATURE // DUAL-BRAND ROUTING ]

Two brands, one codebase.

Route groups (glowinface) and (glowinstudio) let both brands share every component, cart and auth flow while presenting themselves as distinct sites — different navigation, different content, different SEO. Adding a new brand later is a route group and a theme, not a fork.

  • (glowinface) — training platform + shop
  • (glowinstudio) — physical clinic + workshops
  • Shared cart, auth, checkout
  • Independent nav + SEO per brand

[ APPROACH ]

How it came together.

01ONE CODEBASE, THREE BUSINESSES

Route groups let two brands share every wire.

The (glowinface) route group hosts the training platform and product shop; the (glowinstudio) route group hosts the physical clinic's site — treatments, workshops, masterclasses. They share every component, the cart, the auth model and the checkout — but present as distinct brands. This is why a bugfix ships to both sites at once, and why adding a new brand later is a route group, not a fork.

02EXTERNAL SERVICES AS THE BOUNDARY

Payments, video, shipping, invoicing, marketing — each has one entry point.

Every third-party integration lives behind exactly one /api route. Stripe is payment-intent-secret + subscription-paid. Shipping is gls. Invoicing is minimax. Marketing is klaviyo. This keeps the surface small: if the courier changes tomorrow, we touch one file — not the whole codebase.

03CONTINUOUS DELIVERY CADENCE

500+ production deploys and still shipping weekly.

Glowinface isn't a launch-and-leave build. Every week ships new products, new lessons, translation fixes, conversion tweaks and new promos. The pipeline was built to sustain that: preview-per-PR, typed integration boundaries, and idempotent cron so re-running never hurts.

04SEO AS ENGINEERING

Rankings come from clean HTML, not tags.

Structured data, per-locale metadata, ISR for near-static pages, sitemap.ts and Search Console verification files ship as part of the build. Both brands earn organic traffic; neither is renting attention.

[ DELIVERY ]

What the build looked like.

glowinface.build.log◐ BUILDING…

01

[ TECH STACK ]

What’s under the hood.

HOVER FOR ROLE

[ IMPACT ]

What changed.

One platform now runs three businesses under two brands: the physical clinic, the online training program and the product shop. New products ship in minutes; new lessons in an hour; every paid order becomes a compliant invoice without a bookkeeper touching a keyboard. 632 commits later, the site is faster, better-translated and more automated than at launch — that's what continuous delivery looks like when the stack was built to sustain it.

[ POWERED BY ]

NEXT.JSSUPABASEVERCELSANITYSTRIPE