This article explains how Deel clients can use the bulk edit feature to edit the details of their workforce in bulk.
The Bulk edit feature also enables clients to record the changes made to their workers’ data and log the reasons for modifying any data for audit purposes.
In this article:
About Bulk Edit of Workers’ and Payroll Contract Information
How to Download Current Data of Workers
How to Upload New Data of Workers
What are the accepted formats in every field?
Validation Errors & How to Fix Them
About Bulk Edit of Workers’ and Payroll Contract Information
Deel clients can edit workforce information and payroll contract details in bulk directly from the platform.
Clients can bulk edit:
- Worker details (for all worker types)
-
Payroll contract information (applies to Direct Employees Payroll only)
With the Bulk Edit feature, clients can download a .csv file, edit the necessary fields, and upload it back to the Deel platform. This saves time and reduces manual errors when updating worker or contract information.
What does the CSV file contain?
In addition to the workers’ data, the CSV file includes the modification reasons allowed by the client admin.
Depending on your organization’s settings, the file may also include two additional columns for each editable field:
- A column to schedule a data change to occur at a future date.
- A column to record the reason for modifying the data.
How to download the current data of workers
✅ Step 1 - Click on the People icon, followed by the People tab
Click the three dots in the top-right corner of the People tab, then select Bulk Edit of Workers’ Information or Bulk edit payroll contracts.
The process to download, edit, and upload data is the same for both Bulk Edit of Workers’ Information and Bulk Edit Payroll Contracts.
The main difference is that Payroll Contract Data includes payroll and job-related fields. You’ll also receive an in-app notification if there’s an issue with your upload.
✅ Step 2 - Download Current Data of Workers
Click on download current data of workers to choose the workers whose information will be edited and the fields they wish to modify.
✅ Step 3 - Select applicable workers
Select the workers whose information will be edited.
Note: When bulk editing payroll contracts, clients must select the entity before choosing the workers.
✅ Step 4 - Select the fields that will be edited
Only the fields applicable to the selected worker type will be available to edit.
✅ Step 5 - Select the modification reasons
Clients can provide reasons as to why they are modifying the data and can schedule changes to come into effect on a specific date and time.
✅ Step 6 – Download and edit the current data of workers
Click on the Download button to generate a .CSV file containing the selected workers' data and the editable fields.
CSV Modification
In the CSV file, edit the fields that need to be modified. Open the downloaded CSV file using any spreadsheet editor (e.g., Microsoft Excel, Google Sheets).
Modify the data in the relevant fields as needed. Ensure that the data adheres to the allowed worker-type specifications.
After modifying the workers’ information, save the changes made in the CSV file on a local device.
When editing data in spreadsheet tools, some formatting may change automatically. To avoid validation errors, it’s safest to convert numeric fields to text format before saving your file.
For example, if you are updating bank account numbers and one starts with a zero (0), some spreadsheet tools will remove the leading zero when saving the file. This will cause the number to upload incorrectly.
To prevent this, ensure those fields are formatted as text before saving your CSV file.
How to Upload New Data of Workers
✅ Step 1 – Select Bulk Edit of Workers’ Details or Bulk Edit Payroll Contracts
Select the People icon on the home page.
Click the People tab, then click the three dots in the top-right corner.
From there, select Bulk Edit of Workers’ Information or Bulk Edit Payroll Contracts.
✅ Step 2 – Select Upload New Data of Workers
Click Upload new data of workers. Clients can now select the modified CSV file from their device and confirm the upload.
After adding the CSV file, click Continue. Deel will validate the newly uploaded data, and the client can review the field that they wish to modify.
✅ Step 3 – Validate the uploaded data
The uploaded data will be validated for specific worker-type conditions:
For employee bulk edits, we will check for:
- Ongoing amendments as multiple active amendments against a single employee, are not allowed.
- If amendments are enabled for the country.
- Make sure the worker is active.
- We will also run additional validations for employee specifics (salary, job title, seniority) against each record.
It may take a while to validate the file, depending on the file size. The system will also perform basic validation to ensure that the uploaded CSV file is correct and that critical fields have not been altered to avoid disruptions.
✅ Step 4 – Review and Apply Changes
Clients can review the workers and their new data by clicking the Review button.
For EOR bulk edits, clients can also review the contract change timings. In countries where Instant amendments are enabled, the contract changes will apply immediately. Any additional deposit requirements resulting from change requests in certain contract fields are available to review as well.
Clients need to tick the checkbox to confirm that they have reviewed and approved the imported data.
✅ Step 5 – Submit and Sign
After the client has reviewed and approved the bulk edits, they will be required to sign the change request.
This action will automatically generate amendment requests for each employee contract.
When bulk editing Direct Employee payroll contracts, clients can track the upload status by going to Entity → Entity Details → Mass Actions Logs. If the upload fails, Deel will send an in-app notification to alert the client.
What are the accepted formats in every field?
[ACCORDION] CSV Fields
| Date of birth | The format should be YYYY-MM-DD |
| Work email | johndoe@mail.com |
| Nationality | Format should be ISO 3166-1alpha-2, for example: US |
| Phone | Input should be a numeric value |
| Calling code | Country calling code with leading +, for example: +972 |
| Country | Format should be ISO 3166-1 alpha-2, for example: US |
| State | Format should be ISO state / province,for example: TX |
| Vacation yearly policy |
Input should be a numeric value Days off per year. If the policy is unlimited, leave the field blank. |
| Vacation accrual start date | Format should be YYYY-MM-DD |
| Employee number | Input should be a numeric value |
| Gross salary | Input should be a numeric value, for example 1000.45 |
| Employment type |
The value must be either: PART_TIME FULL_TIME |
| Part time percentage |
If employment type is part time this field will contain part-time percentage, for example: 50. Leave empty if the worker is full-time |
| Contract currency | Format should be ISO 4217, for example USD |
| Contract effective date | YYYY-MM-DDTHH:mm:ssZ, for example: 2015-09-08T04:00:00+00:0 |
| Contract timezone |
Here’s the list of timezones https://en.wikipedia.org/wiki/List_of_tz_database_time_zones For example: America/Toronto |
| Department |
|
| Work location | The value must match the name of the Work location in Organization Settings. |
| Direct manager | The value should be the work email of the direct manager |
| Emergency Contact |
Required : Full name, Dial Code, Phone number, Relationship |
[/ACCORDION]
Common Validation Errors & How to Fix Them
[ACCORDION]Custom field value not found
The entered value cannot be found.
Fix this error by making sure that the correct value is being entered.
Please note: It is not possible to create a new value within the custom field using the Bulk Edit feature.
[/ACCORDION]
[ACCORDION]Nested custom field depth can't be more than 3
Fix this error by making sure the data follows the correct format. For example, Product//Product Management//Product Operations. Each // indicates a level and we have a maximum of three levels.
[/ACCORDION]
[ACCORDION]Nested path for custom field values not found A, B, C
The custom field and value exist, but the entered order levels don’t exist. Fix this by entering the correct order of levels.
[/ACCORDION]
[ACCORDION] A Direct manager was found for {Worker}, but the CSV file has an empty value for the direct manager field. Reupload the CSV file with the filled value of the direct manager, or by continuing, the direct manager relationship will be deleted
This is a warning message: If the direct manager exists and should be deleted, then the client can proceed. If they want to fix this, fill the direct manager with their work email in the CSV file.
[/ACCORDION]
[ACCORDION]CSV Snapshot not found
Please use the CSV file that was downloaded using the Bulk Edit feature, as this file contains values associated with the data.
[/ACCORDION]
[ACCORDION]Manager not found
Fix this by providing the right work email in the CSV File.
[/ACCORDION]
[ACCORDION] Expand for a full list of Validation Errors:
| Process Step | Error message | Applicable to EOR | Applicable to IC | Applicable to HDE | Applicable to GP |
| Download | Hris profile ids and column names are mandatory | Yes | Yes | Yes | Yes |
| Download/Upload | hrisProfileOids are expected | Yes | Yes | Yes | Yes |
| Download/Upload | Invalid format Note: "Format" here doesn't refer to the file format of the csv, but rather the type of action taken (download or upload or review). If the action taken is somehow none of these, an invalid format error will be returned |
Yes | Yes | Yes | Yes |
| Upload | Joi validation failed: ${errors} (DEFINE ALL JOI ERRORS) | Yes | Yes | Yes | Yes |
| Download/Upload | Access denied Note: Error will occur if a non-client tries to download or upload |
Yes | Yes | Yes | Yes |
| Download/Upload | Some workers cannot be edited as they do not belong to the client's group or they do not exist. Remove the following Deel Internal IDs and their data, and try again: [${ids}] | Yes | Yes | Yes | Yes |
| Download/Upload | Some workers cannot be edited as they do not belong to the client's group. Remove the following Deel Internal IDs and their data, and try again: [${ids}] | Yes | Yes | Yes | Yes |
| Download/Upload | Column name ${columnName} is not supported | Yes | Yes | Yes | Yes |
| Download/Upload | Column name ${columnName} is not supported for EOR employees | Yes | No | No | No |
| Download/Upload | No column names provided | Yes | Yes | Yes | Yes |
| Upload | Please check the format of the date of birth, it should be YYYY-MM-DD but ${value} was sent instead | No | Yes | Yes | No |
| Upload | Employee cannot be under 18 years old. | No | Yes | Yes | No |
| Upload | Seniority level must be one of the predefined values | No | Yes | Yes | No |
| Upload | Effective date should be the same for all fields in IC contracts | No | Yes | No | No |
| Upload | Only one draft work statement is allowed | No | Yes | No | No |
| Upload | Contract does not have active data to amend | No | Yes | No | No |
| Upload | Joi validation for contractors: (DEFINE ALL JOI ERRORS) currency: Joi.currency(), rate: Joi.number().positive(), cycleScale: Joi.workStatementCycleScale(), jobTitleName: Joi.string().allow(null).max(255), seniorityName: Joi.string().allow(null).max(255), toBeAppliedDate: Joi.plainDateString(), effectiveDate: Joi.plainDateString(), terminationNoticeDays: Joi.number().integer().positive().allow(0).max(4000), scope: Joi.string().min(30).max(10000), specialClause: Joi.string().max(10000).empty('') |
No | Yes | No | No |
| Upload | Job title id is invalid | No | Yes | No | No |
| Upload | Seniority is invalid | No | Yes | No | No |
| Upload | Seniority level must be one of the predefined values | No | Yes | No | No |
| Upload |
${label} is not allowed to be changed Note: "Label" here refers to one of the following: 'Completion date', 'Effective date', or 'Start date' |
No | Yes | No | No |
| Upload | ${label} can't be earlier than ${period.min} | No | Yes | No | No |
| Upload | ${label} is too in the future | No | Yes | No | No |
| Upload | ${label} can't be later than ${period.max} | No | Yes | No | No |
| Upload |
Payment rate cannot be more than ${maxRate} ${currency} Note: maxRate depends on the currency |
No | Yes | No | No |
| Upload | Joi validation payment cycle: (DEFINE ALL JOI ERRORS) scale: Joi.string().valid('monthly', 'semimonthly', 'calendar-month', 'biweekly', 'weekly', null).default('monthly'), dueType: Joi.string().when('scale', [ { is: 'monthly', then: Joi.string().valid('REGULAR', 'AFTER_MONTH', 'WITHIN_MONTH').default('REGULAR'), otherwise: Joi.string().valid('REGULAR').default('REGULAR'), }, ]), dueDays: Joi.alternatives().conditional('scale', [ {is: 'weekly', then: Joi.number().min(0).max(7).default(0)}, {is: 'semimonthly', then: Joi.number().min(0).max(15).default(0)}, {is: 'biweekly', then: Joi.number().min(0).max(14), otherwise: Joi.number().min(0).max(90).default(0)}, ]), payBeforeWeekends: Joi.boolean().default(false) |
No | Yes | No | No |
| Upload | differentEffectiveDate (test to find the actual error) | Yes | No | No | No |
| Upload | invalidSalary (test to find the actual error) | Yes | No | No | No |
| Upload | backDatingEffectiveDate (test to find the actual error) | Yes | No | No | No |
| Upload | specificAmendmentDisabled (test to find the actual error) | Yes | No | No | No |
| Upload | Contract not found | Yes | No | No | No |
| Upload | Amendments v2 is not enabled for this organization | Yes | No | No | No |
| Upload | Only active contracts can be edited | Yes | No | No | No |
| Upload | This contract has another amendment in progress | Yes | No | No | No |
| Upload | Invalid seniority level. Please select one from the list below | Yes | No | No | No |
| Upload | This field can't be empty. Please, enter a valid value (to test) | Yes | No | No | No |
| Upload | Amendment has disabled items; changes cannot be confirmed | Yes | No | No | No |
| Upload | Amendment ${amendmentFlowId} not found | Yes | No | No | No |
| Upload | Something went wrong with creating eorsow | Yes | No | No | No |
| Upload | Change request ${changeRequestId} not found | Yes | No | No | No |
| Upload | Contract not found | Yes | No | No | No |
| Upload | Something went wrong with getting active eorsow data | Yes | No | No | No |
| Upload | Something went wrong with getting the country validations data | Yes | No | No | No |
| Upload | Due to compliance, salary reductions are not possible in ${country} | Yes | No | No | No |
| Upload | Minimum salary for ${countryName} is ${this.formatSalary(minSalary, contractCurrency)} | Yes | No | No | No |
| Upload | Maximum salary for ${countryName} is ${this.formatSalary(maxSalary, contractCurrency)} | Yes | No | No | No |
| Upload | Seniority not found | Yes | No | No | No |
| Upload | Job title cannot be empty | Yes | No | No | No |
| Upload | C-Level job title is not allowed | Yes | No | No | No |
| Upload | ${amendmentItem?.label || item.item} is disabled in country ${context.contract.employmentCountry} | Yes | No | No | No |
| Upload | Effective date can't be in the past | Yes | No | No | No |
| Upload | Deleting draft amendments failed | Yes | No | No | No |
| Upload | Probation period is not allowed. | Yes | No | No | No |
| Upload | Probation period type must be CUSTOM when there is probation value. | Yes | No | No | No |
| Upload | The minimum probation period for ${eorCountryData.country} is ${min} days. | Yes | No | No | No |
| Upload | The maximum probation period for ${eorCountryData.country} is ${max} days. | Yes | No | No | No |
| Upload | Amendments for worker type ${snapshot.EMPLOYMENT_TYPE} is not supported | No | No | Yes | Yes |
| Upload | All amending changes have to have the same effective date | No | No | Yes | Yes |
| Upload | All amending changes have to have the same modification reason | No | No | Yes | Yes |
| Upload | Could not find pending amendment to update | No | No | Yes | Yes |
| Upload | Pending amendment for contract already exists | No | No | Yes | Yes |
| Upload | Error parsing input custom fields | Yes | Yes | Yes | Yes |
| Upload | Custom field not found | Yes | Yes | Yes | Yes |
| Upload | Invalid Custom Field Value | Yes | Yes | Yes | Yes |
| Upload | These profiles are blocking the update because they either do not exist or they're duplicated: [$ids] | Yes | Yes | Yes | Yes |
| Upload | Error parsing input data | Yes | Yes | Yes | Yes |
| Upload | Parsed column ${key} is not supported for EOR employees | Yes | No | No | No |
| Upload | Schedule date must be the same for all the following fields: ${verticalEdits.map((ve) => ve.key).join(', ')} for EOR contracts | Yes | No | No | No |
| Upload | An error occured during the edition of this EOR contract | Yes | No | No | No |
| Upload | [jobTitleName] not found | No | No | Yes | No |
| Upload | [senorityName] not found | No | No | Yes | No |
| Upload |
Main employment not found for ${profile.id} (${profile.firstName} ${profile.lastName}) Note: When the CSV was manually created, an old hris profile was used. The old profile does not have a primary contract. |
Yes | Yes | Yes | Yes |
| Upload |
Main contract not found for ${profile.id} (${profile.firstName} ${profile.lastName}) Note: When the CSV was manually created, an old hris profile was used. The old profile does not have a primary contract. |
Yes | Yes | Yes | Yes |
| Upload | Manager not found Note: Direct manager email doesn't lead to an existing profile |
Yes | Yes | Yes | Yes |
| Upload | Labels not found Note: HRIS Label - Only applicable to work location |
Yes | Yes | Yes | Yes |
| Upload |
Label ${label.value} not found Note: HRIS Label - Only applicable to work location |
Yes | Yes | Yes | Yes |
| Upload | Database error | Yes | Yes | Yes | Yes |
[/ACCORDION]
Frequently Asked Questions
[ACCORDION] What worker details can I edit?
The fields that clients can edit vary from one worker type to another. Here is the list of fields which we support editing in bulk. If the client would like to edit any additional fields that are not seen here, please have them reach out to their account manager or contact Deel Support.
Table of Fields by Worker Type:
| Direct Employee | Direct Employee - Payroll by Deel | Independent Contractor | Employee of Record |
Custom Fields |
Custom Fields |
Custom Fields |
|
[ACCORDION] Why is my uploaded CSV file showing an error?
The system does a basic validation to check if the right file has been uploaded, and that the fields/columns, etc, are not changed, as changing them would break the upload flow. Additionally, using special characters like commas is not accepted in currency updates. To avoid such errors, remove any special characters in the file.
[ACCORDION] Is there a limit to the number of employees in bulk?
Clients can use the bulk edit option to edit up to 1000 rows of data at a time.