Every 10 minutes
Get told when a deal changes stage
When one of my deals moves to a new stage, I get a Slack message with the deal and its new stage.
- Runs
- Every 10 minutes
- Apps
- Freshsales
- AI
- Not needed
- Access
- read
Send this to your assistant
Create a ClickRuntime automation: every 10 minutes, check my Freshsales deals and send me a Slack DM when one changes stage, with the deal name, old stage and new stage.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A deal in Freshsales moving to a new stage is the main event in sales. A prospect that reaches Negotiation needs a contract ready, one that drops to Lost needs a reason logged, and one that jumps to Won needs onboarding to begin. Managers and teammates who are not the deal owner find out only when they open the pipeline or hear it at the weekly meeting, and the follow-up work, from billing to kickoff, waits until someone remembers to ask. Updates often go unseen.
Every ten minutes, ClickRuntime lists the deals sorted by last update, compares each deal's stage with the value it stored earlier, and sends you a direct message for every deal whose stage has changed, showing the deal name, the old stage, the new one and a link.
It works best for people who follow a handful of important deals without owning them.
What you get out of it
Start the next step on time
A deal that moves to Won triggers onboarding, invoicing and a welcome email. Knowing within minutes means the customer experiences a smooth handoff instead of a week of silence. Customers remember smooth starts.
Support your reps at the right moment
A manager who sees a deal enter Negotiation can offer help with pricing or legal terms. Support at that moment can decide the outcome. Help arrives while it can still change the result.
Learn why deals are lost
A message when a deal moves to Lost prompts you to ask the rep for the reason while it is fresh. Honest loss reasons improve forecasting and messaging far more than reasons recalled a month later.
Keep forecasts current
Stage changes feed revenue forecasts. Seeing them as they happen lets a sales leader adjust the quarter's expectations before the end-of-month scramble. Better forecasts help everyone plan. Quarter-end surprises shrink.
Follow only the deals you care about
A direct message is private and personal. You see changes to the deals you track without adding noise to a team channel. You stay informed without extra noise. Private updates stay private.
How it works
What happens, step by step
Every 10 minutes, ClickRuntime checks your most recently updated deals in Freshsales.
It compares each deal's stage with the one it saved last time.
When a deal has moved, you get a Slack message with the deal name and its old and new stage.
Before it runs live
- Connect Freshsales
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
- 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 Freshsales steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_trigger, credentials, http, notify, state, report_fetched
API = "https://northwind.myfreshworks.com/crm/sales/api"
VIEW_ID = 31000000124 # My deals
@on_trigger
def run(event):
resp = http.get(f"{API}/deals/view/{VIEW_ID}", params={"sort": "updated_at", "sort_type": "desc", "include": "deal_stage"},
headers={"Authorization": f"Token token={credentials.secret('FRESHSALES_API_KEY')}"})
resp.raise_for_status()
body = resp.json()
stages = {s["id"]: s["name"] for s in body.get("deal_stages", [])}
known = state.get("stages") or {}
moved = [d for d in body["deals"] if str(d["id"]) in known and known[str(d["id"])] != d["deal_stage_id"]]
report_fetched(len(moved))
current = {**known, **{str(d["id"]): d["deal_stage_id"] for d in body["deals"]}}
if not moved:
if current != known:
state.set("stages", current) # first run: remember stages without alerting
return {"moved": 0}
for d in moved:
notify.slack(f"*{d['name']}*: {stages.get(known[str(d['id'])], '?')} → {stages.get(d['deal_stage_id'], '?')}",
channel="@morgan")
state.set("stages", current)
return {"moved": len(moved)}FAQ
Common questions
Does it show who moved the deal?
Can I follow only deals above a certain value?
What if a deal moves stage twice between checks?
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
Post new Freshsales deals to Slack
Each new deal appears in #sales with its name, amount and owner within a few minutes of being created.
See how it worksEmail a Monday pipeline summary
Every Monday morning I get an email with open deal value per stage and the deals expected to close this week.
See how it worksSee new job listings as they're posted
Jobs that match your keywords show up in a Slack channel, each one only once.
See how it worksKeep exploring
Set up “Get told when a deal changes stage” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.
