Helpdesk migration
Field-level mapping, validation, and rollback between OTRS and Freshdesk. We move data and schema; workflows are rebuilt natively in Freshdesk.
OTRS
Source
Freshdesk
Destination
Compatibility
8 of 12
objects map 1:1 between OTRS and Freshdesk.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from OTRS to Freshdesk means translating a normalized relational schema spanning dozens of tables into Freshdesk's flatter REST API object model. OTRS stores Tickets with linked Articles, Dynamic Fields as entity-attribute-value rows, and Configuration Items in a separate CMDB with a CI-to-Ticket linking table. We extract from the MySQL or PostgreSQL backend directly to avoid OTRS SOAP API pagination constraints, enumerate every custom Dynamic Field during scoping, and map OTRS Queues to Freshdesk Groups. SLA definitions and escalation thresholds migrate as metadata tags on each Ticket. Freshdesk's per-minute API rate limits (200 on Growth, 400 on Pro, 700 on Enterprise) govern write speed, and we handle sub-limit ceilings per endpoint. Process Management workflows, SLA calendars, and OTRS reporting definitions do not migrate; we deliver a written inventory of these for the customer's admin to rebuild post-migration.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a OTRS object lands in Freshdesk, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
OTRS
Ticket
Freshdesk
Ticket
1:1OTRS Tickets map to Freshdesk Tickets with Title, Status, Priority, Type, and Owner preserved. We extract from the MySQL ticket table using ticket_id as the primary key and join to the article table for thread history. The OTRS ticket_state_id maps to Freshdesk status values (2 = open, 3 = pending, 4 = closed) with a custom field otrs_original_state__c holding the OTRS state name for audit. CreatedAt and UpdatedAt timestamps transfer to Freshdesk created_at and updated_at.
OTRS
Article
Freshdesk
Conversation (Reply, Note, Outbound Email)
1:manyOTRS Articles are the atomic communication unit attached to each Ticket: inbound emails, agent notes, and outbound emails each appear as separate article rows with a communication channel field (email-external, email-internal, phone, web). We extract all articles linked to each ticket_id and write them to Freshdesk as Conversations with type inferred from the OTRS article communication field. Inbound emails become Freshdesk notes (private) or replies (public); outbound emails become Freshdesk outbound_email conversations. The original sender address and content-type (plain text vs HTML) are preserved in custom conversation fields.
OTRS
Customer
Freshdesk
Contact
1:1OTRS CustomerUser records map to Freshdesk Contacts. The OTRS customer_id becomes the Freshdesk external_id for deduplication. Customer email, first name, last name, phone, and address fields map directly. If OTRS stores companies separately (customer companies), we map those to Freshdesk Companies and link the Contact to the Company via the company_id lookup. We flag duplicate emails at migration time and let the customer's Freshdesk admin decide whether to merge or keep separate Contact records.
OTRS
Dynamic Field (Ticket-level)
Freshdesk
Custom Field (Ticket)
lossyOTRS Dynamic Fields are stored as entity-attribute-value rows in separate dynamic_field tables joined to ticket_id. During scoping we enumerate all defined field names, types (Text, Date, Dropdown, Checkbox, Database, MultiSelect), and current values. We create matching Freshdesk Custom Fields at the Ticket level before migration. Dropdown Dynamic Fields map to Freshdesk Dropdown custom fields with the same option list; Checkbox maps to Checkbox; Date maps to Date Picker. Multi-select OTRS fields map to Freshdesk Multi-select. We validate that all OTRS field values fit within Freshdesk's character limits before writing.
OTRS
Dynamic Field (Customer-level)
Freshdesk
Custom Field (Contact)
lossyCustomer-facing Dynamic Fields (those with ObjectType = CustomerUser) map to Freshdesk Contact Custom Fields. We enumerate these separately from ticket-level Dynamic Fields during scoping because Freshdesk enforces separate field creation per object type. If the customer's OTRS instance uses customer company-level Dynamic Fields, those map to Freshdesk Company Custom Fields in the same pass.
OTRS
Queue
Freshdesk
Group
1:1OTRS Queues define ticket routing and agent access boundaries. We export queue names and their assignment rules (which groups and roles can access which queues) and map them to Freshdesk Groups. Each OTRS queue becomes a Freshdesk Group with the same name. If OTRS uses nested sub-queues (a queue under a parent queue), we flatten to Group names using a hyphen delimiter unless the customer's Freshdesk plan supports subgroup nesting. Agent-to-group membership is resolved by extracting the queue-user join table from the OTRS database.
OTRS
User / Agent
Freshdesk
Agent
1:1OTRS Users and Agents are stored in the users table with separate permission tables linking to roles, groups, and queues. We extract user records (first name, last name, email, valid until date) and resolve agent status by checking the user's membership in any OTRS group. We map active OTRS agents to Freshdesk Agents with the email address as the lookup key. If a Freshdesk agent account does not yet exist for a given OTRS user, we flag it in the reconciliation queue for the customer's Freshdesk admin to provision before record migration begins.
OTRS
Attachment
Freshdesk
Attachment
1:1Attachments in OTRS are stored as binary blobs in the article_attachment table linked to article IDs. We extract each blob with its original filename, MIME type, and content_size. During Freshdesk ingestion, each attachment re-attaches to the corresponding Conversation record using the Freshdesk Conversations API attachments endpoint. We preserve the original filename so agents can verify the attachment matches the source record. Maximum file size respects Freshdesk's 25 MB per attachment limit; we flag any oversized blobs during scoping.
OTRS
Configuration Item (CMDB)
Freshdesk
Product or Custom Object
1:1OTRS Configuration Items use a class-based CMDB schema (GenericIT, Computer, Network, Software) with key-value pairs stored per CI. We export the CI class, all defined attributes, and the CI-Ticket linking table (cmdb_change_id or similar join). If the customer's Freshdesk plan supports Custom Objects (Pro tier and above), we create a Custom Object matching the OTRS CI class and map CI attributes to Custom Object fields. On Growth and lower tiers without Custom Objects, CIs migrate as Freshdesk Products with a custom field ci_class__c and CI attributes stored in the product description or a JSON custom field.
OTRS
CI-to-Ticket Link
Freshdesk
Custom Field or Freshdesk Marketplace App
1:1OTRS stores CI-to-Ticket relationships in a linking table (link_relation or similar depending on OTRS version). We export this table and reconstruct the relationship in Freshdesk by writing the OTRS CI ID into a custom Ticket field (e.g., linked_configuration_item__c) on each affected ticket. If the customer uses the Freshdesk IT Service Management (Freshservice) product alongside Freshdesk, we can map CI-to-Ticket links to Freshservice CIs instead, which requires a separate object mapping pass and is scoped as an add-on engagement.
OTRS
SLA
Freshdesk
SLA Policy (Freshdesk Pro/Enterprise) or Custom Field
1:1OTRS SLA definitions link response and solution times to queues and ticket types. We export SLA names, first response time targets, and update time targets as metadata. On Freshdesk Growth (where SLA Policies are not available), we write these as ticket Custom Fields (sla_first_response_hours__c, sla_resolution_hours__c) so agents can see urgency context without a native SLA enforcement engine. On Pro and Enterprise, we configure Freshdesk SLA Policies with matching first-response and next-voice-response targets.
OTRS
Process Management (Workflows)
Freshdesk
Written Inventory (Not Migrated)
lossyOTRS Process Management stores workflow definitions as XML with activity nodes, transition rules, and conditional branching. These XML workflows cannot be translated to Freshdesk Automations programmatically because the underlying logic models are structurally different. We export the workflow structure and action types for each active process and deliver a written inventory specifying which Freshdesk Automation rule or Freshdesk Omni Flow corresponds to each OTRS process step. The customer's admin rebuilds the automation in Freshdesk using the inventory as a blueprint. This is explicitly out of scope for standard migration pricing.
| OTRS | Freshdesk | Compatibility | |
|---|---|---|---|
| Ticket | Ticket1:1 | Fully supported | |
| Article | Conversation (Reply, Note, Outbound Email)1:many | Fully supported | |
| Customer | Contact1:1 | Fully supported | |
| Dynamic Field (Ticket-level) | Custom Field (Ticket)lossy | Fully supported | |
| Dynamic Field (Customer-level) | Custom Field (Contact)lossy | Fully supported | |
| Queue | Group1:1 | Fully supported | |
| User / Agent | Agent1:1 | Fully supported | |
| Attachment | Attachment1:1 | Fully supported | |
| Configuration Item (CMDB) | Product or Custom Object1:1 | Fully supported | |
| CI-to-Ticket Link | Custom Field or Freshdesk Marketplace App1:1 | Fully supported | |
| SLA | SLA Policy (Freshdesk Pro/Enterprise) or Custom Field1:1 | Fully supported | |
| Process Management (Workflows) | Written Inventory (Not Migrated)lossy | Mapping required |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
OTRS gotchas
Community Edition security freeze forces migration
Direct database export preferred over SOAP API
Major version upgrades can leave login broken
Freshdesk gotchas
API access is blocked on the free plan
Per-minute rate limits are account-wide and endpoint-specific
Multi-channel source types do not map 1:1 to all destinations
Custom objects created in-product cannot be accessed by other apps
Contact import requires at least 10 existing tickets in the account
Pair-specific challenges
Migration approach
Discovery and database access
We audit the source OTRS instance by connecting read-only to the MySQL or PostgreSQL database and enumerating the active schema: ticket count, article count, Dynamic Field definitions (field name, type, object linkage), CustomerUser count, Configuration Item class list and CI count, Queue list, User/Agent count, and any active Process Management XML definitions. We also confirm the OTRS version to determine whether the security freeze applies. In parallel, we confirm the customer's Freshdesk plan tier and validate API access. The discovery output is a written Migration Scope Document with record counts per object, a list of all Dynamic Fields and their types, a CI class inventory, and the OTRS-to-Freshdesk field mapping table.
Demo migration and mapping validation
We run a Demo migration of a random subset of 50-100 tickets (including their articles, attachments, Dynamic Field values, and linked customers) into the customer's Freshdesk instance to validate the mapping before committing to full cutover. The customer reviews the migrated sample tickets, checks that Dynamic Field values landed correctly, confirms the conversation thread structure matches the OTRS article history, and verifies that linked contacts appear in Freshdesk. We correct any mapping errors identified during the demo and re-run the demo pass until the customer approves before scheduling the full migration.
Schema creation in Freshdesk
Before any data migration, we create the destination schema in Freshdesk: Custom Fields on Ticket (matching each OTRS Dynamic Field with the correct type and option list), Custom Fields on Contact (for any customer-facing Dynamic Fields), Custom Fields on Company (for customer-company-level fields), Freshdesk Groups (matching OTRS Queue names), SLA Policies (on Pro and Enterprise tiers), and Custom Objects or Product records for OTRS Configuration Items. We coordinate with the customer's Freshdesk admin to apply the correct field visibility and mandatory settings. Schema is validated in a Freshdesk test environment before production writes begin.
Data extraction from OTRS
We extract from the OTRS database in dependency order: Customers first (CustomerUser records), then Contacts into Freshdesk (with external_id set to the OTRS customer_id for deduplication), then Tickets (extracting the full ticket record including Dynamic Field values via the dynamic_field_value join), then Articles (extracted per ticket_id in article_id order to preserve thread chronology), then Attachments (extracted per article_id with blob data), then Configuration Items (extracted by CI class with attributes flattened to key-value pairs). We use database transactions with consistent snapshots to avoid partial reads if the database is active during extraction. CI-to-Ticket links are extracted from the linking table as a separate lookup pass.
Data ingestion into Freshdesk with rate-limit management
We ingest into Freshdesk via the REST API v2 using Basic Auth. Tickets are written first, then Conversations (extracted from OTRS articles and written as Freshdesk reply, note, or outbound_email based on the original article communication field), then Contacts, then Companies, then Agents, then Attachments (re-attached to the corresponding Conversation record). We manage Freshdesk's per-minute rate limits by plan tier using exponential backoff on 429 responses, batch writes to the Tickets List endpoint's sub-limit ceiling, and sequential page reads rather than concurrent API calls. SLA values write as custom fields on Growth or as SLA Policies on Pro and Enterprise. CI-to-Ticket links write as a custom field update pass after all tickets are created.
Cutover, final validation, and workflow handoff
We freeze OTRS write access during cutover, run a final delta migration of any tickets or customer records modified during the migration window, then enable Freshdesk as the system of record. We deliver a Migration Summary Report with record counts per object, a list of any records that failed validation with error reasons, and the count of CI-to-Ticket links written. We deliver the Process Management Workflow Inventory document to the customer's admin team for Freshdesk Automation rebuild. We do not rebuild OTRS workflows as Freshdesk automations inside the migration scope; that is a separate engagement. We offer a one-week hypercare window for reconciliation issues raised during the first five business days of Freshdesk production use.
Platform deep dives
OTRS
Source
Strengths
Weaknesses
Freshdesk
Destination
Strengths
Weaknesses
Complexity grading
Standard Helpdesk migration. All 7 core objects map 1:1 between OTRS and Freshdesk.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across OTRS and Freshdesk.
Object compatibility
All 7 core objects map 1:1 between OTRS and Freshdesk.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
7-object category — typical timelines run 2–7 days end-to-end.
API constraints
OTRS: Not publicly documented; no published rate limit values.
Data volume sensitivity
OTRS doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during OTRS to Freshdesk migration scoping. Not seeing yours? Book a call.
Walk through your OTRS to Freshdesk migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave OTRS
Other ways to arrive at Freshdesk
Same-Helpdesk migrations
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.