All articles

Contacts and CSV import

Your address book fills itself as people book, and you can bring the one you already have with you. The importer takes a client export from another booking tool unedited, shows you what it is about to do to every row, and never makes a second record for somebody you already have.

What a contact is

A contact is identified by an email address or a phone number. That is the whole rule, and everything below follows from it: a row with neither cannot become a contact, and a row whose email or number you already have folds into the record that has it rather than starting a new one.

Importing a CSV

Open Import in the dashboard and go to Import a CSV. Upload the client export from your old tool as it came out. Exports from different tools disagree about almost every column name, so the importer matches headers loosely: case, spaces and punctuation are ignored, which makes E-mail Address, email_address and Email Address the same column.

Columns it reads

Eight fields: Full name, First name, Last name, Email, Phone, Company, Notes and Tags. Common spellings are recognised for each — Mobile, Cell and Telephone all read as Phone; Client Name and Customer Name both read as Full name. A file with separate first and last name columns and no combined one has the two joined for you.

The guess is a convenience, not the contract. The preview names the column it picked for every field and you can change any of them by hand before anything is written. A column the importer does not recognise is left alone rather than guessed at.

A Tags cell may hold several tags separated by a comma, a semicolon or a pipe. Repeats within the cell are dropped, and a single tag is cut at 50 characters.

The preview

Nothing is written until you confirm. The preview shows the first 20 rows in full, and labels every row with what would happen to it:

  • New — becomes a contact you do not have yet.
  • Merges — folds into a contact you already have, or into an earlier row of the same file. The preview names which fields it would change, and which earlier line it matched.
  • Skipped — no email address and no phone number, so there is nothing to identify the person by.
  • Invalid — the row could not be read.

When you confirm, the import is worked out again against your live contacts rather than replaying what the preview decided. Minutes can pass while you read the preview and a booking can land in between; re-deciding costs a moment and cannot act on a stale picture.

What happens to duplicates

A row is matched to an existing contact by email first. If the row has no email, or the address is new to you, the phone number is tried next: a contact you hold a number but no address for is matched outright, and the address on the row is added to it. Where one number is shared by two named contacts — a household — a row carrying its own email address is treated as a new person rather than guessed onto one of them.

Merging adds, and does not overwrite. A field you already have a value for is left exactly as it is, and only an empty one is filled in. A name you corrected here is not replaced by the stale spelling in an old export. The two exceptions are both additive:

  • Notes are appended rather than replaced, and text already present is not appended twice. Importing the same file again does not double anything up.
  • Tags are combined, matching existing tags regardless of case.

The same person appearing twice inside one file is handled the same way: the second row merges into whatever the first row decided, including into a contact the import is about to create. Each contact is written once.

Phone numbers

Numbers are compared in international form, so (555) 010-1234 and +15550101234 are one number and not two contacts. A number written without a country code is read as a United States number. A number that cannot be read as a dialable one does not count as an identity, so a row carrying only that is skipped.

Limits

  • The file may be up to 2 MB. A larger one is refused, with a message telling you its size and asking you to split it.
  • Up to 5,000 data rows, not counting the header. A longer file is refused whole rather than imported in part, so split it and import the pieces.
  • Up to 30 imports every 10 minutes per workspace. A preview counts towards that as well as a confirmed import.

Both ceilings are checked in your browser before the upload starts and again on the server, so an oversized file is refused straight away rather than after a long upload.

After the import

Contacts in the dashboard lists everybody, and each contact page holds their bookings, tags, notes and any card on file. You can also add somebody by hand with New Contact. Rows the import skipped are listed on the results screen with the reason, so you can fix those few in the spreadsheet and import them again — the rows that already landed merge into themselves and change nothing.

Bookings CSV

The client list is one import; your appointments are another. Import bookings from a CSV, further down the same Import page, takes a spreadsheet of bookings from the tool you are leaving and writes them here.

It writes the booking, a contact for the attendee and a hold on the time so the slot cannot be booked over. It sends nothing: no email, no text message, no calendar event and no meeting link. The meetings already exist where you made them, and the people in them did not ask to hear about the move.

Three things it asks you for, because none can be guessed safely:

  • Which column is which. Headers are matched on their names, case and punctuation ignored, and you can repoint any of them. Calendly publishes the column names its export uses, so a Calendly events CSV is matched against that published list; no other export format is, and the page tells you which of the two happened.
  • A time zone, unless the times in your file already carry one. A clock with no zone is not a time, so the importer asks rather than assuming.
  • An event type for every service name in the file. This importer does not create event types. A name you leave unset is reported and its rows are not imported.

Dates are read as 2026-10-06, as 10/6/2026, or spelled out as October 6, 2026. A day-first date like 3/4/2026 is refused rather than guessed at, because guessing wrong moves an appointment by a month. An end time may be a column of its own or a duration in minutes; when the file has neither, the event type's own length fills it in.

Rows are labelled in the preview:

  • Imports — will be written.
  • Already here — this workspace imported this row before. Uploading the same file twice does not double your bookings.
  • Time taken — something already holds that time. The row is reported, and nothing is written over the top of what is there.
  • Skipped — cancelled in the other tool, marked as a no-show, no event type, no attendee email or phone number, or a time that could not be read. Each is counted separately on the results screen.

Columns the mapping does not claim are carried into each booking's notes as Column: value lines, up to 2,000 characters per booking; you can turn that off, and the results screen counts anything that did not fit. The same 2 MB and 5,000-row ceilings apply as for contacts, with 20 imports every 10 minutes per workspace.

If your export does not resemble any of this, start from the bookings template and reshape the file to match it.

When the import finishes it names the date of the last booking it wrote. Keep your old tool open until then: your attendees still hold its confirmation email, and its cancel and reschedule links act there rather than here.

Getting data back out

Bookings export from Bookings with Export CSV, which downloads everything matching the filters you currently have set. See Managing bookings.

Last checked 2026-09-11.

Still stuck? Email support@calemander.com · Privacy · Terms