Support Platform
Full-stack customer support infrastructure — designed as a graduate, still in production nine years later. Now powers the company's AI agent workflows.
I designed the initial database schema within weeks of joining as a graduate engineer in late 2016. Over nine years I’ve built and maintained the full stack — backend services, API layer, consumer infrastructure, Angular webapp, and the admin tooling around it.
What it covers
The platform handles the complete support lifecycle across 28+ configurable support types:
- Agent management — creation, availability tracking, away status, session assignment limits, preferred agent routing
- Session handling — auto-assignment (round-robin, capacity-based), escalation, resolution tracking with configurable reasons per support type, session notes and tagging
- Real-time chat — customer-facing and admin interfaces, with session history and agent sidebar
- Queue infrastructure — 5 RabbitMQ consumers handling notification delivery, away status, automated chat, blast messaging, and project-specific tagging
- Feedback — CSAT collection and tracking
- AI integration (2024–25) — suggested messages, auto-replies, initial message generation, escalation handling — all built on top of the original session APIs without modification
Scale
~13K lines of backend PHP across 89 files, 90+ Angular components, 148 database migrations tracking the schema’s evolution since 2016. The Thrift API layer exposes ~33 endpoints covering agent operations, session management, chat, configuration, and the newer AI features.
Enterprise integrations for NASA, Deloitte, and Arrow Technologies each involved bespoke API work, custom access controls, and enterprise-specific data handling.
What I find interesting about it
The session APIs I wrote in 2018 are the same ones the AI agent workflows were built on in 2024 — no modifications needed. That wasn’t because I predicted AI would use them. It was because the abstractions were right: sessions, agents, assignment, resolution. The AI team just treated their bots as another type of agent. The interfaces held up because they modelled the domain correctly, not because they were over-engineered.