Service Types

Define and manage categories of services

Overview

Service Types define the categories of work your organization performs. They provide default pricing, billing configuration, and integrate with QuickBooks for accounting. Types are classified using boolean flags such as isServiceType, isAppointmentType, isProjectType, and isServiceCall rather than a single category field. The display field holds the human-readable name, and isInactive indicates whether the type is disabled (note the inverted logic compared to an isActive flag).

List Service Types

Retrieve service types using cursor-based pagination. Use the selector argument to pass filters and search criteria.

query InfiniteTypes(
  $selector: TypesSelector
  $sort: Sort
  $first: Int!
  $after: String
) {
  infiniteTypes(
    selector: $selector
    sort: $sort
    first: $first
    after: $after
  ) {
    edges {
      node {
        id
        display
        desc
        defaultPrice
        isServiceType
        isAppointmentType
        isProjectType
        isServiceCall
        isInactive
        isTaxable
        isBilledHourly
        quickbooksId
      }
      cursor
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}

# Variables
{
  "first": 50,
  "selector": {
    "filters": {
      "isInactive": { "eq": false },
      "isServiceType": { "eq": true }
    },
    "search": "cleaning"
  }
}

Response:

{
  "data": {
    "infiniteTypes": {
      "edges": [
        {
          "node": {
            "id": "type_001",
            "display": "Weekly Pool Cleaning",
            "desc": "Standard weekly pool maintenance including skimming, brushing, and chemical testing",
            "defaultPrice": 75.00,
            "isServiceType": true,
            "isAppointmentType": false,
            "isProjectType": false,
            "isServiceCall": false,
            "isInactive": false,
            "isTaxable": false,
            "isBilledHourly": false,
            "quickbooksId": "QB-ITEM-001"
          },
          "cursor": "eyJpZCI6InR5cGVfMDAxIn0="
        },
        {
          "node": {
            "id": "type_002",
            "display": "Chemical Balance",
            "desc": "Test and adjust pool chemical levels",
            "defaultPrice": 50.00,
            "isServiceType": true,
            "isAppointmentType": false,
            "isProjectType": false,
            "isServiceCall": false,
            "isInactive": false,
            "isTaxable": false,
            "isBilledHourly": false,
            "quickbooksId": "QB-ITEM-002"
          },
          "cursor": "eyJpZCI6InR5cGVfMDAyIn0="
        }
      ],
      "pageInfo": {
        "hasNextPage": true,
        "endCursor": "eyJpZCI6InR5cGVfMDAyIn0="
      }
    }
  }
}

Filtering Options

The TypesSelector accepts a filters object and an optional search string (max 600 characters). Available filters on TypeFilters:

  • id - StringFilter
  • isInactive - BooleanFilter
  • isServiceType - BooleanFilter
  • isAppointmentType - BooleanFilter
  • isProjectType - BooleanFilter
  • isServiceCall - BooleanFilter
  • isTaxable - BooleanFilter
  • isBilledHourly - BooleanFilter
  • isQuotableServiceType - BooleanFilter
  • createdAt - DateTimeFilter
  • updatedAt - DateTimeFilter

Create Service Type

Create a new service type.

mutation CreateType($data: CreateTypeInput!) {
  createType(data: $data) {
    id
    display
    desc
    defaultPrice
    isServiceType
    isAppointmentType
    isInactive
    isTaxable
    createdAt
  }
}

# Variables
{
  "data": {
    "display": "Filter Replacement",
    "desc": "Replace pool filter cartridge or media",
    "defaultPrice": 150.00,
    "isServiceType": true,
    "isAppointmentType": false,
    "isProjectType": false,
    "isServiceCall": false,
    "isTaxable": true,
    "isBilledHourly": false
  }
}

Response:

{
  "data": {
    "createType": {
      "id": "type_010",
      "display": "Filter Replacement",
      "desc": "Replace pool filter cartridge or media",
      "defaultPrice": 150.00,
      "isServiceType": true,
      "isAppointmentType": false,
      "isInactive": false,
      "isTaxable": true,
      "createdAt": "2024-01-20T09:00:00Z"
    }
  }
}

Update Service Type

Update an existing service type.

mutation UpdateType($id: ID!, $data: UpdateTypeInput!) {
  updateType(id: $id, data: $data) {
    id
    display
    desc
    defaultPrice
    isInactive
    updatedAt
  }
}

# Variables
{
  "id": "type_001",
  "data": {
    "defaultPrice": 80.00,
    "desc": "Updated weekly maintenance service"
  }
}

Response:

{
  "data": {
    "updateType": {
      "id": "type_001",
      "display": "Weekly Pool Cleaning",
      "desc": "Updated weekly maintenance service",
      "defaultPrice": 80.00,
      "isInactive": false,
      "updatedAt": "2024-01-20T10:00:00Z"
    }
  }
}

Bulk & Export Operations

Exporting or bulk-editing many service types at once is handled asynchronously through the Bulk Operations API. These jobs run in the background and report progress you can poll. See the Bulk Operations guide for the full workflow.

Field Reference

FieldTypeDescription
idID!Unique identifier
displayString(nullable)Display name / human-readable name for the type
descString(nullable)Type description
defaultPriceNumber(nullable)Default price for this type
isAppointmentTypeBoolean(nullable)Whether this type is used for appointments
isQuotableServiceTypeBoolean(nullable)Whether this type can be quoted
isServiceTypeBoolean(nullable)Whether this is a service type
isProjectTypeBoolean(nullable)Whether this is a project type
isServiceCallBoolean(nullable)Whether this is a service call type
includesServiceCallFeeBoolean(nullable)Whether the service call fee is included
isTaxableBoolean(nullable)Whether this type is taxable
isBilledHourlyBoolean(nullable)Whether this type is billed hourly
isInactiveBoolean(nullable)Whether the type is inactive (true = inactive)
quickbooksIdString(nullable)QuickBooks item ID
minimumBillableHoursNumber(nullable)Minimum billable hours
intervalToRoundUpNumber(nullable)Interval to round up billable time
billedForTotalManHoursBoolean(nullable)Whether billed for total man-hours
deletedBoolean(nullable)Soft delete flag
createdAtDate!Creation timestamp
updatedAtDate!Last update timestamp
deletedAtDate(nullable)Deletion timestamp
appointmentDefaults[TypeAppointmentDefaultEntity](nullable)Default settings for appointments of this type
projectDefaults[TypeProjectDefaultEntity](nullable)Default settings for projects of this type
customServiceReportCustomServiceReportEntity(nullable)Custom service report configuration