Help us improve
Share bugs, ideas, or general feedback.
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 autotaskHow this skill is triggered — by the user, by Claude, or both
Slash command
/kaseya-autotask:expensesThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
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.
Creates, searches, and manages QuickBooks Online expense records, bills, and vendor payments. Covers Purchase (checks, credit cards, cash) and Bill entities, per-client cost tracking, vendor management, MSP categorization.
Manages Autotask time entries for logging hours, billing calculations, approval workflows, utilization tracking, budget validation, and integrations with tickets/projects.
Aggregates expense receipts from email by time period, categorizes by project or client, and outputs structured JSON schema for expense tools or accountants. Use for building reports from email receipts like 'what did I spend this month'.
Share bugs, ideas, or general feedback.
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