The problem
I took over the CRM the print house ran its orders through — it was supposed to help, instead it was the bottleneck. Reporting didn't work, so nobody could say which clients were actually worth the press time, and the task system was too unusable for anyone to touch.
Underneath, the database had grown over years into an unoptimized sprawl: client and order data scattered across 15+ legacy tables, every interaction type in its own isolated log, a separate ERP re-keyed by hand to stay aligned. Answering "what did we print for this client, and what did we charge" meant opening several places and hoping they agreed.
What I built
Rebuilt on a clean schema: UUID primary keys with JSONB columns for the parts that genuinely vary between print jobs — flexible without losing referential integrity. The 15+ tables and 5+ scattered logs collapsed into one client timeline: every order, quote and conversation in one place, in order.
Reporting that actually runs, so the team can see which clients and which work pay off. A task system they use instead of avoid. ERP sync is automatic through a dual-key match (relation number + ERP id), with GDPR unsubscribe handling built into the data layer. The tool went from daily friction to daily driver.
Stack
Retool · Postgres · JSONB · UUID · ERP sync · GDPR