Help us improve
Share bugs, ideas, or general feedback.
From kaseya-autotask
Manages Autotask PSA contracts for recurring services, block hours, time & materials, and billing using REST API. Useful for MSPs handling service agreements, renewals, and invoicing.
npx claudepluginhub wyre-technology/msp-claude-plugins --plugin autotaskHow this skill is triggered — by the user, by Claude, or both
Slash command
/kaseya-autotask:contractsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Contracts in Autotask define the service relationship with clients - what services you provide, how you bill for them, and what service levels apply. Contracts control how time and expenses flow to invoices and are critical for MSP financial management.
Guides HaloPSA contract management: service agreements, recurring billing, prepaid hours, renewals, types, SLAs, and financial workflows for MSPs.
Manages Autotask time entries for logging hours, billing calculations, approval workflows, utilization tracking, budget validation, and integrations with tickets/projects.
Manages ConnectWise PSA projects: create/update phases, templates, resource allocation, lifecycle, budgeting, billing methods, and tickets.
Share bugs, ideas, or general feedback.
Contracts in Autotask define the service relationship with clients - what services you provide, how you bill for them, and what service levels apply. Contracts control how time and expenses flow to invoices and are critical for MSP financial management.
| Type | Description | Billing Method |
|---|---|---|
| Recurring Services | Monthly/annual managed services | Fixed recurring fee |
| Block Hours | Prepaid hour bank | Deduct from balance |
| Time & Materials | Pay as you go | Bill actual time |
| Fixed Price | Project-based fixed fee | Milestone billing |
| Retainer | Prepaid monthly hours | Use or lose |
| Field | Description | Required |
|---|---|---|
id | Unique identifier | System |
contractName | Contract name | Yes |
companyID | Client company | Yes |
contractType | Type of contract | Yes |
status | Contract status | Yes |
startDate | Contract start | Yes |
endDate | Contract end | Yes |
setupFee | One-time setup fee | No |
timeReportingRequiresStartStopTimes | Require start/stop | No |
serviceLevelAgreementID | SLA assignment | No |
| ID | Status | Description |
|---|---|---|
| 1 | Active | Current, billable |
| 2 | Inactive | Suspended |
| 3 | Cancelled | Terminated |
Services define what's included in a contract:
| Field | Description |
|---|---|
serviceName | Name of service |
unitPrice | Price per unit |
unitCost | Cost per unit |
periodType | Monthly, Quarterly, Annual |
isOptional | Required vs optional |
POST /v1.0/Contracts
Content-Type: application/json
{
"contractName": "Acme Corp - Managed Services",
"companyID": 12345,
"contractType": 1,
"status": 1,
"startDate": "2024-01-01",
"endDate": "2024-12-31",
"setupFee": 500.00,
"timeReportingRequiresStartStopTimes": true,
"serviceLevelAgreementID": 1
}
POST /v1.0/ContractServices
Content-Type: application/json
{
"contractID": 54321,
"serviceID": 111,
"unitPrice": 150.00,
"adjustedPrice": 150.00,
"quantity": 50,
"effectiveDate": "2024-01-01"
}
POST /v1.0/Contracts
Content-Type: application/json
{
"contractName": "Acme Corp - Block Hours",
"companyID": 12345,
"contractType": 4,
"status": 1,
"startDate": "2024-01-01",
"endDate": "2024-06-30"
}
Then add block hours:
POST /v1.0/ContractBlocks
Content-Type: application/json
{
"contractID": 54322,
"datePurchased": "2024-01-01",
"hoursPurchased": 40,
"hourlyRate": 150.00,
"isPaid": true
}
Active contracts for a company:
{
"filter": [
{"field": "companyID", "op": "eq", "value": 12345},
{"field": "status", "op": "eq", "value": 1}
]
}
Contracts expiring soon:
{
"filter": [
{"field": "status", "op": "eq", "value": 1},
{"field": "endDate", "op": "lte", "value": "2024-03-31"},
{"field": "endDate", "op": "gte", "value": "2024-01-01"}
]
}
GET /v1.0/ContractBlocks/query?search={"filter":[{"field":"contractID","op":"eq","value":54322}]}
Calculate remaining hours:
hoursPurchased - Sum of time entries against contractCreate contract
Add services
Configure billing
Assign to tickets
Identify expiring contracts
Review contract performance
Negotiate renewal
Create renewal
Monitor balance
Replenish as needed
Handle overages
Contracts can be linked to SLAs:
| SLA Metric | Description |
|---|---|
| Response Time | Time to first response |
| Resolution Time | Time to resolve |
| Uptime | System availability % |
| Business Hours | When SLA applies |
SLA violations trigger alerts and can affect contract terms.
| Code | Message | Resolution |
|---|---|---|
| 400 | Invalid contract type | Use valid contract type ID |
| 400 | EndDate before StartDate | Fix date sequence |
| 409 | Cannot modify - has billing | Adjust dates only |
| 404 | ServiceID not found | Verify service exists |
"CompanyID is required" - Must associate with a company
"StartDate is required" - All contracts need start date
"Invalid service for contract type" - Service must match contract type