Asana CSV Importer: Migrate Tasks & Projects
Import tasks into Asana from CSV files - works on free plan. Includes field mapping, required column order, custom field handling, limitations, and third-party alternatives.

Migrating tasks to Asana from spreadsheets, other project management tools, or your own systems? Asana's built-in CSV importer works on all plans, including the free tier. You can bulk import hundreds of tasks in minutes without writing code or paying for a premium subscription.
That said, Asana's CSV import has specific requirements and limitations you should know about. I'll cover the correct column order, date formatting, custom field handling, dependency setup, and the common mistakes I see people make.
What You Can Import With Asana's CSV Importer
Here's what the native importer supports:
| Feature | Free Plan | Premium+ Plan |
|---|---|---|
| Task names and descriptions | Yes | Yes |
| Assignees (via email) | Yes | Yes |
| Due dates | Yes | Yes |
| Start dates | No | Yes |
| Sections | Yes | Yes |
| Subtasks | Yes | Yes |
| Dependencies | Yes | Yes |
| Collaborators | Yes | Yes |
| Milestones | Yes | Yes |
| Custom fields | No | Yes |
The importer accepts CSV files exported from Excel, Smartsheet, Wrike, Monday.com, Airtable, and Trello. Each row becomes one task.
How to Import CSV Files to Asana
Asana gives you three ways to import CSV data. Which one you use depends on whether you're starting fresh or adding to an existing project.
Method 1: Create a New Project From CSV
- Go to your team sidebar in Asana
- Click Import spreadsheet
- Select your CSV file
- Map columns to Asana fields
- Click Go to project to complete the import
Method 2: Use the Quick Add Button
- Click the + (Quick Add) button in Asana
- Select Project
- Choose Select file to import
- Upload your CSV file
- Configure column mapping and complete import
Method 3: Import Into Existing Project
- Open the project where you want to add tasks
- Click the project header dropdown (the project name)
- Select Import > CSV
- Upload your file and map columns
This method adds tasks to your existing project without touching what's already there. But here's the catch: you can't update existing tasks via CSV import. The importer only creates new tasks.
Required CSV Format and Column Order
Asana's CSV importer is picky about column names and their order. The order matters because Asana falls back to positional matching when column names don't match exactly.
Supported Columns (In Required Order)
| Column Name | Purpose | Format Requirements |
|---|---|---|
Name | Task name (required, must be first) | Text |
Description | Task details | Text |
Section | Group tasks into sections | Add colon at end (e.g., "Design Phase:") |
Assignee | Person responsible | Work email address (not display name) |
Collaborators | Additional team members | Comma-separated emails, no spaces |
Start Date | When work begins (Premium+ only) | MM/DD/YYYY |
Due Date | Deadline | MM/DD/YYYY or M/D/YYYY |
Type | Task type | Use "Milestone" for milestones |
Parent Task | Creates subtasks | Exact name of parent task |
Dependents | Task dependencies | Task names this blocks |
From Asana's docs: "The order of columns in your CSV file must be precise. The Task Name must be the first column, followed by Description, Sections, and Assignee."
CSV Sample Template
Here's a working CSV you can copy:
Name,Description,Section,Assignee,Collaborators,Due Date,Type,Parent Task,Dependents
Project Setup:,,,,,,,,
Define project scope,Document goals and deliverables,,user@company.com,team@company.com,1/5/2026,,,
Create timeline,Build project schedule,,user@company.com,,1/10/2026,,,Define project scope
Design Phase:,,,,,,,,
Create mockups,Design UI mockups,,designer@company.com,,1/20/2026,,,Create timeline
Review designs,Team feedback session,,user@company.com,designer@company.com,1/22/2026,,Create mockups,
Header Row Requirements
Your CSV must include a header row with column names using title case:
- Correct:
Due Date,Parent Task,Assignee - Incorrect:
due date,parent_task,assignee
Date Format Requirements
Asana only accepts US date format (month/day/year), which is annoying if you're anywhere else in the world:
| Format | Example | Accepted? |
|---|---|---|
| MM/DD/YYYY | 01/15/2026 | Yes |
| M/D/YYYY | 1/5/2026 | Yes |
| DD/MM/YYYY | 15/01/2026 | No |
| YYYY-MM-DD | 2026-01-15 | No |
If you're outside the US, you'll need to reformat your dates in Excel or Google Sheets before exporting.
Assignee Format
Use email addresses, not display names:
- Correct:
sarah@company.com - Incorrect:
Sarah Johnson
Users must already be in your Asana workspace, or you can check the "Invite assignees" option during import to send invitations.
Creating Sections in Your CSV
To create a section (task grouper), add a colon at the end of the task name:
Name,Description,Section,Assignee
Design Phase:,,,
Create wireframes,Initial designs,,designer@company.com
Build prototype,Interactive prototype,,developer@company.com
Development Phase:,,,
Set up repository,Initialize codebase,,developer@company.com
Tasks listed after a section row will be grouped under that section.
Importing Subtasks
Use the Parent Task column to create subtasks. The parent task must appear before the subtask in your CSV:
Name,Description,Parent Task
Main Task,This is the parent task,
Subtask 1,First subtask,Main Task
Subtask 2,Second subtask,Main Task
The Parent Task value must exactly match the parent task name. If multiple tasks share the same name, Asana picks the closest matching row above the subtask (which can get confusing fast).
Setting Up Dependencies
Use the Dependents column to create task dependencies. This specifies which tasks the current task blocks.
Name,Description,Dependents
Research,Gather requirements,
Design,Create mockups,Research
Development,Build feature,Design
In this example:
- "Research" blocks "Design" (Design depends on Research)
- "Design" blocks "Development"
For multiple dependencies, separate task names with commas.
Dependency Ordering
The dependent task should be listed below the blocking task. This creates a headache when combined with subtask ordering (I'll explain why in the limitations section).
Custom Field Import (Premium+ Only)
Custom fields require a paid Asana subscription (Premium, Business, or Enterprise). On the free plan, columns that don't match Asana's standard field names get dumped into the task description. Not ideal.
How Custom Fields Work
Any column name that doesn't match a standard Asana field (Name, Description, Section, etc.) becomes a custom field. The supported types:
- Text: Any string value
- Number: Numeric values only
- Dropdown: Must match existing options exactly (case-sensitive)
Dropdown Field Requirements
For dropdown custom fields, values must match exactly. Spelling, capitalization, spacing - everything.
If your dropdown has "In Progress", your CSV must say "In Progress" (not "in progress" or "In progress"). Misspelled values just won't import.
Local vs. Global Custom Fields
From Asana's docs: "When creating a new project via the CSV importer, custom fields are local, not global. To use these fields for reporting or future imports, convert them to global custom fields."
To use global custom fields across multiple projects:
- Complete your first CSV import
- Convert local custom fields to global custom fields in Asana settings
- Duplicate the project without tasks or sections
- Import subsequent CSVs into the duplicated project
Color Limitations
Dropdown option colors can't be imported via CSV. You'll have to set those manually after import.
Limitations Worth Knowing
Asana's CSV importer has some real limitations. A few of these might be dealbreakers depending on what you're trying to do.
No Updating Existing Tasks
This is the big one: CSV import only adds new tasks. You can't update existing tasks in a project via CSV import.
From Asana's docs: "Importing data via CSV will not update any existing tasks in the project. Therefore, it will not be possible to create a dependency on any existing task by using the CSV importer."
In practice, that means no bulk updates to existing task fields, no creating dependencies on tasks already in the project, and no modifying assignees or dates on existing tasks. If you need to update data in bulk, you're stuck with the API or manual work.
No Subtask Dependencies
You can't import dependencies for subtasks via CSV. Dependencies only work for top-level tasks.
Export/Import Roundtrip Doesn't Work
This one surprised me: CSV files exported from Asana can't be directly reimported. The export format doesn't match the import requirements, so you'd need to reformat the data first.
Other Limitations
| What You Cannot Import | Workaround |
|---|---|
| File attachments | Add manually after import |
| Comments and activity history | No workaround |
| Task completion status | Mark tasks complete after import |
| Tags | Use custom fields or add manually |
| Multiple assignees | Asana only supports one assignee per task |
Subtask/Dependency Ordering Conflict
This is the frustrating one. When parent tasks depend on their subtasks, you hit an impossible situation.
Subtasks require the parent task to be listed above them in the CSV. But dependencies require the dependent task to be listed below the blocking task. If a parent task depends on its subtasks, you can't satisfy both requirements in a single import.
Workaround: Import subtasks and dependencies in separate steps, or just add the dependencies manually after import.
Troubleshooting Import Errors
Dates Not Importing
Problem: Dates appear blank or wrong after import.
Fix: You're probably not using US date format (MM/DD/YYYY). In Excel, select the date column, right-click > Format Cells, and choose Custom format: m/d/yyyy.
Assignee Not Found
Problem: Tasks show no assignee after import.
Fix: You're probably using display names instead of email addresses. Make sure users are already in your Asana workspace, or check the "Invite assignees" option during import.
Custom Fields Going to Description
Problem: Custom field columns appear in task descriptions instead of as fields.
Fix: Custom fields require a paid Asana plan. On free plans, those extra columns just get appended to the description. Not much you can do except upgrade.
Subtasks Appearing as Top-Level Tasks
Problem: Tasks meant to be subtasks appear at the top level.
Fix: Check that your column is named exactly Parent Task, that the parent task name matches exactly (case-sensitive), and that the parent task appears above the subtask rows in your CSV.
"Unnamed Task" Dependencies
Problem: Blank dependency cells show "Dependent on (unnamed task)".
Fix: This is a known bug. You'll have to manually remove these phantom dependencies after import. Annoying, but there's no way around it.
Third-Party Alternatives
If Asana's native importer doesn't cut it, here are some options.
Zapier + Asana
Zapier can automate task creation from CSV files or spreadsheets. Connect Google Sheets or Excel to Asana, trigger task creation when new rows are added, and tap into 5,000+ app integrations.
Best for: Automated ongoing imports when your data source updates regularly.
Unito
Unito provides two-way sync between Asana and other tools. You can sync subtasks, attachments, and custom fields while keeping projects in sync across platforms.
Best for: Migrating from another PM tool while maintaining both systems temporarily.
EasyCSV + Zapier
For user-facing CSV imports in your own applications. It's a production-ready spreadsheet import widget that connects to Asana via Zapier and handles validation.
Using the Asana API for Programmatic Import
If you need more control, Asana's API lets you create tasks programmatically. But fair warning: it's not as straightforward as you might hope.
Batch API Limitations
Asana's Batch API allows up to 10 actions per request. Each action counts against rate limits individually, actions execute in parallel (so no guaranteed order), and the entire batch fails with a 429 error if you hit rate limits.
There's no true bulk import endpoint. You have to create tasks one at a time or in small batches.
API Code Example
const Asana = require('asana');
const client = Asana.Client.create()
.useAccessToken(process.env.ASANA_PAT);
async function importTasksToAsana(tasks, projectId) {
for (const task of tasks) {
await client.tasks.create({
name: task.name,
notes: task.description,
assignee: task.assignee,
due_on: task.dueDate, // API uses YYYY-MM-DD format
projects: [projectId]
});
// Respect rate limits
await new Promise(resolve => setTimeout(resolve, 100));
}
}Note that the API accepts ISO date format (YYYY-MM-DD), unlike the CSV importer which requires US format (MM/DD/YYYY). At least the API got that right.
When to Use ImportCSV Instead
Asana's native CSV importer works fine for simple, one-time imports. But if you're building applications that need reliable CSV import, or you're fed up with Asana's limitations, ImportCSV might be a better fit.
A few things ImportCSV handles that Asana doesn't:
- Auto-detects and converts date formats (no more MM/DD/YYYY headaches)
- Built-in validation UI so users see and fix errors before import completes
- Drag-and-drop column mapping instead of strict column ordering
- Can update existing records, not just create new ones
- Works with any backend - Supabase, Firebase, your own API
If you're building a SaaS product that needs user-facing CSV import, try ImportCSV free.
Quick Reference Checklist
Before importing, double-check:
- First column is
Name(task names) - Header row uses title case (
Due Datenotdue date) - Dates use US format (MM/DD/YYYY)
- Assignees use email addresses (not display names)
- Section names end with colon (e.g., "Design Phase:")
- Parent tasks appear before subtasks
- Blocking tasks appear before dependent tasks
- Dropdown custom field values match exactly (Premium+)
- File is saved as CSV with UTF-8 encoding
Summary
Asana's CSV importer is decent for bulk task import, and the fact that it works on the free plan is genuinely useful. The main things to remember:
- Column order matters. Name must be first, followed by Description, Section, Assignee.
- Use US date format (MM/DD/YYYY). Yes, even if you're not in the US.
- Use email addresses for assignees, not display names.
- Custom fields need a Premium plan. Free plans dump extra columns into descriptions.
- Import only adds tasks. You can't update existing tasks via CSV.
For most migration and bulk import scenarios, Asana's native tool gets the job done. But if you need to update existing data, want flexible date formats, or you're building user-facing import features, look at the API or third-party tools like ImportCSV.
Wrap-up
CSV imports shouldn't slow you down. ImportCSV aims to expand into your workflow — whether you're building data import flows, handling customer uploads, or processing large datasets.
If that sounds like the kind of tooling you want to use, try ImportCSV .