Read this case study on its own page
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, what the ads cost yesterday, 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. It grew into a daily operational briefing: top pages and referrers from the site's own analytics store, a GA4 summary, ad spend 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.
Outcome
- One email replaces a round of inbox and portal checks: mailbox status, site performance, ad spend and email security posture together
- No duplicate sends and no silently skipped days
- Renders correctly in Outlook, Apple Mail and on mobile
- Every send is logged, so a missing digest is diagnosable
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