> AI agents: this is one page from PostHog's docs. Full index of Markdown docs for LLMs: https://posthog.com/llms.txt # Linking Personio as a source Canonical URL: https://posthog.com/docs/data-pipelines/sources/personio > **Cloud region:** This page uses US Cloud hosts. For an EU Cloud project, use `https://eu.posthog.com` instead of `https://us.posthog.com` or `https://app.posthog.com` (app host for links). ## On this page - [Prerequisites](#prerequisites) - [Linking Personio](#linking-personio) - [Sync modes](#sync-modes) - [Configuration](#configuration) - [Supported tables](#supported-tables) **Beta release** This source is currently in **beta**. It works end to end, but you may still hit rough edges. [Let us know](https://us.posthog.com/#panel=support%3Asupport%3Adata_warehouse%3A%3Atrue) if you do. ![](https://res.cloudinary.com/dmukukwp6/image/upload/texture_tan_9608fcca70) ![](https://res.cloudinary.com/dmukukwp6/image/upload/texture_tan_dark_a92b0e022d) 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. `npx @posthog/wizard warehouse` ![PostHog Wizard hedgehog](https://res.cloudinary.com/dmukukwp6/image/upload/wizard_3f8bb7a240.png) ![](https://res.cloudinary.com/dmukukwp6/image/upload/wizard_3f8bb7a240.png)Let AI connect your sources for you 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: 1. In Personio, go to **Settings** > **Integrations** > **API credentials** (requires admin access) 2. Create new API credentials with the following read scopes: - `personio:persons:read` - `personio:absences:read` - `personio:attendances:read` - `personio:salary-bands:read` - `personio:cost-centers:read` - `personio:recruiting:read` 3. Note down your **Client ID** and **Client secret** **Whitelist employee attributes** 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 1. Go to the [Data pipeline page](https://app.posthog.com/data-management/sources) and the sources tab in PostHog 2. Click **New source** and select Personio 3. Enter your **Client ID** and **Client secret** 4. *Optional:* Add a prefix to your table names 5. Select the tables you want to import 6. 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](https://app.posthog.com/data-management/sources). ## 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_at` filtering (available for persons, absence\_periods, and attendance\_periods) When you enable incremental sync for a supported table: 1. The first sync performs a full import to establish a baseline. 2. 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 | — | — |