Import / Export
Bulk import tickets from CSV or JSON files, or export your project's tickets as CSV.
Access: Team Lead role or higher. Found in Settings → Import / Export.
Migrating from another help desk
Use this sequence when moving from Zendesk, Freshdesk, Help Scout, or another ticket system. Fesk's file importer creates tickets from CSV or JSON; it does not connect to the old service or restore a complete conversation archive.
1. Prepare an export
Keep an untouched copy of the source export and its attachments. Prepare one row per ticket in a UTF-8 CSV file, or one object per ticket in a JSON array. For a nested API export, extract the ticket fields into that flat structure first.
| Source | Fields to prepare for Fesk | |---|---| | Zendesk | Ticket ID → External ID; subject → Title; chosen ticket text → Description | | Freshdesk | Ticket ID → External ID; subject → Title; chosen ticket text → Description | | Help Scout | Conversation ID → External ID; subject → Title; chosen conversation text → Description |
These are mapping examples, not required source column names. Map the actual columns in your file after upload. Prefix external IDs when combining sources, for example zendesk-123 and freshdesk-123, so unrelated tickets do not look like duplicates.
2. Prepare the destination
Create the destination workspace's statuses and ticket types, and add the agents who should own imported tickets. Map old statuses to the destination's configured labels or slugs and priorities to low, medium, high, or critical. Assignee emails must belong to active project members. Importing a file does not create or invite users; a reporter email only resolves an existing project member, otherwise the importing user is recorded as creator.
3. Trial, verify, then import
Upload a small representative sample, map its columns, and inspect validation errors before executing. Check descriptions, dates, assignments, status and External ID on the created tickets. Save a mapping preset for the remaining files. Files are limited to 5 MB and 10,000 rows; split larger exports, keep external IDs stable, and enable Skip duplicates when rerunning an import. This skips existing tickets rather than updating them.
There is no fixed migration duration. Time a representative sample and scale its processing time to your row count, allowing extra time for export preparation, validation and reconciliation. Up to 500 rows execute synchronously; larger imports queue for background processing. Check Import History for completion before continuing with the next file. Keep the source system available until counts and sample tickets match your expectations, then arrange the inbox cutover separately.
4. Know what is preserved
The file import supports ticket fields, description text, original creation dates and external IDs. It does not import individual replies, internal notes, attachments, audit history, source ticket numbers, user accounts or passwords. Fesk assigns its own ticket numbers. Keep the original archive for conversation history and attachment files; any links placed in a description still require access to their original destination.
For a bad trial or completed batch, use Import History → Roll back. Rollback soft-deletes the tickets created by that import, including tickets edited afterwards; those edits are not preserved as separate tickets. It does not change the source system. Review a trial before allowing the team to work on its imported tickets.
Importing Tickets
Preparing Your File
Fesk accepts CSV and JSON files up to 5 MB and 10,000 rows.
CSV Format
A standard comma-separated file with a header row:
Title,Status,Priority,Assignee,External ID
Fix login bug,open,high,alice@company.com,JIRA-1234
Add dark mode,in_progress,medium,bob@company.com,JIRA-1235
Update docs,open,low,
Rules:
- First row must be column headers
- Title is the only required field, everything else is optional
- Quoted fields supported:
"Value with, commas"or multiline"Line 1\nLine 2" - Encoding: UTF-8 recommended. UTF-16 and ISO-8859-1 are auto-detected.
- Delimiter: Comma, semicolon, or tab, detected automatically from the first 5 rows
JSON Format
An array of objects where each object is one ticket:
[
{
"title": "Fix login bug",
"status": "open",
"priority": "high",
"assignee_email": "alice@company.com",
"external_id": "JIRA-1234"
},
{
"title": "Add dark mode",
"status": "in_progress",
"priority": "medium"
}
]
Rules:
- Must be a JSON array of objects (not a single object or nested structure)
- Field names become the column headers for mapping
Supported Fields
After upload, you map each source column to a Fesk ticket field:
| Target Field | Accepted Values | Default if Unmapped |
|---|---|---|
| Title (required) | Any text | - |
| Description | Ticket description text | Empty |
| Status | Workflow status slug or label (e.g. open, In Progress) | Project's default status |
| Priority | low, medium, high, critical | medium |
| Ticket Type | Ticket type name (e.g. Bug, Feature Request) | Project's default type |
| Assignee (email) | Active project member's email | Unassigned |
| Reporter (email) | Any email | Importing user |
| Created Date | ISO-8601, US (MM/DD/YYYY), or EU (DD/MM/YYYY) | Now |
| External ID | Any text (e.g. Jira key PROJ-123) | Empty |
| Source Type | manual, email, api, webhook | manual |
| Labels | Comma-separated text | Empty |
| Due Date | Any supported date format | Empty |
| Skip | - | Column ignored |
Status and Ticket Type must match values configured in your project (Settings → Workflow Statuses / Ticket Types). If a value doesn't match, you'll see an error with a suggestion: "Status 'In Review' not found, did you mean 'In Progress'?"
Assignee must be an active user who is a member of the project. Deactivated or non-member emails produce row errors.
Import Workflow
- Upload: Drag-and-drop or browse for your file. Fesk detects format, encoding, and delimiter automatically.
- Map Columns: Each source column is paired with a Fesk field via a dropdown. Auto-suggestions appear based on common header names (e.g. "Summary" → Title). Columns you don't need → set to "Skip."
- Preview & Import: Review the first 10 rows. Validation runs on all rows. Choose options:
- Skip invalid rows: rows with errors are skipped instead of blocking the import
- Skip duplicates: rows whose External ID already exists in the project are skipped (prevents duplicates on re-import)
- Execute, Files ≤500 rows import instantly. Larger files queue in the background, check Import History for status.
Mapping Presets
If you import regularly from the same source (e.g. a weekly Jira export), save your column mapping as a preset. Next time, select it from "Load preset" to skip manual mapping.
Rolling Back an Import
Made a mistake? Go to Import History and click Roll back on any completed import. This soft-deletes all tickets created by that import. Tickets modified after import are still rolled back but flagged in the confirmation.
Common Issues
| Problem | Solution | |---|---| | "Status 'In Review' not found" | That status doesn't exist in this project. Check Settings → Workflow Statuses for valid values. | | "No active project member with email" | The email isn't a member of this project, or the user is deactivated. | | Row count exceeds 10,000 | Split your file into smaller parts. | | File larger than 5 MB | Remove unnecessary columns or split the file. | | "An import is already in progress" | Only one import runs per project at a time. Wait for the current one to finish. |
Exporting Tickets
Download your project's tickets as a CSV file.
Columns
Select which fields to include in the export. Defaults: Ticket Number, Title, Status, Priority, Assignee, Created Date. Additional options: Description, External ID, Labels, Updated Date, Reporter.
Filters
Narrow the export to specific tickets. All filters are optional: leave them empty to export all non-deleted tickets in the project.
| Filter | What to Enter | Examples |
|---|---|---|
| Status | A workflow status slug or label from your project | open, closed, in_progress |
| Priority | One of: low, medium, high, critical | high |
| Created after | Only include tickets created on or after this date | Use the date picker |
Tips
- Soft-deleted tickets are excluded automatically
- The file is UTF-8 encoded and named
tickets-export-YYYY-MM-DD.csv - To re-import an export into another project, use the Import tab with the exported CSV
- Large exports (thousands of tickets) stream efficiently, no timeout risk