Case Study / 01
Internal app · Eskens
All work

Eskens Ops

An operations app that sits on top of our CRM's API and turns rows of job data into a live map of the UK, with every job as an icon and every van beside them. 40+ staff use it every day, from helpdesk and field engineers to projects, the warehouse, IT and senior stakeholders. I planned, designed, built and deployed it on my own.

Next.js React TypeScript Node.js Postgres Python Azure Entra ID PWA Web Push

Overview

Engineers used to track jobs in their own spreadsheets. Work got missed, and engineers would drive past jobs they didn't know about because the job was sitting in someone else's file.

The CRM holds everything as rows of data. Eskens Ops pulls those rows through the CRM's API every ten minutes and plots them on a map of the UK, with each job as an icon, so anyone in the business can see what's happening and where at a glance. When a new breakdown lands, the engineer whose area it's in gets a push notification on their phone, so a job booked while they're out on the road still reaches them.

I built it end to end on my own: planning, design, the Next.js app, the data pipeline, the Azure deployment and the rollout to the team.

What it does

One app for the whole business: helpdesk, field engineers, projects, the warehouse, IT and senior stakeholders.

01 / Map

Live job map

Every job from the CRM plotted as an icon on a map of the UK, with the company vans shown live from the tracking system.

02 / Claims

Claim a job

Engineers claim work from the map and planners see it arrive live. A claim made with no signal queues and sends itself on reconnect.

03 / Alerts

New-job alerts

A new breakdown pushes a notification to the engineer whose postcode area it's in, or to whoever is covering while they're away.

04 / Schedule

My week, everyone's week

Each engineer's week grouped by store, the whole team's week for planners, and the rota beside both.

05 / Helpdesk

Helpdesk and IT

The helpdesk dashboard, a second-line queue, and IT tickets with threads that notify both ways.

06 / Customers

Customers and machines

Every store and its machines, each machine with its own page and an append-only log of edits and notes.

How it works

The app reads the CRM's API on its own schedule: tickets and orders every ten minutes, sites hourly, machines every six hours. The fields the API can't give yet arrive from a Node agent inside the office network, and a Python agent reads the shared Outlook work-order diary. Everything lands in one Postgres table with its change history, and changes reach open screens straight away over a live stream.

Built as an app

Eskens Ops is a progressive web app, so staff install it on their phone or computer like any other app, and push notifications reach them even with the app closed.

Staff sign in with their Microsoft accounts through Entra ID, so there are no new passwords to hand out or reset. What each person can see and do is decided by their role on the server, never by the browser.

The app runs on Azure App Service with an Azure Postgres database, and deploys from GitHub Actions only once type checks, lint and its own test suite pass.

At a glance

40+
Staff using it every day, from helpdesk and field engineers to projects, the warehouse, IT and senior stakeholders.
30k
Rows of job data in one database, from the CRM's API, its exports and the Outlook work-order diary.
10 min
From a job being booked in the CRM to it appearing on the map and alerting the engineer whose area it's in.

Up next

Eskens Ops is an internal tool, so there's no public demo or repo. I'm happy to walk through it on a call.