Case study · Zendesk Support · Ticket sidebar app

A Zendesk ticket PDF app with no server behind it

Agents are often asked for a copy of a ticket, and the files in a long conversation are hard to find. We built a free sidebar app that prints any ticket as a clean PDF and lists every attachment in one place. It runs entirely inside Zendesk, stores nothing, and has been live on the Zendesk Marketplace since 23 October 2026. It is our own product, built and shipped by our team.

PlatformZendesk Support, ticket sidebar
Built withTypeScript, Vite, Zendesk Apps Framework
StatusLive on the Zendesk Marketplace, free
TimelineBuilt from 26 Sep 2026, submitted 29 Sep, live 23 Oct

Two jobs in the ticket sidebar

Options for the PDF and a Print button at the top. Below it, every file on the ticket with its size, sender and date.

The Ticket PDF & Attachments sidebar: options for the PDF, a Print or save as PDF button, and the ticket's attachments with sizes, senders and dates.

The problem

Zendesk's own print and attachment apps were switched off

In April 2026 Zendesk announced that several of its own free apps would stop working on 21 October 2026, including Print Ticket History and Attachment Manager. For printing, Zendesk points to the print option in the Agent Workspace, used together with its Incremental Exports API to build a PDF yourself. For anything more tailored, it suggests rebuilding the app in App Builder or upgrading the plan.

That leaves a small, common task without a simple tool. A customer, a manager or an auditor wants a readable copy of a conversation, with the custom fields and, sometimes, the internal notes. And in a ticket with dozens of replies, finding every file someone attached means scrolling through all of them.

What we built

A printable ticket and one list of files

The app has two parts. The PDF part builds a clean copy of the ticket: requester, assignee, organisation, group, brand, custom fields with their labels, tags and the full conversation. Internal notes are optional. The attachments part lists every file on the ticket with its size, sender and date, plus the total size, and a link to open or download each one.

No server

Zendesk hosts the app's files. We run no backend and no database, and there is no API token to set up.

Read-only, agent's own access

The app reads the ticket through Zendesk's app framework with the agent's own permissions. It can't change or delete anything, and it shows only what that agent could already see.

Every language

The PDF comes from the browser's own print function with a system font stack, so Japanese, Arabic, Russian and other scripts print correctly.

Small on purpose

The whole app is one page of about 14 KB with no runtime libraries. There is very little to break and very little to review.

Engineering

The hard parts, and how we solved them

  • Printing from a locked-down frame. Zendesk runs sidebar apps in a sandboxed frame that doesn't allow dialogs, so the app can't open the print dialog itself. It writes a self-contained, printable document into a new window and prints from there. If the browser blocks the pop-up, the sidebar says so and explains how to allow it.
  • Getting the whole ticket. Long tickets don't fit in one API call. The app follows Zendesk's cursor pagination for comments, 100 at a time with a hard cap on pages. It loads the ticket field definitions, so custom fields print their labels instead of raw values. Comment authors it doesn't know yet are fetched in batches of 100.
  • Safe HTML in a new page. Zendesk already cleans comment HTML, but the app writes it into a fresh document. So it strips scripts, frames, forms and event handlers again before printing, and escapes every other value it shows.
  • Private images. Pasted images are private files, and the print window often can't load them. Instead of a silent blank space, every image gets a visible caption with its file name, so the printout still says what was there.
  • No "download all" button. We built a zip download and tested it in a real Zendesk account. Zendesk keeps attachments private and doesn't let apps fetch the files, so it could not work. We removed it rather than ship a button that fails, and kept per-file links that open with the agent's own login, with a tip for opening several at once.
  • A blank panel on the first real install. Zendesk serves app files with a content type it guesses from their contents. Our separate script and style files arrived as generic binary data and never ran. Once they were inlined, raw control bytes in the code made Zendesk treat the page itself as binary, so the browser downloaded it instead of showing it. The build now puts the script and styles inside one HTML page, escapes every control and non-ASCII character, and fails if any remain.

Result

Where it is now

We tested the app end to end in a real Zendesk account on 28 September 2026. The saved PDF had all the ticket fields, custom-field labels, tags, a highlighted internal note, and Japanese, Arabic and Russian text. We submitted it to the Zendesk Marketplace on 29 September 2026.

During the review, Zendesk asked for the source code. We sent the reviewer the source repository with build steps, and a clean build from that source produces the same files as the package we submitted. Zendesk approved the app on 22 October 2026 with no changes requested, and it has been live on the Zendesk Marketplace since 23 October 2026. It is free to install.