Transcripts
Transcripts are permanent records of ticket conversations. They preserve all messages, users, and metadata from a ticket after it has been closed.
How Transcripts Are Generated
Transcripts can be generated in two ways:
Automatic (On Close)
When a ticket is closed and archive is enabled (the default), Ticketo automatically:
Collects all archived messages from the ticket
Gathers user information (username, avatar, roles)
Snapshots channel references
Generates a unique transcript ID (21-character random string)
Stores everything in the database
Manual
Staff or the ticket creator can generate a transcript at any time using:
/transcriptThis generates a downloadable transcript file and provides a link to view it online.
Transcript Format
Transcripts are stored as JSON snapshots in the database containing:
Messages — All messages with content, author, timestamps, and edit/delete status
Users — Participant information including username, display name, avatar, role, and role color
Channels — Channel name references mentioned in messages
Metadata — Ticket ID, guild info, total message count, theme color, footer text
When viewed through the web portal, transcripts are rendered into a readable HTML format using a Mustache template.
Where Transcripts Are Stored
Transcripts are stored in the Transcript database table (PostgreSQL). This includes:
id
21-character random unique ID
ticketId
Associated ticket channel/thread ID
guildId
Server ID
guildName
Server name at time of creation
channelName
Ticket channel name
messages
Serialized JSON array of all messages
users
Serialized JSON map of participant data
channels
Serialized JSON map of channel references
totalMessages
Message count
primaryColour
Theme color for rendering
footer
Footer text for rendering
Note: The Transcript model is currently available only for PostgreSQL databases. Other database providers store archived data in the
ArchivedMessage,ArchivedUser,ArchivedRole, andArchivedChanneltables.
Accessing Transcripts
Web Viewer
Transcripts are accessible via a web URL:
This page renders the transcript with:
Participant avatars and names
Message content with timestamps
Role colors
Edited/deleted message indicators
DM Link
When a ticket is closed, the creator receives a DM containing:
Ticket summary (number, dates, close reason, feedback)
A link to the transcript (if archiving is enabled)
API Access
Transcripts can be fetched programmatically:
This is a public endpoint — no authentication is required. Access is controlled by the obscurity of the 21-character random transcript ID.
Data Encryption
All transcript-related data is encrypted at rest using AES encryption:
Message content
Yes
Usernames
Yes
Display names
Yes
Ticket topics
Yes
Close reasons
Yes
Feedback comments
Yes
Avatars / message IDs
No
Encryption uses the ENCRYPTION_KEY environment variable (48+ character hex string). Decryption happens on-demand in worker threads when transcripts are accessed.
Important: If you lose your encryption key, all encrypted transcript data becomes unrecoverable.
Transcript Retention
Free
30 days
Premium
Lifetime
After the retention period, transcript data may be automatically pruned.
Archived Data Tables
Behind the scenes, ticket data is archived across several database tables when a ticket is active:
ArchivedMessage
Stores each message posted in the ticket:
Author ID
Encrypted content (includes text, embeds, attachments)
Created timestamp
Deleted/edited flags
Whether the message is from outside the ticket
ArchivedUser
Snapshots each participant:
User ID, username, display name, avatar
Bot flag
Role assignment at time of closure
Discriminator (legacy #0000 tag)
ArchivedRole
Snapshots Discord roles referenced in the ticket:
Role ID, name, color
ArchivedChannel
Snapshots Discord channels referenced in messages:
Channel ID, name
Privacy Considerations
Transcript IDs are random 21-character strings — not sequential or guessable
Transcripts are accessible via a public API endpoint without authentication
Access is controlled through the obscurity of the ID (shared via DM to the ticket creator)
If
roleSpecificTranscriptViewingis enabled, additional role-based access restrictions may apply (Needs verification — enforcement details not fully confirmed)Server admins can view all transcripts via the dashboard
For maximum privacy, ensure that transcript links are only shared with intended recipients.
Limitations
Transcript generation requires the
archivesetting to be enabledFile attachments and images are referenced by URL — if the original Discord CDN link expires, media may not display
Very large tickets (thousands of messages) may take longer to render
The web viewer requires JavaScript to render properly
Last updated