Skip to content

The moment it happens

Turn security alerts into Jira tickets and Slack messages

Each security alert creates one Jira ticket, posts to your security channel, and messages the affected person in Slack when the alert names them.

Runs
The moment it happens
Apps
Jira, Slack
AI
Not needed
Access
Jira create; Slack chat:write, users:read.email

Send this to your assistant

Create a ClickRuntime automation: when a security alert arrives at the trigger link, create a Jira ticket in SEC unless we've already ticketed that alert, post it to #security, and DM the affected user in Slack if the alert has their email.

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

A company's security tools send alerts by email: a suspicious login, a disabled multi-factor setting, a file shared publicly. The IT team investigates each by first asking the affected employee whether it was them, often a day later.

Creating a ticket for every alert and messaging the affected person straight away cuts the slowest part of the response. Most alerts are resolved by a quick 'yes, that was me', and the real incidents are tracked from the first minute.

What you get out of it

  • Every alert is tracked

    Each alert becomes one Jira ticket. Nothing is lost in an inbox, and auditors can see how each was handled.

  • The affected person is asked straight away

    A direct Slack message asks them to confirm the activity. Many alerts are cleared in minutes.

  • No duplicate tickets

    Alerts that are sent again are recognised by their id. The security backlog stays accurate.

  • The team sees it in Slack

    A post in the security channel means someone picks it up quickly, even outside office hours.

How it works

What happens, step by step

  1. When a security tool raises an alert, it sends the details to your automation's trigger link.

  2. ClickRuntime checks whether it has already created a ticket for that alert.

  3. For a new alert, it creates a Jira ticket in your security project.

  4. The alert is posted to your #security Slack channel with the ticket link.

  5. If the alert names a person, they get a direct Slack message asking them to confirm the activity.

Before it runs live

  • Connect Jira
  • Connect Slack, then invite the app to the channel (type /invite @ClickRuntime there)
  • Paste your automation's link into the other app's webhook settings

What you get

RunsThe moment it happens
Turn security alerts into Jira tickets and Slack messagesjust nowSucceeded
Slack · #securitySecurity alert Sign-in from new country (j.doe@acme.example) SEC-311

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 Jira and 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.
security_alerts_become_jira_tickets_and_slack_messages.pyexample
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
from clickruntime import on_event, credentials, http, notify, state

JIRA, SITE = "https://api.atlassian.com/ex/jira/your-cloud-id", "https://acme.atlassian.net/browse/"
adf = lambda text: {"type": "doc", "version": 1, "content": [{"type": "paragraph", "content": [{"type": "text", "text": text}]}]}

def jira(method, path, **kw):
    resp = http.request(method, JIRA + path, headers={"Authorization": f"Bearer {credentials.connection('jira', 'work')}", "Accept": "application/json"}, **kw)
    return resp.raise_for_status() or (resp.json() if resp.content else None)

@on_event
def handle(event):
    alert = event.json or {}
    done = state.get("alerts") or {}
    if alert.get("id") in done:
        return {"issue": done[alert["id"]], "duplicate": True}
    issue = jira("POST", "/rest/api/3/issue", json={"fields": {"project": {"key": "SEC"}, "issuetype": {"name": "Task"},
                 "summary": f"[{alert.get('severity', 'alert')}] {alert.get('title', 'Security alert')}"[:250], "labels": ["security-alert"],
                 "description": adf(f"{alert.get('description', '')}\nUser: {alert.get('user_email', '-')}\nSource: {alert.get('source', '-')}")}})
    notify.slack(f"Security alert {alert.get('title')} ({alert.get('user_email', 'no user')}) <{SITE}{issue['key']}|{issue['key']}>", channel="#security")
    if alert.get("user_email"):
        slack = WebClient(token=credentials.connection("slack", "work"))
        try:
            uid = slack.users_lookupByEmail(email=alert["user_email"])["user"]["id"]
            slack.chat_postMessage(channel=uid, text=f"Hi, our security tools noticed: {alert.get('title')}. Was this you? Please reply in #security.")
        except SlackApiError:
            notify.slack(f"Could not find {alert['user_email']} in Slack for {issue['key']}", channel="#security")
    done[alert.get("id")] = issue["key"]
    state.set("alerts", done)
    return {"issue": issue["key"]}

FAQ

Common questions

Which security tools can send alerts?
Any tool that can send a web request for each alert, such as identity providers, endpoint protection or cloud security tools.
What does the direct message say?
A short note describing the alert and asking the person to reply in the security channel or contact IT if it was not them. You can change the wording.
What if the email is not in Slack?
The ticket and channel post still go ahead, and the message notes that the user could not be found in Slack.
What permissions does it need?
Jira create; Slack chat:write, 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 for each event the app sends.
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 “Turn security alerts into Jira tickets and Slack messages” from your assistant

Copy the prompt above, or connect your assistant first. Free plan, no credit card.