From kaseya-autotask
Manages Autotask expense reports and items: creates reports/line items, searches by status/submitter, tracks reimbursable vs billable expenses, handles approval workflows, categories, receipts, and billing.
npx claudepluginhub wyre-technology/msp-claude-plugins --plugin autotaskThis skill uses the workspace's default tool permissions.
Expense reports track out-of-pocket costs incurred by technicians and staff during service delivery. Unlike time entries (which track labor hours), expense reports capture material costs like mileage, meals, equipment purchases, and travel expenses. Each report contains one or more expense items, and follows an approval workflow before reimbursement or client billing.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Analyzes BMad project state from catalog CSV, configs, artifacts, and query to recommend next skills or answer questions. Useful for help requests, 'what next', or starting BMad.
Expense reports track out-of-pocket costs incurred by technicians and staff during service delivery. Unlike time entries (which track labor hours), expense reports capture material costs like mileage, meals, equipment purchases, and travel expenses. Each report contains one or more expense items, and follows an approval workflow before reimbursement or client billing.
| Entity | Purpose | Relationship |
|---|---|---|
| Expense Report | Container/header for a group of expenses | Parent - groups items by period or purpose |
| Expense Item | Individual expense line item | Child - belongs to exactly one report |
| Status ID | Name | Description |
|---|---|---|
| 1 | New | Report created, not yet submitted |
| 2 | Submitted | Sent for manager approval |
| 3 | Approved | Manager approved, ready for processing |
| 4 | Paid | Reimbursement processed |
| 5 | Rejected | Manager rejected, needs correction |
| 6 | InReview | Under review by approver |
NEW (1) ──────────> SUBMITTED (2) ──────────> IN REVIEW (6)
│
┌───────────┴───────────┐
▼ ▼
APPROVED (3) REJECTED (5)
│ │
▼ ▼
PAID (4) Back to NEW
| Field | Type | Required | Description |
|---|---|---|---|
id | int | System | Auto-generated unique identifier |
name | string | No | Report name (e.g., "Feb 2026 Travel") |
description | string | No | Report description |
submitterId | int | Yes | Resource ID of the person submitting |
weekEndingDate | date | No | Week ending date (YYYY-MM-DD) |
status | int | System | Current approval status (1-6) |
| Field | Type | Required | Description |
|---|---|---|---|
expenseReportId | int | Yes | Parent expense report ID |
description | string | Yes | Line item description |
expenseDate | date | Yes | Date expense was incurred (YYYY-MM-DD) |
expenseCategory | int | Yes | Expense category picklist ID |
amount | decimal | Yes | Expense amount |
companyId | int | No | Associated company ID (0 for internal) |
paymentType | int | No | Payment type picklist ID |
isBillableToCompany | boolean | No | Whether billable to client |
isReimbursable | boolean | No | Whether reimbursable to employee |
haveReceipt | boolean | No | Whether receipt is attached |
Use autotask_get_field_info with entity ExpenseItem to get the full picklist for your instance. Common categories include:
| Category | Typical Use |
|---|---|
| Mileage | Driving to client sites |
| Meals | Client meetings, travel meals |
| Lodging | Overnight travel |
| Airfare | Flight costs |
| Parking/Tolls | On-site parking fees |
| Equipment | Small equipment purchases |
| Supplies | Office or project supplies |
| Other | Miscellaneous expenses |
| Type | Description |
|---|---|
| Cash | Out-of-pocket cash payment |
| Personal Credit Card | Employee's own card |
| Company Credit Card | Corporate card (usually not reimbursable) |
| Check | Payment by check |
Tool: autotask_create_expense_report
Args: {
"submitterId": 29744150,
"name": "Feb 2026 Client Travel",
"description": "Travel expenses for on-site visits",
"weekEndingDate": "2026-02-28"
}
Notes:
submitterId is the only required fieldname defaults to auto-generated if omittedweekEndingDate helps organize reports by periodTool: autotask_create_expense_item
Args: {
"expenseReportId": 12345,
"description": "Mileage to Contoso Ltd - server migration",
"expenseDate": "2026-02-15",
"expenseCategory": 1,
"amount": 45.50,
"companyId": 67890,
"isBillableToCompany": true,
"isReimbursable": true,
"haveReceipt": false
}
Required fields: expenseReportId, description, expenseDate, expenseCategory, amount
Tool: autotask_search_expense_reports
Args: {
"submitterId": 29744150,
"status": 1,
"pageSize": 25
}
Filters:
submitterId - Filter by who submittedstatus - Filter by approval status (1=New, 2=Submitted, 3=Approved, 4=Paid, 5=Rejected, 6=InReview)pageSize - Results per page (default 25, max 100)Tool: autotask_get_expense_report
Args: { "reportId": 12345 }
autotask_create_expense_report: {
"submitterId": <your_resource_id>,
"name": "Client Visit - Contoso Ltd",
"weekEndingDate": "2026-02-28"
}
autotask_create_expense_item: {
"expenseReportId": <report_id>,
"description": "Round trip to Contoso - 45 miles @ $0.67/mi",
"expenseDate": "2026-02-15",
"expenseCategory": <mileage_category_id>,
"amount": 30.15,
"companyId": <contoso_company_id>,
"isBillableToCompany": true,
"isReimbursable": true
}
autotask_create_expense_item: {
"expenseReportId": <report_id>,
"description": "Parking at Contoso office",
"expenseDate": "2026-02-15",
"expenseCategory": <parking_category_id>,
"amount": 12.00,
"companyId": <contoso_company_id>,
"isBillableToCompany": true,
"isReimbursable": true,
"haveReceipt": true
}
autotask_search_expense_reports: { "status": 2 }
Returns all submitted reports awaiting approval.
autotask_search_expense_reports: {
"submitterId": 29744150,
"status": 1
}
Returns draft reports for a specific employee.
| Scenario | Billable | Reimbursable | Example |
|---|---|---|---|
| Client site mileage | Yes | Yes | Driving to customer office |
| Company card purchase | Yes | No | Equipment on company card |
| Internal travel | No | Yes | Conference attendance |
| Company event | No | No | Team lunch on company card |
Key distinction:
isBillableToCompany) = Charge to the client's accountisReimbursable) = Pay back the employeeTo find valid expense category and payment type IDs for your instance:
Tool: autotask_get_field_info
Args: { "entity": "ExpenseItem", "field": "expenseCategory" }
Tool: autotask_get_field_info
Args: { "entity": "ExpenseItem", "field": "paymentType" }
| Error | Cause | Resolution |
|---|---|---|
| Invalid expenseCategory | Wrong picklist ID | Use autotask_get_field_info to get valid IDs |
| Invalid paymentType | Wrong picklist ID | Use autotask_get_field_info to get valid IDs |
| ExpenseReportId required | Missing parent report | Create a report first, then add items |
| Invalid submitterId | Resource not found | Verify with autotask_search_resources |
| Cannot modify approved report | Report already approved | Only NEW/REJECTED reports can be edited |
haveReceipt helps auditing; attach receipts in Autotask UIisBillableToCompany for client-recoverable costsautotask_get_field_info before creating items to get valid category/payment IDs