Employee events

The following events can be used to create Employee data updates Webhooks.

Before you dive into the various event types, make sure to follow these key steps, explore our guide Getting started with Bob webhooks.

Basic Employee events

EventTypeDescription
Updatedemployee.updatedTriggered when an employee's field is updated.
Createdemployee.createdTriggered when an employee is created.
Deletedemployee.deletedTriggered when an employee is deleted.

Table events

EventTypeDescription
Table Createdtable.entry.createdTriggered when an entry is added to an employee’s table.
Table Updatedtable.entry.updatedTriggered when an entry is updated in an employee’s table.

Notes:

  1. Deleting a table entry will not trigger a webhook event.
  2. When adding or updating an entry in an employee table, this action will trigger the following events:
  • 'table.entry.created' or 'table.entry.updated': depending on the operation. Note that deleting an entry does not trigger any events.
  • employee.updated: If you update the 'current' table entry (i.e., the entry with the current effective date), it will also trigger an 'employee.updated' event, as this change impacts the employee's current data. The event will include the field IDs of the updated entry fields (columns).
  1. The following tables do not trigger a 'table updated/created' event: Training, Equity, Positions, Jobs.

Lifecycle events

Lifecycle events refer to changes that affect an employee's status, such as rehiring, placing or returning from leave, and termination. To learn more, check out the lifecycle status in Bob overview. These updates create an entry in the employee's lifecycle table and trigger the event only when the lifecycle entry becomes effective and affects the employee's status.e

EventTypeDescription
Inactivatedemployee.inactivatedTriggered when an employee is set to be on leave or terminated, once the corresponding lifecycle entry becomes effective.
Activatedemployee.activatedTriggered when an employee's access is enabled, once the corresponding lifecycle entry becomes effective.
Joinedemployee.joinedTriggered when an employee is granted access, once the corresponding lifecycle entry becomes effective.
Terminatedemployee.leftTriggered when an employee is set as terminated or on 'Garden leave', depending on which occurs first, once the corresponding lifecycle entry becomes effective.
On Leaveemployee.temporaryLeaveTriggered when an employee is set to be on temporary leave, once the corresponding lifecycle entry becomes effective.

Lifecycle events (Inactivated, Activated, Joined, Terminated, On Leave) will be triggered automatically when the lifecycle entry becomes effective as part of Bob flows.

Important: When triggered via the flow, the lifecycle events will be added to the lifecycle table and triggered automatically at midnight on the effective date of the lifecycle table entry. For example, if an employee is terminated with an effective date of April 17, the termination event will trigger at midnight on April 18 (according to the site’s timezone). To learn more, see Handling scheduled employee changes.

Handling scheduled employee changes

When an employee's status is updated, Bob creates an entry in the relevant table with the date the change is to become effective (e.g., a promotion), and the status change event is triggered on the effective date.

When a scheduled change is added, Bob triggers the following webhook events:

  1. table.entry.created – Fires immediately when a new entry is added to the relevant table.
  2. table.entry.updated – Fires when changes occur in the existing entry.
  3. employee.updated – Fires immediately if the new entry affects employee fields.
  4. Lifecycle specific events – Some actions (e.g., an employee joining the company) trigger extra events like employee.joined at the effective date.

For example:

  • A promotion effective April 17 is recorded in the Work table when scheduled.
  • The table.entry.created event fires immediately when the entry is added.
  • On April 17 at midnight, the employee.updated event is triggered, reflecting the new promotion details (e.g. Job title).

If you need to detect and act on scheduled changes before they take effect:

  1. Listen for the table.entry.created or table.entry.updated event in the relevant table.
  2. Retrieve the entry via API:
    GET https://api.hibob.com/v1/people/{id}/{table}
  3. Locate the entry using the effectiveDate from the event.
  4. Check its details (e.g., new job title, lifecycle status) and take action.

This approach ensures you can track scheduled updates early, perform actions to prepare for the change, and act when they become effective.

Webhook events payloads

Created Payload



