Project Management migration guide

The Definitive Guide to Migrating to Asana

Asana is a work-management platform whose import model rewards teams that pre-build projects with the right custom fields, structure subtask depth deliberately, and accept that comments, time history and attachments are second-class citizens of the CSV path.

22 min read 9 sections Updated May 27, 2026
Asana
Projects
Tasks
Subtasks
Comments
Attachments
Dependencies

Inside this guide

What you'll learn, section by section

  1. 01

    Why teams migrate to Asana

    The four shapes an Asana migration takes, and what makes the platform easier — or harder — than the category average.

  2. 02

    The Asana data model you need to map into

    Workspaces, Projects, Tasks, custom fields, multi-homing — the destination schema decoded.

  3. 03

    Pre-migration prep — the work before you touch Asana

    What must be true on the source, the destination, and across the team before the first row hits the CSV Importer.

  4. 04

    Import mechanisms: CSV Importer and Smart Import

    Two paths in, each with different limits and shapes. Picking the wrong one is how mid-migrations stall at scale.

  5. 05

    Mapping your data into Asana

    The longest section — because field mapping is where almost every PM migration that fails actually breaks.

  6. 06

    The pitfalls that derail Asana migrations

    Eight specific failure modes — ranked by impact, each tied to the exact Asana mechanism that breaks.

  7. 07

    Validation and cutover

    What to verify after the import job, in what order — and how to fail safely when something is wrong.

  8. 08

    Migration partners and tools

    Asana Solutions Partners, specialist migration vendors, ETL tools — what each is good for and how to choose.

  9. 09

    Frequently asked questions

    The seven questions every Asana migration team works through before they sign the scope.

Section 01

Why teams migrate to Asana

The four shapes an Asana migration takes, and what makes the platform easier — or harder — than the category average.

Asana, Inc. was founded in 2008 by Dustin Moskovitz and Justin Rosenstein, launched commercially in April 2012, and is headquartered in San Francisco 1. The flagship Asana service is a web and mobile work-management platform that helps teams organise, track and manage their work across projects, portfolios and goals.

The typical Asana customer is a cross-functional team — 25 to 5,000 users — that wants a single tool for project plans, intake forms, recurring operational work and OKR-style goal tracking, without standing up a dedicated Jira admin. Compared with Monday, Asana positions on a more opinionated data model (Workspace/Team/Project/Section/Task/Subtask) and stronger Portfolio rollup; compared with Jira, on a faster ramp for non-engineering teams.

Migrations to Asana fall into four shapes. First, consolidation: replacing Trello + spreadsheets + an intake tool with Asana's Projects + Forms + Rules combination. Second, Monday or ClickUp exits, driven by teams that want a more structured workflow story and tighter portfolio rollup 127.

Third, legacy replacements — Wrike, Smartsheet, Teamwork, MS Project — where the source schema is loose and the project is a re-architecture. Fourth, M&A consolidation, where an acquired business runs a different PM tool. A Trello-to-Asana move has clean object parity but loses card automations; a Monday-to-Asana move flattens board structure into Projects + Sections + custom fields.

What makes migrating *to* Asana easier than the category average is the CSV Importer itself — it accepts CSV exported from Excel, Smartsheet, Wrike, Monday, Airtable, Trello, ClickUp and Google Sheets, and preserves task name, description, assignee, due dates, start dates, dependencies, followers and custom fields in a single pass 24.

What makes it harder than the average is that comments and historical activity do not import via CSV, attachments must be re-uploaded or relinked individually, completion state on imported rows is silently stripped to *incomplete*, and created_at cannot be overridden — every imported task is stamped with the import date 5499161.

Rules, Bundles, Forms and inbox notifications do not move across either — they are rebuilt from documentation. Teams that scope for that work up front finish on time; teams that assume CSV parity do not.

CSV gets you tasks, names, owners and dates. Everything else — comments, history, completion state, attachments — is a second project.

Section 02

The Asana data model you need to map into

Workspaces, Projects, Tasks, custom fields, multi-homing — the destination schema decoded.

Asana platform Contacts Companies Deals Tickets Tasks Notes
Standard objects orbit the platform; every association can be many-to-many with optional labels.

