# 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.

- Workflow type: app
- Services: Freshdesk, Google Sheets
- Categories: Customer Support, Operations
- Published: 2026-08-24

## What it does

- 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 you'll need

- 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.

## Prompt

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.

## How to customize

- 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.

## FAQ

### Can it merge or close tickets without me checking first?

No. Everything the assistant produces is a proposal, and nothing reaches Freshdesk until you approve it. Before any action runs you get a dry run preview showing exactly which tickets are affected, which one is being kept, and what message goes out. Merging is permanent in Freshdesk, so the app always asks you to confirm the ticket you are keeping before it merges anything.

### How does it decide that two tickets are duplicates?

It looks at recent open tickets from the same requester or about the same underlying issue, reads the full conversation on each one, and groups the ones that genuinely match. Each cluster comes with a short explanation of why those tickets belong together and a suggestion for which one to keep. You can disagree, drop a ticket out of a cluster, or pick a different one to keep.

### What counts as a stalled ticket?

A ticket sitting in pending status with no reply from the customer for longer than your threshold. The list is sorted with the longest waits first, so the most neglected tickets are the ones you see when the tab opens. The threshold is a setting you can change at any time.

### Will a bulk close email all those customers at once?

Only if you want it to. You choose the standard closing message, you see the full list of tickets in the preview first, and there is a hard cap on how many tickets one bulk action can touch. Bulk closes run in the background in Freshdesk, so the app shows progress and confirms each ticket actually changed before it records anything in the log.

### Why log everything to a spreadsheet instead of just leaving it in Freshdesk?

Freshdesk keeps no readable record of this kind of housekeeping, so there is no easy way to answer questions later about who closed a batch of tickets or why two tickets were merged. The cleanup log gives you that history in a spreadsheet: the date, the ticket numbers, the action taken and the person who approved it.

Use this prompt in General Input: https://www.generalinput.com/prompts/a-monthly-backlog-cleanup-desk-for-your-freshdesk-queue