ChatGPTSoftwareInfra & DevOpsAI score · 74/100AI-assisted edit · no obvious prompt-injection riskn8n.io

Auto-triage GitHub Issues with GPT-4.1-mini and sync to Slack, Gmail, ClickUp, and Sheets

New GitHub Issue → AI analysis → parallel outputs to spreadsheet, tasks, notifications, and labels

Some experienceStepsWorkflowPrompt
Who
Development or ops teams that need to auto-process GitHub Issues and sync notifications across platforms
You get
When a new Issue is created, AI extracts category, severity, priority, and more, while simultaneously writing to Google Sheets, creating a ClickUp task, sending Slack and Gmail alerts, posting a GitHub comment, and applying labels
You need
n8n · github · google-sheets · clickup · slack · gmail

Constraints

Import the template workflow into n8n, configure credentials for GitHub, OpenAI, Slack, Gmail, ClickUp, and Google Sheets, specify the target repository and notification channels, then activate. Requires an n8n instance and API or OAuth credentials for the listed services.

What they did

Template author itechnotion published a workflow on n8n that listens for issue events on a GitHub repository. When a new Issue is created, it first filters for the opened action via an If node, then sends the Issue title, body, and metadata to GPT-4.1-mini for structured analysis, extracting category, severity, priority, estimated effort, assigned team, summary, and suggested action. A Code node parses the AI text output into JSON and appends a date. Finally, six actions run in parallel: appending data to Google Sheets, creating a ClickUp task, sending a Slack message to #github-alerts, sending an HTML Gmail email, posting a comment on the GitHub Issue, and applying category and severity labels via the GitHub API.

How it went

No specific runtime metrics, success rates, or team feedback are provided by the source. The template description claims the workflow handles issues 'without any manual effort' and keeps the team synchronized across platforms.

Worth knowing

Author-reported claims (author_report): states it eliminates manual triage, keeps the team informed, and prevents items from falling through cracks. Known limitations: 1) The HTTP Request node uses a hardcoded Bearer YOUR_TOKEN_HERE; replace with an n8n credential reference. 2) Requires credentials for six external services. 3) Email recipient is hardcoded to [email protected]. 4) Slack channel is fixed to #github-alerts. 5) Not tested by this site (reproduction=not_tested); compatibility with future platform API changes is not guaranteed.

n8n workflow template

Structure checked · Not run-tested

Use “Import from File” in n8n, or copy the JSON and paste it into the editor. Connect your own accounts, then try test data. The template is inactive by default.

Setup and test checklist

Credentials to connect

  • Github Trigger node: connect GitHub API credentials.
  • Send a message node: connect Slack API credentials.
  • Message a model node: connect OpenAI API credentials.
  • Send a message1 node: connect Gmail OAuth2 credentials.
  • Create a task node: connect clickUpApi credentials.
  • Create a comment on an issue node: connect GitHub API credentials.
  • Append row in sheet node: connect Google Sheets OAuth2 credentials.
  • Replace __UKH_BEARER_8__ with your real secret/token (path /nodes/8/parameters/headerParameters/parameters/1/value; literal auth header).

Configuration to replace

  • Source template is n8n public workflow #15169 (~18 nodes). Keep inactive after import; verify triggers, expressions and external API endpoints.
  • Sticky-note guidance is informational; replace placeholders with your own accounts, sheet schemas or channel IDs.

Test input and expected output

  • Manually run the main path once in a test workspace and confirm credentialed nodes authenticate without errors.
  • Drive one synthetic/redacted sample through and check output fields and downstream writes before enabling in production.

Template changes

  • Author credential bindings, webhookId and execution data are removed; the workflow is inactive. Nodes, connections and original prompts are preserved. Not run-tested in n8n.
  • No business-logic edits; verify keys, quotas and privacy compliance before use. 1 literal secret value(s) replaced with __UKH_…__ placeholders.

Template retrieved: 2026-10-24

