Helpdesk migration

Migrate from OTRS to Freshdesk

Field-level mapping, validation, and rollback between OTRS and Freshdesk. We move data and schema; workflows are rebuilt natively in Freshdesk.

OTRS logo

OTRS

Source

Freshdesk

Destination

Freshdesk logo

Compatibility

67%

8 of 12

objects map 1:1 between OTRS and Freshdesk.

Complexity

BStandard

Timeline

2-4 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

OTRS logo

OTRS

What's pushing teams away

  • Annual licensing and support contract costs scale steeply, prompting teams to evaluate lower-cost SaaS alternatives with similar capabilities.
  • The 300-page admin manual and $2,000+ per-person training requirement means teams cannot self-onboard, creating friction for smaller organizations.
  • Performance degrades noticeably on large ticket volumes without tuning, and slow loading pages frustrate agents handling high-throughput queues.
  • The Community Edition received no security patches after OTRS 6, forcing organizations onto paid tiers or unsupported forks to maintain compliance posture.

Choosing

Freshdesk logo

Freshdesk

What's pulling them in

  • Free tier for 1-2 agents with no credit card makes initial evaluation risk-free and appeals to startups and small support teams.
  • Per-agent pricing is predictable and scales cleanly as teams grow from Growth at $15/agent/month to Enterprise at $89/agent/month.
  • Freddy AI Copilot and Email AI Agent bring AI assistance without forcing a full platform switch, appealing to teams already embedded in Freshdesk.
  • Multilingual help desk and customer portal features serve global SMB teams without requiring enterprise-level investment.
  • Collaborators up to 5,000 included in paid plans allow non-agent stakeholders to view tickets without additional licensing cost.

Object mapping

How OTRS objects map to Freshdesk

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

maps to

Freshdesk

Ticket

1:1
Fully supported

OTRS 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

maps to

Freshdesk

Conversation (Reply, Note, Outbound Email)

1:many
Fully supported

OTRS 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

maps to

Freshdesk

Contact

1:1
Fully supported

OTRS 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)

maps to

Freshdesk

Custom Field (Ticket)

lossy
Fully supported

OTRS 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)

maps to

Freshdesk

Custom Field (Contact)

lossy
Fully supported

Customer-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

maps to

Freshdesk

Group

1:1
Fully supported

OTRS 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

maps to

Freshdesk

Agent

1:1
Fully supported

OTRS 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

maps to

Freshdesk

Attachment

1:1
Fully supported

Attachments 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)

maps to

Freshdesk

Product or Custom Object

1:1
Fully supported

OTRS 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

maps to

Freshdesk

Custom Field or Freshdesk Marketplace App

1:1
Fully supported

OTRS 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

maps to

Freshdesk

SLA Policy (Freshdesk Pro/Enterprise) or Custom Field

1:1
Fully supported

OTRS 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)

maps to

Freshdesk

Written Inventory (Not Migrated)

lossy
Mapping required

OTRS 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.

Gotchas + challenges

What specifically takes care here

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 logo

OTRS gotchas

High

Community Edition security freeze forces migration

Medium

Direct database export preferred over SOAP API

Medium

Major version upgrades can leave login broken

Freshdesk logo

Freshdesk gotchas

High

API access is blocked on the free plan

High

Per-minute rate limits are account-wide and endpoint-specific

Medium

Multi-channel source types do not map 1:1 to all destinations

Medium

Custom objects created in-product cannot be accessed by other apps

Low

Contact import requires at least 10 existing tickets in the account

