Help us improve
Share bugs, ideas, or general feedback.
From connectwise-psa
Manages ConnectWise PSA company records via API: create, update, search; handle types, statuses, sites/locations, custom fields, relationships.
npx claudepluginhub wyre-technology/msp-claude-plugins --plugin connectwise-psaHow this skill is triggered — by the user, by Claude, or both
Slash command
/connectwise-psa:companiesThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Companies in ConnectWise PSA represent your clients, prospects, vendors, and other business entities. Company records are central to ticketing, agreements, projects, and billing. This skill covers company CRUD operations, types, statuses, sites, and custom fields.
Guides management of Autotask CRM entities: companies, contacts, sites/locations, and opportunities. Useful for MSP account management, client onboarding, and REST API usage.
Manages Hudu companies (clients/organizations): create, search, update, archive; covers fields, PSA integrations, parent/child hierarchies, and related assets/passwords/articles.
Create, update, search, and manage ConnectWise PSA contact records including types, communication items (email, phone), portal access, and company relationships.
Share bugs, ideas, or general feedback.
Companies in ConnectWise PSA represent your clients, prospects, vendors, and other business entities. Company records are central to ticketing, agreements, projects, and billing. This skill covers company CRUD operations, types, statuses, sites, and custom fields.
Base: /company/companies
Standard company types in ConnectWise PSA:
| Type ID | Name | Description |
|---|---|---|
| 1 | Client | Active paying customer |
| 2 | Prospect | Potential customer |
| 3 | Vendor | Supplier or partner |
| 4 | Partner | Strategic partner |
| 5 | Competitor | Market competitor |
Note: Company types are configurable. Query /company/companies/types for your instance's types.
Standard company statuses:
| Status ID | Name | Description | Active |
|---|---|---|---|
| 1 | Active | Active company | Yes |
| 2 | Inactive | Inactive company | No |
| 3 | Not Approved | Pending approval | No |
Query /company/companies/statuses for available statuses.
| Field | Type | Required | Description |
|---|---|---|---|
id | int | System | Auto-generated unique identifier |
identifier | string(25) | Yes | Unique company code (e.g., "ACME") |
name | string(50) | Yes | Full company name |
status | object | No | {id: statusId} |
type | object | No | {id: typeId} |
| Field | Type | Required | Description |
|---|---|---|---|
phoneNumber | string(30) | No | Main phone |
faxNumber | string(30) | No | Fax number |
website | string(255) | No | Company website URL |
| Field | Type | Required | Description |
|---|---|---|---|
addressLine1 | string(50) | No | Street address |
addressLine2 | string(50) | No | Suite/unit |
city | string(50) | No | City |
state | string(50) | No | State/province |
zip | string(12) | No | Postal code |
country | object | No | {id: countryId} |
| Field | Type | Required | Description |
|---|---|---|---|
territory | object | No | {id: territoryId} - Sales territory |
market | object | No | {id: marketId} - Industry/market |
accountNumber | string(30) | No | External accounting ID |
taxIdentifier | string(25) | No | Tax ID/EIN |
annualRevenue | decimal | No | Company annual revenue |
numberOfEmployees | int | No | Employee count |
| Field | Type | Required | Description |
|---|---|---|---|
billingTerms | object | No | {id: termsId} - Payment terms |
billToCompany | object | No | {id: companyId} - Bill to different company |
invoiceDeliveryMethod | object | No | {id: methodId} - Email, Mail, etc. |
invoiceTemplate | object | No | {id: templateId} |
pricingSchedule | object | No | {id: scheduleId} |
| Field | Type | Required | Description |
|---|---|---|---|
ownerLevel | object | No | {id: levelId} - Account manager level |
defaultContact | object | No | {id: contactId} - Primary contact |
leadSource | string(50) | No | How lead was acquired |
leadFlag | boolean | No | Is this a lead |
| Field | Type | Required | Description |
|---|---|---|---|
dateAcquired | date | No | When became customer |
deletedFlag | boolean | System | Soft delete status |
mobileGuid | guid | System | Mobile app identifier |
_info | object | System | Metadata including last updated |
Sites represent physical locations for a company. Each company can have multiple sites.
/company/companies/{companyId}/sites
| Field | Type | Required | Description |
|---|---|---|---|
id | int | System | Site identifier |
name | string(50) | Yes | Site name |
addressLine1 | string(50) | No | Street address |
addressLine2 | string(50) | No | Suite/unit |
city | string(50) | No | City |
state | string(50) | No | State/province |
zip | string(12) | No | Postal code |
country | object | No | {id: countryId} |
phoneNumber | string(30) | No | Site phone |
faxNumber | string(30) | No | Site fax |
taxCode | object | No | {id: taxCodeId} |
defaultFlag | boolean | No | Is primary site |
POST /company/companies/{companyId}/sites
Content-Type: application/json
{
"name": "Main Office",
"addressLine1": "123 Main Street",
"city": "Springfield",
"state": "IL",
"zip": "62701",
"defaultFlag": true
}
Custom fields store company-specific data not in standard fields.
GET /company/companies/{companyId}/customFields
{
"id": 1,
"caption": "SLA Tier",
"value": "Gold",
"type": "Text"
}
Custom fields are updated via the company PATCH:
PATCH /company/companies/{id}
Content-Type: application/json
{
"customFields": [
{
"id": 1,
"value": "Platinum"
}
]
}
| Type | Description |
|---|---|
Text | Free-form text |
Number | Numeric value |
Date | Date value |
Checkbox | Boolean true/false |
Dropdown | Selection from list |
POST /company/companies
Content-Type: application/json
{
"identifier": "ACME",
"name": "Acme Corporation",
"status": {"id": 1},
"type": {"id": 1},
"addressLine1": "123 Main Street",
"city": "Springfield",
"state": "IL",
"zip": "62701",
"phoneNumber": "555-123-4567",
"website": "https://www.acme.com"
}
GET /company/companies/{id}
GET /company/companies?conditions=identifier="ACME"
PATCH /company/companies/{id}
Content-Type: application/json
{
"phoneNumber": "555-987-6543",
"status": {"id": 1}
}
GET /company/companies?conditions=name contains "Acme" and status/id=1
DELETE /company/companies/{id}
Note: Deleting a company with related records (tickets, contacts, etc.) will fail. Use status change to Inactive instead.
Active clients:
conditions=status/id=1 and type/id=1
Companies by territory:
conditions=territory/id=5
Companies with no contact:
conditions=defaultContact=null
Recently added companies:
conditions=_info/lastUpdated>[2024-01-01]
orderBy=_info/lastUpdated desc
Search by name:
conditions=name contains "tech"
Companies by market:
conditions=market/id=3
Companies can have hierarchical relationships:
GET /company/companies/{id}/managedDevicesIntegrations
| Entity | Relationship |
|---|---|
| Contacts | /company/contacts?conditions=company/id={id} |
| Tickets | /service/tickets?conditions=company/id={id} |
| Agreements | /finance/agreements?conditions=company/id={id} |
| Projects | /project/projects?conditions=company/id={id} |
| Configurations | /company/configurations?conditions=company/id={id} |
| Error | Cause | Resolution |
|---|---|---|
| Identifier required | Missing identifier | Provide unique company code |
| Name required | Missing company name | Include name field |
| Identifier exists | Duplicate identifier | Choose unique identifier |
| Cannot delete | Has related records | Set status to Inactive instead |
| Invalid status | Status doesn't exist | Query statuses endpoint |