Zapier CRM Series
Zapier CRM Series · 06 / 07Live-testedRun on real accounts with sample data

Customer Health & Churn Alerts

Combines three warning signs, product usage, open support tickets and payment status, into one 0–100 health score per customer. Each account is sorted into Healthy, At-Risk or Critical, written to Zoho CRM, and At-Risk and Critical accounts alert Customer Success in Slack.

TriggerNew or updated row in Google Sheets (instant)
Steps17
ToolsSheets · Formatter · Paths · Zoho CRM · Slack
Result12 of 12 accounts scored correctly
All 7 builds
The Customer Health and Churn Alerts Zap in the Zapier editor
The Zap itself. Click to see all of it.

Customers rarely announce they’re leaving

The warning signs arrive one at a time, in different places. Usage drops in the product, complaints pile up in support, a card fails in billing. Nobody sees them together until the cancellation email lands.

This works like a checkup for every account: start from how actively they use the product, take points off for each bad sign, and act when the number drops into a risky range.

One formula, three tiers

Health = MAX( Usage − MIN(Tickets × 5, 20) − PaymentPenalty, 0 )
// Payment penalty: Current 0 · Overdue 15 · Failed 30

Usage is the base

It’s the broadest daily signal of whether a customer gets value, so it anchors the score.

Tickets cap at −20

Four open tickets already means real frustration. The cap stops tickets alone driving an account to zero.

Payment hits hardest

A failed payment is one of the strongest churn signals, so it can pull an engaged account into risk on its own.

Healthy 70–100 · At-Risk 40–69 · Critical 0–39

Healthy accounts update quietly. At-Risk gets a check-in alert; Critical asks for immediate attention.

Six shared steps, three branches

1Sheets triggerInstantNew or updated row, so changed inputs get re-evaluated.
2Loop guardFilterHealth Score does not exist. The Zap writes back to this row, so without the guard it would re-trigger forever.
3Find AccountZoho CRMMatches the company name to the CRM record. “Create if missing” is off, so a typo fails loudly.
4Payment penaltyLookup tableCurrent 0, Overdue 15, Failed 30, fallback 0.
5ScoreFormulaPenalty, cap, subtraction and floor in one step.
6Paths3 tiersEach branch updates Zoho, alerts Slack for At-Risk and Critical, and writes score, tier and time back to the sheet.
Final Zap canvas
The finished Zap: six shared steps, then three tier branches.
Formula test output 60
Test output: 90 − 0 − 30 = 60, matching the hand calculation.
At-Risk path accepts 60
At-Risk (40–69) correctly accepts 60.

Working around a free-plan wall

Zoho CRM Free refuses to create custom fields. It does allow editing existing ones, so instead of paying for an upgrade I repurposed three standard fields.

Original fieldBecameSetup
Rating (picklist)Health TierValues replaced with Healthy / At-Risk / Critical; no default
Annual Revenue (currency)Health Score0 decimals, limited to 0–100
Modified Time (system)Last UpdatedUpdates on every write automatically
Picklist with tiers
Rating, rebuilt as the three tiers.
Health score field
Annual Revenue, relabelled Health Score.

Twelve accounts, each chosen to prove something

Several accounts were built to land exactly on a tier boundary, because obvious cases can’t show that the edges work. Four landed in each tier.

Live run for Willowbrook Dental
Willowbrook Dental Group (usage 20, failed payment): only the Critical branch ran.
Slack alerts
At-Risk and Critical alerts in #customer-health-alerts.
Zoho account record
Summit Peak Realty in Zoho: Critical, score 25. The “Php” prefix comes from reusing a currency field.

What broke, and how I found out

“Blank” and “missing” are different

The loop guard checked for an empty value and failed. A never-filled Sheets cell isn’t sent as empty text; the field is left out entirely. “Does not exist” fixed it.

Read the error’s exact wording.

Corrected filter passing
The corrected filter passing its test.

A loop guard that guarded nothing

The first build only wrote to Zoho, never back to the sheet, so the guard always passed and any later edit would have sent duplicate updates and alerts. Writing back to the sheet on every branch made it real. Zapier flagged the pattern too.

A safeguard only counts if something can make it fail.

Zapier loop warning
Zapier’s own loop warning.

The trigger that “didn’t fire”

Retyping 90 as 90 isn’t a change. Changing it to 91 fired immediately. I’d also been reading a different Zap’s history.

Confirm which log you’re reading first.

Timestamps hours off

The account timezone was blank, so “current time” used a default. Setting it to Asia/Manila fixed it at the source, and the extra conversion step was deleted.

The test caught my own math

Northline was meant to land on exactly 70 but its values gave 65, and the Zap put it in At-Risk. The Zap was right; my test plan was wrong.

Check the expectation before blaming the system.

Seven of twelve accounts weren’t in the CRM

Comparing names before building found seven missing accounts and one real duplicate. I created the missing ones and documented the duplicate as a risk for name matching.

What a production version would change

Scores once per row

To re-score, clear the score cell. Production would compare a stored hash of the inputs.

Matches on company name

Duplicates or typos can hit the wrong account. Production would key on the CRM record ID.

Paid Zapier features

Filter, Paths and multi-step Zaps stop when the trial ends.

TaskFlow and every company and person shown are fictional mock data. Built on Zoho CRM Free, Slack and a Zapier Professional trial; the Zaps are switched off now the trial has ended, and every screenshot comes from the real Zapier, Zoho and Slack accounts.

All work

Hiring, or have a process to automate?

Let’s talk.

Send a few lines about the role, or what keeps slipping through.

Write to me

ralphmatthewmarty@gmail.com

Or message me

WhatsApp +63 919 947 0840

Or connect

LinkedIn

Replies within one business day · UTC+8

Good to know

Based in

Central Luzon, PH (UTC+8)

Looking for

Full-time remote roles; contract too

Works

Remote; hybrid or on-site in the Philippines