Every 15 minutes
Turn approved Notion feature requests into GitHub issues
When a feature request in Notion is marked Approved, a GitHub issue is opened and its link is written back to the Notion page.
- Runs
- Every 15 minutes
- Apps
- GitHub, Notion
- AI
- Not needed
- Access
- Notion read+write; GitHub issues:write
Send this to your assistant
Create a ClickRuntime automation: every 15 minutes, find feature requests in my Notion Requests database with status Approved and no GitHub link, open an issue for each in acme/app, write the link back, and email me.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A product manager collects feature requests from customers in a Notion database and reviews them with the team each week. Approved requests then have to be copied into GitHub, which happens slowly and sometimes not at all, and the Notion page never shows whether work has started.
Opening an issue the moment a request is approved, and linking it back, makes the hand-off instant. Customer-facing teams can follow the link from Notion to see progress without asking engineers.
What you get out of it
Approval leads straight to work
An approved request becomes an issue within minutes. Nothing waits for someone to copy it.
Linked in both directions
The Notion page links to the issue, and the issue links to the Notion page. Context is never lost.
Product decides, engineering builds
Product managers work in Notion, engineers in GitHub. Each team stays in its own tool.
No duplicates
Pages that already have a GitHub link are skipped. Each request becomes exactly one issue.
How it works
What happens, step by step
Every 15 minutes, ClickRuntime looks in your Notion database for requests marked Approved that have no GitHub link.
For each one, it opens a GitHub issue with the request's title, description and a link back to Notion.
The issue link is written into the Notion page, so it is not created twice.
You get an email listing the new issues.
Before it runs live
- Connect GitHub
- Connect Notion and share the database you want it to use
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 GitHub and Notion steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_trigger, credentials, http, notify, report_fetched
def gh(method, path, **kw):
resp = http.request(method, f"https://api.github.com{path}", headers={
"Authorization": f"Bearer {credentials.connection('github', 'work')}", "Accept": "application/vnd.github+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()
REPO, DB = "acme/app", "your-notion-database-id"
@on_trigger
def run(event):
pages = notion("POST", f"/databases/{DB}/query", json={"filter": {"and": [
{"property": "Status", "status": {"equals": "Approved"}}, {"property": "GitHub", "url": {"is_empty": True}}]}})["results"]
report_fetched(len(pages))
if not pages:
return {"created": 0}
created = []
for p in pages:
title = "".join(t["plain_text"] for t in p["properties"]["Name"]["title"])
desc = "".join(t["plain_text"] for t in p["properties"].get("Description", {}).get("rich_text", []))
issue = gh("POST", f"/repos/{REPO}/issues", json={"title": title, "labels": ["feature-request"], "body": f"{desc}\n\nNotion: {p['url']}"})
notion("PATCH", f"/pages/{p['id']}", json={"properties": {"GitHub": {"url": issue["html_url"]}}})
created.append(f"{title}: {issue['html_url']}")
notify.email_me(f"{len(created)} feature requests sent to GitHub", "\n".join(created))
return {"created": len(created)}FAQ
Common questions
Which Notion properties does it need?
Can it add labels to the issue?
Does it update Notion when the issue is closed?
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
Flag Notion docs that are older than your latest release
When a new release ships on GitHub, Slack lists the Notion docs pages for that product that have not been updated since before the release.
See how it worksBack up workflows to GitHub and document them in Notion
Each week your workflow definitions are saved to GitHub, and every changed workflow gets a plain-language description in your Notion database.
See how it worksGet a pre-meeting briefing from GitHub and Notion
Before each engineering meeting, Slack gets a short briefing with recent pull requests and issues and the latest notes from your Notion meeting page.
See how it worksKeep exploring
Set up “Turn approved Notion feature requests into GitHub issues” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.