Asana's object model is small but layered. A top-level Workspace or Organization contains Teams, which contain Projects, which contain Sections and Tasks, which contain Subtasks 63. Tasks are the basic unit of action — they have an assignee, a name, notes (description), followers, likes and comments, and they inherit custom fields from their parent project 63.

Before you can map a field on the source side, you need to know exactly which destination object the row belongs on, what properties it requires, and which value will serve as your match key. The table below summarises the objects you will touch in a typical Asana migration.

Object Stores Required on import Tier
Workspace / Organization Top-level container — Workspace for ad-hoc groups, Organization tied to an email domain Name; Organization additionally requires a verified email domain All tiers; Organization features expand on paid plans
Teams Sub-container within an Organization for grouping projects Name; visibility setting (Membership-only, Public, Hidden) Organization-only (not available in standalone Workspaces)
Projects A collection of tasks for a specific outcome (campaign, sprint, launch) Name, team (in Org), privacy setting All tiers; per-project custom field limits scale with plan
Sections Logical groupings of tasks within a project (often used as workflow status) Name All tiers
Tasks The unit of work — assignee, name, notes, followers, due/start dates, custom fields Name; everything else is optional All tiers
Subtasks (up to 5 levels) Tasks nested under a parent task — maximum 5 levels deep Name; parent task ID All tiers [37]
Custom Fields Typed metadata attached to tasks (text, number, single-select, multi-select, date, formula, ID, time tracking) Name, type; created at workspace, project or portfolio level Starter and above (not on free plan) [81]
Portfolios Cross-project rollups of status, owner, dates and custom-field rollups Name, owner Advanced and above
Goals OKR-style targets connected to projects and portfolios Name, owner, time period, metric Advanced and above

Asana does not expose a true external-ID / upsert key on tasks. The platform identifier is the gid (a global ID surfaced in the URL as /0/<project_gid>/<task_gid>). The CSV Importer always creates new tasks — there is no native upsert; re-running a CSV against an existing project produces duplicates 54157.

Teams that need re-runnability typically introduce a custom ID-type field (unique readable IDs per task) plus a separate text *External ID* field for the source system's primary key, and handle upsert logic externally. The ID custom field is the closest Asana feature to a stable, queryable record key 38.

Custom property types determine validation and storage; the catalogue below covers what you can model and the limits you need to plan around.

Field type Limits Notes
Single-select (drop-down) 500 options per field 3873 Case-sensitive matching on import; a new value creates a new option silently
Multi-select 500 options; multiple values per task Comma-separated on CSV import; ordering not preserved
Text Plain string; no enforced max in CSV path Rich text in task notes uses Asana-specific markdown subset
Number / Percent / Currency Decimal places configurable Strip currency symbols and thousands separators before import
Date Date-only, separate from task due date Asana prefers mm/dd/yyyy on CSV; dd/mm/yyyy frequently mis-parses 124
People Single user reference Adds user as collaborator automatically
Formula Number-type output only on the project; UTC timestamps in date inputs 76 Does not import — rebuild on-platform after data lands
ID (unique readable IDs) Auto-generated per task Recommended for tasks that need a stable handle 38
Time tracking / Timer Estimated time + actual time Source system time entries cannot be imported via CSV — see §5
Per-project custom field cap 150 fields per project (Starter+) 3879 Raised from 30 in 2023; per-task cap is 60 via multi-homing 38

Relationships in Asana are modelled differently from a relational CRM. A task can be multi-homed — present in multiple projects simultaneously — which is how the platform expresses many-to-many 38. Subtasks belong to exactly one parent task and inherit nothing from it by default (they do not auto-populate custom fields or section). Dependencies are *blocking* / *blocked-by* relationships between tasks, configurable on Advanced+ plans.

There is no cascade-delete, no master-detail relationship, and no foreign-key constraints — deleting a parent task orphans its subtasks, and removing a project from a multi-homed task leaves it alive elsewhere. Reproduce stricter cascade semantics via Rules or import scripts if the source relied on them.

Section 03

Pre-migration prep — the work before you touch Asana

