Integration Example: PSA
Integration Example: PSA
Integration Example: PSA
This example shows a common integration pattern where a middleware tool sits between your Professional Services Automation (PSA, Agentursoftware) tool and awork.
The external system remains the source of truth for quotations and invoicing. awork is used for project execution, task collaboration, and time tracking.
Create this once per workspace. Use entity: "project" so the field can be set on projects.
Save the returned custom field definition ID for later, for example as externalProjectLinkCustomFieldDefinitionId.
You can either create from a project template or from scratch.
The response contains the awork id (project ID). Keep this mapping in your middleware:
projectId -> awork projectIdProject custom fields are available across all projects once the definition exists. You can set the value directly:
This makes navigation easier for users, because they can jump directly from awork to the related project in your PSA.
If your project template already creates the structure, you can skip this section.
Use the returned taskListId to place tasks:
For POST /tasks, pass the project ID in entityId when baseType is projecttask.
When work is completed (or in regular billing cycles), fetch billable but not-yet-billed time entries and map them back to your external project and task IDs.
Each time entry includes references such as:
id (awork time entry ID)projectId and nested projecttaskId and nested taskdurationisBillable and isBilledThis gives your middleware enough data to transform entries into invoice lines in your PSA.
If you instead need an export of already billed entries (for reconciliation), filter with isBilled eq true.
Some teams export billable, not-yet-billed entries and mark them as billed after successful export:
external project ID <-> awork project IDexternal task ID <-> awork task ID