Weekly
Get a weekly report of messy leads in Zoho CRM
Every Monday you get an email listing leads with invalid emails, missing fields or likely duplicates, so you can clean them up.
- Runs
- Weekly
- Apps
- Gmail, Zoho CRM
- AI
- Not needed
- Access
- Zoho read; gmail.send
Send this to your assistant
Create a ClickRuntime automation: every Monday at 8, check all my Zoho CRM leads for bad email addresses, missing company or phone, and duplicates, and email me a report through Gmail.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A marketing manager imports leads from events, forms and purchased lists into Zoho CRM. Over time the data fills with typos, blank fields and the same person entered three times. Campaigns bounce, reps call duplicates, and reports overcount the pipeline.
Every Monday a report arrives listing exactly which leads have problems and what's wrong with each. Fixing a dozen records a week keeps the CRM clean without a big clean-up project.
What you get out of it
Fewer bounced emails
Invalid addresses are caught before your next campaign, which protects your sender reputation.
No reps calling the same person twice
Duplicates are listed side by side so they can be merged.
Accurate pipeline numbers
Removing duplicates and junk means reports reflect real leads.
Small weekly fixes
A short list each Monday is easy to work through, unlike a yearly clean-up.
How it works
What happens, step by step
Every Monday morning, ClickRuntime reads all your leads from Zoho CRM, page by page.
It checks each email address is well formed and that required fields are filled in.
It groups leads that share an email or a name and company as likely duplicates.
You get one email from Gmail listing every problem, with a link to each lead.
Before it runs live
- Connect Google through your own Google app (a one-time, 10-minute setup), so it works with your own Gmail
- Connect Zoho CRM
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Gmail and Zoho CRM steps into one automation
Under the hood
The code that runs this automation
import base64, re
from collections import defaultdict
from email.message import EmailMessage
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from clickruntime import on_trigger, credentials, http
ZOHO = "https://www.zohoapis.com/crm/v6"
@on_trigger
def run(event):
zh = {"Authorization": f"Zoho-oauthtoken {credentials.connection('zoho', 'work')}"}
leads, page, more = [], 1, True
while more:
resp = http.get(f"{ZOHO}/Leads", headers=zh, params={"fields": "Full_Name,Email,Company,Phone", "page": page, "per_page": 200}).json()
leads, page, more = leads + resp.get("data", []), page + 1, resp.get("info", {}).get("more_records")
issues, seen = [], defaultdict(list)
for l in leads:
email = (l.get("Email") or "").lower()
if not re.fullmatch(r"[^@\s]+@[^@\s]+\.[a-z]{2,}", email):
issues.append(f"Bad email: {l.get('Full_Name')} <{email}>")
issues += [f"Missing {f}: {l.get('Full_Name')}" for f in ("Company", "Phone") if not l.get(f)]
seen[email or f"{l.get('Full_Name')}|{l.get('Company')}"].append(l["Full_Name"])
issues += [f"Duplicates: {', '.join(names)}" for names in seen.values() if len(names) > 1]
msg = EmailMessage()
msg["To"], msg["Subject"] = "me", f"Lead data quality: {len(issues)} issues"
msg.set_content("\n".join(issues) or "All clean this week.")
gmail = build("gmail", "v1", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False)
gmail.users().messages().send(userId="me", body={"raw": base64.urlsafe_b64encode(msg.as_bytes()).decode()}).execute()
return {"leads": len(leads), "issues": len(issues)}FAQ
Common questions
How does it find duplicates?
Does it fix or delete anything?
Which fields count as missing?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Draft follow-ups for stalled deals and new leads
Each morning, stalled deals and untouched new leads get a personal follow-up drafted in your Gmail, with a note added in Zoho.
See how it worksSave each order in Zoho CRM and email a confirmation
Every new order or inquiry is saved as a contact and deal in Zoho CRM, and the customer gets a confirmation email from Gmail.
See how it worksScore new Zoho leads and email me a briefing
Every new lead in Zoho CRM is scored, the score is saved on the lead, and you get a short briefing email on the ones worth calling.
See how it worksKeep exploring
Set up “Get a weekly report of messy leads in Zoho CRM” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.