What must be true on the source, the destination, and across the team before the first row hits the CSV Importer.

The single best predictor of a clean Asana migration is how much work you do on the source side before the first CSV is uploaded. The CSV Importer is forgiving on file format but unforgiving on structure: wrong-parent subtasks, wrong-locale dates and mismatched assignee emails all silently land but produce broken tasks that take longer to repair than to re-import.

Always finish an Asana migration in one sitting if you can — context loss between sessions is the single biggest source of mistakes.

— Bastien Siebman, Asana Forum Leader [129]

Treat the source export as raw material to be shaped to Asana's expected formats — dates in mm/dd/yyyy, assignees resolved to verified emails already in the destination workspace, drop-down values matched case-exactly to the destination custom field, and subtask parents resolved either by row position or via an explicit *Parent Task* column.

Source-side prep

  • Audit and de-duplicate tasks in the source — Asana's CSV importer does not detect duplicates on re-import and will happily create a second copy of every row 54, so any cleanup has to happen on the source side or in the staging spreadsheet.
  • Resolve assignees to verified email addresses that already exist in the destination Asana org. The assignee column is matched by exact email; mismatches result in unassigned tasks with no error, which then break ownership-based filters and notifications.
  • Normalise dates to mm/dd/yyyy in the CSV — Asana parses U.S. format reliably and frequently misreads dd/mm/yyyy files, producing off-by-month errors that look correct until someone notices a January task due in April 124.
  • Convert drop-down values to the exact case used in the destination project's custom field. Case-only differences create new options silently — "option" and "Option" become two values rather than collapsing 157.
  • Decide subtask strategy upfront — either put subtasks immediately below their parent row and let Asana infer hierarchy, or carry an explicit *Parent Task* column with the parent's exact name 21. Mixing strategies in one file produces orphan subtasks.

Destination-side prep

  • Request a sandbox from Settings → Admin Console → Sandboxes — available only on Enterprise+ 53. A sandbox is a separate, empty space where you can dry-run imports, train users and validate rules before touching production. Each Enterprise+ org gets one or more sandbox slots.
  • Provision users first via Okta, Entra ID or Google Workspace single sign-on (Enterprise+) or via the CSV user import at the admin console on Advanced+ 96. The assignee column on a task import only resolves if the user already exists.
  • Create destination projects, sections and custom fields before importing tasks. The CSV Importer can build a new project from a file, but if you want tasks to land in an existing project with a specific structure, the project, sections and field library entries have to exist first.
  • Add the field library entries you will need — drop-down options, ID fields, formula fields. Adding fields mid-import creates per-project copies that don't roll up into Portfolios.
  • Define dependencies as a column that references parent task names if you need blocking/blocked-by relationships preserved during import 124. The advanced CSV options support a *Dependents* column that resolves by exact name match.

People prep

Cutover only works if humans cooperate. Lock down a source freeze window — 24 to 48 hours — and communicate it to every team that touches the source tool. Train project leads on Asana's Projects + Sections + Custom Fields model before go-live, especially if the source was board-first. A simple Trello move under 1,000 tasks runs one to two days; a complex multi-team migration with subtasks, dependencies, Forms and Rules rebuilds runs two to four weeks of elapsed time.

Section 04

Import mechanisms: CSV Importer and Smart Import

Two paths in, each with different limits and shapes. Picking the wrong one is how mid-migrations stall at scale.

Asana exposes two main load paths and the right one depends on dataset size and source format. The CSV Importer covers most one-shot migrations under ~20,000 tasks. Smart Import (AI-assisted) handles unstructured files like PDFs and presentations. Third-party migration tools cover the shapes CSV cannot reach, including Workspace-to-Workspace splits with comments and attachments preserved.

CSV Importer

The native importer lives behind the + button in the top bar (Create new project → Import → CSV) or via any existing project's three-dot menu → Import → CSV 416. It accepts a single CSV file mapped to a new or existing project, parses the first row as headers, and lets you confirm column mapping before commit. Supported columns: Task Name, Description, Assignee (email), Due Date, Start Date, Section/Column, Dependents, Followers, and any number of Custom Field columns 4.

