When open-source issues pile up, manual triage is a disaster. This n8n workflow template listens to a GitHub webhook, uses an LLM to label new issues, judge priority, and notify a channel. Maintainers and teams save hours of triage.
Workflow Chain
GitHub webhook trigger -> extract issue title and body -> LLM classifies (bug/feature/docs/question + priority) -> call GitHub API to add labels -> notify channel.
Download Template
Setup Steps
- Import: n8n -> Workflows -> Import from File, pick github-issue-triage.json
- Webhook node: set a POST path; in GitHub repo Settings -> Webhooks, point to your n8n public URL, trigger on
Issues - LLM node: fill API key; the prompt makes the model output JSON (type + priority + reason)
- GitHub API node: fill a Personal Access Token (needs repo scope); use
PATCH /repos/:owner/:repo/issues/:numberto add labels - Notify node: Feishu/DingTalk/Slack webhook
- Test run: open a test issue, watch the labels appear
Companion Prompt (LLM Classification)
You are a project maintainer. Classify this GitHub issue's type and priority, output JSON only:
- type: bug | feature | documentation | question
- priority: P0 (blocker/data loss) | P1 (major feature broken) | P2 (minor) | P3 (enhancement/question)
- reason: one-sentence basis
Basis: title + body. Empty body or "doesn't work" with no repro steps starts at P2 minimum.
Issue title: {{title}}
Issue body: {{body}}Pitfalls
- LLM returns non-JSON: stress "JSON only" at the end of the prompt; add a parse-retry + fallback branch in n8n (default
needs-triagelabel) - GitHub API rate limits: authenticate with a token-unauthenticated is 60/hr, nowhere near enough; adding labels is PATCH not POST
- Webhook security: verify GitHub's
X-Hub-Signature-256-don't let any random request trigger your workflow