From connectwise-psa
Creates, updates, and manages ConnectWise PSA projects including phases, templates, resource allocation, and project tickets. Useful for MSPs automating project-based service delivery.
How this skill is triggered — by the user, by Claude, or both
Slash command
/connectwise-psa:projectsWhen to use
When creating, updating, managing project phases, templates, and resource allocation. Use when: connectwise project, project management, create project connectwise, project phase, project template, project resource, project budget, project billing, project ticket, or project schedule.
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Projects in ConnectWise PSA track larger bodies of work that span multiple tickets, phases, and resources. Projects support templates, phases, budgeting, resource allocation, and various billing methods. This skill covers project CRUD operations, phases, templates, resources, and project tickets.
Projects in ConnectWise PSA track larger bodies of work that span multiple tickets, phases, and resources. Projects support templates, phases, budgeting, resource allocation, and various billing methods. This skill covers project CRUD operations, phases, templates, resources, and project tickets.
Base: /project/projects
Standard project statuses in ConnectWise PSA:
| Status ID | Name | Description |
|---|---|---|
| 1 | Open | Active project |
| 2 | Closed | Completed project |
| 3 | On Hold | Temporarily paused |
| 4 | Cancelled | Cancelled project |
| 5 | Waiting | Awaiting approval/resources |
Query /project/projects/statuses for configurable statuses.
| Type ID | Name | Description |
|---|---|---|
| 1 | Project | Standard project |
| 2 | Template | Project template |
| Field | Type | Required | Description |
|---|---|---|---|
id | int | System | Auto-generated unique identifier |
name | string(100) | Yes | Project name |
company | object | Yes | {id: companyId} - Client company |
contact | object | No | {id: contactId} - Primary contact |
site | object | No | {id: siteId} - Company site |
board | object | No | {id: boardId} - Service board for tickets |
status | object | No | {id: statusId} |
type | object | No | {id: typeId} |
| Field | Type | Required | Description |
|---|---|---|---|
manager | object | No | {id: memberId} - Project manager |
team | array | No | Array of team member objects |
department | object | No | {id: departmentId} |
location | object | No | {id: locationId} |
| Field | Type | Required | Description |
|---|---|---|---|
estimatedStart | date | No | Planned start date |
estimatedEnd | date | No | Planned end date |
actualStart | date | System | When project actually started |
actualEnd | date | System | When project completed |
scheduledStart | datetime | No | Scheduled start datetime |
scheduledEnd | datetime | No | Scheduled end datetime |
| Field | Type | Required | Description |
|---|---|---|---|
estimatedHours | decimal | No | Total estimated hours |
actualHours | decimal | System | Hours logged to date |
budgetAnalysis | string | No | OverBudget, OnBudget, UnderBudget |
budgetHours | decimal | No | Budget cap in hours |
budgetAmount | decimal | No | Budget cap in dollars |
percentComplete | decimal | No | Completion percentage (0-100) |
| Field | Type | Required | Description |
|---|---|---|---|
billingMethod | string | No | ActualRates, FixedFee, NotToExceed, OverrideRate |
billingRateType | string | No | WorkRole, StaffMember |
billingAmount | decimal | No | Fixed fee or override rate |
billProjectAfterClosedFlag | boolean | No | Allow billing after closed |
billTime | string | No | Billable, DoNotBill, NoCharge |
billExpenses | string | No | Billable, DoNotBill, NoCharge |
billProducts | string | No | Billable, DoNotBill, NoCharge |
agreement | object | No | {id: agreementId} - Linked agreement |
| Field | Type | Required | Description |
|---|---|---|---|
description | string | No | Project description |
customerPO | string(50) | No | Customer PO number |
restrictDownPaymentFlag | boolean | No | Restrict down payment |
downpayment | decimal | No | Down payment amount |
Phases break projects into manageable chunks with their own timelines and budgets.
/project/projects/{projectId}/phases
| Field | Type | Required | Description |
|---|---|---|---|
id | int | System | Phase identifier |
description | string(100) | Yes | Phase name |
board | object | No | {id: boardId} |
status | object | No | {id: statusId} |
wbsCode | string(50) | No | Work breakdown structure code |
scheduledStart | datetime | No | Phase start date |
scheduledEnd | datetime | No | Phase end date |
scheduledHours | decimal | No | Planned hours |
actualStart | datetime | System | When phase started |
actualEnd | datetime | System | When phase completed |
actualHours | decimal | System | Hours logged |
billTime | string | No | Billable, DoNotBill, NoCharge |
markAsMilestoneFlag | boolean | No | Mark as milestone |
POST /project/projects/{projectId}/phases
Content-Type: application/json
{
"description": "Phase 1: Discovery",
"scheduledStart": "2024-03-01",
"scheduledEnd": "2024-03-15",
"scheduledHours": 40,
"wbsCode": "1.1"
}
Templates provide reusable project structures with pre-defined phases and tickets.
GET /project/projects?conditions=type/id=2
POST /project/projects
Content-Type: application/json
{
"name": "Client Onboarding - ACME Corp",
"company": {"id": 12345},
"templateFlag": false,
"projectTemplateId": 100
}
When using projectTemplateId, ConnectWise copies:
Project tickets are service tickets linked to a project and phase.
GET /project/projects/{projectId}/tickets
POST /service/tickets
Content-Type: application/json
{
"summary": "Configure Active Directory",
"board": {"id": 1},
"company": {"id": 12345},
"project": {"id": 5000},
"phase": {"id": 5001}
}
| Field | Type | Description |
|---|---|---|
project | object | {id: projectId} |
phase | object | {id: phaseId} |
POST /project/projects/{projectId}/teamMembers
Content-Type: application/json
{
"member": {"id": 123},
"projectRole": {"id": 1},
"startDate": "2024-03-01",
"endDate": "2024-06-01",
"hoursScheduled": 160
}
/project/projects/{projectId}/teamMembers
| Field | Type | Description |
|---|---|---|
member | object | {id: memberId} |
projectRole | object | {id: roleId} |
workRole | object | {id: workRoleId} |
startDate | date | Assignment start |
endDate | date | Assignment end |
hoursScheduled | decimal | Planned hours |
| Method | Description |
|---|---|
ActualRates | Bill at standard work role rates |
FixedFee | Fixed project price |
NotToExceed | Actual rates with cap |
OverrideRate | Custom hourly rate |
POST /project/projects
Content-Type: application/json
{
"name": "Website Redesign",
"company": {"id": 12345},
"billingMethod": "FixedFee",
"billingAmount": 15000.00
}
POST /project/projects
Content-Type: application/json
{
"name": "System Migration",
"company": {"id": 12345},
"billingMethod": "NotToExceed",
"budgetAmount": 25000.00
}
POST /project/projects
Content-Type: application/json
{
"name": "Office 365 Migration - ACME Corp",
"company": {"id": 12345},
"status": {"id": 1},
"manager": {"id": 100},
"estimatedStart": "2024-03-01",
"estimatedEnd": "2024-05-01",
"estimatedHours": 200,
"billingMethod": "ActualRates",
"description": "Migrate from on-premises Exchange to Office 365"
}
GET /project/projects/{id}
PATCH /project/projects/{id}
Content-Type: application/json
{
"percentComplete": 50,
"estimatedEnd": "2024-05-15"
}
PATCH /project/projects/{id}
Content-Type: application/json
{
"status": {"id": 2},
"actualEnd": "2024-05-10"
}
GET /project/projects?conditions=company/id=12345 and status/id=1
Active projects for company:
conditions=company/id=12345 and status/id=1
Projects by manager:
conditions=manager/id=100 and status/id=1
Overdue projects:
conditions=estimatedEnd<[2024-02-01] and status/id=1
Projects over budget:
conditions=budgetAnalysis="OverBudget"
Template projects:
conditions=type/id=2
| Error | Cause | Resolution |
|---|---|---|
| Company required | Missing company reference | Include company: {id: x} |
| Name required | Missing project name | Provide name field |
| Invalid status | Status doesn't exist | Query statuses endpoint |
| Invalid manager | Member doesn't exist | Verify member ID |
| Template not found | Invalid projectTemplateId | Query templates first |
npx claudepluginhub wyre-technology/msp-claude-plugins --plugin connectwise-psaManages Autotask PSA projects: creating projects, phases, milestones, tasks, and assigning resources. Use for client implementations, migrations, and scheduled MSP work.
Creates, updates, searches, and closes ConnectWise PSA tickets with SLA handling, notes, and closure validation. For MSP technicians managing service desk operations.
Automates Harvest time tracking, project management, and invoicing via natural language commands. Log hours, manage projects/clients/tasks, and pull reports from the terminal.