Pair-specific challenges

  • Freshdesk API rate limits are tiered with per-endpoint sub-limits

    Freshdesk enforces per-minute API rate limits that scale with plan (Growth 200/min, Pro 400/min, Enterprise 700/min) and applies sub-limits per endpoint that are stricter than the account total. The Tickets List endpoint is capped at 20 calls/min on Growth, meaning at 100 records per page you are moving roughly 2,000 ticket stubs per minute before touching conversations or contacts. We batch writes into chunked API calls with exponential backoff on 429 responses, but migrations on Growth and Pro tiers run significantly slower than on Enterprise. We flag the customer's plan tier at discovery and adjust timeline estimates accordingly.

  • OTRS Community Edition security freeze requires urgent migration scoping

    OTRS stopped releasing security patches for Community Edition after version 6, leaving organizations on versions 6 through 8 with active CVE exposure and no patch path short of purchasing the Business Solution. We flag any OTRS instance below version 9 as an urgent discovery item and recommend prioritizing data export before any other planning step. We validate agent login immediately after any OTRS version upgrade before proceeding with data export because major version upgrades in OTRS can invalidate session tokens and hashed passwords.

  • OTRS Dynamic Fields require field-by-field enumeration before migration

    Dynamic Fields in OTRS are stored as entity-attribute-value rows across separate dynamic_field tables. Unlike standard ticket fields, there is no single export that captures all Dynamic Fields and their current values without joining across multiple tables and enumerating field definitions separately from field values. We scope this by querying the dynamic_field_definitions table to list all defined fields and their types, then query the dynamic_field_value table joined to ticket_id to extract actual values. Skipping this enumeration step means custom ticket properties silently disappear during migration.

  • OTRS direct database export requires DBA coordination

    The OTRS Generic Interface SOAP API does not expose a clean bulk export endpoint for tickets, articles, customers, and Dynamic Fields simultaneously. Pagination is not publicly documented and bulk exports via the API require looping across ticket ranges, which is unreliable for large instances. We default to direct MySQL or PostgreSQL reads to get complete, consistent dataset snapshots. This requires read-only database access coordinated with the customer's DBA during a maintenance window. The GitHub otrs-freshdesk-migration script explicitly warns not to run against a production database; we follow that guidance and require a database copy for staging.

  • Freshdesk Sprout and Free plans have no API access

    Freshdesk's Sprout (free) plan and the Free tier explicitly disable API access, which means the migration cannot write to Freshdesk on those tiers. The customer must upgrade to at least Blossom (now Growth) before we can begin API-driven data ingestion. We confirm the customer's Freshdesk plan tier during discovery and factor any plan upgrade into the project timeline and pricing. This is a common oversight when teams create a Freshdesk trial account during evaluation.

Migration approach

Six steps for a successful OTRS to Freshdesk data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

Context on both ends of the pair

OTRS logo

OTRS

Source

Strengths

  • Per-ticket Dynamic Fields allow unlimited custom properties without code changes.
  • Multi-channel inbound (email, portal, chat, phone) unified into a single ticket thread.
  • Role-based access control with granular queue, group, and permission scoping.
  • Built-in asset management (CMDB) with ticket-to-CI relationship tracking.
  • Process Management supports multi-step ITSM workflows with conditional branching.

Weaknesses

  • Community Edition receives no security updates, creating compliance risk on unsupported versions.
  • Database is normalized across many tables, making direct exports complex without schema knowledge.
  • No publicly documented API rate limits; direct database access is the reliable bulk export path.
  • Complex permission model (roles, groups, queues, users) is difficult to replicate exactly in simpler SaaS tools.
  • Self-hosted deployment requires dedicated server administration and Perl runtime maintenance.
Freshdesk logo

Freshdesk

Destination

Strengths

  • Generous free tier with no credit card required for 1-2 agents for 6 months.
  • Per-agent pricing model is transparent and scales linearly with team growth.
  • Freddy AI Copilot integrates assistance directly into the agent workspace without requiring separate tooling.
  • Multilingual help desk and customer portal serve global teams on Pro and Enterprise plans.
  • Shared inbox, threads, and tasks keep ticket context unified across multi-channel conversations.

Weaknesses

  • Freddy AI is a separate paid add-on charged per session, making AI costs unpredictable and hard to budget.
  • Performance issues including delayed loading and duplicate tickets are recurring user complaints during high-volume periods.
  • Customization is more limited than Zendesk, with fewer workflow options and reporting flexibility.
  • Add-ons for chat, advanced routing, and custom reporting are gated behind higher tiers or separate module purchases.
  • API access is completely disabled on the free plan, blocking any programmatic data export or migration tooling.

Complexity grading

How hard is this migration?

Standard Helpdesk migration. All 7 core objects map 1:1 between OTRS and Freshdesk.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across OTRS and Freshdesk.

  • Object compatibility

    A

    All 7 core objects map 1:1 between OTRS and Freshdesk.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    7-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    OTRS: Not publicly documented; no published rate limit values.

  • Data volume sensitivity

    B

    OTRS doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your OTRS to Freshdesk migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about OTRS to Freshdesk data migrations

Answers to the questions buyers ask most during OTRS to Freshdesk migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your OTRS to Freshdesk migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Most migrations land between two and four weeks for accounts under 10,000 tickets with fewer than 20 Dynamic Fields and no CMDB. Migrations with large CMDB inventories (500+ Configuration Items), complex multi-queue routing structures, or instances where OTRS Dynamic Fields are used extensively across both ticket and customer objects move to six to ten weeks because of field enumeration scope, CI-to-Ticket resolution, and parent-record lookup ordering. The Demo migration pass typically takes two to three days and runs before the full cutover is scheduled.

Adjacent paths

Related migrations to explore

Ready when you are

Move from OTRS.
Land in Freshdesk, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day