web/cs-case-study-snippet.html

Portfolio  /  Case studies  /  Workflow Health Monitor

✦ AI tools · 1 of 3 · Workflow Health Monitor · Porch Moving Group

An AI agent that watches every lifecycle email

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 works

My 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

😩 The problem

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.

🛠️ What I built

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.

🚀 The impact

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.

🧰 Skills shown

Lifecycle email

Marketing ops

Statistics

AI tooling

HubSpot APIs

Apps Script

🚀 Results

+35%

🎯 The catch that proved it

Low priority didn’t mean low value.

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

👉 Before

•  ~8 hours/week manual monitoring

•  Reactive issue detection

•  Generic industry benchmarks

•  No AI-powered guidance

✅ After

✓  Fully automated daily monitoring

✓  Proactive anomaly detection (1.5σ / 2.5σ)

✓  Per-workflow statistical baselines

✓  AI recommendations via Gemini

🎯 Context & challenge

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

Every email, every day

Watch every live email, every day, without adding hours to the week.

Signal, not noise

Tell a real problem from normal noise.

Say what to do

Tell the team what to do, not only that a number moved.

Earn trust

Keep it transparent enough that the team would trust the alerts.

🧠 My approach

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.

Two alert levels

Warning at 1.5 to 2.5 standard deviations from that email’s average; critical beyond 2.5.

What it watches

Low sends, opens, or clicks raise an alert; so do rising bounces or unsubscribes.

One alert per email

Issues for the same email are grouped into one alert with a priority tag, so the team isn’t flooded.

AI explains it

Gemini writes a likely root cause and one recommended fix per email, with Claude as the fallback when Gemini hits its limits.

When an email gets flagged

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.

⚙️ How it works

In short: an eight-step pipeline runs every day, then I review what it flags and decide what we fix.

The daily pipeline

Eight automated steps, then a human decides what to fix.

① Collect and store

1 · ⏰ Fetch

Fetch active workflows

HubSpot Automation API v3 finds every active workflow, skipping test and ops flows.

2 · ✉️ Stats

Get email stats

Marketing Email API v1 pulls each email’s name and numbers.

📤 Sent

👀 Opens

👆 Clicks

🚫 Unsubs

⚠️ Bounces

3 · 📊 Store

Store daily data

A new row in the Workflow Health Data tab on every run: the raw material for the statistics.

4 · 📈 Trends

Update trends

Monthly Trends and Year over Year tabs update with each run.

Month over month

Year over year

② Analyze and decide

5 · 📐 Analyze

Statistical analysis

Each email against its own mean and standard deviation, on a 30-day rolling window.

6 · ❓ Decide

Anomaly detected?

No

✅ All healthy. It checks again tomorrow.

Yes → step 7

🟡 Warning at 1.5 to 2.5σ
🔴 Critical beyond 2.5σ

🎚️ Per email

Its own normal

A welcome email and a 10-month nurture email each get their own baseline, so alerts mean something.

③ Explain and act

7 · ✨ Explain

AI recommendations

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

Send alerts

One email and Slack alert per email, with a priority tag and links to the workflow and the email in HubSpot.

🧠 Human

I review and prioritize

About 15 minutes a day reading the alert and deciding what we fix first.

✍️ Team

The team makes the change

HubSpot’s API can’t edit emails, so fixes are made by hand, and the next run shows if they worked.

⚙️ Automation

Google Apps Script, Google Sheets, Gmail, Slack webhooks

🔌 APIs

HubSpot Automation v3, HubSpot Marketing Email v1, Gemini 2.0 Flash, Claude as fallback

🧮 Intelligence

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

Lead Gen nurture · 10 months after move date

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.

🛠️ The build

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.

Problems I solved along the way

🐛 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

Lead Gen nurture · 10 months after move date

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.

🤝 Human + AI

In short: I made the judgment calls. AI does the explaining.

🙋‍♀️ What I decided

•  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

🤖 What AI does

✦  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

👀 Who reads it

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.

📈 What changed after the presentation

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.

🧩 What I learned

Compare things to their own normal

Per-email baselines cut false alarms and made every alert worth reading.

AI is best at the last step

Statistics find the problem; AI explains it in words people act on.

Iterate in the open

The alert format the team uses today came from dozens of rounds of their feedback.

Explain the warm-up

Being upfront about when the numbers become reliable is what earned the team’s trust.

🔮 What’s next

In short: today it’s a hybrid: automation with AI-assisted analysis. The next steps turn it into a true agent.

📍 Today: hybrid automation

✅  Runs on its own every day

✅  Monitors HubSpot performance

✅  Statistical anomaly detection

✅  AI-generated recommendations

❌  No learning from outcomes

🤖 Next: a true AI agent

✅  Everything it does today

✅  Learns from the recommendations the team applies

✅  Tracks outcomes for 30 days

✅  Gets smarter over time

✅  Confidence-scored suggestions

Three steps to get there

🔁 1. Recommendation learning

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.”

✍️ 2. Subject line suggestions

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%)

⏰ 3. Send time optimization

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.

Building lifecycle programs that run themselves?

Let’s talk.

Email, SMS, automation, and the AI tools that keep them healthy. I’d love to hear what you’re working on.