Portfolio / Case studies / Workflow Health Monitor
✦ AI tools · 1 of 3 · Workflow Health Monitor · Porch Moving Group
15 minutes a day. A 35% conversion lift.
I was spending about 8 hours a week checking our live lifecycle emails by hand. So I built an AI monitoring agent that checks every one, every day, against its own normal, and explains what’s wrong in plain English.
5 min read · AI tools series, part 1 of 3
✦ See how it worksMy role
Lifecycle Marketing Manager (designer and builder)
Focus
Email Performance, Marketing Operations
Tools
Apps Script, Sheets, HubSpot APIs, Gemini, Claude, Gmail, Slack
Scope
About 50 live workflow emails across five brands
⚡ The 30-second version
About 8 hours a week went into checking our live lifecycle emails by hand: opens, clicks, bounces, trends. It was slow, reactive, and easy to miss something.
An AI monitoring agent that checks every live workflow email every day against its own normal. When something drifts, it sends an alert with a likely root cause and a fix, linked straight to HubSpot.
It caught underperforming emails in a campaign we hadn’t prioritized, which turned out to convert well. Fixing them lifted that workflow’s conversion by 35%. Checking every email went from about 8 hours a week by hand to about 15 minutes a day, and leadership now sees it as a way to convert more and work more efficiently.
Lifecycle email
Marketing ops
Statistics
AI tooling
HubSpot APIs
Apps Script
🚀 Results
+35%
🎯 The catch that proved it
The monitor flagged underperforming emails in campaigns we hadn’t prioritized. When I dug in, they were high-converting campaigns. We updated those emails and saw a 35% increase in conversion from that single workflow. Since then it has caught many more emails as they start to slip, before they become a problem.
Time to check every email
~15
min/day
Down from ~8 hours a week of checking by hand
Coverage
Daily
Every live workflow email across five brands, instead of weekly spot checks
Where my AI tools started
1st
of 3 AI tools
Its approach became the base for the Property Health Monitor and the AI testing assistant
• ~8 hours/week manual monitoring
• Reactive issue detection
• Generic industry benchmarks
• No AI-powered guidance
✓ Fully automated daily monitoring
✓ Proactive anomaly detection (1.5σ / 2.5σ)
✓ Per-workflow statistical baselines
✓ AI recommendations via Gemini
In short: lifecycle email problems are quiet, and checking about 50 emails by hand each week wasn’t catching them.
We run about 50 live workflow emails across HireAHelper, MovingPlace, PODS, Budget Truck, and PackRat. Problems in lifecycle email are quiet. A nurture email whose click rate slips doesn’t show up in program totals, and a workflow that stops enrolling people doesn’t send an error. The only way to catch these was to check every email by hand each week.
Generic benchmarks didn’t help either. A welcome email and a 10-month nurture email behave nothing alike, so “opens are down 10%” means very different things for each.
The challenge was to
Watch every live email, every day, without adding hours to the week.
Tell a real problem from normal noise.
Tell the team what to do, not only that a number moved.
Keep it transparent enough that the team would trust the alerts.
In short: the monitor learns what normal looks like for each email, and AI explains what moved.
Instead of fixed percentage drops, the monitor learns each email’s typical performance and alerts on standard deviations from it. I used HubSpot’s AI assistant, Breeze, to work through the statistical approach, then built it myself in Apps Script.
Warning at 1.5 to 2.5 standard deviations from that email’s average; critical beyond 2.5.
Low sends, opens, or clicks raise an alert; so do rising bounces or unsubscribes.
Issues for the same email are grouped into one alert with a priority tag, so the team isn’t flooded.
Gemini writes a likely root cause and one recommended fix per email, with Claude as the fallback when Gemini hits its limits.
Normal
within 1.5 std devs
Warning
1.5 to 2.5 std devs
Critical
beyond 2.5 std devs
Distance from that email’s own average, in standard deviations.
In short: an eight-step pipeline runs every day, then I review what it flags and decide what we fix.
Eight automated steps, then a human decides what to fix.

