The pattern is always the same.
A customer submits a feature request, another submits the same one two weeks later, and by the end of the quarter the same request is sitting across multiple tickets from different accounts.
Someone has to manually go through every ticket, identify the pattern, and write up individual feature requests engineering can access and prioritise.
Feedback Loop is a dashboard with two views. The Insights tab shows you the full picture at a glance. Request volume by category, tier mix, and trend over time. The Analysis tab lets you filter the queue, run a Claude-powered analysis, and export a PDF brief you can hand straight to engineering.
Try it: Use the mock tickets already loaded or submit your own, then open the Insights tab to explore the data or switch to Analysis to run the full workflow.
How I built it
Why I built it this way
Having a system means every feature request gets captured, grouped, and actioned
Feature requests come in through support tickets. I go through them manually, spot the pattern, submit individual feature requests, and build a case for engineering.
Feedback Loop replaces the manual steps. The dashboard ensures nothing gets missed, and the PDF gives engineering a consistent brief every time.
Step 1: Submit a feature request
Structured intake captures the signal before it disappears into a backlog
The Submit Feature Request page captures each request by product area (Authentication, API, Integrations, User Management, Billing), account tier (Enterprise, Pro, Free), priority, and description.
Every submission is saved locally and appears immediately in the dashboard queue.
You can also go to Settings to import your own tickets via CSV export from Zendesk, Intercom, or any support tool rather than submitting one by one.
The mock data went through seven versions. The first read like bug reports. Then it was too employer-specific. Then the categories were confusing to anyone who was not already familiar with the product.
It took longer to get twenty tickets that felt genuinely realistic and well spread across five request types than it took to build the intake form.
Step 2 and 3: Analysis and export
Claude groups the requests, scores by priority, and generates a brief you can act on
Step 2 sends the selected tickets to Claude via a secured Cloudflare Worker. Claude groups them into themes, scores each one by priority based on how frequently it appears and which account tiers are asking for it, and returns a summary with recommended actions and affected accounts.
Step 3 exports a PDF document with supporting evidence for each ticket — the document I would attach to a Jira epic or bring into a product review meeting.
The PDF export broke twice. The first version generated a blank document. The second had content but the layout was unreadable.
When I deployed, the PDF library returned a 404 and the whole export silently failed until I checked the console. I used Cursor's debugger to trace and resolve the issue, then rebuilt the PDF layout from scratch.
Insights tab and CSV import
From a single workflow to a full analytics dashboard
After shipping the core Analysis workflow I added an Insights tab to give the full picture before you dive into individual tickets.
It shows total requests, top category, and tier mix. The stacked bar chart breaks down requests by category and account tier. The donut chart shows the overall tier split. The trend line shows request volume over time. Clicking any chart segment filters the Analysis view instantly.
The Settings page also supports CSV import so you can bring in your own feature request data rather than relying on the mock tickets. Upload a CSV export from Zendesk, Intercom, or any support tool, preview the data, and choose to merge with or replace the mock tickets.
Once imported you choose whether to use your data only or merge it with the mock tickets.
The Insights and Analysis panels were conflicting on initial render because of a hidden versus display flex issue. The panels were both trying to occupy the same space until I separated the visibility logic properly.
Getting the chart colours to match the tier system throughout the whole dashboard took more iterations than expected. The CSS variables needed wiring through Chart.js configuration rather than relying on stylesheet inheritance.
Tech stack
Cursor
Built end to end in Cursor
Anthropic Claude
Groups requests and scores priority
Chart.js
Stacked bar, donut, and trend charts
Cloudflare Workers
Secures the API key and rate limits the public demo
Cloudflare Pages
Hosts the live demo
jsPDF
Generates the PDF document
JavaScript
Dashboard, intake form, import, storage
Try it yourself
Submit a feature request first, or go to Settings to import your own tickets via CSV. Then open the Insights tab to explore the data at a glance, or switch to Analysis to filter tickets, run the AI analysis, and export a PDF brief.
Open Feedback Loop →