Limits are practical rather than published: there is no documented hard row cap, but performance degrades above ~10,000 rows per file, and imports above ~20,000 rows often time out 37. Subtask depth caps at 5 levels 37, drop-down fields cap at 500 options 38, and attachments are not supported in CSV at all. The right call: CSV for one-shot loads under 20,000 tasks on a single project, especially when the source already exports clean CSV (Trello, Monday, Wrike, ClickUp).

Smart Import (AI)

Smart Import accepts CSV, PDF, DOCX, XLSX, PPTX, TXT, JPEG and PNG, and uses Asana AI to generate a project structure (sections, tasks, custom fields) from the content 18. It is the right tool when the source is *not* already structured CSV — a plan in a Word doc, a Gantt screenshot, a meeting agenda. It is the wrong tool when you have clean columnar data: AI inference adds variability that direct CSV mapping avoids.

Third-party migration tools

Tools sit between the source and Asana for the shapes CSV cannot reach. Asana's own migration service copies data between Asana domains for free but does not migrate paid plan, admin roles, or deleted objects 108115. Altosio ($14.99+ per project) covers Trello, Monday, Wrike, Planner, ClickUp and Asana-to-Asana with comments and attachments preserved 127. Relokia runs a managed CSV-bridged migration. Airbyte, Fivetran, Stitch and Matillion are reverse-ETL tools for ongoing sync.

Rule

Under 5,000 tasks on a clean CSV → CSV Importer. 5,000–20,000 → CSV in batches, one project at a time. Over 20,000, or any need for comments / attachments / dependencies-across-projects → a third-party tool like Altosio or Relokia.

Section 05

Mapping your data into Asana

The longest section — because field mapping is where almost every PM migration that fails actually breaks.

SOURCE ASANA FirstName, LastName firstname, lastname AccountName company AnnualRevenue annualrevenue Owner.Email hubspot_owner_id CreatedDate createdate
Field-mapping flow — every source field resolves to a destination property or an explicit drop.

Mapping is where every PM migration earns its scars. The decisions in your mapping spreadsheet determine whether Portfolio rollups work on day two, whether Rules fire correctly on day five, and whether project leads trust the data on day thirty. Work object by object: Workspace/Organization first, then Teams, then Projects with sections and custom fields pre-built, then Tasks with subtasks, then dependencies, then comments and attachments as separate jobs.

Project hierarchy: Workspace → Team → Project → Section → Task → Subtask

Asana's hierarchy is rigid in a way that catches teams from board-style tools. Subtasks max out at 5 levels 37; a WBS from MS Project nesting six or more levels has to be collapsed before import. Sections are *not* workflow status — they are visual groupings within a project. If your source used a Status column, the cleanest mapping is either (a) Sections (good for Kanban) or (b) a single-select custom field called *Status* (good for cross-project rollup via Portfolios).

Decide upfront — mixing patterns across projects makes Portfolio rollups inconsistent. The custom-field approach is generally the better default for multi-project organisations because *Status* values then roll up into Portfolio columns and Goals.

Common source concept → Asana destination

Source Destination
  • Task / Card / Issue title
    Task Name

    Required; only mandatory column in the CSV importer

  • Description / Body
    Notes (task description)

    Plain text or Asana markdown subset; HTML stripped on CSV path149

  • Assignee / Owner
    Assignee (email)

    Matched on exact email — user must already exist in the org

  • Due date
    Due Date

    mm/dd/yyyy preferred; dd/mm/yyyy frequently mis-parses 124

  • Start date
    Start Date

    Distinct field from due date; both can be set independently

  • Status / Stage / Column
    Section OR custom single-select

    Pick one pattern org-wide — Section for board view, custom field for Portfolio rollup

  • Priority / Severity
    Custom single-select (Low/Med/High/Urgent)

    Create at workspace level so it rolls up across projects

  • Tags / Labels
    Tags OR multi-select custom field

    Tags are workspace-level; multi-select is per-project — prefer tags for cross-project search

  • Source system primary key
    Custom text field (External ID) + ID field

    There is no native external ID — store source key in a text field for re-runnable upsert

Task dependencies (blocking / blocked-by)

