Create a complete copy of an existing project with configurable options for what to include.
Copy a Project
The copy project mutation allows you to duplicate an existing project within the same company or to a different company. This is useful for creating project templates, setting up similar projects, or moving projects between companies. The copy operation runs asynchronously to handle large projects efficiently.
Basic Example
mutation CopyProject {
copyProject(
input: {
projectId: "proj_123abc"
name: "New Project Copy"
options: {
todos: true
todoLists: true
people: true
}
}
)
}
Advanced Example
mutation CopyProject {
copyProject(
input: {
projectId: "proj_123abc"
name: "Q2 Marketing Campaign"
description: "Copy of Q1 campaign with updated timeline"
imageURL: "https://example.com/campaign-logo.png"
companyId: "comp_789xyz"
options: {
assignees: true
automations: true
checklists: true
customFields: true
discussions: false
discussionComments: false
dueDates: true
files: true
forms: true
people: true
projectUserRoles: true
statusUpdates: false
statusUpdateComments: false
tags: true
todoActions: true
todoComments: false
todoLists: true
todos: true
}
}
)
}
Input Parameters
CopyProjectInput
Parameter | Type | Required | Description |
---|---|---|---|
projectId |
String! | ✅ Yes | The ID of the project to be copied |
name |
String! | ✅ Yes | The name for the new project (max 50 characters) |
description |
String | No | The description for the new project (max 500 characters) |
imageURL |
String | No | The image URL for the new project |
companyId |
String | No | The ID of the company where the new project should be created. If not provided, uses the source project's company |
options |
CopyProjectOptionsInput! | ✅ Yes | Configuration for what elements to copy |
CopyProjectOptionsInput
Parameter | Type | Required | Description |
---|---|---|---|
assignees |
Boolean | No | Copy task assignees (requires people: true ) |
automations |
Boolean | No | Copy project automations and workflows |
checklists |
Boolean | No | Copy task checklists |
customFields |
Boolean | No | Copy custom field definitions and values |
discussions |
Boolean | No | Copy project discussions |
discussionComments |
Boolean | No | Copy comments on discussions (requires discussions: true ) |
dueDates |
Boolean | No | Copy due dates on tasks |
files |
Boolean | No | Copy file attachments |
forms |
Boolean | No | Copy project forms |
people |
Boolean | No | Copy project members |
projectUserRoles |
Boolean | No | Copy user roles and permissions (requires people: true ) |
statusUpdates |
Boolean | No | Copy project status updates |
statusUpdateComments |
Boolean | No | Copy comments on status updates (requires statusUpdates: true ) |
tags |
Boolean | No | Copy project tags |
todoActions |
Boolean | No | Copy task actions/subtasks |
todoComments |
Boolean | No | Copy task comments |
todoLists |
Boolean | No | Copy task lists/sections |
todos |
Boolean | No | Copy tasks |
coverConfig |
Boolean | No | Copy todo cover image configuration |
Response
The mutation returns a Boolean
value:
true
- The copy job has been successfully queuedfalse
- The copy job could not be started
Checking Copy Status
Since copying is asynchronous, use the copyProjectStatus
query to check progress:
Copy Status Fields
Field | Type | Description |
---|---|---|
queuePosition |
Int | Position in the copy queue |
totalQueues |
Int | Total number of items in the queue |
isActive |
Boolean | Whether the copy operation is currently active |
oldProject |
Project | The source project being copied |
newProjectName |
String | Name of the new project being created |
isTemplate |
Boolean | Whether this is copying as a template |
oldCompany |
Company | Source company |
newCompany |
Company | Target company |
query CheckCopyStatus {
copyProjectStatus {
queuePosition
totalQueues
isActive
oldProject {
id
name
}
newProjectName
isTemplate
oldCompany {
id
name
}
newCompany {
id
name
}
}
}
Required Permissions
To copy a project, you need appropriate permissions in both the source and target locations:
Scenario | Required Permissions |
---|---|
Copy within same company | OWNER , ADMIN , or MEMBER role in the source project |
Copy to different company | • OWNER , ADMIN , or MEMBER role in the source project• Must be a member of the target company |
The source project must be active (not archived) to be copied.
Error Responses
Project Not Found
{
"errors": [{
"message": "Record not found",
"extensions": {
"code": "PROJECT_NOT_FOUND"
}
}]
}
Occurs when the source project doesn't exist or you lack access.
Company Not Found
{
"errors": [{
"message": "Record not found",
"extensions": {
"code": "COMPANY_NOT_FOUND"
}
}]
}
Occurs when the target company doesn't exist or you lack access.
Project Too Large
{
"errors": [{
"message": "Project is too large to copy",
"extensions": {
"code": "CREATE_PROJECT_LIMIT"
}
}]
}
Occurs when the project has more than 250,000 tasks.
Copy Already In Progress
{
"errors": [{
"message": "Oops!"
}]
}
Occurs when you already have a copy operation in progress.
Important Notes
- Asynchronous Operation: The mutation queues a background job and returns immediately. Use
copyProjectStatus
to track progress. - One Copy at a Time: Only one copy operation per user can be active at any time.
- Size Limitations: Projects with more than 250,000 tasks cannot be copied.
- Logical Dependencies: Some options work best together:
assignees
works withpeople: true
(assignees won't be copied without people)discussionComments
works withdiscussions: true
statusUpdateComments
works withstatusUpdates: true
projectUserRoles
works withpeople: true
- Name Processing: Project names are trimmed and any URLs are automatically removed.
- Queue Priority: Enterprise customers receive higher priority in the copy queue.
- Status Caching: Copy status is cached for 6 hours after completion.