← All case studies

Case study

GCH Billing

An internal billing and practice-operations dashboard for Greater Change Health's therapy business - Stripe subscriptions, tiered pricing, and a full audit trail, later split onto Cloudflare's edge network.

Delivered with our partnerHenge
GCH Billing logo
GCH Billing redesigned website

Project overview

Billing infrastructure built to run in the background.

Greater Change Health needed more than a payment link: recurring therapy subscriptions, discounted first sessions, promo codes, add-ons, and a clear record of who changed what. We built GCH Billing as a dedicated internal tool so the operations team can manage pricing, subscriptions, and Stripe reconciliation without touching code.

The challenge

Manual billing doesn't scale with recurring care.

Session-based therapy billing has real edge cases: discounted first sessions, couples billing, card-verification holds, and retries on failed payments. Handling this by hand in the Stripe dashboard was slow and left no clear record of who adjusted a client's plan, or why.

What we did

A purpose-built admin, not a spreadsheet.

We built a Fastify API and Next.js dashboard around Stripe: hosted Checkout with optional Klarna, a self-serve Customer Portal for clients, tiered pricing with add-ons, promo codes with a saved snapshot per client, role-based access, and an audit log covering every sensitive action. Chart widgets for revenue, churn, and top customers are drag-and-drop, so the team builds the dashboard views it actually uses.

Under the hood

What the platform actually handles.

01Stripe-first billing

Hosted Checkout with optional Klarna, a self-serve Customer Portal, and an admin job that reconciles the database against Stripe.

02Tiered pricing & add-ons

Discounted first sessions, standard-rate renewals, and one-time add-ons are managed from tables, not hardcoded logic.

03Role-based audit trail

Every sensitive action is logged and filterable by admin, action, entity, and date, across 14 incremental schema migrations.

04Customizable dashboard

A drag-and-resize chart grid with revenue, churn, and per-tier breakdowns, saved per admin.

The Results

Split cleanly onto Cloudflare, without a rewrite.

The original Docker-Compose app (Fastify API, Next.js dashboard, Postgres, Nginx) was later re-architected for Cloudflare: the dashboard shipped as a Worker, while the Fastify API, which needs native bcrypt, a persistent Stripe scheduler, and a Postgres connection pool, moved into a Cloudflare Container instead of being force-fit into a stateless Worker. Every migration and the full Stripe integration carried over unchanged.

Discuss your own project