Working with Incentives

Overview

In this guide, you will learn:

  • How to differentiate incentives
  • About the incentive lifecycle
  • How to work with one-time and recurring incentives

Before you get started

Before you get started, ensure that you have an active employment in your company.

Incentives

An Incentive represents all the items outside of regular salary that an employer might need to pay to the employee, for example, commissions, bonuses or allowances. The amount specified is in the currency the person gets paid in.

There are two payment frequencies:

  • One time - when the incentive is created and paid only once, a single event;
  • Monthly - when the incentive is periodicity, it is called a Recurring Incentive. It can repeat for a fixed number of months or it can be indefinite.

Besides that, each incentive has a type. Check the documentation of the Create Incentive / Create Recurring Incentive API Reference to get the updated list of available types. On a side note, not all one-time types are accepted for recurring incentives.

When creating an incentive, it is necessary to provide the effective_date, which determines which payroll cycle the incentive will be paid out in. The incentive is not paid out on the effective date, but during the next payroll cycle.

📅 Since the months don't have the same amount of days, *for recurring incentives*, if the day of the month of `effective_date` is one of [28, 29, 30, 31] it will be transformed to the last day of each month, avoiding the possibility of skipping a month in the recurrence.

Incentives also have the free-form text note field, to add more information about the incentive. It is highly recommended to use that field since the Remote API has some mechanisms in place to prevent the registration of duplicated incentives, and having specific notes helps to differentiate them. For example, in case an employee is to receive two referral bonuses on the same day, this can be mentioned in the notes, such as Referral bonus regarding <people's name or id>.

Incentive lifecycle

The status of an incentive depends on whether it is already associated to a payroll cycle or not. When the incentive is created and it is not yet associated to a payroll cycle, its status is pending. When the incentive is associated to a payroll cycle, its status can be preparing, processing, or paid. When an incentive is cancelled, it is marked as deleted.

⚠️ It is not possible to cancel an one-time incentive if its status is `:paid` or `:processing`. Recurring incentives work slightly differently and Remote will only ****delete scheduled upcoming incentives with the `pending` status.

Working with one-time incentives

We provide endpoints for all basic operations (create, read, update, delete, and list) for one-time incentives in the /v1/incentives route. For example, to create and update an incentive:

# create a one-time incentive
$ curl --location --request POST \
  --header "Authorization: Bearer <your token>" \
  --header "Content-Type: application/json" \
  https://gateway.remote-sandbox.com/v1/incentives \
  --data '{
	"amount": 50000,
  "amount_tax_type": "gross",
  "effective_date": "2025-12-20",
  "employment_id": "5509b6b0-5a0a-11ed-a6f6-c38dbde70e6f",
  "note": "Bonus for moving start date to an earlier date",
  "type": "signing_bonus"
}'

{
   "data":{
      "incentive":{
         "amount": 50000,
         "amount_tax_type": "gross",
         "effective_date": "2025-12-20",
         "employment_id": "5509b6b0-5a0a-11ed-a6f6-c38dbde70e6f",
         "expected_payout_date": null,
         "id": "e6c42029-d12a-4480-a732-73017991ba8e",
         "note": "Bonus for moving start date to an earlier date",
         "recurring_incentive_id": null,
         "status": "pending",
         "type": "signing_bonus"
      }
   }
}

# modify the incentive
$ curl --location --request PATCH \
  --header "Authorization: Bearer <your token>" \
  --header "Content-Type: application/json" \
  https://gateway.remote-sandbox.com/v1/incentives/e6c42029-d12a-4480-a732-73017991ba8e\
  --data '{
	"amount": 150000
}'

{
   "data":{
      "incentive":{
         "amount": 150000,
         "amount_tax_type": "gross",
         "effective_date": "2025-12-20",
         "employment_id": "5509b6b0-5a0a-11ed-a6f6-c38dbde70e6f",
         "expected_payout_date": null,
         "id": "e6c42029-d12a-4480-a732-73017991ba8e",
         "note": "Monthly stipend to buy food",
         "recurring_incentive_id": "1e74fdc2-7420-4eef-ab0a-b794cbbef4e1",
         "status": "pending",
         "type": "meal_allowance"
      }
   }
}

Working with Recurring incentives

Recurring Incentives are an abstraction for scheduled one-time incentives, so we only provide endpoints for the create, list, and delete operations. When creating a recurring incentive, the response returned is the upcoming one-time incentive, but with the recurring_incentive_id field filled.

To modify some information, you must indicate the upcoming one-time incentive. It's not possible to modify in batch all the recurring incentives since some occurrences might have been already paid or processed.

Deleting a recurring incentive cancels the upcoming one-time incentives with the pending status. This request also returns a list of already_processing_incentives , that are occurrences of incentives that cannot be deleted since they're in processing status.

# create an indefinite recurring incentive
$ curl --location --request POST \
  --header "Authorization: Bearer <your token>" \
  --header "Content-Type: application/json" \
  https://gateway.remote-sandbox.com/v1/incentives/recurring \
  --data '{
	"amount": 50000,
  "amount_tax_type": "gross",
  "effective_date": "2025-12-20",
  "employment_id": "5509b6b0-5a0a-11ed-a6f6-c38dbde70e6f",
  "note": "Monthly stipend to buy food",
  "type": "meal_allowance"
}'

{
   "data":{
      "incentive":{
         "amount": 50000,
         "amount_tax_type": "gross",
         "effective_date": "2025-12-20",
         "employment_id": "5509b6b0-5a0a-11ed-a6f6-c38dbde70e6f",
         "expected_payout_date": null,
         "id": "e6c42029-d12a-4480-a732-73017991ba8e",
         "note": "Monthly stipend to buy food",
         "recurring_incentive_id": "1e74fdc2-7420-4eef-ab0a-b794cbbef4e1",
         "status": "pending",
         "type": "meal_allowance"
      }
   }
}

# modify the amount of the incentive
$ curl --location --request PATCH \
  --header "Authorization: Bearer <your token>" \
  --header "Content-Type: application/json" \
  https://gateway.remote-sandbox.com/v1/incentives/e6c42029-d12a-4480-a732-73017991ba8e \
  --data '{
	"amount": 150000
}'

{
   "data":{
      "incentive":{
         "amount": 150000,
         "amount_tax_type": "gross",
         "effective_date": "2025-12-20",
         "employment_id": "5509b6b0-5a0a-11ed-a6f6-c38dbde70e6f",
         "expected_payout_date": null,
         "id": "e6c42029-d12a-4480-a732-73017991ba8e",
         "note": "Monthly stipend to buy food",
         "recurring_incentive_id": "1e74fdc2-7420-4eef-ab0a-b794cbbef4e1",
         "status": "pending",
         "type": "meal_allowance"
      }
   }
}

# delete the recurring incentive
$ curl --location --request DELETE \
  --header "Authorization: Bearer <your token>" \
  --header "Content-Type: application/json" \
  https://gateway.remote-sandbox.com/v1/incentives/recurring/1e74fdc2-7420-4eef-ab0a-b794cbbef4e1

{
    "data": {
        "already_processing_incentives": [],
        "status": "ok"
    }
}