{
 "companyId": 637323,
 "type": "employee.created",
 "triggeredBy": "3332883804594373380",
 "triggeredAt": "2024-12-26T11:29:14.399997",
 "data": {
   "employeeId": "3332883894235038486"
 }
}

Joined Payload


{
 "companyId": 637323,
 "type": "employee.joined",
 "triggeredBy": "3332883804594373380",
 "triggeredAt": "2024-12-26T11:29:14.399997",
 "data": {
   "employeeId": "3332883894235038486"
 }
}

Terminated Payload


{
 "companyId": 637323,
 "type": "employee.left",
 "triggeredBy": "3332883804594373380",
 "triggeredAt": "2024-12-26T11:29:14.399997",
 "data": {
   "employeeId": "3332883894235038486"
 }
}

Updated Payload


{
 "companyId": 637323,
 "type": "employee.updated",
 "triggeredBy": "3332883804594373380",
 "triggeredAt": "2024-12-26T11:29:14.399997",
 "data": {
   "employeeId": "3332883894235038486",
   "fieldUpdates": [
     {
       "id": "personal.birthDate"
     }
   ]
 }
}

Note: Calculated fields, such as Full Name , are based on other base fields. They will trigger the update event when one of the base fields (First and Last Name) is updated.

Deleted Payload


{
 "companyId": 637323,
 "type": "employee.deleted",
 "triggeredBy": "3332883804594373380",
 "triggeredAt": "2024-12-26T11:29:14.399997",
 "data": {
   "employeeId": "3332883894235038486"
 }
}

Temporary Leave

{  
  "companyId": 636192,  
  "type": "employee.temporaryLeave",  
  "triggeredBy": "3332883804594373380",  
  "triggeredAt": "2025-01-08T13:06:26.935613",  
  "version": "v2",  
  "data": {  
    "employeeId": "3332883854254932743"  
  }  
}

Inactivated

{  
  "companyId": 636192,  
  "type": "employee.inactivated",  
  "triggeredBy": "3332883804594373380",  
  "triggeredAt": "2025-01-08T13:06:26.915964",  
  "version": "v2",  
  "data": {  
    "employeeId": "3332883854254932743"  
  }  
}

Table entry payloads

When a table entry is created or updated, the payload of the events will include the table identifier and the table entry identifier.

The entry identifier can be either:

  • entryId - identifies the entry in non-historical tables (effectiveDate will be 'null').
  • effectiveDate identifies the entry in historical tables (entryId will be null).

To learn more about table types, see Employee data modeling.

To view the updated entry, you should use the API to retrieve the table rows and find the relevant entry by the entry identifier.

Lifecycle entry

{
  "companyId": 636192,
  "type": "table.entry.created",
  "triggeredBy": "3332883804594373380",
  "triggeredAt": "2025-01-08T13:06:26.915906",
  "version": "v2",
  "data": {
    "employeeId": "3332883854254932743",
    "tableId": "lifecycle",
    "effectiveDate": "2025-01-08",
    "id": null
  }
}

Lifecycle entry events indicate the employee's 'lifecycle status' changed (such as Hired, Employed, Terminated, Garden leave, Leave, Parental leave). To find out what exactly is the status change, you should retrieve the relevant entry via API, locate the entry based on the effectiveDate, and then check the status property.

For example, if the entry data indicates that the status is 'terminated,' the employee was terminated. However, the effectiveDate is when this will take effect, and only then will you get the employee.left event (at midnight).

To learn more about retrieving Lifecycle entries via the API, see List employee's life-cycle status history.

Lifecycle entry - employee update

The lifecycle change above will also trigger the employee update event, and the payload depends on the fields that have changed due to the lifecycle update:

{  
  "companyId": 636192,  
  "type": "employee.updated",  
  "triggeredBy": "3332883804594373380",  
  "triggeredAt": "2025-01-08T13:06:26.893941",  
  "version": "v2",  
  "data": {  
    "employeeId": "3332883854254932743",  
    "fieldUpdatesIds": [  
      {  
        "id": "employee.recentLeaveStartDate"  
      },  
      {  
        "id": "internal.status"  
      },  
      {  
        "id": "employee.recentLeaveEndDate"  
      },  
      {  
        "id": "internal.lifecycleStatus"  
      }  
    ]  
  }  
}

