Skip to content

The moment it happens

Update Jira and log a Notion changelog from your commits

When code is pushed with a Jira key in the commit message, the ticket gets a comment and moves forward, and a changelog entry is added to Notion.

Runs
The moment it happens
Apps
Jira, Notion
AI
Not needed
Access
Jira write; Notion insert

Send this to your assistant

Create a ClickRuntime automation: when code is pushed to main, find Jira keys in the commit messages, comment the commit on each ticket and move it to In Review, add an entry to my Notion Changelog database, and post a note to #eng.

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

Developers on a product team mention Jira keys in their commits, but tickets still sit in 'In Progress' long after the code is merged, and the product manager keeps a changelog in Notion by asking around each Friday.

Updating the ticket and writing the changelog entry the moment code is pushed keeps both tools accurate without anyone's effort. Jira reflects real progress, and the changelog builds itself.

What you get out of it

  • Tickets reflect real progress

    A pushed commit moves its ticket forward. The board shows where work actually is.

  • A changelog that writes itself

    Each push adds a Notion entry with the commit and ticket. Release notes start from a complete list.

  • Commits are linked to tickets

    A comment on the ticket names the commit. Reviewers can jump straight to the code.

  • No extra steps for developers

    Mentioning the key in the commit message is all it takes. No forms or tools to update.

How it works

What happens, step by step

  1. When code is pushed, your code host sends the commit details to your automation's trigger link.

  2. ClickRuntime finds Jira ticket keys in the commit messages.

  3. Each ticket gets a comment with the commit and is moved to the next status.

  4. An entry is added to your Notion Changelog database with the commit and ticket keys.

  5. A short note is posted to your #eng Slack channel.

Before it runs live

  • Connect Jira
  • Connect Notion and share the database you want it to use
  • Paste your automation's link into the other app's webhook settings

What you get

RunsThe moment it happens
Update Jira and log a Notion changelog from your commitsjust nowSucceeded
Notion · ChangelogAdd CSV export for invoices · ENG-402 · commit 3f9a1c2

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 Slack
  • Combine it with other Jira and Notion 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.
log_jira_updates_from_commits_into_notion.pyexample
import re
from clickruntime import on_event, credentials, http, notify

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)
def notion(method, path, **kw):
    resp = http.request(method, f"https://api.notion.com/v1{path}", headers={
        "Authorization": f"Bearer {credentials.secret('NOTION_TOKEN')}", "Notion-Version": "2022-06-28"}, **kw)
    return resp.raise_for_status() or resp.json()

CHANGELOG, TARGET = "your-notion-database-id", "In Review"

@on_event
def handle(event):
    push = event.json or {}
    commits = [c for c in push.get("commits", []) if re.search(r"[A-Z]+-\d+", c["message"])]
    for c in commits:
        keys = sorted(set(re.findall(r"[A-Z]+-\d+", c["message"])))
        for key in keys:
            jira("POST", f"/rest/api/3/issue/{key}/comment", json={"body": adf(f"Commit {c['id'][:7]} by {c['author']['name']}: {c['message']}\n{c['url']}")})
            move = next((t for t in jira("GET", f"/rest/api/3/issue/{key}/transitions")["transitions"] if t["to"]["name"] == TARGET), None)
            if move:
                jira("POST", f"/rest/api/3/issue/{key}/transitions", json={"transition": {"id": move["id"]}})
        notion("POST", "/pages", json={"parent": {"database_id": CHANGELOG}, "properties": {
            "Name": {"title": [{"text": {"content": c["message"].splitlines()[0][:200]}}]},
            "Jira": {"rich_text": [{"text": {"content": ", ".join(keys)}}]}, "Commit": {"url": c["url"]}}})
    if commits:
        notify.slack(f"{len(commits)} commits logged to Jira and the changelog", channel="#eng")
    return {"commits": len(commits)}

FAQ

Common questions

Which status does it move tickets to?
The one you choose, such as In Review. It uses the matching transition in your Jira workflow, and leaves tickets alone if that move is not allowed.
What sends the push events?
A webhook from your code host, such as GitHub or GitLab, set to send push events to your automation's trigger link.
What if a commit mentions several tickets?
Each ticket gets a comment and transition, and the Notion entry lists all of them.
What permissions does it need?
Jira write; Notion insert. 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 “Update Jira and log a Notion changelog from your commits” from your assistant

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