Dependencies in Asana are *blocking* / *blocked-by* relationships between tasks within the same project and require Advanced+ for full functionality 122. The CSV Importer supports a *Dependents* column that resolves by exact task name — duplicate names break the resolution silently and produce no error 124. A common pattern: keep dependencies inside a single project for the import, then split into multiple projects via multi-home afterwards. Cross-project dependency-shifting is only available in Timeline view 122.

If the source is MS Project or Smartsheet with finish-to-start, start-to-start and finish-to-finish dependencies, expect to collapse to Asana's simpler blocking/blocked-by model.

Time tracking history

Asana ships a built-in Time tracking custom field for Estimated and Actual Time per task 38. Historical entries from Harvest, Toggl or Clockify do not import via CSV — the field accepts a current value, not a back-dated entry stream. Asana has a dedicated path from Everhour that copies the most recent estimated and actual values onto matching tasks 126. For other sources, summarise time per task, populate *Actual Time* with the rolled-up total, and archive per-entry detail.

If forensic per-entry detail matters for billable reporting or audit, keep the source archive accessible — Asana holds only summaries.

Comments, @-mentions and reactions

Comments are the single biggest gap in the CSV path: CSV export does not include comments, and CSV import cannot create them 54. Anything preserved has to be recreated through a third-party migration tool that supports comment carryover, or accepted as a known loss.

Rich-text formatting in source comments survives only when written using Asana's markdown subset — the notes field supports bold, *italic*, lists, links, blockquotes149. Confluence-style macros, embedded tables and team mentions degrade to plain text. Plan a transform step that strips HTML to Asana markdown before any comment-replay tool runs, or accept the degrade.

Custom workflow status migration

Asana does not have a first-class *Status* concept on tasks — there is completed: true|false, and that's it 94. Source platforms with rich status models (Jira's workflow states, Monday's Status column, Trello's lists) need to land on either a Section or a single-select custom field, as outlined above.

Critically: the CSV Importer cannot create completed tasks — every imported task lands as incomplete regardless of source state 94161. The documented workaround: add a *Status* single-select with a *Complete* option, create a Rule that *when status = Complete, mark task complete and clear status*, then run the rule across imported tasks. This is the only reliable round-trip for completion state via CSV.

Recurring tasks

Recurring task schedules — daily, weekly, monthly, yearly, on completion — are an Asana-managed property and **the CSV Importer does not support a *Recurrence* column**. Recurring tasks imported via CSV land as one-shot tasks. The mitigation: import as regular tasks, then configure recurrence manually post-import. For hundreds of recurring templates, a third-party migration tool that supports recurrence is the only practical option.

Attachments: Asana-hosted vs linked from Drive / Box / Dropbox

Attachments do not import via CSV at all. Asana hosts files up to 100 MB per file uploaded from a computer; larger files must be attached as Dropbox, Google Drive, OneDrive/SharePoint or Box links 36130. There is no documented hard storage cap on the number of files per workspace 36, but performance degrades on tasks with very many attachments and forum threads recommend not exceeding a couple of dozen files per task.

For large estates (hundreds of GB), the pattern most teams adopt: keep originals in Drive, S3 or Box, store a deep link in a URL-type custom field, and inline-upload only the small subset that needs to live on the Asana timeline. Third-party migration tools handle the bulk file upload where inline hosting matters.

Audit trail, ownership and original timestamps

Standard created_at, modified_at, completed_at and created_by are Asana-managed system fields — they cannot be overwritten on import via CSV 99. Every imported task is stamped with the import date and the importing user as creator. Teams discover this on day two when filtered reports of *tasks created last month* return nothing or everything from import day.

The pattern: create two custom fields per project, *Legacy Created Date* (date) and *Legacy Created By* (text or people), populated from the source export. All historical-period reporting runs against the legacy fields. Asana's audit log is available only on Enterprise+ or Enterprise + Compliance Management add-on, with events retained 90 days 93. Lower tiers have no granular per-property change history.

Rules, Bundles, Forms, Approvals — the rebuild list

