Section 01
Why teams migrate to Jira
The four shapes a Jira migration takes, and what makes the platform easier — or harder — than the category average.
Jira is a software product developed by Atlassian for bug tracking, issue tracking and agile project management 1. Atlassian is headquartered in Sydney and San Francisco, with Jira available in three product lines on a single underlying engine: Jira Software (engineering and agile), Jira Service Management (ITSM and service desk) and Jira Work Management (business teams).
The typical Jira customer is a software-led organisation — anywhere from a 20-person startup to a 20,000-engineer enterprise — that wants configurable workflows, JQL-based reporting and a deep Marketplace ecosystem rather than the simpler, more opinionated trackers further down the category. Compared with monday.com or Asana, Jira positions on workflow depth and developer-tool integrations; compared with Azure DevOps it positions on platform neutrality and the strength of its app ecosystem.
The shapes of migration that actually land on Jira tend to fall into four patterns. First, PM consolidation: a company replacing Trello, Asana or ClickUp with Jira to standardise engineering and cross-functional work on one tracker. Second, DC-to-Cloud moves, where existing Jira Data Center customers migrate to Atlassian Cloud ahead of Data Center end-of-life on 28 March 2029 37.
Third, legacy issue-tracker replacements — Redmine, Trac, Bugzilla, MantisBT, or homegrown databases — where the source schema is loose and the project is really a re-architecture. Fourth, M&A integration, where an acquired business runs on a different tracker and the parent standardises on Jira. An Asana-to-Jira move usually has clean Project-to-Project parity but maps poorly across custom workflows; a Server-to-Cloud move retains schema but reshapes user identifiers and audit history.
What makes migrating *to* Jira easier than the category average is the official tooling — the Jira Cloud Migration Assistant (JCMA) for Data Center sources and a native CSV importer for everything else 232. JCMA also generates a Post-Migration Reconciliation (PTR) Excel report that counts projects, issues, comments, attachments and boards source-vs-destination 122.
What makes it harder than the average is the scheme model — Workflow Schemes, Field Configuration Schemes, Screen Schemes, Issue Type Schemes, Permission Schemes and Notification Schemes all map per-project per-issue-type 25. Imports silently land issues against the wrong scheme set if the destination project's schemes are not pre-configured. Add the system-property override block — created, updated and creator cannot be overwritten on Cloud during standard CSV import — and the migration rewards careful pre-creation.
Workflows do not import via CSV — they are built in Settings → Issues → Workflows and applied through a Workflow Scheme before the first issue lands. Custom fields do not exist until created with the right type and context. Teams that scope for that work up front finish on time; teams that assume parity do not.
Workflows do not import. Custom fields do not exist until they are created. Teams that assume parity discover this on day two.
Section 02
The Jira data model you need to map into
Projects, Issue Types, schemes and Custom Field contexts — the destination schema decoded, with the upsert keys you'll wire on every load.
Jira's data model is hierarchical: a Site contains Projects, each Project has Issue Types, each Issue Type is governed by a Workflow Scheme that defines its Statuses and Transitions. Issues belong to a Project, carry an Issue Key (PROJ-123), and are linked to other issues via Issue Links. Above the issue level, Epics group Stories/Tasks/Bugs, and Sub-tasks live one level below their parent.
Before you map a single field on the source side, you need to know which Project, which Issue Type, and which Workflow Scheme each row will land against. The table below summarises the objects you will touch in a Jira Software / Service Management / Work Management migration.
| Object | Stores | Required on import | Tier |
|---|---|---|---|
| Projects | Top-level container — Software, Service Management, Work Management, Product Discovery | Name, Key (uppercase 2–10 chars), Lead, Project Type | All editions |
| Issues | Work items — Story, Task, Bug, Epic, Sub-task and custom types | Project, Issue Type, Summary, Reporter | All editions |
| Sub-tasks | Child issues belonging to a parent | Parent issue, Project, Issue Type, Summary | All editions; requires Sub-task enabled on Issue Type Scheme |
| Epics | Story/Task aggregator — Jira Software hierarchy level 1 | Project, Epic Name, Summary | Jira Software; Premium adds higher levels (Initiative) |
| Components | Project-scoped categorisation of issues | Name, Project | All editions |
| Versions / Fix Versions | Release containers — affected and fix-version dimensions | Name, Project; optional Start/Release dates | All editions |
| Sprints | Time-boxed work containers on Scrum boards | Name, Board, Start date, End date | Jira Software |
| Boards | Scrum and Kanban work views backed by a Filter | Type (Scrum/Kanban), filter JQL | Jira Software |
| Workflows + Statuses | State machines that govern Issue Type transitions | Name, Statuses, Transitions; applied via Workflow Scheme | All editions |
| Custom Fields | User-defined fields scoped via Field Contexts | Name, Type, Context (Project + Issue Type set) | All editions; context model controls scope [48] |
| Assets / CMDB objects | Configuration items linked to issues via the Assets custom field | Object Schema, Object Type, Attributes | Jira Service Management Premium/Enterprise; 10M-object ceiling [24] |
Issues use the Issue Key (e.g. PROJ-123) as their canonical identifier, but Jira also exposes a numeric Issue ID internally. For CSV updates of existing issues, the External System Import tool requires you to include the Issue Key in a column mapped to Issue Key so the importer upserts rather than creates 121.
For first-time imports the upsert key you control is the legacy source ID — stamp it on each issue as a custom External ID or Legacy ID single-line text field. Build it on day one, populate from the source export, and use it for every subsequent delta.
Custom field types in Jira are based on a small set of primitive data types — string, number, user, group, datetime, option, option-with-children — each with documented JQL behaviour 43. The catalogue below summarises the field-type estate you will model.
| Field type | Limits | Notes |
|---|---|---|
| Short text (single line) | 255 chars | XML export bug truncates near 255-char strings with special chars 87 |
| Paragraph (multi-line text) | 32,767 chars | Atlassian Document Format (ADF) on Cloud; Wiki Markup on DC |
| Number | IEEE 754 double-precision 64-bit float | Single-select options are not summed; rebuild as Number field 44 |
| Date picker | yyyy-MM-dd via import | Format must match the Date format option chosen at import 83 |
| Date Time picker | ISO-8601 | Imports default to dd/MMM/yy h:mm a; configurable |
| Select List (single choice) | Up to thousands of options per context | Option must exist in the field context for the project 84 |
| Checkboxes / multi-select | Multi-value via repeated column header | Component, Fix Version, Labels accept multiple cols of same header 38 |
| User picker | Cloud uses Atlassian Account IDs; DC uses usernames | Cross-environment migrations break user references 113 |
| Assets / CMDB object | Up to 10M objects per schema | Raised from 3M on 1 Nov 2025; requires JSM Premium 24 |
Relationships in Jira are expressed three ways. First, issue hierarchy: Sub-task → parent issue → Epic → higher-level (Premium) — these are *first-class* parent/child relationships scoped to a Project. Second, Issue Links — configurable link types like blocks, is blocked by, relates to, duplicates, clones, used for cross-project dependencies and for non-hierarchical relationships 54.
Third, Components, Fix Versions and Labels act as project-scoped tag dimensions, queryable via JQL. There is no native master-detail cascade-delete between Epics and Stories: deleting an Epic does not delete its Stories, which is a behaviour you may need to reproduce with an Automation rule if your source platform relied on it.
Custom Field contexts are the single most-misunderstood part of the Jira schema. A custom field with one name can have *multiple* contexts, each scoped to a different (Project, Issue Type) combination, each with its own option list and default value 48. A row imported into the wrong project context will appear to drop its value even though the field name matches.
Section 03
Pre-migration prep — the work before you touch Jira
What must be true on the source, the destination and across the team before the first row hits the importer or JCMA.
The single best predictor of a clean Jira migration is how much work you do on the source side before the first import button is pressed. Atlassian's own JCMA documentation pre-flights your data for over a dozen error classes and still warns that scheduled background jobs, large attachment estates and inactive users derail otherwise-healthy migrations 7779.
The single best predictor of a clean Jira migration is how much work you do before you press *Begin migration* in JCMA.
Treat the source export as raw material that needs to be shaped to Jira's expected formats — dates rewritten to the chosen ISO format, users resolved to Atlassian Account IDs (Cloud) or usernames (Data Center), Issue Type and Status values mapped to the destination's existing names, and option-list values pre-created on the right Field Context.
Source-side prep
- Audit and clean the source database before export. Atlassian's *Clean up your instance before migration* guide recommends deleting unused projects, schemes, custom fields and workflows so you migrate less rather than more 7980.
- Convert dates to the format you intend to declare on the importer's Date time format options step — Jira rejects rows with
fields.validation.date.formatwhen the file format does not match the declared format 83. - Convert option lists so every value in single-select and multi-select columns exists as an option on the destination field's context — Jira returns *custom field require options that do exist* on any mismatch 84.
- Stamp a stable external ID on every record in the source export — the source platform's primary key — so re-runs and reconciliation are deterministic.
- Decide what is in scope for historical comments, attachments and change history. CSV import preserves comments via the
01/01/2012 10:10;Admin; This comment workspattern and attachments via HTTP/HTTPS URLs in an Attachment column 38. - Save the file as UTF-8 with BOM if you have non-ASCII characters — Jira warns when the file contains non-ASCII and the wrong encoding silently mojibakes German umlauts, French accents, CJK characters 8291.
Destination-side prep
- Create a sandbox on Jira Cloud Premium/Enterprise (or a development DC instance) and run the full migration end-to-end before touching production. Atlassian explicitly recommends a sandbox dry-run before any JCMA cutover124.
- Provision users first through Okta, Microsoft Entra ID or another identity provider, *then* run the import — owner/reporter/assignee assignment fails silently if the referenced user does not exist or has no Jira product access 113.
- Pre-create every Custom Field with its Context on the right Project + Issue Type pair. Once a field is created, its type cannot be changed — you create a new field with the right type and migrate values across.
- Build Workflows, Workflow Schemes, Issue Type Schemes, Field Configuration Schemes, Screen Schemes, Permission Schemes and Notification Schemes before importing any issues — issues land against the wrong scheme set if the destination project is not pre-configured.
- Define Components and Fix Versions per Project before importing issues that reference them; the CSV importer accepts multiple column headers with the same name to import multi-value Component and Fix Version assignments 38.
People prep
Cutover only works if humans cooperate. Lock down a source-system freeze window — typically 24 to 72 hours — and communicate it widely. Stop all non-crucial scheduled jobs on the source Jira (re-indexing, archive, Tempo accruals); Atlassian flags scheduled jobs as a leading cause of degraded migration performance 77. A small Jira-to-Jira move runs one to two business days; a Server-to-Cloud migration with 2,000+ users and ScriptRunner-heavy customisations runs four to twelve weeks even when JCMA completes overnight 14.
Section 04
Import mechanisms: JCMA, CSV importer, and Marketplace tools
Multiple paths in, each with different limits and shapes. Picking the wrong one is how mid-migrations stall at scale.
Jira exposes several load paths and the right one depends on the source platform, dataset size, and whether the migration is Jira-to-Jira or third-party-to-Jira. The Jira Cloud Migration Assistant (JCMA) is the official path for Data Center → Cloud. The CSV importer covers most one-shot loads from third-party trackers. Marketplace and ETL tools sit on top of all of these.
Jira Cloud Migration Assistant (JCMA)
JCMA is the Atlassian-built, free app installed on Jira Data Center that migrates Projects, Issues, Workflows, Schemes, Users, Boards and Filters to Jira Cloud 36. It runs as a wizard: pre-migration checks → choose projects → select users and apps → assess → run. Atlassian's published best practice is to move groups of projects in business-impact-ordered waves rather than one big-bang cutover 124.
JCMA generates a Post-migration Reconciliation (PTR) report as an Excel file that compares source-vs-destination entity counts for projects, issues, comments, attachments, boards, filters and configurations, so you can validate before users get access 122. JCMA requires JCMA 1.12.45 or later for the PTR report.
CSV importer (External System Import)
Jira ships a native CSV importer at Settings (gear) → System → External System Import → CSV in both Cloud and Data Center 3233. A newer Jira import experience moves data from Asana, Notion and other business-tool sources directly into Jira business and software spaces. The recommended number of work items per file is 1,500, with estimated time around an hour 32.
The importer accepts CSV (and XLS/XLSX in the new experience). Each file needs a heading row with at minimum a Summary column; multi-value fields like *Components*, *Fix Version* and *Labels* are imported by repeating the column header 38. Comments are loaded with the pattern MM/dd/yyyy HH:mm;username;comment-body; attachments via HTTP/HTTPS URLs in an Attachment column 38157.
Marketplace and third-party staging tools
Exalate, Getint, OpsHub and Configuration Manager sit between the source and Jira. They handle two scenarios: (a) third-party-to-Jira where the source is ClickUp, Asana, Azure DevOps or Trello, and the tool handles field mapping plus attachments and comments, and (b) Jira-to-Jira with selective JQL-based migration and bidirectional sync during a transition window.
Jira DC → Cloud: JCMA, always. Third-party → Jira under 1,500 issues per project: CSV importer. Over 1,500 issues or any custom workflow remapping: a Marketplace migration app (Exalate, Getint, OpsHub).
Section 05
Mapping your data into Jira
The longest section — because for PM migrations, project hierarchy, Issue Links, time tracking, threaded comments and custom workflows are where almost every migration that fails actually breaks.
Mapping is where every Jira migration earns its scars. The schema decisions you make in your mapping spreadsheet determine whether boards work on day two, whether automations fire on day five, and whether your engineering team trusts the data on day thirty.
Work object by object, top to bottom of the import order: Projects + Schemes first (so issues have somewhere to land), then Users and Groups, then Components and Versions, then Epics, then Stories/Tasks/Bugs, then Sub-tasks, then Issue Links, then attachments and comments by CSV pattern.
Project hierarchy — Project → Epic → Story/Task/Bug → Sub-task
Jira's first-class hierarchy is Project → Epic → Story/Task/Bug → Sub-task, and Premium adds higher levels (Initiative, Theme) configurable in Settings → Issues → Issue type hierarchy. Sub-task and Epic are *system* Issue Types — their parent-child semantics are baked into the platform.
When importing, set the Parent column on a Sub-task row to the parent's external ID; set the Epic Link (legacy) or Parent column on a Story row to the Epic's external ID. The newer Jira import experience also lets you assign specific Issue Types — Epic, Task, Story, Bug, Subtask — during import, rather than defaulting everything to Task. Use this — defaulting to Task and changing types post-import breaks reporting until reconciled.
Common source → Jira Project / Issue mapping
- project / workspace / space→Project (with Key, Lead, Project Type)
Pre-create on destination; Key is uppercase 2–10 chars
- task / item / ticket→Issue with Issue Type = Story/Task/Bug
Map Issue Type per row, not via global default
- subtask→Sub-task with Parent populated
Parent column resolves to Issue Key during import
- epic / initiative / goal→Epic (or higher hierarchy on Premium)
Epic Name and Summary both required for Epic rows
- category / tag / area→Component or Label
Component is project-scoped; Label is global free-text
- release / milestone→Fix Version
Pre-create the Version on the destination Project
- due date / target date→Due date
Format must match the importer's Date format option 83
- assignee→Assignee (Atlassian Account ID on Cloud)
Cloud requires Account ID; DC uses username 113
- reporter / created by→Reporter
Falls back to importer user if missing
Task dependencies — Issue Links, not hierarchy
Task dependencies in Jira are modelled through Issue Links with configurable Issue Link Types — defaults include blocks / is blocked by, relates to, duplicates, clones. Administrators can add custom link types via Settings → Issues → Issue linking 54.
Issue Links can be populated via the CSV importer by adding columns named after each link type. Cross-project dependencies are supported natively — Issue Links span projects without restriction. The pragmatic approach for a source platform with a single dependency field is to import every dependency as a blocks link, then refine link types post-cutover.
Custom workflow status — Statuses and Workflow Schemes
Workflows are state machines built from Statuses and Transitions, applied to Issue Types via a Workflow Scheme on each Project. Every destination Status must be pre-created in Settings → Issues → Statuses before the workflow is built 106.
When importing, the *Status* column value must exactly match the destination Status name, and that Status must be present on the workflow assigned to the Issue Type. Issues whose imported Status does not match the workflow's allowed states land on the workflow's *initial* status with the imported value dropped. Build the source-status → destination-Status mapping before the first dry run.
Time tracking — Original / Remaining / Logged
Jira has native time tracking with three fields: Original Estimate, Remaining Estimate and Logged Time (worklogs). Original and Remaining import via CSV columns in Jira's time-format (2w 1d 4h 30m). Worklogs import via repeated Log Work columns with the pattern time-spent;timestamp;author;comment.
For third-party trackers (Tempo, Harvest, Toggl), worklog migration is more involved. Atlassian's App Migration Platform coordinates with Tempo for Server-to-Cloud Tempo Timesheet migrations, but the support is partner-driven; projects without a Tempo migration path land worklogs as plain Jira worklogs, losing Tempo billing categories and account associations 102.
Comments and attachments — threading and timestamps
Comments import with original timestamps via the CSV pattern 01/01/2012 10:10;Admin;This is a comment body in a Comment column — repeat the column header for multiple comments 38. The author segment must match an Atlassian Account ID (Cloud) or username (DC); unresolved authors default to the importer user. Comments do not thread on Jira — they are flat and chronological on the Activity tab.
Attachments via CSV require HTTP/HTTPS URLs in an Attachment column, with optional timestamp and author: 01/01/2012 13:10;[email protected];image.png;file://image-name.png 38. Attachment size on Cloud defaults to 1 GB per file (up to 2 GB configurable); Data Center caps at 10 MB per file 153159. Plan storage caps: 2 GB per app on Free, 250 GB on Standard, unlimited on Premium 153.
For migrations with hundreds of GB of attachments, keep originals in S3 or Google Drive, store a deep link in a custom URL field on the issue, and only inline-attach the most recent or most-referenced subset. This avoids both the per-file cap and the cumulative storage tier consumption.
Recurring tasks — Automation rules, not a property
Jira has no native *recurring issue* property. Recurrence is implemented via Automation rules in Project settings → Automation with a scheduled trigger (e.g. *Every Monday at 9 AM, clone issue PROJ-123*) or via Marketplace apps like Schedule for Jira. Source platforms (Asana, ClickUp, monday.com) that store a recurrence_rule on each task lose the rule structure on import; re-create as one Automation rule per distinct schedule.
For a migration with hundreds of distinct recurring rules, consolidate into 5-to-15 canonical Automations (daily standup, weekly review, monthly close, quarterly planning) and let team leads opt their issues in post-migration rather than mapping legacy recurrences one-to-one.
Custom-field mapping strategy
Resist the urge to map every source custom field one-to-one. Migrate only fields used by an active workflow, board, JQL filter or dashboard in the last 12 months. Atlassian's guidance is explicit: limit the number of custom fields in your import, avoid duplicating names of existing standard fields, and use generic names that can be reused 48. Excess custom fields slow JQL and fragment context configurations.
For Select List fields whose source values do not match the destination, either (1) extend the destination field's context to include the missing options, (2) collapse adjacent values during transform, or (3) introduce a parallel custom field that holds the legacy value verbatim. Calculation / scripted fields do not import — they are rebuilt with ScriptRunner, Adaptavist Power Scripts or native Automation conditions post-load.
Audit trail, ownership and original timestamps
System fields created, updated, creator, reporter and the issue change history are partially preserved on import. The CSV importer accepts *Date Created* and *Reporter* columns; whether they round-trip correctly depends on the importer permission set 113114. On Cloud, *Modified Date* cannot be set during a CSV import even by admins — Jira stamps the import time with no override 114.
If you need to preserve the audit trail, create two custom datetime properties per issue type — *Legacy Created Date* and *Legacy Modified Date* — and populate them from the source export. Inactive source users are typically not recreated as Jira users (which would consume licences); instead, store name and email in a custom text field 95.
Account-level audit logging is captured in Settings → System → Audit Log; Data Center exports up to 100,000 events as CSV and rotates daily logs at 100 MB each 112. The Cloud audit log is admin-visible but limited to configuration-impact events — Jira's audit log is explicitly *not intended to record all activity*; it is a configuration-changes-only log 118.
Section 06
The pitfalls that derail Jira migrations
Specific failure modes — ranked by impact, each tied to the exact Jira mechanism that breaks.
High impact
Custom Field Context scoped to the wrong Project + Issue Type
A custom field with one name can have multiple Field Contexts, each scoped to a different (Project, Issue Type) combination, each with its own option list and default. Import a row whose target Project + Issue Type pair is *not in any context* and the field value silently drops on creation with no error visible at the row level. Pre-create the field's context to cover every destination Project + Issue Type combination before the first import, or carry source values in a legacy text field 48. 48
High impact
Workflow Status not present on the destination Workflow Scheme
Every Status referenced by an import must be pre-created in Settings → Issues → Statuses and then added to the workflow assigned to the Issue Type via a Workflow Scheme 106. Issues whose imported Status does not match an allowed state on the workflow land on the workflow's initial status with the imported value dropped — and reports filtered by Status return wrong counts on day two until reconciled. 106
High impact
Required field validation blocks the entire row
Jira's Field Configuration sets fields to *Required* at the (Project, Issue Type) level. A CSV row missing any required field — Original Estimate, End Date, Remaining Estimate, Due Date — is rejected with Issue can't be created due to the error/s [Original Estimate is required.; End Date is required.; ...] and the entire row is dropped 90. The fix is to either populate every required field on every row, or temporarily relax requirements on the destination Field Configuration for the duration of the load and re-enable post-cutover. 90
High impact
Date format mismatch on CSV import
The CSV importer's Date time format options step requires you to declare the format used in the file (e.g. dd/MM/yyyy HH:mm, yyyy-MM-dd). Submit a file with a different format and Jira returns fields.validation.date.format; fields.validation.date.format per row and rejects the issue 83. The mitigation: re-export the source data with a single consistent ISO-8601 date format and explicitly declare that format on the importer's options screen — do not rely on auto-detection across mixed locales. 83
High impact
Cloud Modified Date and createdate cannot be overridden
On Jira Cloud, Modified Date and several system audit fields cannot be set during CSV import even by an administrator — the field is system-managed and stamped to import day 114. Teams discover this on day two when boards filtered by *Updated* return all imported issues sorted to import day. The mitigation is to create *Legacy Created Date* and *Legacy Modified Date* custom datetime properties on every Issue Type, populate them from the source export, and rewrite historical-period JQL filters to use the legacy fields. 114
Medium impact
Encoding errors on non-ASCII CSV imports
Jira warns *The CSV file you uploaded contains non-ASCII characters. Make sure to set the right encoding* and silently mojibakes German umlauts, French accents, CJK characters and Eastern European diacritics if the file is not UTF-8 8291. Atlassian-recommended encoding is UTF-8 with BOM end-to-end — set Excel's *Save As → CSV UTF-8 (Comma delimited)* before upload, and verify a sample row in a hex editor if you have international data. Re-importing with corrected encoding does not retroactively fix already-imported rows. 91
Medium impact
Cloud user picker values are Atlassian Account IDs, not usernames
Cloud CSV imports require Atlassian Account IDs (5b10a2844c20165700ede21g) for user-typed fields, not the firstname.lastname username format that Data Center uses 113. Sources migrating from DC to Cloud, or third-party tools with username-based exports, need a resolution step that maps each source identifier to a destination Account ID. Skip this step and Reporter, Assignee and User Picker custom fields all import unassigned. 113
Medium impact
Data Center end-of-life forces an unscheduled Cloud migration
Atlassian Data Center reaches end of life on 28 March 2029, with end of sale on 30 March 2026 and final renewal/expand on 30 March 2028 1617. Teams that planned a 5-to-10-year Data Center horizon discover the runway is shorter than the platform lifecycle they planned for, and rushed cutovers under EOL pressure cause more failures than the migration itself. Plan the JCMA migration window 12 months before the renewal cliff, not 12 weeks before. 17
Low impact
Free-tier 2 GB storage cap silently truncates attachment imports
Jira Cloud Free plan caps file storage at 2 GB per app, vs 250 GB on Standard and unlimited on Premium 153. A migration that imports an attachment estate over 2 GB to a Free-tier site succeeds row-by-row until the cap is hit, then silently drops further attachment uploads with the issue body still importing. Either land on Standard or Premium for migrations with non-trivial attachment volume, or treat Free as a transient staging environment with paid-tier activation scheduled before attachment data lands. 153
Section 07
Validation and cutover
What to verify after the import job, in what order — and how to fail safely when something is wrong.
Validation is the bridge between the import finishing and users being allowed in. Atlassian's JCMA Post-Migration Reconciliation (PTR) report is the canonical starting point for Data Center → Cloud — an Excel file generated automatically that counts projects, issues, comments, attachments, boards, filters and configurations source-vs-destination 122. For third-party migrations the equivalent is a hand-built reconciliation spreadsheet, plus a manual spot-check protocol on real records.
Build a reconciliation queries spreadsheet that compares source and destination on each of these counts. Anything outside a 0.5 percent variance gets investigated before users get login access.
- Total issues per project per Issue Type imported vs source — minus deliberately excluded rows (archived, deleted, out-of-scope).
- Total issues per Status vs source — a non-trivial drift usually signals a status-mapping miss against the destination Workflow Scheme.
- Total comments per project vs source, and a date-bucketed comparison to confirm comment timestamps round-tripped through the CSV
MM/dd/yyyy HH:mm;author;bodypattern. - Total attachments and total bytes per project — verify against tier storage cap (2 GB Free / 250 GB Standard / unlimited Premium) 153.
- Issue Links per link type — count
blocks,is blocked by,relates to,duplicatesand compare against source-derived expected counts 54. - Worklogs per user and total time logged —
SUM(timeSpentSeconds)GROUP BY author and compare to source-system totals. - Assignee and Reporter coverage —
GROUP BY assigneeand confirm no issue landed unassigned that had a source assignee (the silent Account ID resolution failure). - Sprint and Version assignments — count issues per Sprint, per Fix Version, and verify against source-platform release/sprint structure.
On top of reconciliation, run a manual spot-check protocol: pick 30 random issues across projects and verify each field against the source UI. Pick five high-value Epics and trace the full hierarchy — child Stories, Sub-tasks, Issue Links, attachments, comments, worklogs. If a non-trivial discrepancy shows up in three or more of the 30, halt the migration, fix the root cause, and re-import the affected rows by Issue Key.
Jira has no native bulk-undo. The closest mechanism is Bulk Change at Issues → Search → Tools → Bulk Change, which lets admins select issues by JQL and delete them in batches — deleting all imported issues is the only practical rollback path once a bad import lands 122. Stamp every imported row with an *Import Batch ID* custom field so a single JQL query selects the entire batch for clean deletion.
The real rollback strategy remains: export everything to S3 before the import starts, snapshot the Jira database (DC) or rely on Cloud's daily backup, and if catastrophe strikes, bulk-delete by Import Batch ID and re-import. For JCMA DC-to-Cloud cutovers, keep DC live in read-only mode for 30 to 90 days post-Cloud-go-live as a fallback reference.
Cutover sequencing: (1) source goes read-only and teams are notified; (2) all non-crucial scheduled jobs are paused 77; (3) final delta export captures everything that changed during the test-import window; (4) delta is imported; (5) PTR report or hand-built reconciliation runs; (6) users get login access and a 48-hour hyper-care window with the migration lead on call; (7) source decommission is scheduled for 30 to 90 days out, never the same day.
Section 08
Migration partners and tools
Atlassian Solution Partners, Marketplace migration apps, ETL vendors — what each is good for and how to choose.
The Atlassian Partner Directory lists Platinum, Gold and Silver Solution Partners by certifications, customer count and product focus 141. For Jira migrations, partners with explicit Server-to-Cloud, ClickUp-to-Jira or Asana-to-Jira practices ship cleaner than generalist shops; partners with Atlassian *Cloud Specialization* are the standard pick for JCMA-driven Data Center cutovers.
Common picks include Adaptavist, Isos Technology, Appfire, Modus Create, Praecipio Consulting and Eficode — each offers fixed-scope migration packages alongside ongoing managed services. Atlassian also offers cloud migration trial extensions: paid annual cloud subscriptions for 1,000+ user organisations qualify for up to one year free of overlapping DC subscription 144.
Standard Marketplace picks include Exalate (bidirectional sync during cutover), Getint (Asana/ClickUp/Trello-to-Jira with attachments and comments) and OpsHub Migration Manager (enterprise Jira-to-Jira). For warehouse-resident sources, Fivetran, Airbyte, Stitch and Workato all ship Jira connectors used as the staging layer in ETL-fed migrations.
Managed-migration cost ranges vary widely. A clean Asana-to-Jira or Trello-to-Jira move of under 25,000 issues with standard Issue Types often lands in the $3,000–$10,000 range with a setup fee plus per-project pricing. A Jira Data Center to Cloud project with 2,000+ users, ScriptRunner customisations and 50+ Marketplace apps typically runs $40,000–$150,000+, with the upper end driven by user count, custom-field complexity and plugin migration paths rather than raw issue count 142.
For teams that want to outsource the migration end-to-end, FlitStack specialises in Jira migrations and handles the Workflow Scheme construction, Custom Field Context configuration, Account ID resolution, historical-data preservation and reconciliation work described in Sections 5 and 7. Pricing is fixed-fee, based on issue count and source platform, with separate line items for Issue Link migration, worklog preservation and attachment volume.
This is one of several legitimate paths — the right choice for any given team depends on whether they want an Atlassian Solution Partner, a Marketplace-app-led migration, an ETL-staged approach, or a specialist migration vendor. Explore FlitStack →
Section 09
Frequently asked questions
The questions every Jira migration team works through before they sign the scope.
References
Sources
- 1 Jira (software) — Wikipedia
- 2 Import data from a CSV file — Atlassian Support
- 3 Jira Service Management on-prem alternatives after Atlassian's 2029 deadline — r/atlassian
- 7 Atlassian pricing & product changes to Jira, Trello, on-prem explained — r/Superthread_
- 14 Looking for On-Prem Alternatives to Jira/Confluence in a Highly Regulated Financial Environment — r/jira
- 16 Atlassian raising Jira/Confluence Data Center prices again while EOL is set for 2029 — r/XWiki
- 17 Migrate from Atlassian to ONES.com: DC timeline — Feb 17 2026 pricing, Mar 30 2026 end of sale, Mar 28 2029 EOL — r/ones_dot_com
- 24 You can now store up to 10 Million Objects in Assets! — Atlassian Community
- 25 Link your object schema to a Jira project — Jira Service Management Data Center
- 32 Import data from a CSV file — Atlassian Support (limits & timing)
- 33 Importing data from CSV — Administering Jira applications Data Center
- 36 Step-by-Step Guide: Migrating Jira Data Center to Jira Cloud Using the Migration Assistant
- 38 Create work items using the CSV importer — Jira Cloud
- 43 Custom field types in Jira — Atlassian Community
- 44 Custom fields — select options not recognized as numbers — Atlassian Community
- 48 Map CSV data to Jira fields — Jira Cloud Support
- 54 How to create parent/child relationships between stories or tasks — Atlassian Community
- 77 Jira Cloud Migration Assistant pre-migration checklist — Atlassian Support
- 79 Clean up your instance before migration — Atlassian Support
- 80 Clean up your Server instance before migration — Atlassian Support
- 82 How do I resolve encoding errors during an import — Atlassian Community
- 83 Jira import date format error — Atlassian Community
- 84 Import validation error — custom field require options that do exist — Atlassian Community
- 87 XML Exports containing special characters (Ellipsis) — 255-char truncation — jira.atlassian.com
- 90 Unable to import required fields into JIRA — Atlassian Community
- 91 Which file encoding should I use for importing CSV with German characters — Atlassian Community
- 95 Mastering Jira Migration Guide: Part 1 — Atlassian Community
- 102 Support migration of Tempo Timesheets-Time Tracking & Reports — jira.atlassian.com
- 106 Pre-create Statuses for workflow build — Atlassian Community
- 112 Auditing in Jira — Administering Jira applications Data Center
- 113 Finding user names to bulk upload issues via CSV — Atlassian Community
- 114 Unable to set Modified Date while importing issues from CSV — Atlassian Community
- 118 Audit activities in Jira — Atlassian Support
- 121 CSV Bulk Update Existing issues — Atlassian Community
- 122 Understanding the Post-Migration Reconciliation (PTR) Report in JCMA — Atlassian
- 124 The Jira Data Center Migration Blueprint: 10 Best Practices — Atlassian Community
- 141 Atlassian Partner Directory
- 142 Cost to stand up JIRA Help Desk in the cloud $80k — r/sysadmin
- 144 Cloud transformation costs — Atlassian
- 153 Configure file attachments — Atlassian Support
- 157 How to migrate issues with attachments using the CSV import in Jira Server and Data Center — Atlassian
- 159 Attachment size limit in Jira Cloud — Atlassian Community
Need help running this migration?
FlitStack AI runs Jira migrations end-to-end.
Fixed-fee pricing, a hands-on migration engineer, full field mapping and validation. The work described in this guide — done for you.