Importing users in bulk using a CSV file
You can import a CSV file from your Shopify admin to create new admin users or Point of sale (POS) users for Shopify POS, and manage their store access in bulk.
You can use a CSV import to make the following changes to your user accounts:
- Create new admin users
- Create new Point of sale (POS) users for Shopify POS with assigned PINs
- Suspend and reactivate existing admin and POS user accounts
On this page
- Considerations for the user management CSV file
- Download a sample user management CSV file
- Column definitions for the user management CSV file
- Create new users in a CSV file
- Suspend or reactivate existing users in a CSV file
- Assigning multiple roles, locations, and stores to a user
- Assigning a group to a user in a CSV file
- Import a user management CSV file from your Shopify admin
- Solutions to common user management import issues
- Troubleshooting import error messages
Considerations for the user management CSV file
Some changes to user accounts aren't supported by a CSV import. For updates that a CSV import can't complete, manage your user accounts manually in your Shopify admin or in the Shopify POS app. Review the following considerations when you import users using a CSV file:
- The CSV file import doesn't support bulk deletion of users.
- You can't set or update two-factor authentication requirements for users.
- You can't change an existing user's PIN for Shopify POS.
- You can't create new roles, groups, or locations from a CSV import. Role names, group names, and location names in your file must match what already exists in your Shopify admin.
- You can only suspend or reactivate existing users with a CSV import. You can't change an existing user's role, assigned group, location, or store access.
- You can't change a user's type, such as changing a POS-only user to an admin user.
Download a sample user management CSV file
A sample file includes the required column headers and example values for each column. You can use it as a starting point before you add your own users.
You can download and view a sample user management CSV file from this page, or download a sample from the Import page in your Shopify admin.
To learn how to save and edit CSV files in your spreadsheet app, refer to Open and edit a CSV file.
Column definitions for the user management CSV file
The following table lists every column in the sample user management CSV file. Each definition explains how the column is used when you create users, or when you suspend or reactivate existing users, including differences between admin users and POS-only users.
| CSV column | Definition |
|---|---|
| id | The unique user ID for each account. When you export your user management information as a CSV file, each user's ID is listed in the id column. You can also find a user's ID in the browser URL when you open their profile in your Shopify admin. To create:
To suspend or reactivate:
|
| user_type | User type, such as To create:
To suspend or reactivate:
|
A valid email address. To create:
To suspend or reactivate:
| |
| phone | The user's phone number. To create:
To suspend or reactivate:
|
| given_name | The user's first name. To create:
To suspend or reactivate:
|
| family_name | The user's last name. To create:
To suspend or reactivate:
|
| status | User account status, such as To create:
To suspend or reactivate:
|
| role_name | The name of the role assigned to the user. The role name must exist and be valid for that user type. A row in a CSV file can assign either a role or a group, but not both. If you enter a value in both role_name and group_name on the same row, then the import fails for that row. To create:
To suspend or reactivate:
|
| group_name | The group assigned to the user. Groups are available only for organizations on the Shopify Plus plan. A row in a CSV file can assign either a group or a role, but not both. If you enter a value in both group_name and role_name on the same row, then the import fails for that row. To create:
To suspend or reactivate:
|
| store_name | The store that the user can access. Must match a store name in your Shopify admin exactly. To create:
To suspend or reactivate:
|
| pos_location_name | The POS location that the user can access. The location name must match a location in that store. To create:
To suspend or reactivate:
|
| all_current_and_future_locations | Enter To create:
To suspend or reactivate:
|
| pin | PIN for signing in to Shopify POS: a 4–6-digit number. The PIN must be the same on every row in the CSV file that assigns POS permissions for the same user within a store. The PIN can differ across stores for the same user. In each store, each PIN must be unique to one user account. To create:
To suspend or reactivate:
|
Create new users in a CSV file
To create a new user, leave id blank on that row. After the user is created, the import automatically assigns a value to id.
To grant users access to more than one location, role, or store, refer to Assigning multiple roles, locations, and stores to a user.
Create a POS user
To create a POS user, enter a value for the following fields:
- Enter
Point of salein user_type. - Enter given_name and family_name.
- To set user permissions, enter a value for one of the following fields:
- role_name and store_name: If your organization has more than one store, then both fields are required.
- group_name: Available only on the Shopify Plus plan. To learn how to assign a group, refer to Assigning a group to a user in a CSV file.
- To set location access, enter a value for the following fields:
- For access to specific locations, enter pos_location_name, and set all_current_and_future_locations to
FALSE. - For access to all locations, set all_current_and_future_locations to
TRUE, and leave pos_location_name blank.
- For access to specific locations, enter pos_location_name, and set all_current_and_future_locations to
- Optional: Enter email, phone, or pin. A PIN must be a 4–6-digit number that is unique within a store.
Create an admin user
To create an admin user, enter a value for the following fields:
- Enter
Adminin user_type. - Enter email.
- To set user permissions, enter a value for the following fields:
- role_name and store_name: If your organization has only one store, then store_name isn't required. If the role is an organization-level role, then leave store_name blank.
- group_name: Available only on the Shopify Plus plan. To learn how to assign a group, refer to Assigning a group to a user in a CSV file.
- Optional: When role_name is a POS-category role, you can enter a value for pin on that row. If you don't specify a PIN, then the import generates a PIN for the user.
- If role_name is a POS-category role, then you must set location access for the user. Enter a value for the following fields:
- For access to specific locations, enter pos_location_name, and set all_current_and_future_locations to
FALSE. - For access to all locations, set all_current_and_future_locations to
TRUE, and leave pos_location_name blank.
- For access to specific locations, enter pos_location_name, and set all_current_and_future_locations to
Suspend or reactivate existing users in a CSV file
You can suspend or reactivate an existing user by adding one row per user to your user management CSV file. Users are identified by id.
To suspend or reactivate an existing user, enter a value for the following fields:
- Enter the id for the user.
- Enter the user_type for the user.
- If the user is an admin user, then enter a value for the following fields:
- email: Required.
- given_name: Optional. If you enter a value, then it must match the user's first name in your Shopify admin.
- family_name: Optional. If you enter a value, then it must match the user's last name in your Shopify admin.
- phone: Optional. If you enter a value, then it must match the user's phone number in your Shopify admin.
- If the user is a POS user, then enter a value for the following fields:
- given_name: Required.
- family_name: Required.
- email: If the user has an email on their account, then this field is required.
- phone: If the user has a phone number on their account, then this field is required.
- status: Enter
Suspendedto suspend the user, orActiveto reactivate the user. You can suspend a user only when their current status isActiveorInactivein your Shopify admin. You can reactivate a user only when their current status isSuspended.
Assigning multiple roles, locations, and stores to a user
When you create a new user, you can assign more than one role, POS location, and store to that user in a single CSV file import. Each role, location, or store combination needs its own row in the file.
Add one row for each value that you want to assign to the same user. On every row for that user, enter the same identification values so the import applies every row to that one user account. Leave id blank on every row. The import assigns id after the user is created.
Identification values required on every row
For the import to identify the same user, enter the following values on every row of your CSV file for that user:
- For admin users, the same email and user_type must be entered on every row for that user.
- For POS users, the same user_type, given_name, family_name, email, and phone must be entered for that user on every row.
Assigning multiple roles to a user in the same store
A single user can hold more than one role at the same store when each role is represented on its own row in the CSV file.
To assign a user more than one role at the same store, you must add one row per role in your CSV file. On every row, enter the same identification values for that user, and then include the exact store_name and role_name that are listed in your Shopify admin.
Assigning multiple POS locations in the same store
When a user should access only certain POS locations in a store, you list each location on a separate row.
To assign a user access to multiple specific POS locations, you must add one row per location in your CSV file. On every row, enter the same identification values for that user, enter the pos_location_name that is listed in your Shopify admin, and set all_current_and_future_locations to FALSE on each row.
For example, to give a user the same role at two specific locations in one store, add one row per location.
| role_name | pos_location_name | all_current_and_future_locations |
|---|---|---|
Cashier | Location 1 | FALSE |
Cashier | Location 2 | FALSE |
Alternatively, to grant access to all current and future locations, use a single row with all_current_and_future_locations set to TRUE and pos_location_name left blank. Use the same TRUE or FALSE value on every row for that user in that store. You can't mix them between rows.
Assigning user access across multiple stores
Organizations with more than one store can grant the same person access in each store that they need.
When the same user needs access in more than one store, use one row per role-store-location combination. On every row, you must enter the same identification values for that user, along with the exact store_name that is listed in your Shopify admin.
You can assign multiple roles and multiple POS locations to the same user for each store.
For all_current_and_future_locations and pos_location_name on create rows, use the same row patterns as in assigning multiple POS locations in the same store. You can't set all_current_and_future_locations to TRUE when pos_location_name has a value on that row.
The following example assigns the same POS user with different location access across two different stores.
| store_name | role_name | pos_location_name | all_current_and_future_locations |
|---|---|---|---|
StoreName_USA | Cashier | StoreName_USA_SF_01 | FALSE |
StoreName_CAN | Store Teller | TRUE |
If any row for a user fails, then all rows for that user are rejected. After you fix the error, include every row for that user in the next import.
Assigning a group to a user in a CSV file
Groups are available only for organizations on the Shopify Plus plan. A group bundles one or more roles, so assigning a group can grant a user several roles at the same time.
Assigning a group or a single role
Each row in a CSV file can assign either a group or a single role, but not both:
- To assign a group, enter the group in group_name and leave role_name blank.
- To assign a single role, enter the role in role_name and leave group_name blank.
Assigning a group to eligible users
You can assign a group to a user when at least one role in the group applies to that user's type. Roles in the group that don't apply to the user's type aren't granted, but they don't cause an error. The group still assigns successfully based on the roles that apply.
You can't assign a group that has no roles.
Assigning a group across stores and locations
You must include a row in your CSV file for each store where the group grants a POS role. On each of those rows, you must also set location access:
- For access to specific locations, enter pos_location_name, and set all_current_and_future_locations to
FALSE. To grant several specific locations in one store, add one row per location, with the same group and store on each row. - For access to all locations, set all_current_and_future_locations to
TRUE, and leave pos_location_name blank.
Location access for a group is validated the same way as a POS role that isn't assigned through a group, including that it can't conflict with location access that the same user is granted on another row.
Setting PINs when assigning a group
A PIN follows the same rules that apply to users with multiple roles:
- Enter a pin only on a row in your CSV file for a store where the group grants a POS role.
- A PIN must be unique within a store, but can differ across stores.
- Don't enter a pin on a row for a store where the group grants only non-POS roles.
Assigning a group that includes an organization role
When a group includes an organization role that has POS permissions, the organization role automatically grants access to all locations, so the per-store location requirement doesn't apply to it. You can assign this type of group in one of the following ways:
- A single group-only row: Enter the group in group_name, and leave store_name, pos_location_name, all_current_and_future_locations, and pin blank. The organization role grants access to all locations automatically.
- Explicit store rows: Add a row for each store where the group grants a POS role. On every one of these rows, set all_current_and_future_locations to
TRUE. You can't limit a user with an organization role to a single location.
Examples of assigning a group
The following examples illustrate how to assign one group across different stores and locations. Each row lists the values for group_name, store_name, pos_location_name, and all_current_and_future_locations.
In the following examples, the group grants a store role and a POS role in Store 1, and a POS role in Store 2:
- Example 1 assigns the group with access to all locations in two stores. Because the group grants a POS role in each store, you must add one row per store in your CSV file.
| group_name | store_name | pos_location_name | all_current_and_future_locations | pin |
|---|---|---|---|---|
Group name | Store 1 | TRUE | ||
Group name | Store 2 | TRUE |
- Example 2 assigns the group in two stores, but the group grants a POS role only in Store 1 and a store-only role in Store 2. Add a row in your CSV file only for the store with a POS role. The store-only role in Store 2 is granted without a row.
| group_name | store_name | pos_location_name | all_current_and_future_locations | pin |
|---|---|---|---|---|
Group name | Store 1 | TRUE |
- Example 3 assigns the group with access to specific locations in two stores. You must add one row in your CSV file per location.
| group_name | store_name | pos_location_name | all_current_and_future_locations | pin |
|---|---|---|---|---|
Group name | Store 1 | Location 11 | FALSE | |
Group name | Store 1 | Location 12 | FALSE | |
Group name | Store 2 | Location 21 | FALSE | |
Group name | Store 2 | Location 22 | FALSE |
Example 4 assigns a group that includes an organization role with POS permissions, in addition to a store role and a POS role. You can assign this group in one of the following ways:
- The first option is a single group-only row, where the organization role grants access to all locations.
- The second option uses an explicit row for each store where the group grants a POS role. On each row, all_current_and_future_locations must be
TRUE, because the organization role can't be limited to a single location.
| group_name | store_name | pos_location_name | all_current_and_future_locations | pin |
|---|---|---|---|---|
Group name |
| group_name | store_name | pos_location_name | all_current_and_future_locations | pin |
|---|---|---|---|---|
Group name | Store 1 | TRUE | ||
Group name | Store 2 | TRUE |
Import a user management CSV file from your Shopify admin
After you build your CSV file and save it in the correct format, you can upload it from your organization Users page. The import runs in your Shopify admin and reports any rows that can't be processed.
Steps:
From your Shopify admin, go to Settings > Users.
Click Import.
Optional: Click the link to download a sample CSV file, and then use it as a template for your own file.
Click Upload file, and then select your
.csvfile.
After the import completes, review the confirmation in your Shopify admin. If any rows have errors, then you receive an email with details so you can correct your file and import again.
Solutions to common user management import issues
If you're having a problem uploading your user management CSV file, then check if the problem is listed in the following solutions.
When you need help with troubleshooting a specific error message, refer to Troubleshooting import error messages.
Re-importing after fixing errors
When an import is unsuccessful, you receive an email that lists the rows that failed. Re-import your file carefully so that you don't create duplicate users.
Re-import only the users that had errors, not the entire file. Use the following practices:
- Fix the rows that failed, and then include every row for each affected user in your new file. If a user had 3 rows and 1 row caused an error, then all 3 rows for that user were rejected. Include all 3 corrected rows in your re-import.
- Don't include users that imported successfully. Those accounts already exist. Importing them again can return a
user already existserror, create duplicate users, or both.
If you re-import the entire original file, including rows for users that were already created successfully, then you might encounter the following outcomes:
- Admin users: If an email address is already in use, then you might receive a
user already existsor duplicate email error. - POS users: The system can create duplicate POS user records. POS users are matched using name and related fields instead of a unique email, so a second user can be created with the same name and role.
- Seat limits: If the import counts users that were already created, then you might receive seat limit errors. To learn more, refer to maximum number of users for each pricing plan.
Creating multiple POS users with the same name
If the identification values for a POS user match on multiple rows in one import, including non-consecutive rows, then the import treats those rows as the same user.
To create separate POS users with the same given_name and family_name in one import, you must enter a different value for at least one of the following fields for each user:
- phone
If you can't distinguish multiple users with the same given_name and family_name using different values for email or phone, then you must import each user in a separate CSV file.
File format and upload size
The following issues relate to the CSV file format or size, not to the values in your user rows:
- Wrong file format: Your file must be a
.csvfile saved with the encoding described in Open and edit a CSV file. - File is too large: If your file has many rows, then split it into smaller files and import them one at a time.
POS user displays as multiple users instead of one multi-role user
The import matches rows to the same POS user when user_type, given_name, family_name, email, and phone match on every row for that person. If any of these values differ between rows, then the import creates separate users.
The following situations often lead to duplicate POS users when you expected one multi-role user:
- Email on one row but not another: If you include email on the first row for a POS user but leave it blank on another row, then the import creates separate users. Include email on every row for that user, or leave it blank on every row.
- Typo in the name: A typo in the name rows might create separate users. For example,
Janeon one row andjaneon another row might be treated as different users if matching is case-sensitive. Write the user's name the same way on every row. - Phone on one row but not another: If you include phone on the first row for a POS user but leave it blank on another row, then the import creates separate users. Include phone on every row for that user, or leave it blank on every row.
To avoid duplicating users, make sure user_type, given_name, family_name, email, and phone are identical on every row for the same POS user in your CSV file.
Seat limit errors
Seat limits apply to admin users on your organization's pricing plan. When you receive a seat limit error during an import, the import counts how many new admin users your file would create, and checks that number against your plan's seat limit. If you're at or near your seat limit, then reduce the number of new admin users in your CSV, or review user limits for your pricing plan before you import again.
Export your user list to find duplicate POS users
You can export your user list to a CSV file and compare rows in a spreadsheet when you suspect duplicate POS users. The export includes timestamps that indicate which account was created first.
To learn how exports are delivered and who can download them, refer to exporting your user management information as a CSV file.
Steps:
From your Shopify admin, go to Settings > Users.
Click Export.
In the Export users dialog, click Export.
When you receive the email, click Download file to save the CSV to your device.
Open the file in a spreadsheet app, and then sort by the
GIVEN_NAMEcolumn.Review POS users with matching given name, family name, email, and phone values in the export that have
CREATED_ATtimes that are the same or very close together. These accounts are likely duplicates.
Delete duplicate POS users manually
You can remove a duplicate POS user account manually in your Shopify admin without using a CSV file.
Steps:
From your Shopify admin, go to Settings > Users.
Select the duplicate user account.
Click Remove.
Bulk delete duplicate POS users using a CSV file
You can suspend duplicate accounts with a CSV import, and then delete those suspended accounts in bulk from the Users page in your Shopify admin. Suspending the accounts first helps you confirm which accounts you're removing before you delete them.
Steps:
- Export your current user list.
- Identify duplicate accounts using the comparison method described in Export your user list to compare duplicate POS users.
- For each duplicate account, copy the values for id, user_type, email, phone, given_name, and family_name into a new CSV file. Use the same column structure as the sample user management CSV file.
- Set status to
Suspendedfor each duplicate row. Leave role_name, group_name, store_name, pos_location_name, all_current_and_future_locations, and pin blank. - Import the CSV file to suspend those users.
- Go to Settings > Users.
- If available, filter the user list to Suspended accounts. Select the duplicate accounts that you suspended, and then delete them in bulk.
Troubleshooting import error messages
When a user management CSV import is unsuccessful, you receive an email that includes the error message and the affected rows. The following sections explain what each type of message means and what you can change in your CSV file before you import again.
If you're still having problems with your CSV import, then contact Shopify Support.
CSV file errors
CSV headers are missing or invalid
The file has no header row or the headers can't be parsed. Use the user management sample from the Import page and keep the first row exactly as provided.
CSV file is empty
The file has no data rows under the header. Add at least one row or confirm that you exported or saved the full file.
Missing required CSV headers
One or more required columns are missing. The import expects the following headers when importing a user management CSV file:
- id
- user_type
- phone
- given_name
- family_name
- status
- role_name
- group_name
- store_name
- pos_location_name
- all_current_and_future_locations
- pin
Don't delete or rename columns from the sample user management CSV file.
Found extra CSV headers: [...]
The file includes columns that aren't in the allowed list. Remove any headings that aren't included in the user management CSV file template.
User identification errors
user_type must be 'Admin' or 'Point of sale'
The value set for user_type isn't accepted. Set user_type to Admin or Point of sale.
Admin or POS user creation errors
The following troubleshooting applies when the id field for the user is blank to create a new user.
Status is required
On user creation rows, leave the status column blank. The import sets status for you. If you enter a value in the status column on a create row, then the import fails for that user. On suspend or reactivate rows, set status to Suspended or Active as appropriate.
user_type must be 'Admin' or 'Point of sale'
The user_type you have entered isn't valid. You must enter Admin or Point of sale.
Admin user creation errors
The following troubleshooting applies when id is blank and user_type is set to Admin.
Email is required
You must enter a value for email on every row when you create an admin user.
POS user creation errors
The following troubleshooting applies when id is blank and user_type is set to Point of sale.
given_name is required
You must enter a value for given_name for each new POS user row.
family_name is required
You must enter a value for family_name for each new POS user row.
User suspension errors
The following troubleshooting applies when id has a value and you're changing status for an existing user.
Suspend operation must have exactly 1 row.
Your import includes more than one row that suspends or reactivates the same user. Include only one suspend or reactivate row per user in each import.
Status is required
The status field is blank. You must set it to Suspended or Active as appropriate.
[...] does not match with user.
This error means a value in your row doesn't match what's saved for the user associated with the id in your Shopify admin. Confirm that the values you've entered for each of these columns in your CSV file match what's listed for that user in your Shopify admin:
- given_name
- family_name
- phone
- user_type
Status must be 'suspended' or 'active'.
Set status to either Suspended or Active.
[...] must be blank when suspending a user.
On rows where you're only changing status, leave these fields blank:
- role_name
- group_name
- store_name
- pos_location_name
- all_current_and_future_locations
- pin