I’ve successfully migrated complex requirements hierarchies to ado-2025 multiple times. Let me walk you through the complete solution:
CSV Import Templates Limitation:
The standard CSV import in Azure DevOps doesn’t support forward-reference resolution for parent IDs within the same import batch. When you import a CSV with ParentID references to items that don’t exist yet, the import process can’t create the hierarchy because it processes rows sequentially without maintaining an ID mapping table.
Work Item Hierarchy Validation:
Ado-2025 enforces strict hierarchy rules during import. Your Epic->Feature->Requirement->Sub-requirement->Task chain needs explicit permission in the process template. Many default templates only allow 3 levels (Epic->Feature->User Story), so deeper hierarchies get rejected and flattened.
Parent ID Mapping Strategy:
For successful bulk migration, you need a two-phase approach:
Phase 1 - Process Template Configuration:
First, update your process template to allow all hierarchy levels:
<WorkItemTypes>
<WorkItemType name="Sub-requirement">
<AllowedParents>
<Parent ref="Requirement" />
</AllowedParents>
</WorkItemType>
</WorkItemTypes>
Phase 2 - Staged Import Approach:
Instead of single CSV import, break your migration into hierarchy levels:
- Import Level 1 (Epics): Import all Epic-level items first with no parent references
Title,Type
Auth Epic,Epic
Data Epic,Epic
-
Capture Generated IDs: After import, export the created epics to get their Azure DevOps work item IDs
-
Import Level 2 (Features): Import features with actual parent IDs from step 2
Title,Type,ParentID
Login Feature,Feature,1001
Logout Feature,Feature,1001
- Repeat for each level: Continue this pattern for Requirements, Sub-requirements, and Tasks
Alternative: REST API Bulk Migration:
For 3000+ requirements, CSV import is inefficient. Use the Azure DevOps REST API with batch operations:
POST https://dev.azure.com/{org}/{project}/_apis/wit/$batch
[
{
"method": "PATCH",
"uri": "/_apis/wit/workitems/$Epic",
"body": [{"op":"add","path":"/fields/System.Title","value":"Auth Epic"}]
},
{
"method": "PATCH",
"uri": "/_apis/wit/workitems/$Feature",
"body": [
{"op":"add","path":"/fields/System.Title","value":"Login Feature"},
{"op":"add","path":"/relations/-","value":{
"rel":"System.LinkTypes.Hierarchy-Reverse",
"url":"{{Epic.url}}"
}}
]
}
]
The batch API maintains reference resolution within the batch, so parent-child relationships are preserved.
Complete Migration Solution:
- Validate process template allows all 5 hierarchy levels
- Export your source requirements data with hierarchy information
- Sort data by hierarchy level (depth-first or breadth-first)
- Use REST API batch operations (recommended) or staged CSV imports
- Import each hierarchy level sequentially, using generated IDs for parent references
- Validate hierarchy after each level import
- Run final validation query to verify all parent-child relationships
For your 3000 requirements, the REST API approach will complete in under an hour versus multiple days with staged CSV imports. The key is maintaining the ID mapping between your source system IDs and generated Azure DevOps IDs throughout the migration process.