Building a global admin panel for a small cloud platform
Customer support, billing reconciliation, GST invoicing, fraud signals — all in one panel. Five days of work that pays back monthly.
The most under-discussed part of running a small cloud is the day-to-day support work — checking why a customer's VM didn't boot, refunding a duplicate invoice, looking up a GST number before generating a B2B invoice. We did this throughpsql for the first two months. It was fine until it wasn't.
The trigger
Our first paying customer asked, "Can you check why the instance I created last week is in provisioningstate?" The honest answer required SSHing to the host, running three SQL queries, parsing a Proxmox task log, and eyeballing the NAT reconciler logs. Took 12 minutes.
That's fine for one customer. It's not fine for ten. We built an admin panel.
What we shipped in five days
Phase A through E, named for the order we'd implement them:
- A — Foundation. Sidebar, role gating, BFF passthrough that prefixes
/adminto upstream service routes. - B — Read-only dashboard. Customers, accounts, instances, invoices. Filterable, paginated. No mutations.
- C — GST tooling. Browse invoices by GSTIN, export GSTR-1 summary CSV, regenerate stuck invoices.
- D — Ops actions. Force-stop a VM, refund an invoice, suspend a misbehaving account. Each action audit-logged.
- E — Polish. Mobile sidebar, per-page titles,
noindexmeta, notifications wired up.
The principle
Everything you might do for a customer at 11 PM should be one click in the admin panel. Everything you doto a customer (suspend, refund, escalate) should be logged with your user_id and the reason.
Concretely, the panel reads from the same Postgres the product reads from — no separate "admin database". Every mutation goes through the same backend handlers as customer actions, just with elevated permission. This means the admin panel can't drift from production reality.
What it pays back monthly
- Support time per ticket dropped from 12 minutes to ~90 seconds for the common cases.
- GST quarterly filing went from "one full Sunday" to "one cup of coffee" — the CSV is generated, we hand it to the CA.
- Invoice anomalies (duplicate, mis-categorised, wrong tax) get caught the day they happen instead of at month-end reconciliation.
- Customer "what's happening with my account?" answers go from 12 minutes to "I see exactly what you mean, fixed."
The unfair-advantage take
A polished admin panel is one of the few engineering investments where the ROI is overwhelmingly positive at small scale and stays positive at scale. AWS doesn't have one because they have 100 SREs to write SQL. You have one co-founder; build the panel.