Case studyFeatured
Dialogue Time – Time Tracking & Planning Portal
Replaced scattered timesheets and manual payroll processes with a single source of truth. Consultants log hours in one system, managers approve in real-time, and exports are audit-ready by default.
Full-stackInternal toolsIntegrationSecure & Auditable
ReactNode.jsExpressSequelizeMySQLMongoDBMicrosoft GraphAzure AD / MSALDockerApache
Client
Dialogue One A/S
Industry
Consulting / IT services
Role
Lead architect & full-stack developer
Timeframe
2019-2021
Location
Copenhagen, Denmark
Published
Dec 1, 2021
Context
Dialogue One wanted a single source of truth for hours, payroll, and scheduling. Time registration lived in spreadsheets and email, project planning sat in Outlook calendars, and payroll checks were manual. Off-the-shelf tools were either too heavy or didn’t integrate with Microsoft 365.
Approach
- Architecture: React PWA + Node/Express API with Sequelize on MySQL; MongoDB for announcements and WebSocket notifications.
- Security & identity: MSAL2 SSO with Azure AD groups, JWT bridge for the API, and Graph for calendar awareness.
- Data model: Double-ledger schema linking hours, salary periods, and audit trails via Sequelize hooks.
- Integrations: Emply HR data on login, Ninox CRM and Danløn targets, Swagger-documented REST API.
- Ops: Dockerised services on an Ubuntu host behind Apache; service workers for cache-first UX and update prompts.
Highlights
- Flux-style global state and Axios interceptors that pair Graph bearer tokens with JWTs.
- Excel add-in + VBA tooling for billing/export to match the database schema.
- Rate-limited API with CORS allowlists and method guards; WebSocket reminders for missing hours.
Impact
- Centralised hours and scheduling instead of scattered spreadsheets.
- Reduced manual payroll checks through ledger-backed exports and add-ins.
- Higher adoption thanks to SSO, calendar alignment, and a fast PWA experience.
- Reusable patterns (Docker host, reverse proxy, identity bridge) now power other internal tools.