> ## Documentation Index
> Fetch the complete documentation index at: https://help.liftify.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Bulk import users from a CSV

> Add or update your own staff logins in bulk, and set their notification rules, from two CSV files.

<Warning>
  This imports **portal users** — the people on your team who sign in to Liftify. It does not import customers, contacts, or leads. There is no customer import in the client portal at all: customers arrive through your connected external systems, or one at a time from the **Contacts** page.
</Warning>

If you're onboarding a whole office, or a new branch's worth of staff, this saves you inviting them one by one. There are two separate imports on the page: one that creates the logins, and one that sets what those people get notified about.

You need the **Manage Users** permission.

## Open the import page

1. In the left sidebar, click the circle with your initials, then **User Settings**.
2. Under **Company**, click **Users**.
3. Click **Import Users**.

That takes you to **User Imports**, a list of every import you've run. Click **New Import** for the **Bulk Import** page — *"Import users or notification preferences from a CSV file."*

## Import Users

The first card, **Import Users**: *"Upload a CSV file to bulk-create or update user accounts."*

Click **Download sample CSV** and work from that file — it already has the header row exactly right. **Field descriptions & allowed values** expands to the same reference shown below.

| Column       | Required | What goes in it                                                                                                                                 |
| ------------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `first_name` | Yes      | *"The user's first name."*                                                                                                                      |
| `last_name`  | Yes      | *"The user's last name."*                                                                                                                       |
| `email`      | Yes      | *"The user's email address. Used to identify existing users (case-insensitive)."*                                                               |
| `role`       | No       | The name of a role configured for your account — for example **Full Access** or **View Only**. Capitalisation doesn't matter. One role per row. |
| `locations`  | No       | `ALL` for every location, or location IDs separated by semicolons. Leave blank for no location restrictions.                                    |

<Note>
  All five column headers must be in the file even when you leave `role` or `locations` empty for a row. A missing column fails the whole import with **"Missing required column: role"** and nothing is created.
</Note>

A location ID looks like `loc-a1b2c3d4-e5f6-7890-abcd-ef1234567890`. Open a location in Liftify and copy it from the **Location ID** field at the top of the page.

Then:

1. Under **Select CSV file**, choose your file.
2. **Send invitation emails to imported users** is ticked by default. *"When unchecked, user accounts are created without sending welcome emails."* Untick it if you're loading people ahead of a launch date and want to tell them yourself later.
3. Click **Upload & Process**.

You're taken to the import list while it runs.

<Warning>
  A row whose email already belongs to someone in your account **replaces** that person's roles and location restrictions with what's in the CSV, and updates their name. It does not add to what they have. Export or note the current setup before re-running an import over existing users.
</Warning>

## Import Notifications

The second card, **Import Notifications**: *"Upload a CSV file to bulk-configure notification preferences for users."*

Everyone in this file must already exist in your account — this import never creates anyone. Run the user import first, then this one.

| Column                   | Required | What goes in it                                                                                                                                                         |
| ------------------------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `email`                  | Yes      | *"Email address of an existing user in your account (case-insensitive)."*                                                                                               |
| `notification_event`     | Yes      | The event to subscribe to. One of `review.created`, `survey_response.created`, `ticket.created`, `ticket.status_changed`, `ticket_comment.created`, `ticket.mentioned`. |
| `frequency`              | Yes      | `instantly`, `daily`, `weekly` or `monthly` — but not every event takes every value. See below.                                                                         |
| `rating_threshold`       | No       | *"Only notify for reviews at or below this star rating. A number from 1 to 5."* Only applies to `review.created`.                                                       |
| `review_sources`         | No       | `google`, `facebook` or `yelp`, semicolon-separated. Only applies to `review.created`.                                                                                  |
| `notification_locations` | No       | `ALL`, or location IDs separated by semicolons. Blank means all locations.                                                                                              |

Which frequencies each event accepts, in the page's own words: *"`review.created` and `survey_response.created` support all four; `ticket.*` events support instantly, daily; `ticket.mentioned` supports instantly only."*

One row per rule. A person who wants instant alerts for one-star reviews and a daily ticket digest gets two rows.

**Include account notification defaults** is ticked by default: *"When checked, each user in the CSV will also receive the account's default notification rules."* Untick it when the CSV is the complete picture and you don't want your account defaults layered on top. See [Set default notifications for new users](set-default-notifications-for-new-users).

Choose the file and click **Upload & Process**.

## Check what happened

The **User Imports** list shows every run with **Date**, **Type** (Users or Notifications), **Status**, **Total**, **Success**, **Failed** and **Initiated By**.

| Status              | Meaning                                                |
| ------------------- | ------------------------------------------------------ |
| **Queued**          | Waiting to start.                                      |
| **Processing**      | Running now.                                           |
| **Complete**        | Every row worked.                                      |
| **Partial Success** | Some rows worked, some didn't.                         |
| **Failed**          | No row succeeded, or the file itself couldn't be read. |

Nothing refreshes on its own — reload the page to see the status move.

Click a row for **Import Details**: the filename, whether invitations were **Sent** or **Not sent**, **Total Rows**, and a **Success / Skipped / Failed** count. Below that, **Results** lists every row of your file with its **Row** number, the first few values from that row under **Data**, a **Status** badge — **Success**, **Skipped** or **Error** — and a **Message**.

Fix the failed rows in a new CSV containing only those rows, and upload again. Rows that already succeeded don't need to be re-run, and re-running them would overwrite the people they refer to.

## Messages you might see

| Message                                                                             | What to do                                                                                                                            |
| ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| **"Missing required column: ..."**                                                  | The header row is wrong. Start from the sample CSV. Nothing was imported.                                                             |
| **"Email is required"**                                                             | That row has no email. Fill it in and re-upload just that row.                                                                        |
| **"Role 'X' not found for this account"**                                           | The role name doesn't match one of your roles. Check the exact name on the **Roles** page — spelling matters, capitalisation doesn't. |
| **"Location(s) not found: ..."**                                                    | A location ID in that row isn't one of yours. Copy it again from the location's page.                                                 |
| **"No user found with email '...' in this account"**                                | Notification import only. That person doesn't have a login yet — import them as a user first.                                         |
| **"Duplicate notification rule — a matching rule already exists"**                  | Shown as **Skipped**, not an error. That rule was already in place, so nothing changed.                                               |
| **"File is too large. Maximum size is 10 MB."**                                     | Shown before the upload starts. Split the file and run it in parts.                                                                   |
| **"Failed to get upload URL."**                                                     | Most often the file isn't a `.csv`. Export again from your spreadsheet as CSV and retry.                                              |
| **"The CSV file could not be parsed. Please check the file format and try again."** | The file isn't valid CSV — usually a stray quote mark. Re-export it rather than editing by hand.                                      |

## Troubleshooting

### I can't find the Import Users button

You need the **Manage Users** permission. Without it the **Users** page doesn't appear at all.

### The import says Complete but nobody got an email

Check **Invitations** on the import's detail page. If it says **Not sent**, the **Send invitation emails to imported users** box was unticked. The logins exist — invite those people individually from the **Users** page, or ask them to sign in with a magic link.

### I meant to import customers

Not this page. Customers come in through your connected external systems ([Connect an external system](connect-an-external-system)), or one at a time from **Contacts**. Importing a list of customers here would create staff logins for them.
