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.
Typical flow
- A quotation is approved in your PSA.
- Your middleware creates the related project in awork.
- Your middleware stores the external project link in awork as a project custom field.
- Your middleware creates task lists and tasks (or uses a project template).
- The team tracks time in awork while working on tasks.
- Your middleware fetches billed time entries from awork and sends them back to the external system for invoicing.
1) Create or reuse a project custom field for the external link
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.
2) Create the awork project when the quotation is approved
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:
- external system
projectId-> aworkprojectId
3) Store the external project link on the awork project
Project 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.
4) Create task lists and tasks (if you are not using a full template)
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.
5) Fetch invoiceable time entries for invoicing export
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)projectIdand nestedprojecttaskIdand nestedtaskdurationisBillableandisBilled
This 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.
Optional: mark exported time entries as billed
Some teams export billable, not-yet-billed entries and mark them as billed after successful export:
Implementation notes for your middleware tool
- The transport mechanism is up to you (for example n8n, custom backend, iPaaS).
- Store ID mappings in your middleware so you can always resolve both directions:
external project ID <-> awork project IDexternal task ID <-> awork task ID
- Use idempotency in your middleware (for example lookup by your stored external reference before creating).
- Export times in windows (for example daily) and persist a sync checkpoint to avoid duplicates.

