On a schedule
Get a morning list of deals that have gone quiet
Each weekday, every rep sees which of their Salesforce deals haven't moved in two weeks, with a suggested next step for each.
- Runs
- On a schedule
- Apps
- Salesforce, Slack
- AI
- Optional
- Access
- api, refresh_token; chat:write
Send this to your assistant
Create a ClickRuntime automation: every weekday morning, find open Salesforce opportunities with no activity in 14 days, suggest a follow-up for each, and post them in #sales grouped by owner.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A sales team with forty open opportunities each can't keep every one warm. Deals stall quietly: the champion goes on holiday, the proposal sits unanswered, and by the time the quarter-end review comes round the deal is three weeks colder than anyone thought.
This automation checks Salesforce each morning for open deals with no logged activity in 14 days and posts them to Slack, grouped by owner, each with one suggested follow-up. Reps start the day knowing which deals need a nudge.
What you get out of it
Stalls are caught early
A deal shows up after two quiet weeks, not at the end of the quarter when it's too late to recover.
A concrete next step
Each deal comes with a suggested follow-up based on its stage and history, which makes it easier to act than a bare list.
Grouped by owner
Each rep sees their own deals together, so the post works as a to-do list.
Managers see the bottlenecks
Patterns stand out in the channel, like many deals stuck at the same stage, which points to where the process needs work.
How it works
What happens, step by step
Each weekday morning the automation looks at your open opportunities in Salesforce.
It picks out deals with no logged activity in the last 14 days.
AI suggests one short follow-up for each deal.
The list is posted to #sales, grouped by deal owner, with a link to each opportunity.
Before it runs live
- Connect Salesforce
- Connect Slack, then invite the app to the channel (type /invite @ClickRuntime there)
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 Google Sheets
- Combine it with other Salesforce and Slack steps into one automation
Under the hood
The code that runs this automation
from collections import defaultdict
from clickruntime import on_trigger, credentials, http, ai, notify
INSTANCE = "https://yourcompany.my.salesforce.com"
API = f"{INSTANCE}/services/data/v61.0"
def soql(headers, q):
return http.get(f"{API}/query", headers=headers, params={"q": q}).json()["records"]
@on_trigger
def run(event):
headers = {"Authorization": f"Bearer {credentials.connection('salesforce', 'work')}"}
opps = soql(headers, "SELECT Id, Name, StageName, Amount, Owner.Name, LastActivityDate FROM Opportunity "
"WHERE IsClosed = false AND (LastActivityDate < LAST_N_DAYS:14 OR LastActivityDate = null) LIMIT 60")
if not opps:
return {"stale": 0}
listing = "\n".join(f"{i + 1}. {o['Name']} | {o['StageName']} | last activity {o['LastActivityDate'] or 'never'}"
for i, o in enumerate(opps))
tips = ai.generate("Suggest one short follow-up for each numbered deal. One line per deal, same numbering.\n" + listing,
max_output_tokens=1500).text.splitlines()
tips = [t.split(".", 1)[-1].strip() for t in tips if t.strip()]
by_owner = defaultdict(list)
for i, o in enumerate(opps):
tip = tips[i] if i < len(tips) else ""
by_owner[o["Owner"]["Name"]].append(f"- <{INSTANCE}/{o['Id']}|{o['Name']}> ({o['StageName']}): {tip}")
for owner, lines in by_owner.items():
notify.slack(f"*{owner}*: {len(lines)} deals with no activity in 14 days\n" + "\n".join(lines), channel="#sales")
return {"stale": len(opps), "owners": len(by_owner)}FAQ
Common questions
What counts as no activity?
Can it create follow-up tasks in Salesforce as well?
Can I change the 14 days?
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 Friday list of deals that break your sales rules
Every Friday, each rep sees which of their open deals have missing fields, an out-of-date close date or a discount over your limit.
See how it worksSpot risky renewals 90 days out
Every Monday, customer success sees which accounts renewing in the next 90 days show warning signs, and why.
See how it worksHear when a big deal starts looking risky
Each day your large Salesforce deals get a risk score, and the owner gets a Slack message when one jumps, with the reason.
See how it worksKeep exploring
Set up “Get a morning list of deals that have gone quiet” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.