Linking Personio as a source
This source is currently in beta. It works end to end, but you may still hit rough edges. Let us know if you do.
Let AI connect your sources for you
Skip the manual setup — run this in your project and the wizard auto-detects your databases and APIs and connects them to PostHog.

Contents
The Personio connector syncs your HR and recruiting data from Personio to PostHog. The following tables are supported:
| Table | Description | Sync mode |
|---|---|---|
| persons | Employee profiles and HR data | Full refresh and incremental |
| absence_periods | Employee absences and time-off records | Full refresh and incremental |
| attendance_periods | Employee attendance records | Full refresh and incremental |
| salary_bands | Salary band definitions | Full refresh only |
| cost_centers | Cost center definitions | Full refresh only |
| recruiting_jobs | Recruiting job postings | Full refresh only |
| recruiting_categories | Recruiting job categories | Full refresh only |
Prerequisites
Before linking Personio, create API credentials in your Personio account:
- In Personio, go to Settings > Integrations > API credentials (requires admin access)
- Create new API credentials with the following read scopes:
personio:persons:readpersonio:absences:readpersonio:attendances:readpersonio:salary-bands:readpersonio:cost-centers:readpersonio:recruiting:read
- Note down your Client ID and Client secret
You must whitelist the employee attributes you want to sync in your Personio API credential configuration. Attributes that aren't explicitly whitelisted are silently omitted from API responses.
Linking Personio
- Go to the Data pipeline page and the sources tab in PostHog
- Click New source and select Personio
- Enter your Client ID and Client secret
- Optional: Add a prefix to your table names
- Select the tables you want to import
- Click Import
The data warehouse then starts syncing your Personio data. You can see details, progress, and rows synced in the data pipeline sources tab.
Sync modes
Personio tables support full refresh syncing, and some tables also support incremental syncing:
- Full refresh – Re-imports all records from Personio on every sync
- Incremental – Only imports records modified since the last sync using
updated_atfiltering (available for persons, absence_periods, and attendance_periods)
When you enable incremental sync for a supported table:
- The first sync performs a full import to establish a baseline.
- Subsequent syncs only fetch records modified since the last sync.
Incremental syncing is more efficient for large Personio accounts, reducing sync time and API usage. If a sync is interrupted, it resumes from where it left off.
Tables without incremental support (salary_bands, cost_centers, recruiting_jobs, recruiting_categories) always perform a full refresh.
Configuration
| Option | Type | Required |
|---|---|---|
Client ID | text | Yes |
Client secret | password | Yes |
Supported tables
| Table | Description | Sync method | Incremental field | Primary key |
|---|---|---|---|---|
persons | An employee record in Personio, with profile attributes and employment details. | Incremental, Full refresh | updated_at | — |
absence_periods | A period of employee absence such as vacation or sick leave, including its dates and type. | Incremental, Full refresh | updated_at | — |
attendance_periods | A recorded period of employee working time (a shift or break), with start and end times. | Incremental, Full refresh | updated_at | — |
salary_bands | A salary band with its compensation range and the workplaces it applies to. | Full refresh | — | — |
cost_centers | A cost center defined in Personio, used to allocate people and time to finance dimensions. | Full refresh | — | — |
recruiting_jobs | A recruiting job (open position) in Personio, with its category, department and hiring team. | Full refresh | — | — |
recruiting_categories | A recruiting job category in Personio, with the ordered pipeline stages applications move through. | Full refresh | — | — |











