Skip to main content
ClientNest365ClientNest365

Clients and invitations

How to import an existing client list

Bulk-import clients from a CSV, send invites in batch, and handle the common edge cases (duplicate emails, custom fields, partial imports).

Audience: owner · 4 min read · Last reviewed

If you're migrating from email + Drive or from another portal tool, you'll have an existing list of clients to seed. The bulk-import flow handles this in one CSV upload.

Prepare the CSV

The minimum schema:

name,email
Acme Industries,andrea@acme.example
Greenleaf Yoga,carla@greenleaf.example

Optional columns the importer recognises:

Column Purpose
phone Client primary phone (for offline contact)
country Two-letter ISO code (GB, IE, DE, FR, NL, IT, US)
tags Pipe-separated labels (retainer|priority|Q1-2027)
internal_note Free text, visible only to your team
currency Override the workspace base currency (EUR, USD, GBP)
template_pack Which template pack to attach: accounting, agency, legal, consulting
send_invite true or false, whether to send the magic-link invite immediately

Encoding: UTF-8. If your client names contain accented characters (Café, Marchetti, Müller), save the CSV as UTF-8 to avoid garbled text.

Run the import

/app/clientsImport from CSV.

  1. Drop the CSV into the upload zone.
  2. The importer reads the first row as headers and shows a preview: "We found 47 valid client rows. 2 rows have issues."
  3. The preview lets you map columns if the headers don't match the recognised names (e.g., client_emailemail).
  4. Resolve the issues. Common issues:
    • Duplicate email: a client with that email already exists in your workspace. The importer offers to skip or update.
    • Invalid email: the address fails RFC 5322 validation. Fix in the CSV and re-import the affected rows.
    • Slot count exceeded: you don't have enough slots to import everyone. Buy a top-up pack and continue.
  5. Click Import. The importer processes rows in batches of 50. For 200 clients, expect ~30 seconds.

After import:

  • Every imported client appears in /app/clients
  • If send_invite=true was set for any row, those invites go out in batches (rate-limited to avoid spam-filter triggers)
  • Failed rows show in a downloadable error report

Sending invites after import

You can run the import without sending invites (send_invite=false), then send them later in controlled waves.

To send invites in bulk:

  1. /app/clients → filter by Status: not invited
  2. Select multiple clients (checkbox)
  3. Click Send invites in the bulk-action menu

Best practice: send in waves of 50-100 per hour, not all at once. Mass-send from a fresh workspace can trigger email-provider rate limits or spam-filter heuristics. The bulk-action UI throttles automatically.

Migrating clients with historical context

The CSV import covers names, emails, and metadata. It doesn't cover:

  • Historical files
  • Past invoices
  • Old message threads
  • Approval history

For most migrations, this is fine. You import the active client list, send invites for ongoing engagements, and leave the historical context where it lives (email, Drive, your old portal).

If you need to migrate historical files, the workflow is:

  1. Import clients via CSV
  2. For each client with historical files worth importing, manually upload to their Files section
  3. Use the Internal note field to document where the rest of the historical context lives (e.g., "Pre-2026 files in shared Drive folder /Clients/Acme")

For practices migrating 100+ clients with files each, we can do a custom import on request. Contact us with the source-tool name and an export sample.

Common CSV mistakes

  • Excel saves as UTF-8 BOM by default. The BOM character () at the start of the first cell can break header detection. Solution: re-save with "CSV UTF-8 (no BOM)" if your Excel offers it, or use a text editor like VS Code to remove the BOM.
  • Trailing whitespace in emails. andrea@acme.example (with a space) fails validation. Trim before upload.
  • Inconsistent column counts. If row 47 has a comma inside a field that wasn't quoted, the importer reads it as an extra column. Solution: quote any field containing commas. Most spreadsheet exporters do this automatically; a hand-edited CSV may not.
  • Leading zeros stripped from phone numbers. Excel treats 0207... as a number and strips the zero. Solution: prefix with + or apostrophe in the source, or set the phone column to Text format before save.

Re-running an import

The importer is idempotent on email. If you re-run the same CSV:

  • Existing clients (matched by email) get updated with any new field values
  • New rows get added
  • No duplicates are created

This lets you maintain a master CSV elsewhere (Excel, Google Sheets, your existing CRM) and re-sync on demand.

Bulk-action other operations

The same /app/clients page supports bulk operations beyond import:

  • Bulk archive: select clients you no longer work with, mark them archived. Their slot is freed for new clients.
  • Bulk send message: send the same message to multiple clients at once (useful for announcements like "we're closing for the holidays from 23 Dec to 5 Jan").
  • Bulk delete (soft): marks clients deleted_at; recoverable for 30 days.
  • Bulk export: dumps all client metadata to CSV for backup or migration to another tool.

What this looks like in practice

The accounting walkthrough at Hayes & Co. describes a bulk import of 130 self-assessment clients in October 2026, with invites sent in waves of 30 over three days. The flow there is the canonical version of this article in production use.