Skip to content

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.

Paste it into your assistant. It tells you what it will send or change before it runs live.

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

  1. Every 30 minutes the automation lists every member of the workspace.

  2. It compares the list with the one from the last run to find new accounts.

  3. For each new person it collects name, email, title, timezone and account type.

  4. 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

RunsEvery 30 minutes
Get an email when someone joins your Slack workspacetoday, 9:00Succeeded
Email · 2 new people in the Acme SlackMaria Lopez · maria@northwind.com · Buyer · Europe/Madrid · single-channel guest Tae Park · tae@acme.com · Backend engineer · Asia/Seoul · member

Build your own

Need it to work differently?

This template is a starting point. Copy the prompt and change it, or describe a different automation from scratch, with your own conditions, more apps or an AI step. Your assistant writes it, tests it and runs it on ClickRuntime.
  • 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

This is the Python script that runs each time the automation starts. Your AI assistant writes it for you when you send the prompt, and you allow each step in your assistant. To change how the automation works, describe the change to your assistant and it updates the script for you. For every function it can use, see the script reference.
get_an_email_when_someone_joins_your_slack_workspace.pyexample
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?
users:read to list members and users:read.email to include email addresses. Nothing else is needed, and the app does not have to be in any channel.
Will guests from Slack Connect shared channels appear?
No. People from other organisations in shared channels are not members of your workspace, so users.list does not return them. Guests invited to your workspace are included and marked as guests.
Can it post to an admin channel instead of email?
Yes. Swap the email for a post to a private channel like #admins; that needs chat:write and the app invited to the channel.
What permissions does it need?
users:read, users:read.email. Nothing else in your accounts is used.
Does it need AI?
No. It runs without AI, so it doesn't use your plan's AI allowance.
How many runs does it use?
One run each time it checks. Checks that find nothing new and stop right away aren't counted.
Can I change how it works?
Yes. Describe the change to your AI assistant, for example a different schedule, channel or filter. It updates the automation, tests it and tells you what changed.

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.