Every 30 minutes
Spot 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.
- Runs
- Every 30 minutes
- Apps
- Gmail, Zoho CRM
- AI
- Yes, uses the built-in AI allowance
- Access
- Zoho write; gmail.send
Send this to your assistant
Create a ClickRuntime automation: every hour, read new support tickets. When one suggests the customer needs more seats, a higher plan or another product, add a note and a follow-up task to their Zoho record and email sales about it.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A software company's support team hears every day from customers who've outgrown their plan: 'we've added ten more staff', 'can we connect our second warehouse?'. Those comments sit in the help desk and never reach sales, so upgrades happen late or not at all.
New tickets are now read every hour for signs of growth. Likely upsells get a note and a task on the customer's Zoho record, and sales gets an email with the ticket and why it looks like an opportunity.
What you get out of it
Sales hears what support hears
Growth signals buried in tickets reach the people who can act on them.
Upgrades offered at the right time
A customer asking about more seats is ready to talk about a bigger plan now, not next quarter.
Tracked in the CRM
Each opportunity becomes a task with an owner and due date, not a forwarded email that gets lost.
Support keeps helping, not selling
The support team doesn't need to change how they work; the flagging happens on its own.
How it works
What happens, step by step
Every hour, ClickRuntime fetches support tickets created since the last check.
AI reads each one and scores how likely it is to be an upsell opportunity.
For likely ones, a note and a follow-up task are added to the customer's record in Zoho CRM.
Sales gets an email with the ticket and the reason, and each ticket is only looked at once.
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
- Act only on the items that match your own rules, and skip the rest
- 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 google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from clickruntime import on_trigger, credentials, http, ai, state, report_fetched
ZOHO = "https://www.zohoapis.com/crm/v6"
@on_trigger
def run(event):
since = state.get("since") or "2026-01-01T00:00:00Z"
tickets = http.get("https://support.acme.example/api/tickets", params={"created_after": since},
headers={"Authorization": f"Bearer {credentials.secret('HELPDESK_API_KEY')}"}).json()["tickets"]
report_fetched(len(tickets))
if not tickets:
return {"summary": "No new tickets"}
zh = {"Authorization": f"Zoho-oauthtoken {credentials.connection('zoho', 'work')}"}
gmail = build("gmail", "v1", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False)
for t in tickets:
r = ai.generate(f"Is this support ticket an upsell opportunity? {t['body'][:1500]}", max_output_tokens=80,
json_schema={"type": "object", "properties": {"score": {"type": "integer"}, "reason": {"type": "string"}}}).json
if r["score"] < 7:
continue
contact = http.get(f"{ZOHO}/Contacts/search", headers=zh, params={"email": t["email"]}).json()["data"][0]
http.post(f"{ZOHO}/Notes", headers=zh, json={"data": [{"Parent_Id": {"id": contact["id"]}, "$se_module": "Contacts",
"Note_Content": f"Upsell signal: {r['reason']}"}]})
http.post(f"{ZOHO}/Tasks", headers=zh, json={"data": [{"Subject": f"Upsell follow-up: {t['subject']}", "What_Id": {"id": contact["id"]}}]})
raw = f"To: sales@acme.example\r\nSubject: Upsell signal from {t['email']}\r\n\r\n{r['reason']}\n\nTicket: {t['subject']}"
gmail.users().messages().send(userId="me", body={"raw": base64.urlsafe_b64encode(raw.encode()).decode()}).execute()
state.set("since", tickets[-1]["created_at"])
return {"checked": len(tickets)}FAQ
Common questions
Where do tickets come from?
How does it match a ticket to a Zoho record?
Will every ticket create a task?
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
Score 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 worksDraft 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 worksKeep exploring
Set up “Spot upsell chances in support tickets” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.