The moment it happens
Sync monday.com items to Jira without duplicates
New and updated monday.com items show up as Jira issues, and changes update the same issue instead of creating a new one.
- Runs
- The moment it happens
- Apps
- Jira, monday.com
- AI
- Not needed
- Access
- read+write on both
Send this to your assistant
Create a ClickRuntime automation: when an item is created or changes on my Product board in monday.com, create a matching Jira issue in project APP, or update it if one exists, and write the Jira key back to the item.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
When product managers plan in monday.com and engineers work in Jira, the two drift apart. Titles change on one side but not the other, and simple syncing tools create a new ticket for every edit, filling Jira with duplicates.
Keeping a link between each item and its issue means every change lands on the right ticket. Both teams see the same names and statuses, and Jira stays clean.
What you get out of it
One item, one issue
Each monday.com item is linked to a single Jira issue, so edits never create duplicates.
Changes arrive instantly
monday.com notifies ClickRuntime the moment an item changes, so Jira is updated within seconds.
Both teams in their own tool
Product stays in monday.com and engineering stays in Jira, with nobody copying updates between them.
Easy to trace
The Jira key on each item links the two, making it easy to jump between tools.
How it works
What happens, step by step
monday.com tells ClickRuntime whenever an item on your board is created or changed.
ClickRuntime looks up whether that item is already linked to a Jira issue.
If it is, the existing issue's title and status are updated; if not, a new issue is created.
New issue keys are written back to the monday.com item and remembered, so each item only ever has one issue.
Before it runs live
- Connect Jira
- Connect monday.com
- Paste your automation's link into the other app's webhook settings
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 Slack
- Combine it with other Jira and monday.com steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_event, credentials, http, state
BOARD = 1234567890
STATUS_TO_TRANSITION = {"Working on it": "21", "Done": "31"}
def monday(query, **variables):
resp = http.post("https://api.monday.com/v2", json={"query": query, "variables": variables},
headers={"Authorization": credentials.secret("MONDAY_API_TOKEN"), "API-Version": "2024-10"})
resp.raise_for_status()
return resp.json()["data"]
JIRA_URL = "https://api.atlassian.com/ex/jira/your-cloud-id/rest/api/3"
def jira(method, path, **kw):
resp = http.request(method, JIRA_URL + path, headers={"Authorization": "Bearer " + credentials.connection("jira", "work")}, **kw)
resp.raise_for_status()
return resp.json() if resp.content else None
@on_event
def handle(event):
body = event.json or {}
if "challenge" in body:
return {"challenge": body["challenge"]}
e = body.get("event") or {}
item_id = str(e.get("pulseId", ""))
if not item_id:
return {"synced": False}
key = state.get(f"item:{item_id}")
name = monday("query ($i: [ID!]) { items(ids: $i) { name } }", i=[item_id])["items"][0]["name"]
if key:
jira("PUT", f"/issue/{key}", json={"fields": {"summary": name[:250]}})
label = (e.get("value") or {}).get("label", {}).get("text")
if label in STATUS_TO_TRANSITION:
jira("POST", f"/issue/{key}/transitions", json={"transition": {"id": STATUS_TO_TRANSITION[label]}})
else:
key = jira("POST", "/issue", json={"fields": {"project": {"key": "APP"}, "issuetype": {"name": "Task"}, "summary": name[:250]}})["key"]
state.set(f"item:{item_id}", key)
monday("mutation ($b: ID!, $i: ID!, $v: String!) { change_simple_column_value(board_id: $b, item_id: $i, column_id: \"jira_key\", value: $v) { id } }",
b=BOARD, i=item_id, v=key)
return {"item": item_id, "issue": key}FAQ
Common questions
Which changes are synced?
How is a monday.com status matched to Jira?
How do I connect the trigger?
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
Open Jira issues for approved monday.com requests
When a change request is approved on your monday.com board, a Jira issue is opened and its key is written back to the item.
See how it worksCompare Jira progress with monday.com goals weekly
Every Monday you get a report showing which epics are behind, comparing finished Jira work with the targets on your monday.com board.
See how it worksPost new orders and sign-ups to Slack
When something happens in your shop, app or form, the details land in the right channel straight away.
See how it worksKeep exploring
Set up “Sync monday.com items to Jira without duplicates” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.