CSV Imports

A group account gets real the day somebody hands you a spreadsheet: 200 employees, one file, and a launch date. Inviting them one at a time isn't a plan. The CSV import takes the whole file, seats everyone it can, and tells you about the rest.

The import runs in two places:

  • The owner dashboard, using [memb_group_csv_import_form] or the full [memb_group_dashboard]. The owner seats their own people.
  • The WordPress admin, on the group's edit screen. Same file, same behavior, for when you do the seating yourself before handover.

The file format

The first row of the CSV is the header, and the header is field slugs. That's how the importer knows where each column goes: it reads email in row one and treats everything under it as the email address, whichever column it sits in. Column order doesn't matter; the header does.

Three columns are required:

Column Contents
email The member's email address
firstname First name
lastname Last name

Any other column is allowed as long as it names a Torii field by its slug: a field created under Membership → Fields (see User Fields). The value in that column is imported into the member's field. If you want a column for phone numbers or employee IDs, create the field first, then use its slug as the column header.

One member per row, up to 250 rows per import. A longer roster splits across multiple imports.

Example

email,firstname,lastname,employee_id,phone
dana@acmecorp.com,Dana,Whitfield,10241,555-0142
marcus@acmecorp.com,Marcus,Lee,10242,555-0188
priya@acmecorp.com,Priya,Natarajan,10243,555-0167

The first three columns are the required ones. employee_id and phone are local fields, imported because their slugs are in the header.

Creating the file

Any spreadsheet app makes one: Excel, Numbers, Google Sheets. Put the slug headers in row one, one member per row below, and export or save as CSV. The thing to preserve through the export is the header row; it's the map for everything underneath.

It's also the natural handoff format. Ask the buyer for their roster as a plain spreadsheet, fix the headers to slugs, and import.

What happens on import

Each row is handled according to what's already known about the email:

  • Existing users are added to the group directly.
  • Unknown emails receive invitations, same as if the owner had invited them by hand.

The import respects the seat limit: rows beyond the ceiling are skipped rather than crammed in. When it finishes, you get a report of what was added, what was invited, and what was skipped, with the reason for each skip. On the dashboard, the report arrives through [memb_group_notices].