Offboarding an Employee

Overview

Offboarding an employee through Remote API ensures all necessary compliance, payroll, and legal processes are managed correctly when an employment ends. This includes contract termination, country-specific checks, document processing, and updates to payroll and benefits.

This guide walks you through how to initiate and track offboarding using Remote's API and stay updates via webhook notifications.

Use the offboarding flow when:

  • An employee resigns or is terminated
  • You need to initiate employee exits programmatically
  • You want to monitor offboarding status and receive real-time updates
  • You need visibility into offboarding timelines and payroll cutoffs

How it works

The offboarding process involves multiple stages that can be managed through API calls:

  1. Submit an offboarding request using POST /offboardings.
  2. Remote reviews the request and may reach out if additional inout is required.
  3. Offboarding status progresses through stages such as submitted, review_started, submitted_to_payroll, and finally completed.
  4. Subscribe to offboarding related webhooks to be notified when the status of the request changes.

Let's take a look at each stage in detail.

Create an offboarding

Use the Create offboarding endpoint to submit an offboarding request for a specific employee. In the request body, you need to provide an employment_id along with the offboarding type and termination_details. The details of which are:

  • type: refers to the type of termination being requested. Right now, only termination is supported as the offboarding type.
  • termination_details: The termination date object contains multiple fields detailing the offboarding of the employee. These fields are:
    • proposed_termination_date: The intended date for termination. In most cases, the employee must be notified before termination. Remote will assess legal and contractual notice periods before confirming this date.
    • termination_reason: A structured reason code for termination. Choosing an accurate code helps mitigate the risk of unlawful dismissal. Possible values are:
      • cancellation_before_start_date
      • compliance_issue
      • conversion_to_contractor
      • dissatisfaction_with_remote_service
      • end_of_fixed_term_contract_compliance_issue
      • end_of_fixed_term_contract_incapacity_to_perform_inherent_duties
      • end_of_fixed_term_contract_local_regulations_max_term_reached
      • end_of_fixed_term_contract_misconduct
      • end_of_fixed_term_contract_operational_reasons
      • end_of_fixed_term_contract_performance
      • end_of_fixed_term_contract_redunduncy
      • end_of_fixed_term_contract_values
      • end_of_fixed_term_contract_other
      • gross_misconduct
      • incapacity_to_perform_inherent_duties
      • job_abandonment
      • mutual_agreement
      • performance
      • values
      • workforce_reduction
      • other
    • reason_description: Additional explanation of the reason for termination.
    • termination_reason_files: Supporting documents related to the termination reason. Each object file includes a name and content of the file.
    • agrees_to_pto_amount: A boolean that decides whether the employee agrees with the reported PTO balance.
    • agrees_to_pto_amount_notes: Additional notes about the PTO agreement, especially if there is a dispute or more clarification is needed.
    • timesheet_file: Optional file object that includes a record of the employee's PTO balance to ensure accurate payouts. Uploading this file is recommended if there's a risk of any discrepancy.
    • personal_email: The employee's confirmed personal email address for post-termination communication. If not provided, Remote will pull it up from the employment record. This cannot be a company-issued email address.
    • risk_assessment_reasons: List of risk-related concerns during offboarding. This helps Remote assess legal exposure. Possible values are:
      • caring_responsibilities
      • disabled_or_health_condition
      • family_leave
      • sick_leave
      • requested_medical_or_family_leave
      • member_of_union_or_works_council
      • pregnant_or_breastfeeding
      • reported_concerns_with_workplace
      • none_of_these
    • will_challenge_termination: A boolean that decides whether the employee is likely to challenge the termination or not.
    • will_challenge_termination_description: If a challenge is likely, provide details about the anticipated dispute or concerns.
    • confidential: A boolean that marks the request as confidential. If set to true, only the API token owner or integration can view the request. In case of false, all company admins will have visibility to the request.
    • customer_informed_employee: A boolean confirming whether the employee has been informed about their termination.

      ℹ️ We advise not to inform the employee of their termination until Remote reviews your request for legal risks.

    • employee_awareness: Details about how the termination news was communication which includes the date and notes of the termination communication. This object is only required if the customer_informed_employee is set to true.
    • acknowledgement_termination_procedure: A boolean that confirms that your organization followed internal termination procedures before submitting the offboarding request.
    • additional_comments: Optional additional context or notes about the offboarding request.
{
  "type": "termination",
  "employment_id": "5e55386e-4f4f-4def-92f4-bdc19a5ce77d",
  "termination_details": {
    "confidential": "true",
    "proposed_termination_date": "2025-05-01",
    "termination_reason": "end_of_fixed_term_contract_local_regulations_max_term_reached",
    "risk_assessment_reasons": [
      "reported_concerns_with_workplace"
    ],
    "will_challenge_termination": "false",
    "reason_description": "Contract term is reached. Not renewing the contract.",
    "additional_comments": "",
    "employee_awareness": {
      "date": "2025-04-15",
      "note": "Employee was reminded of their end of contract date."
    },
    "personal_email": "[email protected]",
    "termination_reason_files": [
      {
        "name": "Copy of contract",
        "content": "<binary>"
      }
    ],
    "timesheet_file": {
      "name": "Employee timesheet",
      "content": "<binary>"
    },
    "will_challenge_termination_description": "null"
  }
}

On submission, you will get the following in its response:

{
  "data": {
    ...
    "id": "ba310525-9282-40c9-8977-14d844bf891a",
    "status": "submitted",
    ...
  }
}

Get offboarding request

You can use the Show offboarding endpoint to retrieve a specific offboarding request. This endpoint is specially useful when you want to check the status of the request at any time. All you need to do is provide the offboarding request's ID that you received in response when you created the request.

List all offboarding requests

To retrieve a list of all submitted offboarding requests, you can use the List offboarding endpoint. The results can be filtered by employment_id, type of offboarding, and by their confidentiality. By default, the results won't show requests that have been marked confidential, so to include those in the list, you need to set the include_confidential flag to true.

Webhooks

The status of an offboarding request changes from submitted to in_review, done, canceled as the request moves from different phases. To get notified of this change, you can register for certain events using the following webhooks.

offboarding.submitted

This webhook is triggered when a new offboarding request is submitted.

offboarding.review_started

Register to this webhook if you want to get notified on when Remote starts reviewing the offboarding request.

offboarding.submitted_to_payroll

This event shows when Remote has verified the request and the offboarding has been handed off to payroll for further processing.

offboarding.completed

This webhook is triggered when the requested offboarding process is complete.

offboarding.deleted

This event is triggered when the offboarding request has been deleted.