---
title: "Import clients"
description: "Bulk-import your existing customer list from an Excel or CSV spreadsheet when moving to Requiply from another system."
canonical_url: "https://requiply.com/docs/en/guides/clients/import"
---
# Import clients

> Bulk-import your existing customer list from an Excel or CSV spreadsheet when moving to Requiply from another system.

The **Bulk Client Import** page is where you bring a list of clients into Requiply from a spreadsheet. It is used to onboard existing customer data quickly instead of creating each client manually, and it feeds directly into the same client list used by bookings, invoices, and pricing discounts.

You can find this page under **Clients → Import** (it is also reachable from the **Import clients** button on the [Manage clients](https://requiply.com/docs/en/guides/clients/manage) page).

![Bulk Client Import page](https://requiply.com/docs/assets/clients/import/image.png)

## Why this page matters

Most organizations already have a client list in another system — a CRM, a spreadsheet, or an exported contacts file. This page exists so that data can be loaded into Requiply in one step rather than retyping each contact.

Once imported, those clients become the same records used everywhere else:

- **Bookings** — imported clients can immediately be selected when creating a booking.
- **Invoices and payments** — billing references the imported name, phone, and email.
- **Pricing discounts** — discounts can be applied to imported clients individually or in bulk from the [Manage clients](https://requiply.com/docs/en/guides/clients/manage) page.
- **Custom client fields** — imported clients gain the same custom-field structure as manually created ones (custom values are not part of the import file itself).

A clean import on day one saves a lot of cleanup later.

## What you'll see

The page is split into two columns.

**Left column — upload and controls:**

- A page title **Bulk Client Import**.
- A text-style **Download template** button that opens a dialog explaining the template (see [Downloading the template](#downloading-the-template) below).
- An advanced file uploader with the prompt **Upload .xlsx file** and the empty-state hint **Drag & drop or click to browse (.xlsx)**.

  - Accepts `.xlsx` and `.xls` files only.
  - Maximum file size is **5 MB**.
  - Single file at a time. Once a file is selected, the choose button is disabled until the file is removed.
- When a file is selected, it is shown as a row with an Excel icon, the file name, formatted size, and a red remove button to clear it.
- A list of validation error messages appears below the uploader if the file has problems. The list is scrollable when there are many errors.
- A **Start import** button at the bottom. It is disabled until at least one valid row has been parsed and is not active during an in-flight import.

**Right column — preview:**

- A **Preview** heading.
- When valid rows have been parsed: a card showing a **Showing {shown} of {total} rows** tag and a small data table with columns **First name**, **Last name**, **Phone**, and **Email**. The preview is capped at the first 10 rows.
- When no file has been parsed yet: a centered placeholder with a table icon and the message **Upload a file to see preview**.

**Confirmation dialog:**

When **Start import** is clicked, a modal opens with:

- Title **Confirm import**.
- A **Ready to import {count} client(s)** message and the hint **The import runs in batches and may take a moment.**
- During the import, a progress bar with a percentage and the label **Importing clients**.
- Footer buttons: **Cancel** (disabled while importing) and **Start import**.

<warning>

**Heads up:** While an import is running the dialog cannot be dismissed — closing, escape, and click-outside are all blocked until the import finishes.

</warning>

## Empty state

This page does not have a "no data" state in the usual sense — it is itself the entry point for getting data in. Until a file is uploaded:

- The validation error list is hidden.
- The preview area shows the empty placeholder described above.
- The **Start import** button is disabled.

## Main actions

### Downloading the template

Click **Download template** to open the **Download import template** dialog. The dialog explains:

- The template includes an example client row to follow.
- It contains a reference sheet describing limits and accepted values for each column.
- AI tools can be used to fill or transform existing data into the template format.

A success toast confirms the download; an error toast appears if the download fails.

<note>

**Tip:** Using the template is the recommended starting point because the column headers it contains are exactly what the importer expects.

</note>

### Uploading a file

Drag a file into the upload area or click to browse. The page accepts `.xlsx` and `.xls` files up to 5 MB. As soon as a file is chosen, it is parsed in the browser and:

- Valid rows are added to the preview on the right.
- Invalid rows are reported in the validation error list on the left.
- The **Start import** button enables when there is at least one valid row.

To swap files, click the red **×** next to the selected file (or use the file uploader's remove control). This clears the file, the parsed rows, and any validation errors.

### Starting the import

Click **Start import**. The confirmation dialog opens with the row count. Click **Start import** in the dialog to begin.

The import sends rows to the server in **batches**:

- The first three batches are intentionally small (10, 15, and 25 rows) so early failures show up quickly.
- After that, rows are sent in batches of **50** until the file is exhausted.
- The progress bar updates after each batch using the count of processed rows.

When the import finishes:

- If at least one row succeeded: a **success** toast (or a **warning** toast when some rows failed) is shown, the in-memory client list is refreshed, the dialog closes, and you are navigated to [Manage clients](https://requiply.com/docs/en/guides/clients/manage).
- If every row failed: an **error** toast **Import failed** is shown and the dialog closes.

## Forms and fields

Each row in the spreadsheet maps to a new client. Headers are matched case-insensitively and ignore underscores and dashes. Multiple aliases are accepted per column.

<table>
<thead>
  <tr>
    <th>
      Column
    </th>
    
    <th>
      Required
    </th>
    
    <th>
      Accepted headers
    </th>
    
    <th>
      Validation
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <strong>
        First name
      </strong>
    </td>
    
    <td>
      Yes
    </td>
    
    <td>
      <code>
        first name
      </code>
      
      , <code>
        firstname
      </code>
      
      , <code>
        first_name
      </code>
      
      , <code>
        name
      </code>
    </td>
    
    <td>
      Must be present; max <strong>
        25
      </strong>
      
       characters.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Last name
      </strong>
    </td>
    
    <td>
      Yes
    </td>
    
    <td>
      <code>
        last name
      </code>
      
      , <code>
        lastname
      </code>
      
      , <code>
        last_name
      </code>
    </td>
    
    <td>
      Must be present; max <strong>
        25
      </strong>
      
       characters.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Phone
      </strong>
    </td>
    
    <td>
      Yes
    </td>
    
    <td>
      <code>
        phone
      </code>
      
      , <code>
        phone number
      </code>
      
      , <code>
        phone_number
      </code>
    </td>
    
    <td>
      Must be a full international number — <code>
        +
      </code>
      
       followed by a country code and 7–15 digits in total, for example <code>
        +380951234567
      </code>
      
      . Must be unique within the file and not already used by an existing client.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Email
      </strong>
    </td>
    
    <td>
      No
    </td>
    
    <td>
      <code>
        email
      </code>
      
      , <code>
        e-mail
      </code>
    </td>
    
    <td>
      If provided, must look like a valid email address, be unique within the file, and not already belong to an existing client.
    </td>
  </tr>
</tbody>
</table>

Additional rules enforced before the import runs:

- The file must contain a sheet with at least one row of data.
- The file may contain at most **1000 rows**. Files larger than this are rejected with the error **Maximum 1000 rows allowed**.
- Duplicate phone numbers within the same file are flagged per row, and so are duplicate emails.
- Rows whose phone or email already belongs to a client in your organization are rejected with **Phone already exists** or **Email already exists**.

Each invalid row is reported as **Row {n}: {reason}** (where row numbers start at 2 to account for the header row). Invalid rows are skipped — the import continues with the rows that pass.

## How this page connects to the rest of Requiply

<table>
<thead>
  <tr>
    <th>
      Feature
    </th>
    
    <th>
      How this page affects it
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <strong>
        Manage clients
      </strong>
    </td>
    
    <td>
      After a successful import, you are navigated here automatically and the new clients appear in the table.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Bookings
      </strong>
    </td>
    
    <td>
      Imported clients become immediately available when creating bookings.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Invoices and payments
      </strong>
    </td>
    
    <td>
      Billing documents will use the imported name, phone, and email.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Pricing discounts
      </strong>
    </td>
    
    <td>
      Imported clients can be selected in bulk on the <a href="https://requiply.com/docs/en/guides/clients/manage">
        Manage clients
      </a>
      
       page to assign a discount.
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Custom client fields
      </strong>
    </td>
    
    <td>
      Custom field values are not part of the import file; they can be filled in later from the <a href="https://requiply.com/docs/en/guides/clients/add-or-edit">
        Add or edit client
      </a>
      
       page.
    </td>
  </tr>
</tbody>
</table>

## Common scenarios

### Onboarding from a previous system

The user downloads the template, copies their existing client list into it, removes any rows that exceed the limits, and uploads. The progress bar shows the import working through batches; on completion the user lands on [Manage clients](https://requiply.com/docs/en/guides/clients/manage) with the new rows visible.

### Importing a partially clean list

The user uploads a file where some rows are missing phone numbers or have invalid emails. The validation list on the left flags those specific rows by line number; the preview on the right shows only the rows that passed. The user runs the import for the valid rows now, fixes the rejected rows in the source file, and re-imports.

### Splitting a large list

The organization has more than 1000 clients to import. The user sees the **Maximum 1000 rows allowed** error, splits the file into chunks under 1000 rows each, and runs successive imports.

## Tips and cautions

<note>

**Tip:** Always start from the downloaded template — its headers match the aliases the parser expects, so you avoid "Missing first name" or "Missing phone" errors caused by header mismatches.

</note>

<note>

**Tip:** First name and last name are capped at 25 characters each. Trim long names in the source file before uploading.

</note>

<warning>

**Heads up:** Phone numbers must include the country code and a leading `+` — for example `+380951234567`. A national-format number is rejected with *"Phone must include a country code, e.g. +380951234567"*, and spaces, dashes, and parentheses fail validation too. Reformat the column in your spreadsheet before importing.

</warning>

<warning>

**Heads up:** Phone numbers and emails must be unique both within the file and against your existing clients. If the same client appears twice, the second row is rejected.

</warning>

<warning>

**Heads up:** Once you click **Start import** in the confirmation dialog, the dialog cannot be closed until the import finishes. Avoid navigating away mid-import.

</warning>


## Sitemap

See the full [sitemap](https://requiply.com/docs/sitemap.md) for all pages.
