This article explains how Deel HR clients can use the Bulk Edit of Workers’ Information 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’ Information
How to use the Bulk Edit feature
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’ Information
With the Bulk Edit of Workers’ Information feature, clients can edit details of their workforce in bulk by downloading a .csv file, editing the necessary fields, and uploading the file back onto the Deel platform. This feature will save clients time and effort and reduce the chances of errors which typically come about while manually updating worker details individually.
What does the .CSV file contain?
In addition to the workers’ data, the .CSV file lists the Modification Reasons allowed by the client admin.
Depending on the choices they've made, the client's file may contain two additional columns for every field -
- One column for the users to schedule a data change to occur at any point in time in the future.
- Another column to provide reasons for modifying data.
How to use the Bulk Edit of Workers’ Information
There are two parts to this feature. The first part involves downloading the current data of the workers, while the second part consists of uploading the updated data of the workers.
How to download the current data of workers
✅ Step 1 - Click on People Icon > All People tab
Click on the three dots in the top right on the People list page. From there select the "Bulk Edit of workers' information" option.
✅ 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.
Select the worker type. Clients can make bulk contract edits to EOR employees, Direct Employees global payroll, Direct Employees, and Contractors.
✅ Step 3 - Select applicable workers
Select the workers whose information will be edited.
✅ 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.
How to Upload New Data of Workers
✅ Step 1 – Select Bulk Edit of Workers’ Information
Select the People icon on the home page.
Click on People List tab, and click on the three dots in the top right. From there select the "Bulk Edit of workers' information" option.
✅ 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 is not allowed.
- if amendments are enabled for the country.
- ensure 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.
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 |
[/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 doesn’t exist. Fix this by entering the correct order of levels.
[/ACCORDION]
[ACCORDION]Direct manager was found for {Worker} but the CSV file has an empty value for the direct manager field. Reupload the CSV file with filled value of 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 it, 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 a 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 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 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 character 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.
[ACCORDION] Is it possible to edit Global Payroll Contract details in bulk?
At this time, clients cannot edit the details of their Global Payroll contracts in bulk. They can only edit the fields specified. If a client would like to update several GP contracts at once, please have them contact their Payroll Manager (PRM) for assistance.
[ACCORDION] Can clients bulk edit Shield contracts?
Yes, worker information for shield contracts can be bulk edited.