Jotform to GitHub, fewer duplicate bug reports
Your bug report form is working. The problem is what happens after. Tickets get copied into GitHub by hand, duplicates slip through, and “did anyone triage this?” becomes a daily Slack (or email) ritual.
Product managers end up babysitting triage. Support leads get stuck forwarding the same issue twice. And agency owners feel it when clients think nothing’s happening. This GitHub issue automation cleans incoming Jotform submissions, checks for duplicates, then creates (or doesn’t create) an issue with a clear status you can trust.
Below, you’ll see exactly how the workflow moves from form submission to GitHub + Google Sheets + a Telegram alert, plus the practical results you can expect once it’s running.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Jotform to GitHub, fewer duplicate bug reports
flowchart LR
subgraph sg0["JotForm Submission Hook Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/telegram.svg' width='40' height='40' /></div><br/>Dispatch Telegram Alert"]
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/jotform.dark.svg' width='40' height='40' /></div><br/>JotForm Submission Hook"]
n2@{ icon: "mdi:robot", form: "rounded", label: "AI Triage Assistant", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Retrieve GitHub Issues", pos: "b", h: 48 }
n4@{ icon: "mdi:brain", form: "rounded", label: "Gemini Chat Engine", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Open GitHub Issue", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "Parse Structured Output", pos: "b", h: 48 }
n7@{ icon: "mdi:database", form: "rounded", label: "Update Sheet Row", pos: "b", h: 48 }
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Compose Alert Script"]
n2 --> n7
n1 --> n2
n8 --> n0
n4 -.-> n2
n6 -.-> n2
n5 -.-> n2
n7 --> n8
n3 -.-> n2
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n1 trigger
class n2,n6 ai
class n4 aiModel
class n7 database
class n8 code
classDef customIcon fill:none,stroke:none
class n0,n1,n8 customIcon
The Challenge: Duplicate Bug Reports That Kill Triage
Bug reports come in messy. One user writes three paragraphs, another writes “it’s broken,” and someone else submits the exact same thing that was reported last week. Then your team has to interpret it, search GitHub manually, decide whether it’s new, create an issue, and tell the right people. On a busy day, that’s not “just a few minutes.” It’s constant context switching, plus the risk of missing the one report that actually matters.
The friction compounds. Here’s where it breaks down in real life.
- Someone creates a brand-new GitHub issue even though a matching one already exists, so the team wastes time debating which one to close.
- Triage becomes a memory game because the original report is buried in inboxes and chat threads instead of being logged consistently.
- Form submissions don’t translate cleanly into actionable GitHub titles, labels, or summaries, which means more back-and-forth and slower fixes.
- Notifications are noisy, so people start ignoring them, and then the important reports get missed.
The Fix: Jotform → AI Triage → GitHub + Sheets + Telegram
This workflow turns every Jotform bug report into a consistent, triage-ready outcome. It starts the moment a user submits your bug form with their name, email, and the bug description. An AI triage assistant reviews that text and checks your GitHub repository for similar issues. If it finds a match, it flags the submission as a duplicate and avoids creating yet another issue. If it’s new, it opens a fresh GitHub issue automatically, then returns a structured summary of what happened. Finally, everything gets logged to Google Sheets and a Telegram message goes out so the right people know whether action is needed.
The workflow starts with a Jotform submission. From there, the AI agent uses your GitHub issues as its reference point, then decides “duplicate” vs “new issue.” Google Sheets becomes the running ledger, and Telegram becomes the clean alert channel that tells you what to do next.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you get 10 bug reports a week. Manually, you might spend about 10 minutes searching GitHub, 10 minutes creating or formatting the issue, and another 5 minutes notifying the team, which is roughly 4 hours weekly. With this workflow, submitting is still instant for the user, and your team mostly just reads the Telegram alert and clicks through when it’s truly new. That’s usually closer to 30 minutes of attention per week, not an afternoon.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Jotform to collect incoming bug reports
- GitHub to search and create issues
- Google Sheets for a submission and status log
- Telegram to notify the team instantly
- Google Gemini API access (get it from Google AI Studio / your Google Cloud project)
Skill level: Intermediate. You’ll connect accounts, set permissions, and paste a few IDs like repo name and sheet.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A Jotform submission comes in. The JotForm Submission Hook captures the reporter’s contact details and the raw bug description the moment they hit submit.
The report gets triaged into something consistent. The AI Triage Assistant (running on Gemini) interprets the text and searches your GitHub repository’s issues to find potential duplicates, so you’re not relying on someone’s memory.
GitHub is updated only when it should be. If the bug looks new, the workflow opens a GitHub issue automatically. If it’s already reported, it records that outcome instead of creating more clutter.
Sheets and Telegram keep everyone aligned. A row is written to Google Sheets with the submission, the AI’s decision, and issue details. Then a small script composes a clear Telegram message like “duplicate, no action” or “new issue created,” and sends it to your chosen chat.
You can easily modify the Telegram wording to match your team’s tone, or swap the Google Sheets log for another destination if that’s how you track triage. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the JotForm Trigger
Set up the workflow to start when a new JotForm submission is received.
- Add the JotForm Submission Hook node as your trigger.
- Set Form to
[YOUR_ID]. - Set Only Answers to
false. - Credential Required: Connect your jotFormApi credentials.
Bug Description or Your Email Address), update the expressions later in Update Sheet Row to match your exact JotForm field labels.Step 2: Connect Google Sheets
Store the triaged bug details into a Google Sheet for tracking.
- Add the Update Sheet Row node and connect it after AI Triage Assistant.
- Set Operation to
appendOrUpdate. - Set Document to
[YOUR_ID](cached name:Github user submitted BUGS log). - Set Sheet Name to
[YOUR_ID](cached name:Sheet1). - Map the columns with these expressions:
- id →
{{ $('JotForm Submission Hook').item.json.submissionID }} - email →
{{ $('JotForm Submission Hook').item.json.rawRequest['Your Email Address'] }} - issue →
{{ $json.output.issue_description }} - Full name →
{{ $('JotForm Submission Hook').item.json.rawRequest['Your Name'].first }} {{ $('JotForm Submission Hook').item.json.rawRequest['Your Name'].last }} - present_in_github? →
{{ $json.output.present_in_github }} - Credential Required: Connect your googleSheetsOAuth2Api credentials.
id column or the append/update behavior may fail.Step 3: Set Up AI Triage Assistant
Configure the AI agent to read the bug description, check GitHub issues, and optionally create a new issue.
- Add the AI Triage Assistant node after JotForm Submission Hook.
- Set Text to the provided multi-step prompt, including the expression
{{ $json.rawRequest['Bug Description'] }}. - Ensure Prompt Type is set to
defineand Has Output Parser is enabled. - Connect Gemini Chat Engine as the language model for AI Triage Assistant.
Credential Required: Connect your googlePalmApi credentials on Gemini Chat Engine. - Connect Retrieve GitHub Issues and Open GitHub Issue as tools for AI Triage Assistant.
Credential Required: Connect your githubApi credentials on both Retrieve GitHub Issues and Open GitHub Issue. - Connect Parse Structured Output as the output parser for AI Triage Assistant. Ensure the JSON schema example matches your desired output.
Step 4: Configure Output and Alerts
Format the alert message and send it to Telegram once the sheet has been updated.
- Add Compose Alert Script after Update Sheet Row to build the alert message.
- Keep the JavaScript Code as provided to set
item.json.messagebased onpresent_in_github?. - Add Dispatch Telegram Alert after Compose Alert Script.
- Set Text to
{{ $json.message }}. - Set Chat ID to
[YOUR_ID]. - Credential Required: Connect your telegramApi credentials.
message in the JSON; otherwise Dispatch Telegram Alert will send a blank message.Step 5: Test and Activate Your Workflow
Verify the end-to-end flow from form submission to GitHub triage, logging, and Telegram alert.
- Click Execute Workflow and submit a test entry in your JotForm.
- Confirm AI Triage Assistant produces structured output with
issue_name,issue_description, andpresent_in_github. - Check Update Sheet Row to ensure the row was appended or updated using the
idcolumn. - Verify Dispatch Telegram Alert sends a message to the configured chat.
- Enable the workflow with the Active toggle for production use.
Watch Out For
- GitHub credentials can expire or need specific permissions. If things break, check the GitHub personal access token scopes and the n8n credential settings first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Common Questions
About an hour if your Jotform, GitHub, Sheets, and Telegram accounts are ready.
Yes, but someone needs to be comfortable connecting apps and checking permissions. No “real coding,” although the workflow includes a small script you can usually keep as-is.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Gemini API usage costs, which depend on how long your bug descriptions are.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
You can tweak the AI Triage Assistant instructions so it searches the right repository, uses your labeling rules, and outputs the exact fields you want logged. Common changes include adjusting the duplicate-matching threshold (so it’s stricter or looser), customizing what gets written in the Update Sheet Row step, and rewriting the Compose Alert Script message so Telegram includes an owner, severity, or a direct issue link.
Usually it’s an expired token or missing scopes for reading issues and creating issues. Update the GitHub credential in n8n, then re-test the “Retrieve GitHub Issues” and “Open GitHub Issue” steps. If it works in small tests but fails in production, rate limits can also be the culprit when you get a burst of submissions.
For most small teams, it’s effectively “as many form submissions as you get.” On n8n Cloud Starter you can run thousands of executions per month, and self-hosting removes execution caps (your server becomes the limit). The practical bottlenecks are usually GitHub rate limits and how long the AI model takes to evaluate each description, not n8n itself.
Often, yes. This workflow leans on an AI agent that can search issues, decide “duplicate vs new,” and return structured output, which is easier to express in n8n without piling up paid tasks. n8n also makes it straightforward to keep a Google Sheets log and craft a conditional Telegram message with code when you need it. Zapier or Make can still work if you just want “form submission → create issue” with no duplicate check. If you’re unsure, Talk to an automation expert and we’ll sanity-check your use case.
Once this is live, bug intake stops feeling like whack-a-mole. You get cleaner issues, fewer duplicates, and a log that makes status obvious without a meeting.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.