> ## Documentation Index
> Fetch the complete documentation index at: https://docs.flowpayroll.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Event types

> Every event Flow Payroll can send, how to subscribe to one, a family or everything, and what the Full and Minimal payloads contain.

Each event has a type such as `payslip.finalised`: the thing it is about, then what happened to it. Open any event below to see its exact payload.

## Subscribe to events

An endpoint's `eventTypes` accepts three kinds of value, and you can mix them:

| Value | Receives |
| - | - |
| `payslip.finalised` | Exactly that event. |
| `payslip.*` | Every event in the family, including ones added later. |
| `*` | Everything, including families added later. |

Set them when you create the endpoint, or change them later:

* `PUT /endpoints/{endpointId}/event-types` replaces the list.
* `POST /endpoints/{endpointId}/event-types` adds to it.
* `DELETE /endpoints/{endpointId}/event-types?eventType=payslip.deleted&eventType=payroll_run.*` removes several at once.
* `DELETE /endpoints/{endpointId}/event-types/{eventType}` removes one.

<Tip>
  Subscribe to what you handle, not to `*`. Every delivery costs your server a request, and exact types mean an event added in future never reaches code that does not expect it.
</Tip>

`GET /event-types` returns the same catalogue as this page, so your integration can check it at runtime.

## Full and Minimal payloads

Each endpoint chooses a `payloadStyle`.

* **`Full`** (the default) puts the whole record in `data`: the payslip, the employee, the P60. You can act on the event without calling back.
* **`Minimal`** puts only identifiers in `data`: the kind of record, its id and, when the event is about an employee, the employee's id. `metadata.resourceUrl`, when the event has one, says where to fetch the rest with your own API credentials. Choose it if you want to fetch only the fields you use, or always want the current state rather than the state when the event was sent.