① Collect and store
1 · ⏰ Fetch
HubSpot Automation API v3 finds every active workflow, skipping test and ops flows.
2 · ✉️ Stats
Marketing Email API v1 pulls each email’s name and numbers.
📤 Sent
👀 Opens
👆 Clicks
🚫 Unsubs
⚠️ Bounces
3 · 📊 Store
A new row in the Workflow Health Data tab on every run: the raw material for the statistics.
4 · 📈 Trends
Monthly Trends and Year over Year tabs update with each run.
Month over month
Year over year
② Analyze and decide
5 · 📐 Analyze
Each email against its own mean and standard deviation, on a 30-day rolling window.
6 · ❓ Decide
No
✅ All healthy. It checks again tomorrow.
Yes → step 7
🟡 Warning at 1.5 to 2.5σ
🔴 Critical beyond 2.5σ
🎚️ Per email
A welcome email and a 10-month nurture email each get their own baseline, so alerts mean something.
③ Explain and act
7 · ✨ Explain
Gemini 2.0 Flash reads the issues and writes a likely root cause and one fix. Claude takes over when Gemini hits its limits.
8 · 🚨 Alert
One email and Slack alert per email, with a priority tag and links to the workflow and the email in HubSpot.
🧠 Human
About 15 minutes a day reading the alert and deciding what we fix first.
✍️ Team
HubSpot’s API can’t edit emails, so fixes are made by hand, and the next run shows if they worked.
Google Apps Script, Google Sheets, Gmail, Slack webhooks
HubSpot Automation v3, HubSpot Marketing Email v1, Gemini 2.0 Flash, Claude as fallback
Standard-deviation thresholds, per-workflow baselines, 30-day rolling analysis
Anatomy of an alert
Severity and priority
Critical or warning, with a priority tag, so the team knows what to open first.
Which workflow, which email
Named in full, with a link straight to each in HubSpot.
What moved, in standard deviations
Every issue for that email in one place, against its own average.
AI root cause and one fix
Written by Gemini, or Claude when Gemini hits its limits.
Critical
Priority: high
Email 5 · View email →
Issues detected
• Open rate is 2.0 std devs below this email’s average
• Unsubscribe rate is 2.8 std devs above this email’s average
✦ AI recommendation
Likely root cause: email fatigue. Reduce send frequency and suppress inactive subscribers on this step.
View workflow in HubSpot →
FIG. 01 Every alert has the same anatomy. Rebuilt from a real one; names and values are illustrative.
It gets smarter with age. I documented a warm-up period so nobody panicked at early alerts, or ignored them.
Days 1 to 3
Collects data
Only minimum thresholds apply.
Days 4 to 29
Statistics begin
Analysis starts at 4+ data points.
Day 30 on
Full comparisons
30-day comparisons become available.
In short: I built and debugged it myself in Apps Script, and it took 56 code iterations to get from the first alert to the version the team uses.
56
code iterations, from the first alert to the version the team uses
✅ Built three tracking tabs in Google Sheets: daily snapshots for the statistics, monthly trends, and year over year.
✅ Pulled active workflows from HubSpot’s automation API (skipping test and ops flows) and each email’s stats from the marketing email API.
✅ Designed the alert email and Slack message, then iterated on them with the team until they could be read in seconds.
✅ Presented it to leadership in December 2025 and shared AI use cases with the wider team.
🐛 Problem
🔧 How I fixed it
Enrollment counts weren’t in the API
→ Alerts link to HubSpot’s live numbers instead.
Email links were broken
→ HubSpot uses a content ID, not the email ID, so I rebuilt the URL logic.
Email names were missing
→ I added a second API call to fetch them.
The Gemini model was deprecated mid-build
→ I upgraded it and added Claude as a fallback.
Legacy code referenced old variables
→ I refactored the alert system for accuracy and simplicity.
“N/A, need 30 days of data” confused people
→ I documented the warm-up period so everyone knew when the numbers become reliable.
Around version 50
● Critical
Lead follow-up · 2 days later
Issue: high unsubscribe rate (above threshold)
Suggestion: review (1) email frequency, (2) content relevance, (3) audience targeting
● Critical
Lead follow-up · 2 days later
Issue: high unsubscribe rate (above threshold)
Suggestion: review (1) email frequency, (2) content relevance, (3) audience targeting
What changed
Generic advice → a root cause for this email
One card per issue → one alert per email
No sense of urgency → a priority tag
A dead end → one click into HubSpot
After 56 iterations
Warning
Priority: high
Email 5 · View email →
Issues detected
• Click rate is below its minimum threshold
✦ AI recommendation
Opens are lower than this workflow’s other emails, so start with the subject line and sender name. Then check that the content and CTA still fit people 11 months after their move.
View workflow in HubSpot →
FIG. 02 First vs. final alert, rebuilt from the originals. Names and wording are illustrative.
In short: I made the judgment calls. AI does the explaining.
• Defined “normal”: a baseline per email, with alerts in standard deviations
• Designed the alert and iterated on it with the team until it read in seconds
• Documented the warm-up so the team trusted early alerts
• Built, tested, and debugged every step in Apps Script
✦ Breeze helped me work through the statistical approach
✦ Gemini writes a likely root cause and one fix per flagged email
✦ Claude takes over when Gemini hits its limits
My team and marketing leadership (our head of marketing and CMO) read the alerts, and sometimes product leadership too. We either act on them right away or turn them into tests.
Since the December 2025 leadership presentation, we spend less time finding problems and more time deciding what to change and why. Leadership sees the monitor as a way to lift conversion and work more efficiently.
Per-email baselines cut false alarms and made every alert worth reading.
Statistics find the problem; AI explains it in words people act on.
The alert format the team uses today came from dozens of rounds of their feedback.
Being upfront about when the numbers become reliable is what earned the team’s trust.
In short: today it’s a hybrid: automation with AI-assisted analysis. The next steps turn it into a true agent.
✅ Runs on its own every day
✅ Monitors HubSpot performance
✅ Statistical anomaly detection
✅ AI-generated recommendations
❌ No learning from outcomes
✅ Everything it does today
✅ Learns from the recommendations the team applies
✅ Tracks outcomes for 30 days
✅ Gets smarter over time
✅ Confidence-scored suggestions
Outcomes are measured automatically, what worked is fed back to the AI, and future suggestions improve.
Concept · illustrative
🚨 Alert fires
↓ ✨ AI recommends a fix
↓ ✅ Team marks it “Implemented”
↓ 📊 Tracks it for 30 days
↓ 🧠 AI learns what worked
Sample AI output after learning:
“Based on 6 months of your data, personalized subject lines improved open rates 78% of the time. Confidence: 92% this will work for your lead nurture emails.”
When open rates drop, AI writes scored alternatives.
Concept · illustrative
❌ “Your Monthly Newsletter, December 2025”
Generic, no personalization, no urgency
🥇 “{{first_name}}, your December insights are here” · Score 92
🥈 “Don’t miss these 3 tips before year-end” · Score 87
🥉 “Quick read: what top movers are doing differently” · Score 84
Scored on personalization (20%), length (15%), urgency (15%), curiosity (15%), clarity (15%), and past performance (20%)
Engagement patterns point to the best send window for each workflow.
Concept · illustrative
🏆 Best windows
🥇 Tuesday 10 to 11am · +34% opens
🥈 Thursday 2 to 3pm · +28% opens
🥉 Wednesday 9 to 10am · +21% opens
❌ Worst windows
Monday 8 to 9am · −42% opens
Friday 4 to 5pm · −38% opens
💡 Move the Welcome Series from Monday 8am to Tuesday 10am. Estimated improvement: +34% open rate
⚠️ HubSpot’s API can’t edit emails, so the team makes each change by hand and the system tracks the result.
Let’s talk.
Email, SMS, automation, and the AI tools that keep them healthy. I’d love to hear what you’re working on.