Project Management migration
Field-level mapping, validation, and rollback between ProjeQtOr and Asana. We move data and schema; workflows are rebuilt natively in Asana.
ProjeQtOr
Source
Asana
Destination
Compatibility
5 of 12
objects map 1:1 between ProjeQtOr and Asana.
Complexity
BStandard
Timeline
4-6 weeks
Overview
ProjeQtOr and Asana occupy opposite ends of the project management spectrum: ProjeQtOr is a free, self-hosted PHP application with no API, deep functional scope across risks, expenses, and budgets, and a data model that stores custom fields as EAV rows across separate tables. Asana is a SaaS-first work management platform with a REST API, a global custom field model, and a focus on task-centric collaboration over financial tracking. The migration challenge is structural: we must extract directly from the MySQL or PostgreSQL database, resolve EAV custom fields into flattened columnar records, reconstruct resource allocations as task assignments, and handle document attachments as a parallel file transfer operation. We do not migrate ProjeQtOr Workflows, Risk Registers, or Expense Reports as native objects; we deliver a written inventory of these for the customer's admin to rebuild as Asana Sections, custom fields, or third-party integrations. The migration lands in four to eight weeks depending on portfolio size and document volume.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a ProjeQtOr object lands in Asana, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
ProjeQtOr
Project
Asana
Project
1:1ProjeQtOr Projects map directly to Asana Projects. We extract project id, name, description, status, start date, end date, and customer association from the Project table and load into Asana Project via the Asana REST API or CSV importer. Project color and icon do not transfer; we configure these in Asana post-migration if needed. Multi-project portfolios in ProjeQtOr map to Asana Portfolios at the Business tier or to a top-level Project grouping at lower tiers.
ProjeQtOr
Task
Asana
Task
1:1ProjeQtOr Tasks map to Asana Tasks with parent-child hierarchy preserved via the subtasks relationship. The WBS numbering sequence from ProjeQtOr migrates as a custom field for audit. Planned work hours and actual work logged map to Asana custom number fields since Asana natively tracks only start date, due date, and assignee. Task status (idle, in progress, completed, cancelled) maps to Asana completion state with a status custom field for granular tracking.
ProjeQtOr
Milestone
Asana
Milestone
1:1ProjeQtOr Milestones map to Asana Milestones linked to the parent Project. We extract milestone name, target date, status, and project association from the Milestone table. Asana Milestones are a native subtype of Task; they appear as diamonds in Timeline and Calendar views. If the destination Asana workspace uses the Basic tier (which lacks Portfolios), milestones are the primary mechanism for phase tracking across projects.
ProjeQtOr
Resource
Asana
User (member on Project)
1:1ProjeQtOr Resources represent team members with calendar availability, cost rates, and skill profiles. We map Resources to Asana Users by email match, provisioning Asana Workspace members as we go. ProjeQtOr resource skill profiles and capacity settings do not have a direct Asana equivalent; we preserve them in custom fields on the User record (skill tags as a multi-select custom field, capacity notes in a text field). ProjeQtOr's resource pool concept (a shared inventory of available people) does not exist in Asana; resource availability is managed through the Workload view at Business tier.
ProjeQtOr
Allocation
Asana
Task assignee
1:manyProjeQtOr Resource Allocations bind a Resource to a Task with start date, end date, and daily assignment percentage. Each allocation creates an Asana Task assignment. If a task has multiple resource allocations, we create one Asana assignee per allocation and record the original allocation percentage in a custom field assignment_percent__c. Allocations without a corresponding ProjeQtOr Resource become unassigned Asana Tasks flagged for manual assignment during cutover.
ProjeQtOr
Expense
Asana
Custom field on Task or Project
many:1ProjeQtOr Expenses (travel, software licenses, contractor costs) with category, amount, date, VAT, and project association do not have a native Asana equivalent. We aggregate expenses by project and write them to Asana as a custom monetary field expense_total__c on the Project record, with individual expense line items preserved in a linked Google Sheet or CSV attachment on the Project for financial reference. Customers needing native expense management in Asana integrate a third-party tool post-migration.
ProjeQtOr
Risk
Asana
Task with custom fields (or tag)
lossyProjeQtOr Risks include probability, impact, mitigation plan, and owner. We map these to Asana Tasks with a risk_flag__c custom field set to true, probability mapped to a custom picklist (very low, low, medium, high, very high), impact to a severity custom field, and mitigation plan as the task description. We tag the task with a Risk label. This is a configuration decision the customer makes during scoping; alternatives include storing risks in a dedicated project with sections per risk category or using a third-party risk management integration.
ProjeQtOr
Issue
Asana
Task with tag
1:1ProjeQtOr Issues (bugs, incidents, change requests) map to Asana Tasks with the issue type (bug, incident, change request) preserved as a custom picklist field and tagged accordingly. Priority from ProjeQtOr maps to Asana priority (high, medium, low). Issue status (open, in progress, resolved, closed) maps to task completion state with a status custom field for granular tracking.
ProjeQtOr
Document
Asana
Attachment on Task or Project
lossyProjeQtOr Document records reference files stored on the application server filesystem. We identify all document records, locate the corresponding files in the ProjeQtOr file storage directory, and upload them to Asana as Project or Task attachments via the Asana Attachments API. The original folder hierarchy is preserved as a prefix in the attachment name for traceability. Files exceeding Asana's 100 MB per-attachment limit are handled via Google Drive or Dropbox link custom fields.
ProjeQtOr
Bill / Budget
Asana
Custom monetary field
many:1ProjeQtOr Budgets track planned versus actual spending per project with line items and variance. We extract budget line items and actual expense totals and map them to Asana Project custom fields: budget_planned__c, budget_actual__c, and budget_variance__c. Detailed budget line items (category breakdown) are preserved as a linked CSV attachment on the Project. Asana has no native budget object; if the customer requires granular budget tracking, they use a third-party integration or a linked spreadsheet.
ProjeQtOr
Custom Field (EAV)
Asana
Custom Field (global)
lossyProjeQtOr stores custom fields as EAV rows in a separate attribute table, not as direct columns. We write migration queries that enumerate custom field definitions per object type, flatten the EAV rows into columnar records, and create matching global Custom Fields in the Asana workspace before data migration begins. The customer chooses whether each custom field applies project-wide or workspace-wide. Custom fields with no natural Asana equivalent are flagged for decision: drop, merge into a notes field, or create a new custom field.
ProjeQtOr
Workflow Status
Asana
Automation Rule or Section
lossyProjeQtOr custom status workflows per object type have no direct Asana equivalent. We read the workflow definition table and document every status value and transition rule per object. The customer decides whether to rebuild status-based routing as Asana Automation Rules (Advanced tier) or as named Sections within a Project. We deliver a written workflow inventory document listing each ProjeQtOr status workflow, its trigger, its stages, and the recommended Asana implementation approach.
| ProjeQtOr | Asana | Compatibility | |
|---|---|---|---|
| Project | Project1:1 | Fully supported | |
| Task | Task1:1 | Fully supported | |
| Milestone | Milestone1:1 | Fully supported | |
| Resource | User (member on Project)1:1 | Fully supported | |
| Allocation | Task assignee1:many | Fully supported | |
| Expense | Custom field on Task or Projectmany:1 | Fully supported | |
| Risk | Task with custom fields (or tag)lossy | Fully supported | |
| Issue | Task with tag1:1 | Fully supported | |
| Document | Attachment on Task or Projectlossy | Fully supported | |
| Bill / Budget | Custom monetary fieldmany:1 | Fully supported | |
| Custom Field (EAV) | Custom Field (global)lossy | Fully supported | |
| Workflow Status | Automation Rule or Sectionlossy | Fully supported |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
ProjeQtOr gotchas
No API means migrations rely on database exports or UI exports
PHP and database version dependencies constrain self-hosted upgrades
Custom fields stored as EAV rows require careful mapping
File attachments and documents are server-filesystem references
Asana gotchas
Automation rules have no export representation
API rate limits cap bulk migration throughput
Portfolios are view-only objects that do not hold data
Custom field enum options cannot be updated via API
Subtasks do not appear in project views by default
Pair-specific challenges
Migration approach
Discovery and database readiness assessment
We audit the source ProjeQtOr instance for PHP version, database type (MySQL or PostgreSQL), database size, table counts, and EAV custom field inventory. We confirm read-only database credentials are available or arrange a SQL dump from the application UI. We enumerate all Projects, Tasks, Milestones, Resources, Allocations, Expenses, Risks, Issues, and Documents in scope and produce a record-count estimate. We confirm the destination Asana workspace is provisioned and identify which tier (Basic, Premium, Business, Enterprise) the customer has selected based on custom field quota, Automation Rules needs, and Portfolio requirements.
Schema design and Asana custom field creation
We design the Asana workspace schema before any data loads. This includes creating all global Custom Fields in Asana mapped from the ProjeQtOr EAV custom field definitions (with type mapping: text to text, number to number, date to date, picklist to enum). We configure Project structure, default Sections per project, and Milestone settings. We create a written migration field map that documents every ProjeQtOr column, its ProjeQtOr data type, the corresponding Asana field, and any transformation logic. The schema is validated in the Asana workspace before data extraction begins.
Direct database extraction and EAV flattening
We run targeted SQL queries against the ProjeQtOr database to extract all objects in dependency order: Projects first, then Tasks with parent-child hierarchy, then Milestones, Resources, Allocations, Expenses, Risks, Issues, and Documents. For EAV custom fields, we write join queries that cross-reference the attribute definition table, the value table, and the parent object table to produce flattened records with one column per custom field. We extract document file paths and validate that the files exist in the ProjeQtOr file storage directory. We produce a staging dataset in CSV format for transformation and load.
Data transformation and reconciliation
We transform the extracted dataset into Asana-compatible format. This includes mapping ProjeQtOr status values to Asana completion state, resolving Resource email addresses to Asana User GIDs, splitting multi-allocation tasks into multiple assignee records with assignment percentage custom fields, aggregating Expenses and Budgets to Project-level custom fields, and constructing Risk and Issue tasks with appropriate tags and custom fields. We run a reconciliation check comparing source record counts to the transformed dataset row counts to catch any dropped records before the Asana load begins.
Asana load with API rate-limit handling
We load data into Asana using the REST API with a queue-based chunking strategy. Projects load first, then Tasks (with subtask hierarchy reconstructed via parent gid references), then Milestones, then Resources mapped to Workspace members, then Task assignments, then custom field values. Each batch is capped below the 1,500 calls per minute limit with exponential backoff on 429 responses. We load document attachments in parallel using the Attachments API, matching file paths to the ProjeQtOr file storage directory. We emit a row-count reconciliation report after each batch confirming records loaded against records expected.
Cutover, validation, and Workflow inventory handoff
We freeze writes to ProjeQtOr during cutover, run a final delta migration of any records modified during the migration window, then enable Asana as the system of record. We deliver a post-migration validation report comparing source and destination record counts per object type, spot-checking 25-50 records for data accuracy. We deliver the written Workflow and Risk Register inventory document listing every ProjeQtOr status workflow, its trigger and stages, and the recommended Asana Automation Rule or Section approach. We support a one-week hypercare window for reconciliation issues. We do not rebuild ProjeQtOr Workflows as Asana Automation Rules or rebuild Risk Registers as standalone objects; these are documented for the customer's admin to configure post-migration.
Platform deep dives
ProjeQtOr
Source
Strengths
Weaknesses
Asana
Destination
Strengths
Weaknesses
Complexity grading
Standard Project Management migration. 2 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across ProjeQtOr and Asana.
Object compatibility
2 of 8 objects need a mapping; the rest are 1:1.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
ProjeQtOr: Not applicable—no API exposed.
Data volume sensitivity
ProjeQtOr doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during ProjeQtOr to Asana migration scoping. Not seeing yours? Book a call.
Walk through your ProjeQtOr to Asana migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave ProjeQtOr
Other ways to arrive at Asana
Same-Project Management migrations
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.