Daily
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.
- Runs
- Daily
- Apps
- Gmail, Zoho CRM
- AI
- Yes, uses the built-in AI allowance
- Access
- Zoho read+write; gmail.compose
Send this to your assistant
Create a ClickRuntime automation: every weekday at 8, find Zoho deals with no activity for 10 days and new leads not contacted yet. Draft a personal follow-up for each in Gmail and add a note to the record in Zoho.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A sales rep at a software reseller manages sixty open deals. The ones with an active conversation get attention; the quiet ones drift until the prospect has bought elsewhere. New leads from the website sometimes sit for a week before anyone writes to them.
Every morning the rep finds drafts waiting in Gmail: a short, personal follow-up for each deal that's gone quiet and each new lead nobody has contacted. They read, adjust and send, and Zoho shows that a follow-up was prepared.
What you get out of it
Quiet deals get attention
Deals that would have slipped are put in front of you before it's too late.
New leads contacted quickly
Drafts for untouched leads make a same-day first email easy.
You stay in control
Drafts wait in Gmail for you to check and send, so nothing goes out you haven't read.
CRM shows the activity
A note on each record records that a follow-up was prepared and when.
How it works
What happens, step by step
Every weekday morning, ClickRuntime searches Zoho CRM for quiet deals and uncontacted new leads.
It skips any record that already got a follow-up recently.
AI writes a short follow-up for each, using the deal name, stage and last notes.
The emails are saved as drafts in your Gmail and a note is added to each record in Zoho.
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
- Change what the AI looks for, or how it writes the result
- 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
from datetime import date, timedelta
from email.message import EmailMessage
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from clickruntime import on_trigger, credentials, http, ai, state
ZOHO = "https://www.zohoapis.com/crm/v6"
@on_trigger
def run(event):
zh = {"Authorization": f"Zoho-oauthtoken {credentials.connection('zoho', 'work')}"}
cutoff = (date.today() - timedelta(days=10)).isoformat()
deals = http.get(f"{ZOHO}/Deals/search", headers=zh,
params={"criteria": f"((Modified_Time:less_than:{cutoff}T00:00:00+00:00)and(Stage:not_equal:Closed Won))"}).json().get("data", [])
gmail = build("gmail", "v1", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False)
drafted = state.get("drafted") or {}
for d in deals:
if drafted.get(d["id"], "") > cutoff or not d.get("Email"):
continue
body = ai.generate(f"Short friendly follow-up for deal '{d['Deal_Name']}' at stage {d['Stage']}.", max_output_tokens=200).text
msg = EmailMessage()
msg["To"], msg["Subject"] = d["Email"], f"Checking in: {d['Deal_Name']}"
msg.set_content(body)
gmail.users().drafts().create(userId="me", body={"message": {"raw": base64.urlsafe_b64encode(msg.as_bytes()).decode()}}).execute()
http.post(f"{ZOHO}/Notes", headers=zh, json={"data": [{"Parent_Id": {"id": d["id"]}, "$se_module": "Deals",
"Note_Content": "Follow-up drafted in Gmail."}]})
drafted[d["id"]] = date.today().isoformat()
state.set("drafted", drafted)
return {"drafted": len(drafted)}FAQ
Common questions
What counts as stalled?
Will it draft for the same deal every day?
Can it send instead of drafting?
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
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.
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 worksSpot upsell chances in support tickets
Support tickets that hint at a bigger need are flagged, logged as a note and task in Zoho CRM, and emailed to sales.
See how it worksKeep exploring
Set up “Draft follow-ups for stalled deals and new leads” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.