Skip to content

Autotask Integration

This integration syncs Autotask PSA data into Resplendent Data through the Autotask REST API.

It is a read-only, poll-based integration: Resplendent queries Autotask on a schedule and does not register or rely on webhooks.

What you can sync:

  • Customer context: Companies, Contacts, Resources, ConfigurationItems
  • Service desk: Tickets, ServiceCalls, ServiceCallTasks, ServiceCallTaskResources, ServiceCallTickets, ServiceCallTicketResources, Time Entries
  • Projects: Projects and Tasks
  • Contracts and billing: Contracts, ContractMilestones, ContractRates, ContractServiceBundles, ContractServices, ContractServiceUnits, Services, Products, Invoices

Supported datasets in the current integration:

  • Companies
  • Contacts
  • ContractMilestones
  • ContractRates
  • ContractServiceBundles
  • ContractServices
  • ContractServiceUnits
  • Contracts
  • ConfigurationItems
  • Invoices
  • Products
  • Projects
  • Resources
  • ServiceCalls
  • ServiceCallTasks
  • ServiceCallTaskResources
  • ServiceCallTickets
  • ServiceCallTicketResources
  • Services
  • Tasks
  • Tickets
  • Time Entries

Most Autotask reporting starts from a small set of numeric ID join paths. Use the fields below as your default links in the app.

Start dataset Join column Related dataset Related column Typical use
Companies id Contacts companyID Contacts by customer
Companies id Contracts companyID Contracts by customer
Companies id Projects companyID Projects by customer
Companies id Tickets companyID Ticket volume by customer
Companies id ServiceCalls companyID Service calls by customer
Companies id ConfigurationItems companyID Configuration items by customer
Companies id Invoices companyID Invoices by customer
Contracts id ContractMilestones contractID Milestones billed against a contract
Contracts id ContractRates contractID Hourly rates tied to a contract
Contracts id ContractServiceBundles contractID Service bundles attached to a contract
Contracts id ContractServices contractID Services attached to a contract
Contracts id ContractServiceUnits contractID Unit counts and pricing periods on a contract
Contracts id Projects contractID Projects tied to a contract
Contracts id Tickets contractID Tickets tied to a contract
ContractServices id ContractServiceUnits contractServiceID Quantity / units history for each contract service
Services id ContractServices serviceID Service metadata such as name or period type
Services id ContractServiceUnits serviceID Unit rows grouped by service
Projects id Tasks projectID Project workload and task completion
Projects id Tickets projectID Tickets associated with a project
Tasks id Time Entries taskID Time logged against tasks
Tickets id Time Entries ticketID Time logged against tickets
ServiceCalls id ServiceCallTasks serviceCallID Tasks linked to a service call
ServiceCalls id ServiceCallTickets serviceCallID Tickets linked to a service call
ServiceCallTasks id ServiceCallTaskResources serviceCallTaskID Resources assigned to service-call tasks
ServiceCallTickets id ServiceCallTicketResources serviceCallTicketID Resources assigned to service-call tickets
Resources id Tickets assignedResourceID Assigned technician on tickets
Resources id ServiceCallTaskResources resourceID Assignments on service-call tasks
Resources id ServiceCallTicketResources resourceID Assignments on service-call tickets
Resources id Time Entries resourceID Time by technician
  • Contract service quantity: Join ContractServices.id = ContractServiceUnits.contractServiceID. This is the clearest way to bring unit counts into reporting.
  • Contract service details: ContractServices already hydrates serviceName and servicePeriodType. ContractServiceUnits also hydrates unitPrice, serviceName, and servicePeriodType, so you often do not need an extra join to Services just to label unit rows.
  • Service call assigned resources: ServiceCallTaskResources is the cleanest assignment table. The integration hydrates serviceCallID, taskID, and resourceUserName onto it, so you can usually join it directly to ServiceCalls.id on serviceCallID.
  • Service call ticket assignments: ServiceCallTicketResources hydrates serviceCallID, ticketID, and resourceUserName, so it can usually join directly to ServiceCalls.id or Tickets.id. If you need the explicit bridge path, use ServiceCalls.id = ServiceCallTickets.serviceCallID and ServiceCallTickets.id = ServiceCallTicketResources.serviceCallTicketID.
  • Time against contract work: Join Time Entries.contractServiceID = ContractServices.id, Time Entries.contractServiceBundleID = ContractServiceBundles.id, or Time Entries.contractID = Contracts.id depending on whether you want service-, bundle-, or contract-level reporting.
  • Project execution: Join Projects.id = Tasks.projectID, then Tasks.id = Time Entries.taskID to compare planned work to logged work.
  • Customer billing: Join Invoices.companyID = Companies.id for invoice totals by customer, or Contracts.companyID = Companies.id for agreement reporting.
  • Configuration items under agreements: Join ConfigurationItems.companyID = Companies.id for customer inventory and ConfigurationItems.contractID = Contracts.id for agreement-linked assets.
  • Contracts adds companyName and billToCompanyName.
  • Tickets adds companyName plus several *UserName helper columns such as assignedResourceUserName.
  • Time Entries adds resourceUserName, creatorUserName, lastModifiedUserName, and other resource-name helpers.
  • ContractServices adds serviceName and servicePeriodType.
  • ContractServiceUnits adds unitPrice, serviceName, and servicePeriodType.
  • ServiceCallTasks adds assignedResourceID, taskNumber, title, and assignedResourceUserName.
  • ServiceCallTaskResources adds serviceCallID, taskID, and resourceUserName.
  • ServiceCallTickets adds assignedResourceID, ticketNumber, title, and assignedResourceUserName.
  • ServiceCallTicketResources adds serviceCallID, ticketID, and resourceUserName.
  • Invoices adds companyName, creatorResourceUserName, and voidedByResourceUserName.
  • The integration resolves Autotask picklist values to labels during sync by calling Autotask’s /entityInformation/fields endpoint.
  • Because of that, many reporting dimensions are already readable labels rather than foreign keys. Examples include status, priority, queueID, ticketType, and serviceLevelAgreementID.
  • Some of those fields still end in ID, but the synced value is already the label. Do not use those as join keys.
  • Use raw relationship fields such as companyID, contractID, projectID, taskID, ticketID, serviceCallID, resourceID, and contractServiceID for joins.
  • ContractServiceUnits is time-sliced. A single contractServiceID can have multiple rows across billing periods, so include startDate / endDate when charting unit changes over time.

