Project Management migration
Field-level mapping, validation, and rollback between ]project-open[ and Jira. We move data and schema; workflows are rebuilt natively in Jira.
]project-open[
Source
Jira
Destination
Compatibility
7 of 10
objects map 1:1 between ]project-open[ and Jira.
Complexity
BStandard
Timeline
6-10 weeks
Overview
Moving from ]project-open[ to Jira is an extraction-and-load migration that requires direct PostgreSQL access to the source because ]project-open[ exposes no public API. We connect to the database during discovery, traverse the acs_objects inheritance table and acs_rels join tables to reconstruct project-task hierarchies, company-contact links, and ticket-assignee relationships, then normalize 't'/'f' boolean values and multi-format datetime fields in the transform layer. On the Jira side we load via REST API with rate-limit awareness and batch chunking. We do not migrate ]project-open[ workflows, cost approval rules, ticketing SLA configurations, or financial approval chains as code; we deliver a written inventory of these for the customer's Jira admin to rebuild in Jira Automation or Structure. Jira is the destination in this migration, not the source, which means the API write path is fully supported by Atlassian's documented endpoints.
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 ]project-open[ object lands in Jira, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
]project-open[
Project
Jira
Project
1:1]project-open[ Projects (project_id inheriting from acs_objects) map directly to Jira Projects. The project_id becomes the Jira project key prefix (3-character uppercase alphanumeric). Project status lifecycle (potential, active, closed, on-hold) maps to Jira project category or we flag statuses requiring Jira Status mapping configuration. The acs_rels join table stores project-to-project parent-child relationships which we reconstruct as Jira Epic-Project or Project hierarchy links.
]project-open[
Task
Jira
Issue (Task subtype)
1:1Tasks in ]project-open[ are stored as task_id records keyed against the project tree. We extract parent-child task nesting from the task tree (task_p_id parent reference), resolve the status transitions via status_id enumeration, and assign users and teams from acs_rels memberships. Jira Issue creation uses the parent key to establish sub-task hierarchy, and task priority maps from ]project-open[ priority_id to Jira Priority field.
]project-open[
im_tickets (Ticket)
Jira
Issue (Bug or Task)
1:1Ticket records (im_tickets) store ticket_status_id and ticket_type_id as integer keys. We map these enumerations to Jira Status values and Issue Type (Bug, Task, Story) during the transform. Ticket description, conversation threads from im_tickets_and_invoices and associated message tables, and assignee from the im_ticket_assignee_map all migrate as Issue body, comments, and Assignee field. We traverse acs_rels for any ticket-to-project or ticket-to-company links to set the Jira Project and Reporter.
]project-open[
Company (im_companies)
Jira
Organization
1:1]project-open[ Companies (im_companies objects) with company_name, company_status_id, and object_type_id (customer or provider classification) map to Jira Organizations. We resolve all company-contact relationships from acs_rels and set the Organization as the primary entity with associated user accounts as Jira users. Companies without a Jira-matched Organization are created during the Organization load phase before any Issue import that references them.
]project-open[
Cost (im_costs)
Jira
Issue Worklog
1:manyFinancial records in ]project-open[ (im_costs) store invoice amounts, cost types, and billing status with variable_cost_p as a 't'/'f' char. Timesheet entries (cost entries linked to users and projects) merge into Jira Issue Worklog records. We convert the cost amount, billing type, and effective date to Jira Worklog fields (timeSpentSeconds, started, author), and resolve the cost's project_id and user_id to Jira Issue and User references. ]project-open[ cost approval workflows and invoice generation are not migrated; we document the financial approval chain as a written handoff for the customer's Jira admin to configure in Jira Automation or a third-party billing integration.
]project-open[
Timesheet Entry
Jira
Issue Worklog
1:1Timesheet hours are stored as cost entries in im_costs linked to users and projects. We extract hours_logged, date, and billing type for each entry, resolve the user_id to a Jira User account, and resolve the project_task_id to the target Jira Issue. Effective-dated entries are supported via the object creation timestamp preserved as the Jira Worklog started field.
]project-open[
User (acs_objects + application tables)
Jira
Jira User
1:1User accounts span acs_objects and application-specific tables in ]project-open[. We extract user_id, names, email, and group memberships from the OpenACS auth hierarchy. Resolution to Jira Users happens by email match. Users without an active Jira account are held in a reconciliation queue for the customer's Jira admin to provision before the main migration batch begins. Permissions and role hierarchies in ]project-open[ are not migrated; Jira project role configuration is a separate administrative step documented in the handoff.
]project-open[
Custom Field (dynamic attributes)
Jira
Jira Custom Field
lossyDynamic custom attributes in ]project-open[ are not stored as columns in the main tables; they exist in a separate dynamic attribute storage that requires per-object-type field discovery queries. We run a full attribute discovery pass across all object types before designing the Jira custom field schema. Each discovered custom attribute is provisioned as a Jira custom field of the appropriate type (text, number, date, select, multi-select) before migration, and the attribute values are loaded as custom field values in the same migration batch.
]project-open[
Office / Location
Jira
Organization address or Jira Project component
1:1Office objects in ]project-open[ store physical location data linked to companies and projects via acs_rels. We extract office name, address, and the acs_rel associations, then attach address data to the corresponding Jira Organization record. If Jira Organizations are not in use, the location data attaches to the Project description or a custom Project field.
]project-open[
Category
Jira
Jira Component or Label
lossyCategories are stored in a hierarchical category system used to classify objects (ticket type, project sector, cost type). We map category IDs to string labels during the transform phase and reconstruct the taxonomy as Jira Components (per-project) or Labels (cross-project). The customer's Jira admin chooses the categorization strategy during scoping.
| ]project-open[ | Jira | Compatibility | |
|---|---|---|---|
| Project | Project1:1 | Fully supported | |
| Task | Issue (Task subtype)1:1 | Fully supported | |
| im_tickets (Ticket) | Issue (Bug or Task)1:1 | Fully supported | |
| Company (im_companies) | Organization1:1 | Fully supported | |
| Cost (im_costs) | Issue Worklog1:many | Fully supported | |
| Timesheet Entry | Issue Worklog1:1 | Fully supported | |
| User (acs_objects + application tables) | Jira User1:1 | Fully supported | |
| Custom Field (dynamic attributes) | Jira Custom Fieldlossy | Fully supported | |
| Office / Location | Organization address or Jira Project component1:1 | Fully supported | |
| Category | Jira Component or Labellossy | 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.
]project-open[ gotchas
No public API forces direct PostgreSQL database access
Boolean fields use 't'/'f' char values not native booleans
Complex acs_objects inheritance and acs_rels traversal
Custom fields require pre-migration field discovery and mapping
Date and datetime storage formats vary across modules
Jira gotchas
Unsupported workflow validators silently skipped during migration
Custom fields converted to flat text labels when migrating to non-Jira platforms
Historical status-change timestamps lost when exporting without a Marketplace plugin
Attachment import failures from oversized files and JQL reference corruption
Points-based API rate limits enforced on Jira Cloud apps from March 2026
Pair-specific challenges
Migration approach
Database discovery and schema audit
We establish a read-only PostgreSQL connection to the ]project-open[ instance and run a comprehensive schema audit. This includes cataloguing all active modules (Projects, Tasks, Tickets, CRM, Financials, Ticketing), traversing the acs_objects inheritance tree to enumerate every Business Object type, running dynamic attribute discovery queries against all object types to enumerate custom fields, and extracting the acs_rels join table to map project-task, company-contact, and user-project relationship graphs. We also inventory the distinct status_id, object_type_id, and priority_id enumerations used across all modules. The output is a written schema map and a record count estimate that drives the migration timeline and price confirmation.
Jira destination configuration
We provision Jira Projects, Issue Types, and custom fields in the destination Jira instance via the Jira REST API (POST /rest/api/3/project for project creation; POST /rest/api/3/field for custom field creation). We configure Jira Issue Type schemes to match the ]project-open[ object type taxonomy (for example, Task + Sub-task for ]project-open[ tasks; Bug + Task for im_tickets). Workflows, Jira Automation rules, and SLA configurations are noted for the rebuild handoff; they are not created as part of the data migration. We also confirm Jira API rate limits with the customer based on their Jira tier and agree on a batch chunking strategy before any data loads begin.
Field mapping specification and custom field provisioning
We write a field mapping specification covering every source column and custom attribute with a destination Jira field and transform rule. This includes the boolean 't'/'f' to true/false conversion for all '_p' postfix columns, datetime normalization for epoch, date-only, and timestamptz source fields, acs_rels traversal results for parent-child and many-to-many relationship resolution, and category ID to string label lookup tables for all enumerated types. We pre-provision Jira custom fields for every discovered dynamic attribute before the data load phase begins.
PostgreSQL extraction and transform
We execute extraction queries against the ]project-open[ PostgreSQL database in dependency order: acs_objects hierarchy first, then related tables (im_projects, im_tickets, im_companies, im_costs), then acs_rels for relationships, then dynamic attribute values per object type. Boolean fields are converted in-SQL using CASE WHEN variable_cost_p = 't' THEN true ELSE false END. Datetime values are normalized to UTC timestamps. We write staged CSV or JSON files per object type. Each extraction emits a row count log that we compare against the discovery estimate. We validate foreign key integrity (project_id references, user_id lookups) before advancing to load.
Jira API load with rate-limit management
We load data into Jira using the Jira REST API with batch chunking and rate-limit handling. Projects and Organizations load first (parent records without dependencies). Users are reconciled by email match; unresolved owners are queued for admin provisioning. Issues load next using POST /rest/api/3/issue/bulk with 100 issues per batch, parent references resolved to Jira issue keys, and Assignee and Reporter resolved to Jira User accounts. Worklogs load last via POST /rest/api/3/issue/{issueIdOrKey}/worklog with the same batch and backoff strategy. We use exponential backoff (base 2 seconds, max 5 retries) on 429 responses. Each load phase emits a row count reconciliation report.
Cutover, reconciliation, and automation rebuild handoff
We freeze writes on ]project-open[ during the cutover window, run a final delta migration of any records modified since the last load, then set Jira as the system of record. We deliver a reconciliation report comparing ]project-open[ record counts against Jira record counts per object type and include a spot-check sample of 25-50 records for customer validation. We deliver the written inventory of ]project-open[ financial workflows, SLA rules, and automation triggers with Jira-rebuild recommendations. We support a one-week hypercare window for reconciliation issues raised by the customer's team. Jira Automation and Workflow rebuilds, post-migration admin training, and ongoing Jira administration are outside standard scope and are offered as separate engagements.
Platform deep dives
]project-open[
Source
Strengths
Weaknesses
Jira
Destination
Strengths
Weaknesses
Complexity grading
Standard Project Management migration. 3 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 ]project-open[ and Jira.
Object compatibility
3 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
]project-open[: Not applicable — no public API.
Data volume sensitivity
]project-open[ 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 ]project-open[ to Jira migration scoping. Not seeing yours? Book a call.
Walk through your ]project-open[ to Jira migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave ]project-open[
Other ways to arrive at Jira
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.