A scheduled automation engine that refreshes Excel reports, uploads them to cloud storage, and emails shareable links on a cron schedule. It replaced hours of repetitive manual work every day.
Every morning, the same ritual played out. Staff would log in, open a set of Excel reports, manually refresh data connections, save the files, upload them to a shared drive, compose individual emails with download links, and send them to the right stakeholders. This happened every single workday, without exception.
The process wasn't complicated, it was tedious. And because it was tedious, it was fragile. Reports went out late. The wrong version got attached. Someone forgot to refresh the data before uploading. Recipients had no way of knowing whether they were looking at yesterday's numbers or today's. There was no audit trail and no consistency.
The team at the institution knew this was a problem, but they treated it as a cost of doing business. "That's just how we've always done it." Meanwhile, skilled staff were spending the first hour of every day on work that a well-configured script could handle in seconds.
Staff manually opened and refreshed Excel reports every day. This repetitive, error-prone process ate up the first hour of every workday.
Reports arrived at different times depending on who was handling them that day. Stakeholders never knew when to expect their data.
Wrong attachments, stale data, missed recipients. Manual processes meant mistakes were inevitable and often went unnoticed.
Nobody could say with certainty when a report was sent, whether the data was current, or who received it. Accountability was nonexistent.
We sat down with the team and mapped every step of their morning routine: which reports, which recipients, what format, what schedule. We documented every manual touchpoint and figured out which steps could be automated.
We built a Node.js engine using ExcelJS to open and refresh reports programmatically, then used the Microsoft Graph API and OneDrive API to upload files to cloud storage and generate shareable links. No human intervention needed.
We designed HTML email templates with embedded shareable links and sent them through Nodemailer with SMTP and Azure authentication. Each report type gets its own template, recipient list, and delivery schedule, all configurable without touching code.
I wrapped everything in node-cron for time-based scheduling, added error logging with retry logic so failed uploads or emails get re-attempted automatically, and built a configuration layer so the team can adjust schedules and recipients without calling me.
Let's talk about how automation could give your team their mornings back.
Start a ConversationReports are opened and refreshed programmatically using ExcelJS. Data connections pull the latest numbers without anyone lifting a finger.
Updated reports are uploaded to OneDrive via the Microsoft Graph API, and shareable links are generated automatically for each file.
Reports run on configurable cron schedules: daily, weekly, or custom intervals. The system handles timing so staff never have to think about it.
Stakeholders receive clean, professional HTML emails with embedded links, not raw file attachments. Each report type has its own branded template.
Supports both traditional SMTP and modern Azure authentication for sending emails. Compatible with institutional security policies.
Every action is logged. If an upload fails or an email bounces, the system retries automatically and alerts the team only if human intervention is truly needed.
Stakeholders receive clean, branded HTML emails with direct links to the latest report files on OneDrive. No attachments to download, no version confusion. Just click and view the current data.
Each report has its own cron expression, recipient list, and template. The team can add, remove, or reschedule reports through a configuration file. No code changes needed.
A complete record of every refresh, upload, and email delivery, with timestamps, file sizes, and recipient confirmations. Failed operations trigger automatic retries and admin notifications.
I used to start every morning with 30 minutes of report wrangling before I could do any real work. Now the reports are in everyone's inbox before I even get my coffee. It's the kind of thing you don't realize how much it was costing you until it's gone.
This workflow had been running manually for years. Everyone accepted it as just part of the job. Nobody had stopped to calculate that five people spending 30 minutes a day on it added up to over 1,000 hours a year. The first step wasn't building anything. It was making the hidden cost visible.
The team didn't care whether reports went out at 6:00 AM or 7:00 AM. What they cared about was knowing it would happen, every time, without fail. The retry logic and error logging weren't afterthoughts; they were the whole point. Fast but flaky automation is worse than no automation at all.
The first version had schedules and recipients hardcoded. Within a week, the team needed to add a new report and change a delivery time. Making schedules, templates, and recipient lists all configurable turned a one-off script into a system the team could own without calling me.
Every project starts with a conversation. Tell us about the repetitive workflows taking up your team's time, and let's figure out what automation could look like for you.
No pitch. No pressure. Just a conversation about what might work.