The problem
The business lived in three large, disconnected spreadsheets — around 130,000 records that were edited by hand, joined with lookups, and quietly hitting row limits. There was no audit trail, no backup strategy, and no safe way to grow: one bad paste could lose data nobody could recover.
Separately, the call-centre data sat in the telephony provider's database, but it never reached analytics. The off-the-shelf transfer tool kept failing because the provider enforces a hard limit of two concurrent connections — so reporting was always stale or simply missing.
What I built
A self-hosted database platform on the firm's own cloud: NocoDB over PostgreSQL, behind a reverse proxy with automatic HTTPS and Google SSO locked to the company domain, with daily backups pushed to object storage and a verified restore path. Non-technical staff get a familiar spreadsheet-like UI; the data underneath is finally relational, access-controlled, and auditable.
For the call-centre data I replaced the failing transfer with a scheduled job that syncs 27 tables into the warehouse every 15 minutes. It runs single-connection by design to respect the provider's two-connection limit, uses watermarks for incremental loads, and de-duplicates with merge-on-write — so analytics stay current without ever exhausting the source.
A separate contract panel ties the legal workflow to the sales CRM via webhooks, syncing statuses both ways.
Stack
NocoDB · PostgreSQL · Google Cloud · Cloud Run · BigQuery · Python · Docker · Traefik · Next.js · Express