Skip to content
PynPyn

Sync cadence and matching

Each integration refreshes on its own schedule, writes a History entry per run, and hands records to the Directory, which matches them to employees by external id or email. This reference lists the schedules and the matching rules, and the order Pyn uses to decide an employee’s time zone.

Integration Refreshes Also
BambooHR Every 5 minutes while active Change notifications from BambooHR between refreshes; runs with no changes are logged as skipped
HiBob Every 5 minutes while active Runs with no changes are logged as skipped
Rippling Every 5 minutes while active
Workday Every 5 minutes while active
ADP Workforce Now Every 5 minutes while active
Greenhouse Every 5 minutes while active
Ashby Every 15 minutes while active
Google Workspace Every 5 minutes while active Calendar events; Refresh Events on a calendar pulls now
Microsoft 365 Every 5 minutes while active Calendar events; Refresh Events pulls now
Slack Every 5 minutes while active Members and channels
Jira Every 12 hours while active Projects, and issue types of projects available to steps
Microsoft Teams Daily Team members and channels
Email (SendGrid) Every 5 minutes Delivery events
Employee File, Sample Data On upload or reload only

Deactivating an integration or pausing the workspace stops its refreshes. Each run appears under the integration panel’s History tab with a green, amber or red dot for success, a temporary error or a fatal error; Last Refresh and Last Successful Refresh on the Details tab show the most recent times. A credential failure moves the integration to Needs Attention 🚨 and raises a notice.

Every source record carries external keys, in order of precedence: the source’s own id (such as bamboohr:employee:123 or a Slack user id), then the work email. The Directory looks for an existing employee holding any of those keys and updates it; otherwise it creates one. So:

  • An HRIS record and a Slack member with the same work email become one employee with both sources attached. The employee’s profile lists each source, with Disconnect to unlink one: “Disconnect this source? The employee will no longer take any of their details from it.”
  • A hire from Greenhouse or Ashby appears as an upcoming employee; when the HRIS record arrives with the same work email it attaches to the same employee rather than creating a second.
  • The Employee File matches on employeeId first, so keep ids stable between uploads; a changed id creates a new person.
  • Slack and Teams membership alone does not create an employee; someone has to come from an HRIS, a file or an ATS.
  • One source is the employee’s primary; HRIS fields are read-only in Pyn and change only at the source.

Managers, HRBPs, buddies and mentors are linked by the source’s own ids and resolved after the referenced person has been synced, so a manager who joins later is linked on the next refresh.

The start date, termination date and active flag decide the stage: Joiner before the start date, Current from the start date, On leave when the source says so, and Terminated from the termination date. The seeded lifecycle groups (Upcoming, Current Active, Terminated, Inactive) and every trigger read these stages.

A step scheduled in the recipient’s time zone needs one. Pyn decides it from the source record in this order:

  1. The time zone the source supplies, as an IANA name (Europe/London), a common abbreviation or a Windows time zone name.
  2. The country plus postal code, for countries that span several zones: the United States, Canada and Australia.
  3. The country, when it has a single time zone.
  4. Otherwise the workspace Time Zone from Account Settings: “Employees without timezone data get messages in this default timezone.”

An Employee File row for a multi-zone country without a timeZone or postalCode is rejected with “Could not determine timezone from country … Add a postal code or choose a time zone.” A custom email recipient has its own Time Zone field with the same fallback.