Skip to main content
Version: 1.7.3

Payroll Benefit Webhook

Webhooks allow your application to receive real-time notifications when payroll and benefit events occur for your integrated employers. Instead of polling the API for changes, configure a single callback URL and the service will push a notification to it each time an event is triggered.

Configure the Payroll Benefit Webhook:

  1. Log in to the developer console.

  2. Navigate to Settings >> Webhook.

  3. Click the Add Webhook button. When selecting the event type, choose Payroll Benefit Webhook.

    Triggered for all payroll and benefit activity, including employee lifecycle, pay period status, benefit management, and daily data sync.

  4. Enter your Callback URL and click Save. The service will immediately post a sample JSON payload to the URL. Your endpoint must return an HTTP 200 response to remain active. If the URL does not return 200, it will go inactive. You can retry posting the sample payload from the console to reactivate it.

Webhook Payload

Every notification is delivered as an HTTP POST to your callback URL with a JSON body in the following shape:

{
"eventType": "employee.created",
"entity_id": "a1b2c3d4-0000-0000-0000-000000000001",
"webhook_id": "f9e8d7c6-0000-0000-0000-000000000002",
"data": { }
}
FieldTypeDescription
eventTypestringIdentifies the specific event that occurred. See the table below.
entity_idUUID stringThe organization ID of the affected employer. This is the same value used as entity_ids on all API requests.
webhook_idUUID stringA unique ID for this delivery. Use it to deduplicate retried notifications.
dataobjectEvent-specific payload. Shape varies by eventType (see below). Absent for job.data_sync_all.completed.

Event Types

The eventType field in each payload tells you exactly what happened. All event types are delivered through the single Payroll Benefit Webhook URL you configured.

Employee Events

eventTypeWhen it fires
employee.createdA new employee's onboarding is fully complete.
employee.updatedAn employee's profile fields were updated.
employee.terminatedAn employee was terminated.
employee.rehiredA previously terminated employee was rehired.

data shape:

{
"individual_id": "<employee_id>",
"isActive": true
}

Pay Period Events

eventTypeWhen it fires
payperiod.completedA payroll run completed successfully.
payperiod.skippedA scheduled pay period was skipped.
payperiod.draftA pay period was returned to draft state.

data shape:

{
"payment_id": "<payment_id>",
"status": "completed"
}

Benefit Events

eventTypeWhen it fires
benefit.createdA new employer benefit was activated.
benefit.pausedAn employer benefit was paused (set inactive).
benefit.individual.enrolledAn individual was enrolled in a benefit.
benefit.individual.unenrolledAn individual was unenrolled from a benefit.

data shape — benefit.created / benefit.paused:

{
"benefit_id": "<benefit_id>",
"isActive": true
}

data shape — benefit.individual.enrolled / benefit.individual.unenrolled:

{
"benefit_id": "<benefit_id>",
"individual_id": "<employee_id>",
"enrollmentStatus": true
}

Benefit Job Events

Asynchronous benefit operations (create, update, enroll, unenroll) run as background jobs. These events report the outcome.

eventTypeWhen it fires
benefit_create.job.completedA benefit create or update job completed successfully.
benefit_create.job.failedA benefit create or update job failed.
benefit_enroll.job.completedA benefit enrollment job completed successfully.
benefit_enroll.job.failedA benefit enrollment job failed.
benefit_unenroll.job.completedA benefit unenrollment job completed successfully.
benefit_unenroll.job.failedA benefit unenrollment job failed.

data shape:

{
"job_id": "<job_id>",
"benefit_id": "<benefit_id>"
}

Data Sync Event

eventTypeWhen it fires
job.data_sync_all.completedThe daily data sync job has finished for all businesses.

This event has no data field. The notification is sent to every employer with an active API integration. The entity_id in the payload will be set to each recipient employer's own organization ID.

Delivery and Retry

  • Notifications are delivered over HTTPS POST with Content-Type: application/json.
  • Your endpoint must respond with HTTP 200 within the request timeout. Any other response code marks the delivery as failed.
  • Failed deliveries are retried automatically. If the URL repeatedly fails, it will be marked inactive in the console. Reactivate it by retrying the sample payload from the Webhook settings page.
  • Each notification includes a unique webhook_id. Use it to detect and discard duplicate deliveries caused by retries.