Asana's no-code automation runs on Rules (per-project), Bundles (reusable rule + field packages), Forms (intake), and Approvals. None of these import — they are rebuilt from documentation post-cutover, ideally in a sandbox first. A typical mid-market migration carries 20 to 80 source automations that map to a similar count of Rules; the rebuild runs days, not hours.

Lead-scoring-style logic from CRM-adjacent PM use cases similarly does not import. Recreate as Formula custom fields (number-output) on the destination project.

Section 06

The pitfalls that derail Asana migrations

Eight specific failure modes — ranked by impact, each tied to the exact Asana mechanism that breaks.

High impact

Imported tasks land as incomplete, regardless of source state

The CSV Importer cannot create completed tasks — every row lands as incomplete, even when the source CSV carries a completion flag 94161. Teams discover this when project archives that were 80% done in the source appear as full backlogs in Asana. The workaround is a status custom field plus a destination-project Rule that maps status = Complete to mark-complete after import. Validate completion state on a 100-row dry run before scaling. 94

High impact

Comments and historical activity do not import via CSV

Asana's CSV path carries task name, description, dates, assignee, custom fields and dependencies — but no comments, no @-mentions, no story timeline, no reactions 54. Teams that scope CSV and discover this mid-project either pivot to a third-party migration tool that supports comment carryover or accept the loss. Decide upfront whether comment preservation is in scope, because it determines the import mechanism, not the data shape. 54

High impact

created_at and completed_at cannot be overridden

Standard created_at, modified_at, completed_at and created_by are Asana-managed and ignored if you supply them. Every imported task is stamped to the import date, and reports filtered on *tasks created last month* return nothing. The mitigation is to create *Legacy Created Date*, *Legacy Completed Date* and *Legacy Created By* custom fields on every project, populate them from source data, and rewrite all historical reports to use those legacy fields 99. 99

High impact

Drop-down options are case-sensitive and silently fork

Single-select custom fields treat option and Option as distinct values. A CSV import that contains case variants of the same intended value creates a new option in the destination drop-down for each variant, with no error message 157. Drop-down fields cap at 500 options total 3873 — fork enough times and you bump the ceiling. Always normalise drop-down values in the staging spreadsheet to match the destination field's existing options exactly, character-for-character. 157

High impact

Date parsing flips months when the file is dd/mm/yyyy

Asana prefers mm/dd/yyyy in the CSV path and frequently mis-parses dd/mm/yyyy files — a task due on 04/02/2026 (4 February) can land as 2 April 124. The error surfaces only on inspection, not at import time, so teams notice three weeks in when a January milestone shows up in April. Convert all date columns to ISO yyyy-mm-dd or U.S. mm/dd/yyyy before upload, and spot-check 30 random rows for date drift after the first import. 124

Medium impact

Subtask depth caps at 5 levels — deeper rows silently drop

Asana enforces a hard limit of 5 subtask levels 37. A WBS exported from MS Project that nests 6 or more levels deep loses the deepest rows on import with no clear error — they either land as orphan tasks at the top level or fail to land at all. Audit the source for depth before import (MAX(depth) in the staging spreadsheet) and flatten anything past level 5 into a Section + multi-home pattern. 37

Medium impact

EU data residency available only on Enterprise+

Asana operates a Frankfurt data centre for EU customers and a US centre for everyone else, but EU residency is purchasable only on Enterprise and Enterprise+ plans138. New accounts choose at provisioning; existing customers can request a one-time region migration via the Asana team 115. If you are migrating into an EU-regulated business on a US-region account, plan the region migration *before* the data migration, or you will copy the data twice. 138

Low impact

Attachments are an entirely separate post-import job

The CSV path does not carry attachments at all, and Asana caps uploads from a computer at 100 MB per file 36130. Teams that assume *the importer brings everything* finish the task import and discover thousands of files still in the source. Plan an explicit attachment migration via a third-party tool or via re-linking from Drive/Box/Dropbox — the latter is faster but creates an external dependency for every link, which breaks if the source storage account is decommissioned. 36

Section 07

Validation and cutover

What to verify after the import job, in what order — and how to fail safely when something is wrong.

