CSV File Formats
General Guidelines
- All CSV files must contain a header row.
- The header row must contain all required fields.
- Optional fields may be omitted from the header.
- Header order does not matter.
- Fields that contain a comma must be double-quoted. Example:
Philosophy, Art, and Poetryshould appear in the CSV as"Philosophy, Art, and Poetry" - Fields that contain double-quotes (
") must be double-quoted and escaped. To escape double quotes in a field you use another double-quote. For example, if you want a field in Pronto to appear asCalculus "Lite"then it should appear in the CSV as"Calculus ""Lite"""
Supported file encodings: UTF-8, UTF-16
Identifiers
Users, groups, and categories each have two unique identifiers. The first is the Pronto ID which is a number assigned internally by Pronto when a record is first created. (examples: user_id, category_id, group_id)
The second is an External ID which you can use to store the identifier of a corresponding record in your external system. This identifier can be used however you like, but it must be unique within your organization.
To update or add an External ID to an existing record, specify both identifiers. Pronto will lookup the record using the Pronto ID and update that matching record's External ID. To remove the External ID, include the external_id column header, but leave the value blank.
How existing records are matched
Pronto only ever looks up an existing record by its Pronto ID or its External ID. Other fields, such as a user's email or phone, are never used to find an existing record. This means:
- A row with a Pronto ID is always an update. If no record in your organization has that Pronto ID, the row is rejected.
- A row with an External ID but no Pronto ID is an update if a record in your organization already has that External ID. Otherwise it is treated as a new record.
- A row with neither identifier is always treated as a new record.
- A row with an External ID that does not exist yet and an
email(orphone) that already belongs to a user results in an import error, not an update. The existing user is not matched by email, so the row is treated as a new user and rejected as a duplicate.
When a row is treated as a new record but a matching record already exists (for example, a user with the same email address), the row is rejected as a duplicate and nothing is changed. See the notes under each file type for details.
Users
File Name: users.csv
| Field | Type | Required | Max Length | Default | Description |
|---|---|---|---|---|---|
| user_id | integer | no* | The internal Pronto ID. | ||
| external_id | string | no* | 255 | A customer-supplied unique user identifier. This must be unique within your organization. | |
| first_name | string | yes | 60 | The user's given name. Note that in the Pronto app, the full name is always shown so if your system only has a full name, you can arbitrarily split it. | |
| last_name | string | yes | 60 | The user's surname. | |
| title | string | no | 40 | The user's title. This field will only be imported if the feature is enabled for the organization. | |
| pronouns | string | no | 40 | The user's preferred pronouns. This field will only be imported if the feature is enabled for the organization. | |
| phone | string | no^ | 15 | The user's phone number in E.164 format (e.g. +18012345678).Alternatively, if all phones in the CSV are within a single country, you can specify a default country code when creating an import batch and use local phone number formatting in this field. |
|
| string | no^ | 100 | The user's email address | ||
| role | enum | no | user | The user's role. Values: user, manager, admin |
|
| status | enum | no | active | The status of the user in the org. You can deactivate or reactivate a user by setting this status. Values: active, deactivated |
*When updating or deactivating or re-activating a user, one is required: user_id, external_id
^When creating a new user at least one is required: email, phone
Additional Notes
- When creating a new user you must not specify
user_id. Pronto will create this internally upon record creation. - When creating a new user you may specify
external_id. You can then reference this user in other files or subsequent batches. - If you specify both
user_idandexternal_id,user_idwill be used for lookup and theexternal_idwill be updated to the specified value. - Existing users are matched only by
user_idorexternal_id, never byemailorphone. If a row has nouser_idand itsexternal_iddoes not match any user in your organization (for example, the user was created without one), Pronto treats the row as a new user. Because the email or phone already belongs to an existing user, the row is rejected withEmail address is already in use by another user.(or the phone equivalent) and the existing user is not updated. - To start using external IDs for users that currently exist in Pronto without one, run a batch that includes both
user_idandexternal_idfor each user. Pronto finds the user byuser_idand saves theexternal_id. From then on,external_idalone is enough to update those users. You can find each user'suser_idin Org Management or via the Pronto API. - If your import batch is configured to automatically deactivate users that are not present in
users.csv, be aware that a rejected row does not count as "present". An existing user whose row was rejected for a duplicate email or phone may be deactivated by that batch.
Examples
Creating new users. One record has an email AND a phone, while the other just an email:
first_name,last_name,email,phone
Mookie,Betts,mookie@dodgers.c,+12133456789
Freddie,Freeman,freddie@dodgers.com,
Creating new users with external IDs:
external_id,first_name,last_name,email
MYSYSTEM_ID_100,Mookie,Betts,mookie@dodgers.com
MYSYSTEM_ID_200,Freddie,Freeman,freddie@dodgers.com
Updating roles for existing users using their Pronto IDs:
user_id,first_name,last_name,email,role
23723382,Mookie,Betts,mookie@dodgers.com,admin
23947276,Freddie,Freeman,freddie@dodgers.com,user
Deactivating users using their external IDs:
external_id,first_name,last_name,email,status
MYSYSTEM_ID_100,Mookie,Betts,mookie@dodgers.com,deactivated
MYSYSTEM_ID_200,Freddie,Freeman,freddie@dodgers.com,deactivated
Assigning external IDs to existing users that were created without one. The users are found by user_id and their external_id is saved so future batches can reference them by external_id alone:
user_id,external_id,first_name,last_name,email
23723382,MYSYSTEM_ID_100,Mookie,Betts,mookie@dodgers.com
23947276,MYSYSTEM_ID_200,Freddie,Freeman,freddie@dodgers.com
Suppose Mookie and Freddie already exist in Pronto but were created without external IDs. This batch will not update them. Because there is no user_id and no existing user has these external IDs, each row is treated as a new user and rejected with Email address is already in use by another user.:
external_id,first_name,last_name,email
MYSYSTEM_ID_100,Mookie,Betts,mookie@dodgers.com
MYSYSTEM_ID_200,Freddie,Freeman,freddie@dodgers.com
Categories
File Name: categories.csv
| Field | Type | Required | Max Length | Default | Description |
|---|---|---|---|---|---|
| category_id | integer | no* | The internal Pronto ID. | ||
| external_id | string | no* | 255 | A customer-supplied unique user identifier. | |
| title | string | yes | 255 | user | The title of the category. |
| status | enum | no | active | The status of the caetegory. You can delete a record using this status. Values: active, deleted |
*When updating or deleting a category, one is required: category_id, external_id
Examples
Creating new categories without external IDs.
title
Math 100
English 440
Creating new categories with external IDs:
external_id,title
MYSYSTEM_ID_100,Math 100
MYSYSTEM_ID_200,English 440
Deleting categories using external IDs:
external_id,title,status
MYSYSTEM_ID_100,Math 100,deleted
MYSYSTEM_ID_200,English 440,deleted
Groups
File Name: groups.csv
| Field | Type | Required | Max Length | Default | Description |
|---|---|---|---|---|---|
| group_id | integer | no* | The internal Pronto ID. | ||
| external_id | string | no* | 255 | A customer-supplied unique user identifier. | |
| category_id | integer | no | The group's category using the category's internal Pronto ID. | ||
| category_external_id | string | no | 255 | The groups category using the category's external ID. | |
| title | string | yes | 100 | The title of the group. | |
| status | enum | no | active | The status of the group. You can delete a record using this status. Values: active, deleted |
*When updating or deleting a group, one is required: group_id, external_id
Memberships
File Name: memberships.csv
| Field | Type | Required | Max Length | Default | Description |
|---|---|---|---|---|---|
| group_id | integer | no* | The group's internal Pronto ID. | ||
| group_external_id | string | no* | 255 | The group's customer-supplied unique user identifier. | |
| user_id | integer | no* | The user's internal Pronto ID. | ||
| user_external_id | string | no* | 255 | The user's customer-supplied unique user identifier. | |
| user_phone | string | no* | 15 | The user's phone number in E.164 format (e.g. +18012345678) or in the import batch's default country formatting style (if specified). |
|
| user_email | string | no* | 100 | The user's email address. | |
| role | enum | no | member | The user's group role. Values: member, owner |
|
| status | enum | no | active | The status of the user in the org. You can remove someone from a group using this status. Values: active, deleted |
*A membership record ties a user to a group, so an identifier must be specified for each:
- For user, one is required:
user_id,user_external_id,user_email,user_phone - For group, one is required:
group_id,group_external_id