Create a read-only security level for the API user. The integration only queries Autotask; it does not write back.

  • In Autotask, hover over the Admin icon
  • Click Account Settings & Users
  • Expand Resources/Users (HR)
  • Click Security Levels
  • Find API User (system) (API-only)
  • Right-click and select Copy
  • Name: Resplendent Data API User
  • Active: Checked

For this integration, the important requirement is API query access to the entities you want to sync.

  • In Web Services API, enable View (Query) for each dataset you plan to sync.
  • If you want the full integration, enable query access for all of the datasets listed earlier on this page.
  • Make sure the security level can also see the same records in the corresponding Autotask modules. If a dataset preview fails in Resplendent with a permissions warning, that entity type is still missing access.
  • If you want ConfigurationItems, make sure the API user can query and view configuration items in Autotask.
  • Webhooks are not required for this integration.

Click Save & Close.


Now create the user account that uses the security level you just made.

  • Go to Admin > Resources/Users (HR) > Resources/Users
  • Hover over the arrow next to New and select New API User
  • First Name: Resplendent
  • Last Name: Data
  • Security Level: Select Resplendent Data API User
  • Username (Key): Click Generate Key. Save this immediately.
  • Password (Secret): Click Generate Secret. Save this immediately.
  • If the API Tracking Identifier section is present, select Resplendent Data as the Integration Vendor.

Click Save & Close.


Look at your Autotask URL. If it’s https://ww2.autotask.net, your zone number is 2.

  • Log in to Resplendent Data
  • Click Integrations in the sidebar
  • Find Autotask and click + Connect
  • Fill in:
    • API Username: The Key from Part 2
    • API Password: The Secret from Part 2
    • Zone Number: From your URL
    • Connection Title: Something like “Autotask Production”
  • Click Save & Test
  • Once verified, click Sync Dataset to start pulling data

  • The integration is poll-based. It does not use Autotask webhooks or callback pushes.
  • Autotask limits responses to 500 rows per request, so large initial syncs and backfills are automatically paged.
  • Incremental refresh is currently supported for Companies, Contacts, ContractMilestones, Contracts, Products, Projects, ServiceCalls, Services, Tasks, Tickets, Time Entries, ConfigurationItems, and Invoices.
  • ContractRates, ContractServiceBundles, ContractServices, ContractServiceUnits, Resources, ServiceCallTasks, ServiceCallTaskResources, ServiceCallTickets, and ServiceCallTicketResources are currently treated as non-incremental tables.
  • Ticket deletions are tracked through Autotask DeletedTicketLogs, so deleted tickets can be removed on refresh. Other datasets do not currently emit explicit delete events through this integration.