Importing contacts
Updated August 24, 2026
Import a CSV to load an existing customer list into Pluspoint, or to update details in bulk from a system that already holds them. The import matches every row against your existing contacts and shows you exactly what will change before anything is written. Rows that match nothing become new records.
Before you start
- You need full Contacts access. With restricted access the Import button is not shown — see Users and permissions.
- Import is only available on desktop. It is hidden on screens 768 pixels wide or narrower.
- You must choose at least one location during the import, so create your locations first — see Managing locations.
- The file must be a real CSV. Save any spreadsheet as CSV before uploading.
Where to find it
Contacts → Import, or go to https://app.pluspoint.io/contacts and select Import.
The dialog carries a Download a sample CSV. link to a template at https://docs.google.com/spreadsheets/d/1elW5JQyXmByeMzRHhhsSuX3PXL42HyxGhNytbWXfVsI/.
Prepare the CSV
The file needs a header row, comma separators, and headers spelled exactly as below. Fields containing commas can be quoted, with any quote inside a quoted field doubled.
| Column header | Maps to |
|---|---|
First Name | First name |
Last Name | Last name |
Mobile Number | Phone number |
Email | Email address |
Facebook | Facebook handle, without the facebook.com/ prefix |
Instagram | Instagram handle, without the instagram.com/ prefix |
External ID | External ID — your own system’s identifier for this customer |
Rules the parser applies to the file itself:
- Columns it does not recognise are ignored, so you can leave extra data in the file.
- A row with a different number of columns from the header row is dropped without warning. Watch for stray commas in unquoted values.
- The file picker offers
.xlsxand.xlsas well as.csv, but only plain CSV text is parsed. Uploading a real Excel workbook fails with Incorrect file format.
Note A contacts export writes the external-ID column as
External Id, while the import expectsExternal ID. If you are editing an export and loading it back in, rename that header first. Otherwise every external ID in the file is silently ignored.
Run the import
- Select Import.
- Choose one or more Locations. Everyone the import touches is assigned to the locations you pick here.
- Select Upload CSV file and choose your file.
- Select Validate.
- Review the table of parsed rows. Values that failed validation are shown in red.
- Remove any row you do not want with the bin icon. Import stays disabled while a single invalid row remains. Delete those rows, or select Back, fix the file and upload it again.
- Select Import.
How rows are validated
The dialog quietly cleans the file before it shows you anything, so the table can list fewer rows than your spreadsheet.
| Rule | Effect |
|---|---|
| A row with neither a phone number nor an email | Dropped silently |
| Two rows with the same phone number | Only the first is kept. Rows with no phone number are all kept |
A phone number that starts with neither + nor 0 | A + is added before it is validated |
A phone number starting with 0 on a Ukraine-locale account | Becomes +38 followed by the number |
A phone number starting with 0 on a United Kingdom-locale account | Becomes +44 followed by the number without its leading zero |
| Any phone number after that | Validated as an international number and rewritten in E.164 format. An invalid one blocks the row, even if its email is fine |
| An email | Validated by format. An empty cell is acceptable, but a malformed address blocks the row |
| A row the dialog pairs with an existing contact but that changes nothing | Removed from the import entirely |
That last rule has a consequence worth planning around. Those rows are never sent, so the locations you chose in step 2 are not applied to them. To add a location to contacts whose details are already correct, select them on the Contacts page and use bulk Edit instead — see Managing contacts.
What the import changes
A row is treated as an existing contact when any one of these matches a contact in your account:
- a non-empty External ID that is equal,
- a phone number that is equal after cleaning,
- or an email address that is equal.
The preview table is stricter than that. It pairs a row with an existing contact in only two cases: equal phone numbers, or equal email addresses when neither the row nor the contact has a phone number. So a row the import will match on external ID — or on email while the two phone numbers differ — is shown and counted as new. It is imported without the back-fill described below.
| For a matching contact | For a new contact |
|---|---|
| First name, last name, email, phone number, Instagram and Facebook are overwritten with the imported values, blank cells included. For a row the preview paired, the dialog back-fills the blanks from the existing record first, so nothing is lost. For a row it did not pair, a blank cell overwrites the stored value | Created with everything the row supplies |
| An existing External ID is kept. The file never overwrites one that is already set | The External ID from the file is stored |
| The locations you chose are added. Existing locations are never removed | Assigned to the locations you chose |
| Existing segments are left untouched | Created with no segments |
| No new Contact created activity | A Contact created entry is written to the timeline |
Two things an import deliberately does not do:
- It cannot assign segments. There is no segment column, and segments already on a contact survive the import untouched. Assign segments afterwards with bulk Edit — see Segments.
- It cannot remove anything. Locations are only ever added, and no contact is deleted or unsubscribed by an import.
Size and repeat imports
Keep individual files to a manageable size, and split a very large list across several imports rather than sending one enormous file.
Re-importing the same file is safe. The second run matches every row to the contact it created, finds nothing changed, and removes the rows from the import. That is also why a re-import does not re-apply the location you picked.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| No Import button | You have restricted Contacts access, or you are on a screen 768 pixels wide or narrower | Ask for full access, or use a desktop browser |
| Incorrect file format | The file is an Excel workbook or is not comma-separated text | Save it as CSV and upload again |
| Fewer rows in the table than in the file | Rows with neither phone nor email, duplicate phone numbers, malformed rows and unchanged matches are all removed before the table is drawn | Check those cases in the source file |
| A phone number shows in red | It is not a valid international number after cleaning | Write it in full international form, starting with + and the country code |
| External IDs did not come through | The header reads External Id rather than External ID, or the contacts already had an external ID | Rename the header; existing external IDs are never overwritten |
| The locations you chose were not applied to some contacts | Those rows matched an existing contact and changed nothing, so they were dropped | Assign the location with bulk Edit on the Contacts page |
| Imported contacts have no segments | Import cannot set segments | Select them on the Contacts page and use bulk Edit |
| Couldn’t import | The batch failed as a whole | Nothing was written. Check the file for very large size or malformed rows and try again |