Blog
February 2, 2026

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.

12 mins read

Asana CSV Importer: Migrate Tasks & Projects

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:

FeatureFree PlanPremium+ Plan
Task names and descriptionsYesYes
Assignees (via email)YesYes
Due datesYesYes
Start datesNoYes
SectionsYesYes
SubtasksYesYes
DependenciesYesYes
CollaboratorsYesYes
MilestonesYesYes
Custom fieldsNoYes

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

  1. Go to your team sidebar in Asana
  2. Click Import spreadsheet
  3. Select your CSV file
  4. Map columns to Asana fields
  5. Click Go to project to complete the import

Method 2: Use the Quick Add Button

  1. Click the + (Quick Add) button in Asana
  2. Select Project
  3. Choose Select file to import
  4. Upload your CSV file
  5. Configure column mapping and complete import

Method 3: Import Into Existing Project

  1. Open the project where you want to add tasks
  2. Click the project header dropdown (the project name)
  3. Select Import > CSV
  4. 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 NamePurposeFormat Requirements
NameTask name (required, must be first)Text
DescriptionTask detailsText
SectionGroup tasks into sectionsAdd colon at end (e.g., "Design Phase:")
AssigneePerson responsibleWork email address (not display name)
CollaboratorsAdditional team membersComma-separated emails, no spaces
Start DateWhen work begins (Premium+ only)MM/DD/YYYY
Due DateDeadlineMM/DD/YYYY or M/D/YYYY
TypeTask typeUse "Milestone" for milestones
Parent TaskCreates subtasksExact name of parent task
DependentsTask dependenciesTask 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:

FormatExampleAccepted?
MM/DD/YYYY01/15/2026Yes
M/D/YYYY1/5/2026Yes
DD/MM/YYYY15/01/2026No
YYYY-MM-DD2026-01-15No

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)

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:

  1. Complete your first CSV import
  2. Convert local custom fields to global custom fields in Asana settings
  3. Duplicate the project without tasks or sections
  4. 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 ImportWorkaround
File attachmentsAdd manually after import
Comments and activity historyNo workaround
Task completion statusMark tasks complete after import
TagsUse custom fields or add manually
Multiple assigneesAsana 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 Date not due 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 .