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:

  1. Collects all archived messages from the ticket

  2. Gathers user information (username, avatar, roles)

  3. Snapshots channel references

  4. Generates a unique transcript ID (21-character random string)

  5. Stores everything in the database

Manual

Staff or the ticket creator can generate a transcript at any time using:

/transcript

This 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:

Field
Description

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, and ArchivedChannel tables.


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

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:

Data
Encrypted

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

Plan
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 roleSpecificTranscriptViewing is 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 archive setting to be enabled

  • File 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