A monthly backlog cleanup desk for your Freshdesk queue
Merge duplicate tickets, chase the ones stuck waiting on customers, and close dead threads in bulk, with every change logged to a spreadsheet.
Build me a backlog hygiene desk for Freshdesk so the monthly queue cleanup stops being a manual slog. It is an internal app my support team opens, works through, and closes again, not something that runs on a schedule. It opens on two tabs: "Likely duplicates" and "Stalled".
The "Likely duplicates" tab shows clusters of open tickets that look like the same issue, either because they came from the same requester or because they are about the same problem. Build the list with Freshdesk Filter Tickets scoped to open tickets in a recent window, then expand each ticket with View Ticket and pull its thread with List Ticket Conversations so I can read the threads of the tickets in a cluster side by side in one panel. Each cluster shows the requester, subject, created date, current status and the last message on each ticket. I pick which ticket is the primary, and merge the rest into it in one click with Merge Tickets.
Merge Tickets takes up to five secondary tickets per call, so if a cluster is bigger than that, chunk the merge into successive calls into the same primary and show it as one action in the UI. Merging is not reversible the way a delete is (deleted tickets sit in Trash for thirty days, merged secondaries are closed and linked into the primary for good), so the app must always make me explicitly confirm the primary ticket before it merges anything.
The "Stalled" tab shows tickets sitting in pending status with no customer reply for more than a configurable number of days, default seven. Get the candidates with Filter Tickets on pending status, then use List Ticket Conversations on each to find the last inbound message from the requester and work out how long it has been waiting. Sort the table by longest wait first, and show ticket id, subject, requester, assigned agent, days waiting, and what the agent last asked for. Freshdesk ticket search returns thirty results per page and caps out at three hundred results, so page through properly and narrow the window by date or group rather than assuming one call returns everything.
From the Stalled tab I select rows and do one of two things. Either send a follow-up nudge to the customer with Reply to Ticket, or close them out in bulk with a standard message. For the bulk close, use Bulk Update Tickets, which handles up to a hundred tickets at once and runs asynchronously, so show a progress state while the job runs and confirm the tickets actually changed by re-reading them with View Ticket or Filter Tickets before you report success. Use Update Ticket for a single ticket or for any field the bulk call cannot set.
Add a "Find duplicates" button that kicks off a background agent inside the app. It reads recent open tickets with Filter Tickets, expands the interesting ones with View Ticket and List Ticket Conversations, groups the tickets that are genuinely the same issue rather than merely similar sounding, writes a short explanation of why each cluster belongs together, and proposes which ticket should be the primary and why (usually the oldest or the one with the richest thread). Its output lands back in the app as proposed clusters in the Likely duplicates tab. It applies nothing itself.
Add a second agent action on the Stalled tab that drafts a personalised nudge for each selected ticket. It reads the thread with List Ticket Conversations, works out what the agent last asked the customer for, and drafts a short follow-up referencing that specific request rather than a generic "any update?" message. Drafts land in the app as editable proposals next to each row. Nothing is sent until I approve a draft, and approving it posts the message with Reply to Ticket.
Bake in three safety rails. A configurable stall threshold in settings. A dry-run preview on every action, showing exactly what will change before anything is applied: the ticket ids affected, which ticket is being kept as primary, the status being set, and the exact message text going out. And a hard cap on how many tickets one bulk action can touch, configurable with a sensible default of about twenty-five and never above the hundred-ticket ceiling. Everything the agents produce stays a proposal until a human approves it.
Every merge, nudge and bulk close gets appended as a row to a Google Sheets cleanup log with Append Values: the date, the ticket ids involved, the primary ticket where relevant, the action taken, and who approved it. Write the row only after the Freshdesk call has actually succeeded, one row per action, so the log never claims something that did not happen. Freshdesk keeps no readable record of this housekeeping, so this sheet is the audit trail.
Settings should cover the cleanup log spreadsheet and tab name, the stall threshold in days, the bulk action cap, the standard closing message template, and any filter that narrows which tickets the desk considers, such as group, product or ticket age.
What does this prompt do?
- Two tabs in one place: likely duplicate tickets grouped into clusters with their threads readable side by side, and stalled tickets sorted by how long they have been waiting on a customer.
- A Find duplicates button hands the grouping to an assistant that reads your recent open tickets, explains why each cluster belongs together and suggests which ticket to keep, always as a proposal you approve.
- Merge a cluster into the ticket you choose, send a personalised follow-up nudge written from what your agent last asked for, or close a batch of dead threads with a standard message.
- Every merge, nudge and bulk close is written to a Google Sheets cleanup log with the date, the tickets involved, the action taken and who approved it.
What do I need to use this?
- A Freshdesk account, with an agent login allowed to merge, reply to and close tickets.
- A Google account and a spreadsheet to use as the cleanup log.
- A rough idea of how long a ticket should sit in pending before you count it as stalled, for example seven days.
How can I customize it?
- Change the stall threshold so a ticket counts as stalled after three days, seven days, or whatever your team treats as overdue.
- Set the cap on how many tickets a single bulk action can touch, and edit the standard closing message that goes out with a bulk close.
- Narrow the queue the desk looks at by group, product or ticket age if you only want to clean up part of the backlog.
FAQs
Can it merge or close tickets without me checking first?
How does it decide that two tickets are duplicates?
What counts as a stalled ticket?
Will a bulk close email all those customers at once?
Why log everything to a spreadsheet instead of just leaving it in Freshdesk?
Related templates
Stop buying stale lists. Reps run a saved search, work the results like an inbox, and only the accounts they approve ever reach your CRM.
Drag creators through Sourced to Wrapped on a board grouped by campaign, with audience stats on every card and a one-click brief for each creator.
Pick a repricing rule, send an assistant out to check competitor pages, then approve the new prices that clear your margin floor.
See the projected bounce rate for any outbound send before it goes out, and keep the launch button locked until the list is clean enough to be safe.
Pick any date range and see what each device in your home actually cost to run, not just how many kilowatt-hours it used.
Search three months of global coverage on your topic, rank the outlets actually writing about it, and draft a tailored pitch for each one.
Stop grooming your support backlog by hand.
Set up the cleanup desk once, then run next month's queue tidy in a single sitting with a full record of everything that changed.