A `Full` payload is a snapshot of the record when the event happened. Events can arrive late or out of order, so for the current state fetch `metadata.resourceUrl` with your own credentials. See [Treat a Full payload as a snapshot](/api-reference/webhooks/best-practices#treat-a-full-payload-as-a-snapshot).

In both styles, `payslip.created`, `payslip.updated`, `payslip.finalised` and the P45 and P60 `issued` and `replaced` events also carry `metadata.documentUrl`: where to download the document itself as a PDF. Call it with your own credentials, exactly as you call `resourceUrl`. It is an API address, not a presigned link, so it only works for a caller with access to the organisation. Every other event, including `payslip.deleted`, carries `null`.

```json Minimal data and metadata theme={null}
{
  "data": {
    "resourceType": "payslip",
    "resourceId": "01J9ZQ9A1B3C5D7E9F1G3H5J7K",
    "employeeId": "employee-001"
  },
  "metadata": {
    "resourceUrl": "https://api.flowpayroll.ai/v1/payslip/data/employee-001/2026/6",
    "documentUrl": "https://api.flowpayroll.ai/v1/payslip/data/employee-001/2026/6/file?frequency=Monthly",
    "payloadStyle": "Minimal",
    "payloadDowngraded": false
  }
}
```

A Full payload over 256 KB is sent as Minimal instead, with `payloadDowngraded: true`, so a very large record never fails to arrive. Fetch it from `resourceUrl`. Keep payloads in mind if your receiver limits request size: most are well under 20 KB.

### Personal data in payloads

A `Full` payload carries the whole record, and Flow Payroll does not remove sensitive fields from it. Depending on the event, that can include employees' names, National Insurance numbers, dates of birth, home and email addresses, phone numbers, bank details, passport numbers, pay, tax and deductions. The email events (`payslip.emailed`, `p60.email_failed` and the others) carry the address the email was sent to.

What Flow Payroll never sends is a link that works on its own. A presigned download link attached to a payslip email is removed before delivery, and `resourceUrl` and `documentUrl` are always API addresses that need your credentials.

A `Minimal` payload has no names, pay, tax, National Insurance numbers, bank or contact details. Its ids still point to a real employee, so treat it as personal data too.

Once a delivery reaches your receiver, you decide how it is stored, who can see it and how long it is kept. See [Protect what you receive](/api-reference/webhooks/best-practices#protect-what-you-receive).

## Versions

Every payload carries `apiVersion`, a date such as `2026-10-01`. An endpoint keeps the version it was created with until you choose to move it: Flow Payroll never changes an existing endpoint's payloads for you.

Within a version, changes only ever add to what you receive:

* a new optional field on a payload;
* a new event type;
* a new value in a field documented as open-ended.

Write your receiver to ignore fields and values it does not know. Anything that would break a receiver (renaming or removing a field, changing its type or meaning) only ever arrives in a new version, served alongside the old one. Event types are never renamed: a replacement is a new type, and the old one is deprecated with a date.

## Events you can subscribe to

### Billing your clients

| Event | When it is sent |
| - | - |
| [`invoice.issued`](/api-reference/webhooks/events/invoice-issued) | An invoice was issued to your client. |
| [`invoice.emailed`](/api-reference/webhooks/events/invoice-emailed) | Your accounting system confirmed it emailed the invoice to your client. |
| [`invoice.paid`](/api-reference/webhooks/events/invoice-paid) | Credit allocated to an invoice brought the amount owed to zero. |
| [`invoice.reopened`](/api-reference/webhooks/events/invoice-reopened) | A settled invoice is owed again because credit was removed from it. |
| [`invoice.voided`](/api-reference/webhooks/events/invoice-voided) | An invoice was voided. |
| [`credit_note.authorised`](/api-reference/webhooks/events/credit-note-authorised) | A credit note was authorised. |
| [`credit_note.allocated`](/api-reference/webhooks/events/credit-note-allocated) | Credit from a credit note was applied to an invoice. |
| [`credit_note.allocation_removed`](/api-reference/webhooks/events/credit-note-allocation-removed) | Credit was taken back off an invoice. |
| [`credit_note.voided`](/api-reference/webhooks/events/credit-note-voided) | A credit note was voided. |
| [`billing_client.created`](/api-reference/webhooks/events/billing-client-created) | A client you invoice was added. |
| [`billing_client.updated`](/api-reference/webhooks/events/billing-client-updated) | A client's details were changed. |
| [`billing_client.archived`](/api-reference/webhooks/events/billing-client-archived) | A client was archived. |
| [`billing_client.restored`](/api-reference/webhooks/events/billing-client-restored) | An archived client was made active again. |
| [`billing_client.deleted`](/api-reference/webhooks/events/billing-client-deleted) | A client with no invoices was removed. |

### Connections

| Event | When it is sent |
| - | - |
| [`integration_connection.connected`](/api-reference/webhooks/events/integration-connection-connected) | A connection to a provider, such as your accounting system or pension provider, is ready to use. |
| [`integration_connection.disconnected`](/api-reference/webhooks/events/integration-connection-disconnected) | A connection to a provider was disconnected. |
| [`integration_connection.reauthorisation_required`](/api-reference/webhooks/events/integration-connection-reauthorisation-required) | A provider stopped accepting a connection's sign-in. Reconnect it before anything else can be sent. |
| [`integration_connection.deleted`](/api-reference/webhooks/events/integration-connection-deleted) | A connection to a provider was removed. |

### Court orders

| Event | When it is sent |
| - | - |
| [`court_order.created`](/api-reference/webhooks/events/court-order-created) | A court order was attached to an employee. |
| [`court_order.updated`](/api-reference/webhooks/events/court-order-updated) | Someone changed a court order's terms, dates or status. |
| [`court_order.deleted`](/api-reference/webhooks/events/court-order-deleted) | A court order was removed. |
| [`court_order.status_changed`](/api-reference/webhooks/events/court-order-status-changed) | A court order became active, suspended, on hold or discharged. The event says what it was before and why. |
| [`court_order.deduction_applied`](/api-reference/webhooks/events/court-order-deduction-applied) | A deduction was taken for a court order in a pay run, in full or reduced by protected earnings. |
| [`court_order.deduction_skipped`](/api-reference/webhooks/events/court-order-deduction-skipped) | A pay run called for a deduction but nothing could be taken, because of protected earnings or no eligible earnings. |

### Emails we send for you

| Event | When it is sent |
| - | - |
| [`payslip.emailed`](/api-reference/webhooks/events/payslip-emailed) | A payslip email was accepted for delivery. |
| [`payslip.email_failed`](/api-reference/webhooks/events/payslip-email-failed) | A payslip email could not be delivered. |
| [`payslip.delivered`](/api-reference/webhooks/events/payslip-delivered) | The payslip email reached the employee's mail server. |
| [`payslip.bounced`](/api-reference/webhooks/events/payslip-bounced) | The payslip email was rejected by the employee's mail server. |
| [`payslip.complained`](/api-reference/webhooks/events/payslip-complained) | The payslip email was marked as spam by its recipient. |
| [`p45.emailed`](/api-reference/webhooks/events/p45-emailed) | A P45 email was accepted for delivery. |
| [`p45.email_failed`](/api-reference/webhooks/events/p45-email-failed) | A P45 email could not be delivered. |
| [`p45.delivered`](/api-reference/webhooks/events/p45-delivered) | The P45 email reached the employee's mail server. |
| [`p45.bounced`](/api-reference/webhooks/events/p45-bounced) | The P45 email was rejected by the employee's mail server. |
| [`p45.complained`](/api-reference/webhooks/events/p45-complained) | The P45 email was marked as spam by its recipient. |
| [`p60.emailed`](/api-reference/webhooks/events/p60-emailed) | A P60 email was accepted for delivery. |
| [`p60.email_failed`](/api-reference/webhooks/events/p60-email-failed) | A P60 email could not be delivered. |
| [`p60.delivered`](/api-reference/webhooks/events/p60-delivered) | The P60 email reached the employee's mail server. |
| [`p60.bounced`](/api-reference/webhooks/events/p60-bounced) | The P60 email was rejected by the employee's mail server. |
| [`p60.complained`](/api-reference/webhooks/events/p60-complained) | The P60 email was marked as spam by its recipient. |
| [`pension_enrolment_letter.delivered`](/api-reference/webhooks/events/pension-enrolment-letter-delivered) | The pension enrolment letter email reached the employee's mail server. |
| [`pension_enrolment_letter.bounced`](/api-reference/webhooks/events/pension-enrolment-letter-bounced) | The pension enrolment letter email was rejected by the employee's mail server. |
| [`pension_enrolment_letter.complained`](/api-reference/webhooks/events/pension-enrolment-letter-complained) | The pension enrolment letter email was marked as spam by its recipient. |
| [`report.emailed`](/api-reference/webhooks/events/report-emailed) | A report email was accepted for delivery. |
| [`report.email_failed`](/api-reference/webhooks/events/report-email-failed) | A report email could not be delivered. |
| [`report.delivered`](/api-reference/webhooks/events/report-delivered) | The report email reached the recipient's mail server. |
| [`report.bounced`](/api-reference/webhooks/events/report-bounced) | The report email was rejected by the recipient's mail server. |
| [`report.complained`](/api-reference/webhooks/events/report-complained) | The report email was marked as spam by its recipient. |

### Employees

| Event | When it is sent |
| - | - |
| [`employee.created`](/api-reference/webhooks/events/employee-created) | An employee record was created. |
| [`employee.updated`](/api-reference/webhooks/events/employee-updated) | An employee record changed, in a way with no more specific event. When one change also touches a field below, that field has its own event and this one covers only the rest. |
| [`employee.deleted`](/api-reference/webhooks/events/employee-deleted) | An employee record was deleted. |
| [`employee.tax_code_changed`](/api-reference/webhooks/events/employee-tax-code-changed) | An employee's tax code changed, whether edited directly or applied from an HMRC P6 or P9 notice. |
| [`employee.ni_category_changed`](/api-reference/webhooks/events/employee-ni-category-changed) | An employee's National Insurance category letter changed. |
| [`employee.salary_changed`](/api-reference/webhooks/events/employee-salary-changed) | An employee's contractual salary or hourly rate changed. |
| [`employee.student_loan_changed`](/api-reference/webhooks/events/employee-student-loan-changed) | An employee's student or postgraduate loan plan started or ended. |
| [`employee.working_pattern_changed`](/api-reference/webhooks/events/employee-working-pattern-changed) | An employee's working pattern or working schedule changed. |
| [`employee.payroll_config_changed`](/api-reference/webhooks/events/employee-payroll-config-changed) | An employee moved to a different payroll configuration. |

### HMRC notices

| Event | When it is sent |
| - | - |
| [`hmrc_notice.received`](/api-reference/webhooks/events/hmrc-notice-received) | HMRC sent a notice, such as a new tax code (P6 or P9), a student or postgraduate loan start or stop, or a general message, and it is waiting to be reviewed. |
| [`hmrc_notice.employee_matched`](/api-reference/webhooks/events/hmrc-notice-employee-matched) | An HMRC notice was linked to an employee, automatically or by hand. |
| [`hmrc_notice.applied`](/api-reference/webhooks/events/hmrc-notice-applied) | An HMRC notice was applied to the employee's record. |
| [`hmrc_notice.dismissed`](/api-reference/webhooks/events/hmrc-notice-dismissed) | An HMRC notice was dismissed without changing the employee's record. |
| [`hmrc_notice.reopened`](/api-reference/webhooks/events/hmrc-notice-reopened) | An applied or dismissed HMRC notice was marked as needing action again. |
| [`hmrc_notice_job.completed`](/api-reference/webhooks/events/hmrc-notice-job-completed) | A check for HMRC notices, or a bulk apply or dismiss, finished. |
| [`hmrc_notice_job.failed`](/api-reference/webhooks/events/hmrc-notice-job-failed) | A check for HMRC notices, or a bulk apply or dismiss, could not finish. |
| [`hmrc_notice_job.cancelled`](/api-reference/webhooks/events/hmrc-notice-job-cancelled) | A notice job was stopped by a person before it finished. |

### HMRC RTI

| Event | When it is sent |
| - | - |
| [`rti.fps_accepted`](/api-reference/webhooks/events/rti-fps-accepted) | HMRC accepted a Full Payment Submission. |
| [`rti.fps_rejected`](/api-reference/webhooks/events/rti-fps-rejected) | HMRC rejected a Full Payment Submission, or it could not be sent. Carries HMRC's own error codes. |
| [`rti.eps_accepted`](/api-reference/webhooks/events/rti-eps-accepted) | HMRC accepted an Employer Payment Summary. |
| [`rti.eps_rejected`](/api-reference/webhooks/events/rti-eps-rejected) | HMRC rejected an Employer Payment Summary, or it could not be sent. Carries HMRC's own error codes. |

### Holiday and leave

| Event | When it is sent |
| - | - |
| [`holiday_leave.recorded`](/api-reference/webhooks/events/holiday-leave-recorded) | A single day of leave was recorded. |
| [`holiday_leave.updated`](/api-reference/webhooks/events/holiday-leave-updated) | A recorded day of leave was amended. |
| [`holiday_leave.deleted`](/api-reference/webhooks/events/holiday-leave-deleted) | A recorded day of leave was removed. |
| [`holiday_accrual.recorded`](/api-reference/webhooks/events/holiday-accrual-recorded) | Holiday was accrued from a finalised payslip. Once per employee per pay run, for the percentage-of-time scheme. |
| [`holiday_rolled_up_pay.recorded`](/api-reference/webhooks/events/holiday-rolled-up-pay-recorded) | Rolled-up holiday pay was paid on a finalised payslip. Replaces an accrual-and-leave pair that would net to zero. |
| [`holiday_opening_balance.recorded`](/api-reference/webhooks/events/holiday-opening-balance-recorded) | An opening holiday balance was set for an employee. |
| [`holiday_opening_balance.updated`](/api-reference/webhooks/events/holiday-opening-balance-updated) | An opening holiday balance was corrected. |
| [`holiday_opening_balance.deleted`](/api-reference/webhooks/events/holiday-opening-balance-deleted) | An opening holiday balance was removed. |
| [`holiday_employee_config.created`](/api-reference/webhooks/events/holiday-employee-config-created) | An employee's holiday configuration was created, overriding the organisation's. |
| [`holiday_employee_config.updated`](/api-reference/webhooks/events/holiday-employee-config-updated) | An employee's holiday configuration was changed. Affects how every later payslip pays holiday. |
| [`holiday_employee_config.deleted`](/api-reference/webhooks/events/holiday-employee-config-deleted) | An employee's holiday configuration was removed, so they fall back to the organisation's. |
| [`holiday_organisation_config.created`](/api-reference/webhooks/events/holiday-organisation-config-created) | An organisation's holiday configuration was created. |
| [`holiday_organisation_config.updated`](/api-reference/webhooks/events/holiday-organisation-config-updated) | An organisation's holiday configuration was changed. |
| [`holiday_organisation_config.deleted`](/api-reference/webhooks/events/holiday-organisation-config-deleted) | An organisation's holiday configuration was removed. |

### Journals

| Event | When it is sent |
| - | - |
| [`journal.finalised`](/api-reference/webhooks/events/journal-finalised) | A pay run's journal was locked for the first time and is ready to post. |
| [`journal.reissued`](/api-reference/webhooks/events/journal-reissued) | A corrected version of a locked journal replaced the previous one. The event says which version it replaced. |
| [`journal.reissue_failed`](/api-reference/webhooks/events/journal-reissue-failed) | A requested correction could not be built, so the previous locked journal still stands. |
| [`journal.posted`](/api-reference/webhooks/events/journal-posted) | Your accounting system accepted the journal. |
| [`journal.post_failed`](/api-reference/webhooks/events/journal-post-failed) | Your accounting system refused the journal, or retries ran out. |
| [`journal.voided`](/api-reference/webhooks/events/journal-voided) | The accounting entry for a replaced journal version was reversed. |
| [`journal.void_failed`](/api-reference/webhooks/events/journal-void-failed) | Reversing a replaced version's accounting entry failed, so the pay run may be in your ledger twice. |

### Leavers

| Event | When it is sent |
| - | - |
| [`employee.leaver.recorded`](/api-reference/webhooks/events/employee-leaver-recorded) | An employee was marked as leaving, with a leaving date. |
| [`employee.leaver.reverted`](/api-reference/webhooks/events/employee-leaver-reverted) | A leaver marking was undone and the employee is active again. |

### P45s and P60s

| Event | When it is sent |
| - | - |
| [`p45.issued`](/api-reference/webhooks/events/p45-issued) | A P45 was produced for a leaver. |
| [`p45.replaced`](/api-reference/webhooks/events/p45-replaced) | A replacement P45 was issued, superseding the previous one. |
| [`p45.revoked`](/api-reference/webhooks/events/p45-revoked) | An issued P45 was withdrawn and its document deleted. |
| [`p60.issued`](/api-reference/webhooks/events/p60-issued) | A P60 was produced for an employee at year end. |
| [`p60.replaced`](/api-reference/webhooks/events/p60-replaced) | A replacement P60 was issued, superseding the previous one. |
| [`p60.revoked`](/api-reference/webhooks/events/p60-revoked) | An issued P60 was withdrawn and its document deleted. |
| [`p_form_bulk_send.completed`](/api-reference/webhooks/events/p-form-bulk-send-completed) | A bulk P45/P60 send job finished. Names up to 100 employees who were not sent theirs, each with a reason, and counts every failure by reason. |
| [`p_form_bulk_send.failed`](/api-reference/webhooks/events/p-form-bulk-send-failed) | A bulk P45/P60 send job could not run. |

### Pay run line items

| Event | When it is sent |
| - | - |
| [`payroll_line_item.created`](/api-reference/webhooks/events/payroll-line-item-created) | A line item was added to a pay run. |
| [`payroll_line_item.updated`](/api-reference/webhooks/events/payroll-line-item-updated) | A line item on a pay run was changed. |
| [`payroll_line_item.deleted`](/api-reference/webhooks/events/payroll-line-item-deleted) | A line item was removed from a pay run. |

### Pay runs

| Event | When it is sent |
| - | - |
| [`payroll_run.opened`](/api-reference/webhooks/events/payroll-run-opened) | A pay run was opened and is accepting changes. |
| [`payroll_run.locked`](/api-reference/webhooks/events/payroll-run-locked) | A pay run was locked. Final unless it is later reopened. |
| [`payroll_run.completed`](/api-reference/webhooks/events/payroll-run-completed) | A pay run finished processing. |
| [`tax_year.finalised`](/api-reference/webhooks/events/tax-year-finalised) | A tax year was finalised for the organisation. |

### Payments

| Event | When it is sent |
| - | - |
| [`payment_file.generated`](/api-reference/webhooks/events/payment-file-generated) | The payment file for a pay run is ready to download and send to your bank. |
| [`payment_file.failed`](/api-reference/webhooks/events/payment-file-failed) | The payment file for a pay run could not be generated. The event says why and which employees need fixing. |
| [`payment_settings.created`](/api-reference/webhooks/events/payment-settings-created) | Bank account and payment file settings were added for a payroll. |
| [`payment_settings.updated`](/api-reference/webhooks/events/payment-settings-updated) | The bank account and settings used to make payment files for a payroll were changed. |
| [`payment_settings.deleted`](/api-reference/webhooks/events/payment-settings-deleted) | The payment settings for a payroll were removed, so no payment file can be made for it. |

### Payslips

| Event | When it is sent |
| - | - |
| [`payslip.created`](/api-reference/webhooks/events/payslip-created) | A payslip was created, in preview or final state. |
| [`payslip.updated`](/api-reference/webhooks/events/payslip-updated) | An existing payslip was recalculated or amended. |
| [`payslip.finalised`](/api-reference/webhooks/events/payslip-finalised) | A payslip reached final state and the figures are settled. |
| [`payslip.deleted`](/api-reference/webhooks/events/payslip-deleted) | A payslip was deleted. |

### Pensions

| Event | When it is sent |
| - | - |
| [`pension.employee_assessed`](/api-reference/webhooks/events/pension-employee-assessed) | An employee was assessed for automatic enrolment in a pay run. |
| [`pension.employee_enrolled`](/api-reference/webhooks/events/pension-employee-enrolled) | An employee joined a pension scheme, automatically, at re-enrolment or by the employer. |
| [`pension.employee_enrolment_reversed`](/api-reference/webhooks/events/pension-employee-enrolment-reversed) | An automatic enrolment made in an open pay run was undone because the employee no longer qualifies. |
| [`pension.employee_group_changed`](/api-reference/webhooks/events/pension-employee-group-changed) | An employee's membership moved to a different pension group. |
| [`pension.employee_opted_out`](/api-reference/webhooks/events/pension-employee-opted-out) | An employee opted out of their pension scheme. Can arrive days after they acted, once the provider reports it. |
| [`pension.employee_ceased`](/api-reference/webhooks/events/pension-employee-ceased) | An employee's active membership ended for a reason other than opting out. |
| [`pension.postponement_applied`](/api-reference/webhooks/events/pension-postponement-applied) | Postponement was applied, deferring automatic enrolment to a later date. |
| [`pension.enrolment_letter_sent`](/api-reference/webhooks/events/pension-enrolment-letter-sent) | The employee's enrolment letter was accepted for delivery. |
| [`pension.enrolment_letter_failed`](/api-reference/webhooks/events/pension-enrolment-letter-failed) | The employee's enrolment letter could not be delivered. |
| [`pension.employee_exemption_recorded`](/api-reference/webhooks/events/pension-employee-exemption-recorded) | The employer recorded that an employee is exempt from automatic enrolment. |
| [`pension.employee_exemption_removed`](/api-reference/webhooks/events/pension-employee-exemption-removed) | An employee's exemption from automatic enrolment was removed. |
| [`pension.contributions_submitted`](/api-reference/webhooks/events/pension-contributions-submitted) | A pay run's contribution schedule was sent to the pension provider. |
| [`pension.contributions_accepted`](/api-reference/webhooks/events/pension-contributions-accepted) | The pension provider accepted a pay run's contribution schedule. |
| [`pension.contribution_submission_failed`](/api-reference/webhooks/events/pension-contribution-submission-failed) | A pay run's contribution schedule did not reach the pension provider, or the provider refused it. |
| [`pension.member_enrolments_submitted`](/api-reference/webhooks/events/pension-member-enrolments-submitted) | New members were sent to the pension provider. |
| [`pension.member_enrolments_accepted`](/api-reference/webhooks/events/pension-member-enrolments-accepted) | The pension provider accepted the new members sent to it. |
| [`pension.member_enrolment_submission_failed`](/api-reference/webhooks/events/pension-member-enrolment-submission-failed) | New members did not reach the pension provider, or the provider refused them. |
| [`pension.contribution_payment_approved`](/api-reference/webhooks/events/pension-contribution-payment-approved) | Someone approved paying a pay run's contributions to the pension provider. |
| [`pension.contribution_payment_confirmed`](/api-reference/webhooks/events/pension-contribution-payment-confirmed) | The pension provider confirmed the approval to pay a pay run's contributions. |
| [`pension.contribution_payment_approval_failed`](/api-reference/webhooks/events/pension-contribution-payment-approval-failed) | The approval to pay a pay run's contributions did not reach the pension provider, or the provider refused it. |

### Recurring deductions and payments

| Event | When it is sent |
| - | - |
| [`recurring_line_item.created`](/api-reference/webhooks/events/recurring-line-item-created) | A recurring deduction or payment was set up for an employee, either an ongoing schedule or a loan or advance. |
| [`recurring_line_item.updated`](/api-reference/webhooks/events/recurring-line-item-updated) | Someone changed a recurring deduction, for example the amount on each payslip, its dates or the total to recover. |
| [`recurring_line_item.suspended`](/api-reference/webhooks/events/recurring-line-item-suspended) | A recurring deduction was paused. Nothing is added to pay runs until it is resumed. |
| [`recurring_line_item.resumed`](/api-reference/webhooks/events/recurring-line-item-resumed) | A paused recurring deduction was restarted. |
| [`recurring_line_item.cancelled`](/api-reference/webhooks/events/recurring-line-item-cancelled) | A recurring deduction was stopped before it finished. |
| [`recurring_line_item.completed`](/api-reference/webhooks/events/recurring-line-item-completed) | A recurring deduction finished: a loan or advance was paid off, or an ongoing schedule reached its end date. Sent once. |
| [`recurring_line_item.deleted`](/api-reference/webhooks/events/recurring-line-item-deleted) | A recurring deduction was removed. |
| [`recurring_line_item.period_paid`](/api-reference/webhooks/events/recurring-line-item-period-paid) | The full amount was taken on a finalised payslip. |
| [`recurring_line_item.period_part_paid`](/api-reference/webhooks/events/recurring-line-item-period-part-paid) | Only part of the amount could be taken on a payslip, because of protected earnings or not enough take-home pay. |
| [`recurring_line_item.period_skipped`](/api-reference/webhooks/events/recurring-line-item-period-skipped) | Nothing was taken on a payslip, because there was no take-home pay, the protection rule stopped it, nothing was due, or someone skipped or removed it. |
| [`recurring_line_item.period_amount_changed`](/api-reference/webhooks/events/recurring-line-item-period-amount-changed) | Someone changed the amount for one pay run before it was finalised. |

### Reports

| Event | When it is sent |
| - | - |
| [`report_export.completed`](/api-reference/webhooks/events/report-export-completed) | A report export finished and its file is ready to download. Covers exports you queued and runs a schedule started. |
| [`report_export.failed`](/api-reference/webhooks/events/report-export-failed) | A report export failed, so there is no file. The event says why. |

### Salary settings

| Event | When it is sent |
| - | - |
| [`salary_organisation_config.created`](/api-reference/webhooks/events/salary-organisation-config-created) | Salary settings were saved for the organisation for the first time. |
| [`salary_organisation_config.updated`](/api-reference/webhooks/events/salary-organisation-config-updated) | The organisation's salary calculation method (calendar or working days) changed, or salary calculation was switched on or off. |
| [`salary_organisation_config.deleted`](/api-reference/webhooks/events/salary-organisation-config-deleted) | The organisation's salary settings were removed. |
| [`salary_employee_config.created`](/api-reference/webhooks/events/salary-employee-config-created) | An employee was given their own salary calculation method. |
| [`salary_employee_config.updated`](/api-reference/webhooks/events/salary-employee-config-updated) | An employee's own salary calculation method changed. |
| [`salary_employee_config.deleted`](/api-reference/webhooks/events/salary-employee-config-deleted) | An employee's own salary calculation method was removed, so they follow the organisation's. |
| [`salary_organisation_statutory_leave_policy.created`](/api-reference/webhooks/events/salary-organisation-statutory-leave-policy-created) | The organisation set what happens to salary during statutory leave for the first time. |
| [`salary_organisation_statutory_leave_policy.updated`](/api-reference/webhooks/events/salary-organisation-statutory-leave-policy-updated) | The organisation changed how salary is deducted or topped up during statutory leave. |
| [`salary_organisation_statutory_leave_policy.deleted`](/api-reference/webhooks/events/salary-organisation-statutory-leave-policy-deleted) | The organisation's statutory leave salary policies were removed, so the default applies. |
| [`salary_employee_statutory_leave_policy.created`](/api-reference/webhooks/events/salary-employee-statutory-leave-policy-created) | An employee was given their own statutory leave salary policy. |
| [`salary_employee_statutory_leave_policy.updated`](/api-reference/webhooks/events/salary-employee-statutory-leave-policy-updated) | An employee's own statutory leave salary policy changed. |
| [`salary_employee_statutory_leave_policy.deleted`](/api-reference/webhooks/events/salary-employee-statutory-leave-policy-deleted) | An employee's own statutory leave salary policy was removed, so they follow the organisation's. |

### Statutory pay

| Event | When it is sent |
| - | - |
| [`statutory_pay.created`](/api-reference/webhooks/events/statutory-pay-created) | A statutory pay record was added, by hand or by import. Covers SSP, SMP, SPP, ShPP, SAP, SPBP and SNCP. |
| [`statutory_pay.updated`](/api-reference/webhooks/events/statutory-pay-updated) | Someone changed a statutory pay record, for example its dates, a weekly amount or a payment made outside payroll. |
| [`statutory_pay.recalculated`](/api-reference/webhooks/events/statutory-pay-recalculated) | The figures changed without anyone editing the record, for example after a new working pattern, new statutory rates or a backdated pay rise. |
| [`statutory_pay.completed`](/api-reference/webhooks/events/statutory-pay-completed) | The entitlement has been paid in full. Sent once. |
| [`statutory_pay.deleted`](/api-reference/webhooks/events/statutory-pay-deleted) | A statutory pay record was removed. |

### Webhook health

| Event | When it is sent |
| - | - |
| [`webhook.endpoint.failing`](/api-reference/webhooks/events/webhook-endpoint-failing) | One of your endpoints has failed every attempt for 24 hours. We are still retrying, and it is disabled if it keeps failing for 5 days. |
| [`webhook.endpoint.disabled`](/api-reference/webhooks/events/webhook-endpoint-disabled) | We stopped sending to one of your endpoints, because it failed for 5 days or answered 410 Gone. |
| [`webhook.delivery.exhausted`](/api-reference/webhooks/events/webhook-delivery-exhausted) | An event could not be delivered to one of your endpoints after every retry. Fetch it from the events list or replay it. |

## Listed but not sent yet

`payroll_run.reopened` is listed by `GET /event-types` with the status `Planned`. It is kept for reopening a locked pay run, which Flow Payroll cannot do yet, so you cannot subscribe to it and it is never sent.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.