Linking Factorial as a source
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.

This source is currently in alpha. The interface and available tables may change.
The Factorial connector syncs your HR, time-off, attendance, payroll, and recruiting data into PostHog, so you can analyze it alongside your product data.
Prerequisites
You need a Factorial account with access to create an API key that has read access to your company's data.
Adding a data source
- In PostHog, go to the Sources tab of the data pipeline section.
- Click + New source and click Link next to this source.
- Enter your credentials (see Configuration below) and click Next.
- Select the tables you want to sync, choose a sync method and frequency, then click Import.
Once the syncs are complete, you can start querying this data in PostHog.
When linking Factorial, you'll need:
- API key – create an API key in your Factorial account under Settings > API keys (or Integrations > Public API). The key grants read access to your company's data across every supported table.
Sync modes
Each table can be synced in one of several modes, depending on what the source supports:
- Webhook (when available) – the source pushes changes to PostHog in real time. Fastest freshness, lowest ongoing cost, and the only mode that reliably captures updates and deletes.
- Incremental – only new or updated rows are synced on each run, using a cursor field (such as an
updated_attimestamp). Cheaper than a full refresh, but deletes aren't captured. - Append only – new rows are appended using a cursor field; existing rows are never updated. Ideal for immutable, append-only tables like event logs.
- Full refresh – the whole table is reloaded on every sync. Use it when a table has no reliable cursor or when you need deletions reflected.
See sync methods for a full explanation of how each mode works and how to choose between them.
This source is full refresh only.
Configuration
| Option | Type | Required |
|---|---|---|
API key | password | Yes |
Supported tables
| Table | Description | Sync method | Incremental field | Primary key |
|---|---|---|---|---|
employees | People employed at the company, with their personal and employment details. | Full refresh | — | — |
terminations | Termination events for employees who left the company, with the leaving date and reason. | Full refresh | — | — |
teams | Teams used to group employees within the company. | Full refresh | — | — |
team_memberships | Join records mapping employees to the teams they belong to. | Full refresh | — | — |
locations | Workplaces/locations the company operates from, including their time zones. | Full refresh | — | — |
legal_entities | Legal entities (companies) configured in the account. | Full refresh | — | — |
contract_versions | Versions of an employee's contract; the latest holds the current job title, salary, and working hours. | Full refresh | — | — |
compensations | Salary and compensation lines attached to a contract version, one row per pay concept. | Full refresh | — | — |
leaves | Individual time-off / absence records for employees. | Full refresh | — | — |
leave_types | Types of time off / absence configured for the company (e.g. holiday, sick leave). | Full refresh | — | — |
allowances | Time-off allowance counters (the buckets of days/hours employees can take). | Full refresh | — | — |
allowance_stats | Time-off counters per employee and allowance: how much is accrued, used, carried over and still available at the reference date. | Full refresh | — | — |
attendance_shifts | Attendance shifts: clock-in/clock-out records for employees. | Full refresh | — | — |
worked_times | Worked time aggregated per employee and day, including tracked, pending and multiplied minutes. | Full refresh | — | — |
expenses | Employee expenses submitted for reimbursement. | Full refresh | — | — |
cost_centers | Cost centers used to allocate employee, expense and project costs within the company. | Full refresh | — | — |
payroll_supplements | Payroll supplements (one-off additions or deductions applied to payroll). | Full refresh | — | — |
flexible_time_records | Flexible time records logged against projects (project time tracking). | Full refresh | — | — |
time_records | Time booked against projects, linking an attendance shift to the project worker and subproject it was spent on. | Full refresh | — | — |
projects | Projects used for time tracking. | Full refresh | — | — |
candidates | Candidates in the applicant tracking system (ATS). | Full refresh | — | — |
job_postings | Job postings published in the applicant tracking system (ATS). | Full refresh | — | — |
applications | Applications linking candidates to job postings in the ATS. | Full refresh | — | — |
application_phases | Phases of the hiring pipeline for a job posting, that applications move through. | Full refresh | — | — |
hiring_stages | Standard hiring stages the application phases of every job posting map onto. | Full refresh | — | — |
candidate_sources | Sources candidates come from, used for source-of-hire reporting. | Full refresh | — | — |
Troubleshooting
- If you see an invalid or revoked key error, create a new key in your Factorial account settings, then reconnect.
- If access is denied, check the key's permissions, then reconnect.
If your sync is failing or data looks wrong, see the Data warehouse troubleshooting guide. If that doesn't help, contact support – we're happy to help.