Every 30 minutes
Get an email when someone joins your Slack workspace
Every 30 minutes, new members of a Slack workspace are emailed to the admin with name, email, title and whether they are a guest.
- Runs
- Every 30 minutes
- Apps
- Slack
- AI
- Not needed
- Access
- users:read, users:read.email
Send this to your assistant
Create a ClickRuntime automation: every 30 minutes, check my Slack workspace for new members and email me their name, email, title, timezone and whether they are a full member or a guest.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
In many workspaces anyone can invite people, and guests get added for a single project and forgotten. Admins often only learn who joined when they run a billing or security review.
Every 30 minutes this automation lists the workspace's members, compares the list with the previous run and emails you anyone new: their name, email, title, timezone and whether they are a full member, a multi-channel guest or a single-channel guest.
Workspace admins at small companies, agencies that invite clients as guests and security-minded teams use it to keep track of who has access.
What you get out of it
Guests flagged
Each person's account type is shown, so a new guest stands out from a new employee.
Email addresses included
The email domain tells you at a glance whether the person is internal or from a client.
No channel needed
The alert is an email, so it works even if your Slack app is not in any channel.
Bots ignored
New integrations and bot users are not reported as people.
A running record
The emails form a dated list of who joined and when, handy for billing and access reviews.
How it works
What happens, step by step
Every 30 minutes the automation lists every member of the workspace.
It compares the list with the one from the last run to find new accounts.
For each new person it collects name, email, title, timezone and account type.
You receive one email with all new members; bots and integrations are left out.
Before it runs live
- 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
- 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 Google Sheets
- Combine it with other Slack steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_trigger, credentials, http, state, notify
WORKSPACE = "Acme"
def slack(method, **params):
resp = http.get(f"https://slack.com/api/{method}", params=params,
headers={"Authorization": f"Bearer {credentials.connection('slack', 'work')}"})
data = resp.json()
if not data.get("ok"):
raise RuntimeError(data.get("error"))
return data
def account_type(u):
if u.get("is_ultra_restricted"):
return "single-channel guest"
if u.get("is_restricted"):
return "multi-channel guest"
return "admin" if u.get("is_admin") else "member"
@on_trigger
def run(event):
users, cursor = [], None
while True:
page = slack("users.list", limit=200, **({"cursor": cursor} if cursor else {}))
users += [u for u in page["members"] if not u.get("is_bot") and not u.get("deleted") and u["id"] != "USLACKBOT"]
cursor = page.get("response_metadata", {}).get("next_cursor")
if not cursor:
break
prev = state.get("ids")
state.set("ids", [u["id"] for u in users])
if prev is None:
return {"baseline": len(users)}
new = [u for u in users if u["id"] not in set(prev)]
if not new:
return {"new": 0}
lines = []
for u in new:
p = u.get("profile", {})
lines.append(" · ".join(x for x in [p.get("real_name") or u["name"], p.get("email"), p.get("title"),
u.get("tz"), account_type(u)] if x))
notify.email_me(f"{len(new)} new {'person' if len(new) == 1 else 'people'} in the {WORKSPACE} Slack", "\n".join(lines))
return {"new": len(new)}FAQ
Common questions
Which Slack scopes does it need?
Will guests from Slack Connect shared channels appear?
Can it post to an admin channel instead of email?
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
See 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 worksGet told when someone mentions a keyword in Slack
When anyone mentions a customer, a competitor or a word like "outage", you get the message and a link to it.
See how it worksMake sure no question goes unanswered
Questions in your help channel that nobody answered after 2 hours get a nudge to the right people.
See how it worksKeep exploring
Set up “Get an email when someone joins your Slack workspace” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.