Steps

  1. Trigger and filter

    Use the GitHub Trigger node to listen for issue events on a specified repository. Add an If node with the condition $json.body.action equals opened to ensure only newly created Issues are processed.

  2. AI analysis and structuring

    The Message a model node calls GPT-4.1-mini with the Issue title, body, and metadata, using a structured system prompt to extract category, subcategory, severity, priority, estimated_effort, assigned_team, summary, suggested_action, label, and affected_area. The Parse AI Response node uses JavaScript to parse the AI text output into JSON and appends the current date (DD-MM-YYYY).

    Execution prompt · Source text。n8n 'Message a model' node System/User prompt field (responses.values[0].content)

    You are a senior GitHub Issue Analyst with 10+ years of software development experience. 
    Analyze the following GitHub issue carefully and return a precise structured report.
    
    --- ISSUE DETAILS ---
    Title: {{ $json.body.issue.title }}
    Description: {{ $json.body.issue.body }}
    Repository: {{ $json.body.repository.name }}
    Opened By: {{ $json.body.issue.user.login }}
    Existing Labels: {{ $json.body.issue.labels.length > 0 ? $json.body.issue.labels[0].name : 'None' }}
    
    --- ANALYSIS RULES ---
    - Read the title AND description carefully before deciding
    - If description is vague or missing, base analysis on title only
    - Severity should reflect real-world impact on users
    - Priority should reflect how soon a developer should act
    - Label must exactly match one of the allowed values below
    
    --- YOUR TASK ---
    Respond ONLY in this exact format. No extra text, no markdown, no explanation:
    
    CATEGORY: [Pick one: Bug Report | Feature Request | Documentation | Performance | Security | Question | UI/UX | Testing | Dependency | Other]
    
    SUBCATEGORY: [A specific 3-5 word description e.g. "File Upload Crash", "API Rate Limit", "Dark Mode Toggle"]
    
    SEVERITY: [Pick one: Critical | High | Medium | Low]
    
    PRIORITY: [Pick one: Urgent | High | Normal | Low]
    
    ESTIMATED EFFORT: [Pick one: Small (1-2 hrs) | Medium (half day) | Large (1-2 days) | Extra Large (3+ days)]
    
    LABEL: [Pick one that matches CATEGORY exactly: Bug Report | Feature Request | Documentation | Performance | Security | Question | UI/UX | Testing | Dependency | Other]
    
    SUMMARY: [2-3 clear sentences: what the issue is, what is broken or needed, and what the impact is on users]
    
    SUGGESTED ACTION: [One specific, actionable first step for the developer. Be technical and precise.]
    
    ASSIGNED TEAM: [Pick one: Frontend | Backend | DevOps | QA | Design | Full Stack | Documentation Team]
    
    AFFECTED AREA: [Which part of the app is affected e.g. "File Upload Module", "Authentication System", "Database Layer", "UI Components"]
    
    --- SEVERITY GUIDE (use this to decide) ---
    Critical = App is completely broken, data loss, security breach, affects ALL users
    High     = Major feature broken, affects MANY users, no workaround exists
    Medium   = Feature partially broken, some users affected, workaround exists
    Low      = Minor issue, cosmetic, docs, affects very few users
    
    --- PRIORITY GUIDE (use this to decide) ---
    Urgent   = Must fix today, blocking users or security risk
    High     = Fix this week, significantly impacts user experience
    Normal   = Fix this sprint, standard issue
    Low      = Fix when time allows, nice to have

    Execution prompt · Source text。n8n 'Parse AI Response' node JS Code field

    const items = $input.all();
    
    return items.map(item => {
      const text = item.json.output[0].content[0].text;
    
      const result = {};
    
      text.split("\n\n").forEach(line => {
        const [key, ...rest] = line.split(":");
        if (key && rest.length) {
          const formattedKey = key.trim().toLowerCase().replace(/ /g, "_");
          result[formattedKey] = rest.join(":").trim();
        }
      });
    
      // ✅ Added date (DD-MM-YYYY)
      const now = new Date();
      const day = String(now.getDate()).padStart(2, '0');
      const month = String(now.getMonth() + 1).padStart(2, '0');
      const year = now.getFullYear();
      result.date = `${day}-${month}-${year}`;
    
      return {
        json: result
      };
    });
  3. Parallel outputs and sync

    After Parse AI Response, the workflow runs six actions in parallel: 1) Append row in sheet writes date, title, category, priority, severity, GitHub link, etc. to Google Sheets; 2) Create a task creates a prioritized ClickUp task with full Issue and AI analysis details; 3) Send a message posts a formatted Slack message to #github-alerts; 4) Send a message1 sends an HTML-formatted Gmail email; 5) Create a comment on an issue replies with the AI analysis summary on the GitHub Issue; 6) HTTP Request calls the GitHub API to add category and severity labels to the Issue.

    Execution prompt · Source text。n8n 'Send a message' (Slack) node text field

    =🚨 *New GitHub Issue Opened!*
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    
    *📌 Title:*  {{ $('If').item.json.body.issue.title }}
    *🔢 Issue No:*  #{{ $('If').item.json.body.issue.number }}
    *📁 Repository:*  {{ $('If').item.json.body.repository.name }}
    *👤 Opened by:*  {{ $('If').item.json.body.issue.user.login }}
    *🕒 Created at:*  {{ $('If').item.json.body.issue.created_at }}
    
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    🤖 *AI ISSUE ANALYSIS*
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    
    📂 *Category:*        {{ $('Parse AI Response').item.json.category }}
    🔍 *Subcategory:*   {{ $('Parse AI Response').item.json.subcategory }}
    🔴 *Severity:*          {{ $('Parse AI Response').item.json.severity }}
    ⚡ *Priority:*            {{ $('Parse AI Response').item.json.priority }}
    ⏱️ *Est. Effort:*       {{ $('Parse AI Response').item.json.estimated_effort }}
    👥 *Assigned Team:* {{ $('Parse AI Response').item.json.assigned_team }}
    
    📝 *Summary:*
    {{ $('Parse AI Response').item.json.summary }}
    
    ✅ *Suggested Action:*
    {{ $('Parse AI Response').item.json.suggested_action }}
    
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    🔗 *GitHub Link:* {{ $('If').item.json.body.issue.html_url }}
    📋 *ClickUp Task Created* ✅
    📧 *Email Notification Sent* ✅

    Execution prompt · Source text。n8n 'Send a message1' (Gmail) node message field

    ==<div style="font-family: Arial, sans-serif; max-width: 680px; margin: auto; border: 1px solid #e0e0e0; border-radius: 8px; overflow: hidden;">
    
      <!-- HEADER -->
      <div style="background: #1a1a2e; padding: 24px; text-align: center;">
        <h1 style="color: #ffffff; margin: 0; font-size: 22px;">🚨 New GitHub Issue Opened</h1>
        <p style="color: #aaaaaa; margin: 6px 0 0;">Automated Issue Tracker — Instant Notification</p>
      </div>
    
      <!-- ISSUE DETAILS -->
      <div style="padding: 24px; background: #ffffff;">
        <h2 style="color: #1a1a2e; border-bottom: 2px solid #f0f0f0; padding-bottom: 8px;">📌 Issue Details</h2>
        <table style="width:100%; border-collapse: collapse;">
          <tr style="background:#f9f9f9;">
            <td style="padding:10px; font-weight:bold; width:35%; color:#555;">Title</td>
            <td style="padding:10px;">{{ $('If').item.json.body.issue.title }}</td>
          </tr>
          <tr>
            <td style="padding:10px; font-weight:bold; color:#555;">Issue Number</td>
            <td style="padding:10px;">#{{ $('If').item.json.body.issue.number }}</td>
          </tr>
          <tr style="background:#f9f9f9;">
            <td style="padding:10px; font-weight:bold; color:#555;">Repository</td>
            <td style="padding:10px;">{{ $('If').item.json.body.repository.name }}</td>
          </tr>
          <tr>
            <td style="padding:10px; font-weight:bold; color:#555;">Opened By</td>
            <td style="padding:10px;">{{ $('If').item.json.body.issue.user.login }}</td>
          </tr>
          <tr style="background:#f9f9f9;">
            <td style="padding:10px; font-weight:bold; color:#555;">Created At</td>
            <td style="padding:10px;">{{ $('If').item.json.body.issue.created_at }}</td>
          </tr>
        </table>
    
        <!-- ISSUE DESCRIPTION -->
        <h2 style="color:#1a1a2e; border-bottom:2px solid #f0f0f0; padding-bottom:8px; margin-top:28px;">📝 Issue Description</h2>
        <div style="background:#f9f9f9; padding:14px; border-left:4px solid #1a1a2e; border-radius:4px; white-space:pre-line; color:#333;">
          {{ $('If').item.json.body.issue.body }}
        </div>
    
        <!-- AI ANALYSIS -->
        <h2 style="color:#1a1a2e; border-bottom:2px solid #f0f0f0; padding-bottom:8px; margin-top:28px;">🤖 AI Issue Analysis</h2>
        <table style="width:100%; border-collapse:collapse;">
          <tr style="background:#fff3cd;">
            <td style="padding:10px; font-weight:bold; width:35%; color:#555;">📂 Category</td>
            <td style="padding:10px;">{{ $('Parse AI Response').item.json.category }}</td>
          </tr>
          <tr>
            <td style="padding:10px; font-weight:bold; color:#555;">🔍 Subcategory</td>
            <td style="padding:10px;">{{ $('Parse AI Response').item.json.subcategory }}</td>
          </tr>
          <tr style="background:#f8d7da;">
            <td style="padding:10px; font-weight:bold; color:#555;">🔴 Severity</td>
            <td style="padding:10px; font-weight:bold; color:#c0392b;">{{ $('Parse AI Response').item.json.severity }}</td>
          </tr>
          <tr>
            <td style="padding:10px; font-weight:bold; color:#555;">⚡ Priority</td>
            <td style="padding:10px; font-weight:bold; color:#e67e22;">{{ $('Parse AI Response').item.json.priority }}</td>
          </tr>
          <tr style="background:#f9f9f9;">
            <td style="padding:10px; font-weight:bold; color:#555;">⏱️ Est. Effort</td>
            <td style="padding:10px;">{{ $('Parse AI Response').item.json.estimated_effort }}</td>
          </tr>
          <tr>
            <td style="padding:10px; font-weight:bold; color:#555;">👥 Assigned Team</td>
            <td style="padding:10px;">{{ $('Parse AI Response').item.json.assigned_team }}</td>
          </tr>
        </table>
    
        <!-- SUMMARY -->
        <h2 style="color:#1a1a2e; border-bottom:2px solid #f0f0f0; padding-bottom:8px; margin-top:28px;">📋 Summary</h2>
        <p style="background:#eaf4fb; padding:14px; border-left:4px solid #3498db; border-radius:4px; color:#333;">
          {{ $('Parse AI Response').item.json.summary }}
        </p>
    
        <!-- SUGGESTED ACTION -->
        <h2 style="color:#1a1a2e; border-bottom:2px solid #f0f0f0; padding-bottom:8px; margin-top:28px;">✅ Suggested Action</h2>
        <p style="background:#eafaf1; padding:14px; border-left:4px solid #27ae60; border-radius:4px; color:#333;">
          {{ $('Parse AI Response').item.json.suggested_action }}
        </p>
    
        <!-- BUTTON -->
        <div style="text-align:center; margin-top:32px;">
          <a href="{{ $('If').item.json.body.issue.html_url }}"
             style="background:#1a1a2e; color:#ffffff; padding:14px 32px; text-decoration:none; border-radius:6px; font-size:16px; display:inline-block;">
            🔗 View Issue on GitHub
          </a>
        </div>
      </div>
    
      <!-- FOOTER -->
      <div style="background:#f4f4f4; padding:16px; text-align:center; color:#999; font-size:12px;">
        This email was automatically generated by your n8n GitHub Issue Tracker 🚀<br/>
        Repository: {{ $('If').item.json.body.repository.full_name }}
      </div>
    
    </div>

    Execution prompt · Source text。n8n 'Create a task' (ClickUp) node additionalFields.content field

    =GitHub Issue Details
    
    Title: {{ $('If').item.json.body.issue.title }}
    Issue: {{ $('If').item.json.body.issue.number }}
    Repository: {{ $('If').item.json.body.repository.name }}
    Opened By: {{ $('If').item.json.body.issue.user.login }}
    
    ---
    
    AI Analysis
    
    Category: {{ $('Parse AI Response').item.json.category }}
    Subcategory: {{ $('Parse AI Response').item.json.subcategory }}
    Severity: {{ $('Parse AI Response').item.json.severity }}
    Priority: {{ $('Parse AI Response').item.json.priority }}
    
    Summary:
    {{ $('Parse AI Response').item.json.summary }}
    
    Suggested Action:
    {{ $('Parse AI Response').item.json.suggested_action }}
    
    ---
    
    🔗 {{ $('If').item.json.body.issue.html_url }}

    Execution prompt · Source text。n8n 'Create a comment on an issue' node body field

    =👋 Hey @{{ $('If').item.json.body.issue.user.login }}, thanks for opening this issue!
    
    Our AI has reviewed it and here's what we found:
    
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    🤖 AI ANALYSIS RESULT
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    
    📂 Category:        {{ $('Parse AI Response').item.json.category }}
    🔍 Subcategory:     {{ $('Parse AI Response').item.json.subcategory }}
    🔴 Severity:        {{ $('Parse AI Response').item.json.severity }}
    ⚡ Priority:         {{ $('Parse AI Response').item.json.priority }}
    ⏱️ Estimated Effort: {{ $('Parse AI Response').item.json.estimated_effort }}
    👥 Assigned Team:   {{ $('Parse AI Response').item.json.assigned_team }}
    
    📝 Summary:
    {{ $('Parse AI Response').item.json.summary }}
    
    ✅ Suggested Action:
    {{ $('Parse AI Response').item.json.suggested_action }}
    
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    📋 A ClickUp task has been created for this issue
    📧 The team has been notified via email & Slack
    🔗 We will review and respond as soon as possible
    
    🤖 This comment was auto-generated by our Issue Tracker Bot