1 Read-only Source goes write-frozen 2 Final delta Export incremental changes 3 Import Load into Asana 4 Validate Reconcile + spot-check 5 Cut over Users on new system
Cutover sequencing — five gated phases between source read-only and full user access.

Validation is the bridge between the import finishing and users being allowed in. The three-stage rhythm that works on Asana: a test load of 10 percent of records with stakeholder spot-checks, the full load with real-time monitoring of task counts and assignee distribution, and a 30-day post-migration data-quality audit. The most reliable signal is having project leads verify their own projects — they know what right looks like better than any reconciliation script.

Build a reconciliation spreadsheet that compares source and destination on each of these counts. Anything outside a 1 percent variance gets investigated before users get login access.

  • Total tasks imported vs source — minus deliberately excluded rows (archived projects, deleted tasks, role-based or system-generated entries).
  • Total subtasks per parent task vs source — and a depth check (MAX(depth) <= 5) to confirm the cap did not silently truncate.
  • Tasks per section per project vs source — a non-trivial count variance usually signals a Status mapping error or a hierarchy issue.
  • Assignee distributionGROUP BY assignee_email and confirm no tasks landed unassigned that should not have. Unassigned tasks are typically email-mismatch casualties.
  • Custom field coverage — for each project, count tasks with a value in each custom field and compare to expected. Drop-down case-fork errors show up here as inflated option counts.
  • Dependency integrity — for projects with dependencies, count blocking and blocked-by edges and compare to source. Missing edges usually indicate a duplicate-name resolution failure.
  • Completed-task count — the high-frequency failure mode. Run before AND after the *Complete* Rule fires, to confirm the Rule actually closed the imported tasks.
  • Legacy date field coverage — confirm every task has a populated *Legacy Created Date*; gaps reveal rows where the source field was empty or the column mapping dropped.

On top of reconciliation, run a manual spot-check: pick 30 random tasks across projects and verify each field against the source UI. Pick five high-stakes projects and trace the full tree — sections, tasks, subtasks, dependencies, custom fields, attachments. If a non-trivial discrepancy shows up in three or more of the 30, halt, fix the root cause, and re-import the affected rows.

Asana has no native bulk-rollback button 113. Once tasks are imported, undoing them is per-task delete (lands in the trash for 30 days on Enterprise 137) or per-project archive. For larger reversals, the only practical mechanism is to delete the affected project entirely and re-import. This is why every import should be staged: load to a freshly-created project first, validate, then either keep it or delete-and-redo, rather than importing into a production project.

The real rollback strategy: export every source object to S3 before import, stamp every imported task with an *Import Batch ID* custom field, and if catastrophe strikes, filter on that batch ID, archive the project, and re-import from the cleaned source.

Cutover sequencing: (1) source goes read-only and the team is notified; (2) final delta export captures changes during the test-import window; (3) delta imports into staging projects; (4) reconciliation runs; (5) staging projects move to production teams; (6) users get login and a 48-hour hyper-care window with the migration lead on call; (7) source decommission is scheduled 30 to 90 days out. Asana's in-house service warns that paid plan, admin roles, and deleted objects do not carry over 115.

Section 08

Migration partners and tools

Asana Solutions Partners, specialist migration vendors, ETL tools — what each is good for and how to choose.

Asana's Solutions Partner Program lists certified consulting partners worldwide 103. Partners with explicit migration practices — particularly Trello-to-Asana, Monday-to-Asana, Wrike-to-Asana and ClickUp-to-Asana — tend to ship cleaner than generalist implementation shops. Examples from the partner directory include i.DO (France/global), Priceless Consulting, PMexperts (Poland), and Taco Technologies (Australia). Each offers fixed-scope migration packages alongside ongoing managed services.

Asana also runs an in-house migration team that copies data between Asana domains for free 108115. It has documented caveats: it does not migrate paid plan, admin roles, or deleted objects. Plan to re-provision those after the data copy completes.

On the specialist side, Altosio ($14.99+ per project) covers Trello, Monday, Wrike, Planner, ClickUp and Asana-to-Asana with subtasks, comments and attachments preserved 127. Relokia runs a Demo + Full Migration model with custom-field mapping and agent-resolution that handles email-mismatch cases. Workino, Omtera and ditto.kothar.net cover related niches, particularly for Asana-to-Asana Workspace splits.

