Frontend
Next.js 15, TypeScript, Tailwind CSS, Zod
App Router, server components, BFF pattern. Multi-brand via hostname middleware rewrite.
Backend
NestJS, TypeScript, class-validator, Zod
Modular architecture. Guards, interceptors, structured error handling throughout.
Database
PostgreSQL, TypeORM, Redis
TypeORM entities with migration-first workflow. Redis for sessions, caching, BullMQ queues.
Auth
JWT, RBAC, multi-tenant sessions
Organization → Location hierarchy. Role isolation between staff, managers, owners, agency.
Billing
Stripe Connect + EZ Pay
Platform payments (Connect), direct processing (EZ Pay), subscription tiers, webhooks.
Messaging
Twilio, SendGrid, BullMQ
SMS and email via queue workers. Transactional + marketing. Template-driven, rate-limited.
Integrations
GloriaFood, Google, Meta
Real-time order intake from GloriaFood. OAuth login via Google + Meta. Maps + reviews API.
Deploy
Vercel, Docker, Cloudflare Tunnel
Vercel for frontend. Docker + Cloudflare Tunnel for local dev with external webhook access.
BFF pattern throughout
Every browser request hits a same-origin Next.js route handler, which proxies to the NestJS backend. No internal tokens, backend URLs, or credentials ever reach the client.
Multi-tenant at the data layer
Organization → Location → User hierarchy enforced at the database and API levels. Row-level scoping prevents cross-tenant data access regardless of what the UI does.
Queue-backed async work
BullMQ handles all non-request-critical work: order processing, email delivery, report generation, webhook retries. The request cycle stays fast and decoupled.