Work entry

{
  "companyId": 636192,
  "type": "table.entry.created",
  "triggeredBy": "3332883804594373380",
  "triggeredAt": "2025-01-08T13:28:55.561963",
  "version": "v2",
  "data": {
    "employeeId": "3332883904477528858",
    "tableId": "work",
    "effectiveDate": "2024-09-02",
    "id": null
  }
}

{
  "companyId": 636192,
  "type": "table.entry.updated",
  "triggeredBy": "3332883804594373380",
  "triggeredAt": "2025-01-08T13:28:05.816304",
  "version": "v2",
  "data": {
    "employeeId": "3332883904477528858",
    "tableId": "work",
    "effectiveDate": "2024-03-27",
    "id": null
  }
}

To learn more about the Work data, see List employee's work history.

Work entry: employee update

The work change above will also trigger the employee update event:

{
  "companyId": 636192,
  "type": "employee.updated",
  "triggeredBy": "3332883804594373380",
  "triggeredAt": "2025-01-08T13:28:55.545382",
  "version": "v2",
  "data": {
    "employeeId": "3332883904477528858",
    "fieldUpdatesIds": [
      {
        "id": "work.department"
      },
      {
        "id": "work.title"
      },
      {
        "id": "work.activeEffectiveDate"
      }
    ]
  }
}

Employment entry

 {
  "companyId": 636192,
  "type": "table.entry.created",
  "triggeredBy": "3332883804594373380",
  "triggeredAt": "2025-01-08T13:30:41.592528",
  "version": "v2",
  "data": {
    "employeeId": "3332883904477528858",
    "tableId": "employment",
    "effectiveDate": "2025-01-08",
    "id": null
  }
}

To learn more about the Employment data, see List employee's employment history.

Employment entry: employee update

The employment change above will also trigger the employee update event:

{
  "companyId": 636192,
  "type": "employee.updated",
  "triggeredBy": "3332883804594373380",
  "triggeredAt": "2025-01-08T13:51:59.905057",
  "version": "v2",
  "data": {
    "employeeId": "3332883904477528858",
    "fieldUpdatesIds": [
      {
        "id": "payroll.employment.type"
      }
    ]
  }
}

Payroll entry (salary)

{
  "companyId": 636192,
  "type": "table.entry.updated",
  "triggeredBy": "3332883804594373380",
  "triggeredAt": "2025-01-08T13:55:45.055159",
  "version": "v2",
  "data": {
    "employeeId": "3332883904477528858",
    "tableId": "salary",
    "effectiveDate": "2015-03-03",
    "id": null
  }
}

To learn more about the Payroll data, see List employee's salary history.

Payroll entry: employee update

The Payroll (Salary) change above will also trigger the employee update event:

{
  "companyId": 636192,
  "type": "employee.updated",
  "triggeredBy": "3332883804594373380",
  "triggeredAt": "2025-01-08T13:55:45.017010",
  "version": "v2",
  "data": {
    "employeeId": "3332883904477528858",
    "fieldUpdatesIds": [
      {
        "id": "payroll.salary.monthlyPayment"
      },
      {
        "id": "payroll.salary.yearlyPayment"
      },
      {
        "id": "payroll.salary.payment"
      }
    ]
  }
}

Bank accounts entry

{
  "companyId": 636192,
  "type": "table.entry.created",
  "triggeredBy": "3332883804594373380",
  "triggeredAt": "2025-01-08T13:54:03.608759",
  "version": "v2",
  "data": {
    "employeeId": "3332883904477528858",
    "tableId": "bankAccounts",
    "effectiveDate": null,
    "id": 6236350
  }
}

To learn more about the bank accounts data, see List employee's bank accounts.