On the ETL and iPaaS side, Airbyte, Fivetran, Stitch and Matillion all have Asana connectors. Their role in a one-time migration is rarely the migration itself — it is the staging layer that lands source data into a warehouse, the transformation layer that converts drop-down values and resolves assignee emails, and the ongoing-sync layer that takes over once the one-time migration is complete. Workato is a common pick where the migration is bundled with a Rules rebuild.

Managed-migration cost ranges vary widely. A clean Trello-to-Asana move under 5,000 tasks with no historical comments often lands in the £1,500–£5,000 / $2,000–$7,000 range. A multi-team migration from Monday or Wrike with attachments, comments, dependencies and Rules rebuilds typically runs $15,000–$80,000, driven by task count, custom-field complexity, attachment volume and the number of source automations that need rebuilding rather than re-pointing.

For teams that want to outsource the migration end-to-end, FlitStack specialises in Asana migrations and handles the project hierarchy planning, custom-field mapping, comment preservation, attachment migration, and validation work described in Sections 5 and 7 of this guide. Pricing is fixed-fee, based on task count and source platform, with separate line items for comment depth, attachment volume and Rules rebuilds so the scope is transparent before signature.

This is one of several legitimate paths — the right choice depends on whether you want an Asana Solutions Partner, Asana's free in-house service, a specialist tool, an iPaaS-first approach, or an end-to-end managed migration vendor. Explore FlitStack →

Section 09

Frequently asked questions

The seven questions every Asana migration team works through before they sign the scope.

References

Sources

  1. 1 Asana, Inc. — Wikipedia
  2. 2 Prepare data for CSV import — Asana Help Center
  3. 4 Asana CSV Importer — Asana Apps
  4. 13 Import data from other tools to projects in Asana — Asana Help Center
  5. 16 How to Import CSV Files into Asana — Asana Help Center
  6. 18 How to use Smart Import — Asana Help Center
  7. 21 Advanced CSV import options — Asana Help Center
  8. 36 How many files can I upload to Asana? — Asana Forum
  9. 37 List of technical and data limitations in Asana — Asana Forum
  10. 38 Custom field types & limitations — Asana Help Center
  11. 53 How to use Asana Sandboxes — Asana Help Center
  12. 54 Creating duplicate records in Asana importing data from CSV file — Asana Forum
  13. 63 Object hierarchy — Asana documentation
  14. 73 Limit of 500 options within a custom field — Asana Forum
  15. 76 How to use formula custom fields — Asana Help Center
  16. 79 Raising the per-project custom fields limit from 30 to 100+ — Asana Forum
  17. 81 Asana Custom Field Features — Asana
  18. 93 Audit log — Asana Help Center
  19. 94 Completed tasks when importing a CSV file into Asana — Asana Forum
  20. 96 How to use CSV user import — Asana Help Center
  21. 99 Preserving creation date when importing tasks — Asana Forum
  22. 103 Asana Service Partner Directory — Asana
  23. 108 Data migration guide — Asana Help Center
  24. 113 Undo actions — Asana Forum (Product Feedback)
  25. 115 How to migrate data within Asana — Asana Help Center
  26. 122 Dependencies between tasks of different projects — Asana Forum
  27. 124 CSV Import dependent tasks to a project — Asana Forum
  28. 126 Migrating time tracking data from Everhour to Asana — Asana Help Center
  29. 127 A comprehensive guide to migrating from a tool to Asana — Asana Forum
  30. 129 Always finish an Asana migration in one sitting — Asana Forum
  31. 130 How to use task comments & attachments — Asana Help Center
  32. 137 Data retention policy — Asana Help Center
  33. 138 Asana EU Data Centre — Asana Help Center
  34. 149 How to get rich text formatting from Asana task — Stack Overflow
  35. 157 Import to update existing tasks (case-sensitive drop-down behaviour) — Asana Forum
  36. 161 Updating completion date after CSV import — Asana Forum

Need help running this migration?

FlitStack AI runs Asana 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.