Money Exchange SAAS platform

money exchange saas platform
Overview
Evolved a branch-focused money exchange product into a true SaaS platform in 2026, with tenant onboarding, plan-based access, platform-owner controls, billing histories, payment records, and separate web and platform frontends.
Tech Stack
Frontend
React + TypeScript + Vite + Tanstack Query + ShadcnUI + TailwindCSS + Zustand + react-hook-form + clsx
Backend
Golang + Gin + GORM + SQLC + PostgreSQL
Infra
Docker + Docker Hub + AWS Lightsail + Caddy
Auth
JWT access tokens with httpOnly refresh cookies
The Shift
The original money exchange system worked as a custom operational product. In 2026, I redesigned it into a multi-tenant SaaS so multiple shops could onboard independently, manage subscriptions, and be controlled through a dedicated platform-owner interface rather than ad hoc per-client deployments.
What I Built
- Tenant signup flow with isolated tenant bootstrap data and admin account creation.
- Tenant self-service profile management for business info, owner name, phone, region, and address.
- Dedicated platform authentication, session refresh, current-session, and logout endpoints.
- Platform tenant list, tenant detail, billing history, dashboard metrics, and manual status transitions.
- Subscription purchase, renewal, upgrade, and downgrade flows with payment row creation for true financial reporting.
Platform & Billing Layer
- Implemented platform-owner APIs for tenant management, billing history viewing, dashboard revenue metrics, and subscription actions.
- Added real payment storage so revenue reporting is based on actual money collected instead of only plan estimates.
- Separated current subscription state, billing-cycle state, and payment history so product, ops, and finance concerns stay cleanly modeled.
- Added auto-scheduled lifecycle controls for tenant statuses like active, readonly, and suspended
Hard Problems Solved
- Modeled paid-plan lifecycle, readonly grace windows, and future scheduler readiness without over-automating too early.
- Built same-origin frontend deployments where static apps proxy API and asset requests cleanly through Caddy.
- Introduced platform-specific auth flows without mixing tenant-user and platform-user identity boundaries.
- Designed billing metrics to distinguish real collected cash from projected MRR, avoiding misleading SaaS reporting.
Outcome
- The product moved from a single-solution operations tool to a reusable SaaS foundation.
- Tenant-facing and platform-facing surfaces are now clearly separated, which makes future growth and support work much cleaner.
— End of content —