Prompt you can copy

Setup guidance · Editorial suggestion。Hand to setup assistant to help user import template and replace placeholders

This block is the prompt. Ads are never placed here.

You are an n8n workflow setup assistant. The user wants to replicate the template that auto-triages GitHub Issues with GPT-4.1-mini and syncs to multiple platforms. Assist in this order:
1. Confirm the user has an n8n instance and credentials for GitHub, OpenAI, Slack, Gmail, ClickUp, and Google Sheets.
2. Guide them to import the template from https://n8n.io/workflows/15169/ or create nodes from the provided workflow.json.
3. Remind them to replace all YOUR_* placeholders (repository name, username, Sheet ID, ClickUp List/Team/Space ID, recipient email, Slack channel).
4. Note that the HTTP Request node contains YOUR_TOKEN_HERE as a hardcoded GitHub Personal Access Token; recommend switching to an n8n credential reference instead.
5. Suggest testing with a sample Issue before activating the workflow.

After importing the n8n template, configure credentials, batch-replace YOUR_* placeholders, then test the trigger.

Source

Triage GitHub issues with GPT-4.1-mini, Slack, Gmail, ClickUp and Sheets · itechnotion · n8n.io · 2026-04-20

Comments & feedback

Tried this method? Share results, problems or improvements. Comments appear after moderation. Please avoid sensitive information.

Loading…

    Related