Issue migration between Jira projects can usually be handled in two ways:
Move or Bulk Move;This is the simpler case.
Recently, I found myself working on a specific Jira use case that comes up more often than expected: migrating issues from one Jira project to another.
At first glance, it sounds like a straightforward activity, but in practice it can become quite complex depending on the project configuration. In my case, although this method is typically used for migrations between two different Jira instances, I applied the same logic to migrate issues between two projects in the same instance. It turned out to be a practical option, especially because there were many issues to move and the standard approach was not the most convenient one.
The first attempt was not as smooth as expected. I ran into several issues caused by missing fields, incompatible configurations, and values that did not exist in the target project. That was a useful reminder that even a migration that looks simple on paper depends heavily on how well the target structure is prepared.
In this article, I want to share the most practical native approach I used for this activity: CSV export and CSV import.
This method is useful when the goal is to migrate:
It is commonly used when the source and target projects are on different Jira instances, but it can also be a convenient solution within the same instance when you need to migrate a large number of issues and want more control over the process.
The first step is to export the issues from the source Jira project.
To do this:
For example:
project = ABC ORDER BY key ASC
Once the result list is displayed:
This will generate the file that you will later import into the target project.
Before importing anything, I found it important to check that the target project was actually ready to receive the data.
In particular, the target project should already contain:
This was exactly the point that created the first problems in my case. If one of these elements is missing, the import can fail or produce incomplete issues, which means you often spend more time fixing the target structure than running the migration itself.
Once the file is ready, the next step is to import it into the target project.
In Jira, go to:
Then:
The field mapping is the most sensitive part of the process. At minimum, I recommend checking:
After the import, I would strongly recommend opening the target project and validating the result before considering the migration complete.
The main checks are:
Even in a simple migration, this validation step makes a big difference.
One important lesson from this kind of activity is that CSV works well for simple structures, but it has clear limitations.
It does not reliably preserve:
So while the method is useful, it should not be seen as a full-fidelity migration for every Jira scenario.
If the migration must include comments, attachments, links, or Jira Service Management-specific data, then CSV is usually not enough.
In those cases, the better options are:
These methods require more setup, but they also provide much more control over the final result.
Looking back at this use case, the cleanest workflow is:
If the migration involves Jira Service Management, it is also important to verify:
These elements are often not migrated correctly with CSV alone.
Working on this specific case was a good reminder that migrations are never just about moving tickets from one place to another. Even when working within the same Jira instance, the success of the activity depends on preparation, field compatibility, and careful validation.
For a simple migration, CSV is often enough. For more complex scenarios, especially those involving Jira Service Management or richer issue relationships, a more controlled method such as API, scripts, or a migration tool is usually the better choice.