Challenge
Shared mailboxes are easy to forget. Checking each one by hand creates noise, and the things worth knowing first thing in the morning — what's unread, how the website is doing, whether email authentication is healthy — lived in five different portals.
Approach
A scheduled C# Azure Function collects unread counts and recent message previews from every shared mailbox through Microsoft Graph and sends one branded, responsive email at 09:00 and again at 13:00 each weekday. It grew into an operational briefing: top pages and referrers from the site's own analytics store, a GA4 summary and lead signals, and the DMARC/TLS-RPT compliance summary — all read from first-party SQL rather than by logging into anything. Each data source keeps its own cursor, so if the database is unavailable for one run that window is simply picked up next time rather than lost. A time-window guard stops the same digest going out twice, and an unavailable mailbox degrades that section rather than the whole email.
What it looks like
Outcome
- One email replaces a round of inbox and portal checks: mailbox status, site performance and email security posture together — both digests sent every weekday since 25 August 2026, 38 of 38 weekdays to 15 October
- A time-window guard stops a retry sending the same digest twice, and a digest that stops is noticed: an outside availability check alerts when the host stops answering, and each email carries a data-health card that flags any feed gone quiet
- Renders correctly in Outlook, Apple Mail and on mobile
- Every send is logged, so a missing digest is diagnosable
Have a similar problem in your own systems? Book a free 20-minute call or describe it.
Where judgement mattered
- Independent cursors per data source — a failure in one feed never discards another's data
- Reading from the first-party store instead of live portal APIs, so the digest doesn't depend on five vendors being up at 8am
- Designing for partial failure: one broken mailbox is a gap in the email, not a missing email
- Moving storage access to credential-free authentication so there is nothing to rotate
Technology stack
C# / .NET 10 · Azure Functions · Microsoft Graph · Azure SQL · Azure DevOps multi-environment pipeline