Case study · Monitoring

Live service status board with Teams alerts

One page that watches our suppliers and our own websites every minute, catches certificate faults Windows hides, and tells the right people in Microsoft Teams without the noise.

Node.js Microsoft Teams Power Automate Monitoring TLS

My role: Technical Operations & QA Specialist. I designed, built and tested this myself, directing Claude Code as my AI pair programmer.

At a glance

The problem

Every day, someone on the support team opened each supplier’s status page and our internal monitoring by hand, checked them one by one, then ticked a checklist in Microsoft Teams.

It was slow and easy to forget. Worse, nobody heard about a problem that started between checks.

What I built

One web page that checks 7 third-party suppliers (payments, email, helpdesk, direct debit and banking providers) and 21 of our own websites every 60 seconds. Each one shows green, amber, red or grey, and the board posts to Microsoft Teams when something changes.

Service status Checked 60 seconds ago · next check in 0:42

Suppliers

  • Payments providerOperational
  • Helpdesk platformOperational
  • Direct debit providerOperational
  • Banking providerCan’t check
  • Email platformDegraded

    “We’re investigating delays to outbound email. Messages are queued and will be delivered.”

    View supplier status page

Our websites

  • portal-a.example.com200 · certificate 84 days
  • shop-c.example.com200 · certificate 61 days
  • booking-d.example.comCertificate expires in 21 days
  • portal-b.example.comProblem

    Incomplete certificate chain: the server isn’t sending its intermediate certificate. Some devices and apps will refuse to connect.

Illustrative – names changed A mock-up of the board in each state: green (operational), amber (degraded, maintenance or expiring soon), red (outage or certificate fault) and grey (can’t check).

How it works

Supplier status feeds7 suppliers, read every minute
Our websites21 sites, connected to every minute
Status boardPlain Node.js, no dependencies
Management chatOutages, “it’s fixed”, 9am summary
Support team chatEvery change, summaries at 9, 11, 1, 3 and 5
How information flows: supplier feeds and our websites go into the status board, which posts to two Microsoft Teams chats.

Suppliers

Every minute, the board reads each supplier’s official status feed: the machine-readable data behind their public status page. It understands the Atlassian Statuspage, status.io, StatusHub and Freshstatus formats.

  • Operational shows green.
  • Degraded or maintenance shows amber.
  • Outage shows red.

Each card quotes the supplier’s own explanation and links to their page. If a feed can’t be read or changes shape, the card shows grey (“can’t check”). It never shows a false green.

Our websites

Every minute, the board connects to each site the way a customer’s browser does. It checks that the HTTPS certificate is valid, issued for the right name, not expiring within 30 days, and sent with its complete chain. Then it reads the response code.

Teams alerts for two audiences

  • Management’s chat gets outages only, the “it’s fixed” message, and one summary at 9am every day.
  • The support team’s chat gets every change, plus summaries at 9, 11, 1, 3 and 5.

Every message links back to the board and to a certificate report.

Support team chat

Status board 09:42

Problem: portal-b.example.com

Incomplete certificate chain. The server isn’t sending its intermediate certificate, so some devices and apps will refuse to connect.

Open status boardCertificate report

Status board 10:31

Resolved: Email platform

Operational again and stable for 15 minutes.

Open status board

Illustrative – names changed Two example messages: a certificate problem, and a recovery that was only announced once it had been stable for 15 minutes.

Certificate report

A second page lists every site’s certificate issuer, expiry date and days left, with problems first and a CSV download.

Built to be light

  • Zero dependencies. Plain Node.js using only built-in modules. No npm install, no build step, no database.
  • Tiny footprint. About 55 MB of memory and almost no CPU.
  • Built, not bought. I trialled an off-the-shelf tool (Uptime Kuma) first. I built my own because I needed to read each supplier’s own explanation and route alerts to different audiences.

Making alerts useful, not noisy

Alert noise was the hardest problem. Alerts that cry wolf get muted, so every rule below exists to keep messages rare and trustworthy.

  • Problems now, recoveries when stable

    Problems alert immediately. Recoveries wait until things have been stable for 15 minutes. One supplier incident that flapped back and forth would have sent about 25 messages. It now sends 2.

  • Confirm before alerting

    A site must still be down a minute later before anyone is alerted, so a one-off network blip never reaches Teams. Certificate faults alert at once.

  • Never repeat itself

    It remembers what it has already announced, so restarts never repeat messages. If two copies run at once, only one posts, using a lock file with a heartbeat.

  • No false alarms when it’s offline

    If the board loses its own internet connection, everything goes grey rather than red.

  • UK time, all year

    Schedules run on UK time and stay correct through daylight-saving changes.

Tested properly

40 automated checks, including a replica of the real certificate fault, 12 back-to-back restarts, two copies running at once, and a simulated clock change.

Safe by design

Read-only, using public information only. No logins or passwords stored. Webhook secrets are kept out of source control, and test endpoints are disabled in production.

Outcome

  • Replaced the manual daily checklist with live monitoring and automatic alerts.
  • Adopted by the business and hosted internally.

A really good addition to visibility.

The CIO, who asked for it on the office wall and for a show-and-tell

What I learned

Designing alerts for different audiences matters as much as detecting problems. Noisy alerts get ignored, however accurate they are.

And “it works on my machine” can hide real faults. The certificate issue looked fine on our machines, and was still broken for other devices and apps.

Back to portfolio