· 10 min read

How do I import my member list into Orgo?

Save each sheet as its own CSV, put your old system’s identifier in a user_legacy_id column, and upload it on the Users step of the import page. Nothing is written until the header row passes validation, you get per-row errors for anything that fails, and a completed import can be rolled back once.

This is the most support-heavy job in the product, and almost all of the difficulty is in the file rather than the platform. Get the file right and the import itself takes a few minutes.

The import page lives under Customization in your settings, and every import endpoint requires ADMIN_TENANT. The sidebar is configured per workspace, so the entry may be named differently in yours.

Data Import System page showing the recommended import order as numbered steps for Local Centers, Roles, Badge Types, Badges, Users, Contacts and User Roles, each with a Choose CSV button and an example file download

The page is a numbered list, not a wizard. Each entry is one import type. There is no column-mapping screen, no options dialog and no dry run. The file you upload is the instruction, which is why the columns matter so much.


1. One sheet, one CSV

Import reads one CSV at a time, and a CSV file holds exactly one sheet. If your data lives in a workbook with tabs for members, chapters and payments, that is three separate CSV files and three separate uploads.

One workbookMembersChaptersPaySaving this as CSV keepsonly the active sheetchapters.csvmembers.csvpayments.csvUsers stepLocal Centers stepProduct Payments stepRun them in the page’s order, top to bottomso later files can reference earlier records

Run the steps in the order the page lists them. Each one can reference records the earlier ones created, so chapters and roles go in before members, and payments go in after.

File rules. .csv and .txt, up to 50 MB. Comma, semicolon and tab are detected automatically, and a UTF-8 byte order mark is stripped. A larger file is refused on the spot, so split it and run the parts one after another.


2. What the Users file needs

Only one column is required: user_legacy_id. Everything else is optional, and any column Orgo does not recognise becomes a profile custom field rather than an error.

Your header rowuser_legacy_idemailfirst_namelast_namedate_joinedlocal_center_legacy_idT-Shirt SizeRequiredMissing it fails the whole filebefore any row is writtenRecognised system columnsWritten to the matching fieldon the member’s profileEverything elseBecomes a profile custom field, createdfor you if one with that name does not existHeaders are matched after lowercasing and turning spaces and hyphens into underscores, so First Name works.camelCase does not: firstName is treated as an unrecognised column and becomes a custom field.

The Users columns Orgo recognises

ColumnWhat it sets
user_legacy_idYour old system’s identifier for this person. Required
emailThe member’s email address
first_name, last_nameName
phone_numberPhone
birth_dateDate of birth
genderGender
address, postal_codeAddress
town_residenceTown of residence
local_center_legacy_idChapter. Accepts the chapter’s legacy id, or its name
user_type_legacy_idUser type. Accepts the role’s legacy id, or its name
statusMember status
member_idCard or member ID
is_full_memberFull member flag
date_joinedJoined date
date_joined_full_memberFull member since
profession_headlineProfession headline
company_nameCompany name
websiteWebsite
tagsProfile tags
fee_tenant_product_price_legacy_idWhich membership fee tier the member is on

Two more headers, date_created and is_newsletter_subscribed, are accepted by the header check but not written to the profile, so do not use date_created to carry a joined date. Use date_joined.

Write user_legacy_id exactly, with underscores. The required-column check is stricter than the others and does not forgive a header written as “User Legacy ID”. Download the example CSV from the download icon on the step if you want the exact headers to copy.

If you have no identifiers from your old system

Make some. A row number will do, as long as it is unique and stays the same across every file you upload. What you must not do is renumber between files.


3. The join key holds your files together

user_legacy_id is more than a required column. It is how every later file says which member a row belongs to.

members.csvuser_legacy_idfirst_namelast_name1001RosaWhitfield1002TheoVargasuser_roles.csv1001, chapter_secretary, 2024-01-01payments.csv1001, annual_membership, 45.00Keep it stableThe same person must carrythe same value in every fileRenumbering between files doesnot produce an error. It attachesroles and payments to thewrong people, silentlyCheck a handful by hand afterwards

The same rule applies to the other steps. local_center_legacy_id, role_legacy_id, product_legacy_id and the rest are your old system’s identifiers stored on the Orgo record, and they are how a later file points at what an earlier one created.

Duplicate detection uses the same key. A row is a duplicate when its user_legacy_id already exists in your organisation, and failing that, when its email address already belongs to someone.


4. How dates get set

Dates are where imports quietly go wrong, because a bad date does not usually fail a row. It writes something else instead.

Use YYYY-MM-DD for every date column. It is unambiguous and it is read the same way everywhere.

05/06/1990ambiguouscould be 5 June 1990could be 6 May 1990You get one of them and no error either way1990-06-05unambiguous5 June 1990, every timeUse this form in every date column of every file
ColumnWhat happens
date_joinedSets the member’s joined date. If the cell is empty or the date cannot be read, it is set to today
date_joined_full_memberSets the full member date. Same fallback to today
birth_dateSets date of birth. If the date cannot be read, the field is left empty and the row still imports

The fallback to today on date_joined is worth stopping on. A file with a blank joined-date column imports cleanly and gives you an organisation where everybody joined on migration day, which quietly breaks every “members who joined in 2019” question you ask afterwards. Fill the column, or accept the answer.

What the import does not set

The Users import does not set fee validity. It can put a member on a fee tier with fee_tenant_product_price_legacy_id and it can record a joined date, but the date that decides whether a member currently counts as paid is written by the payment and checkout flows, not by a CSV column.

So after importing a historical membership list, expect members to read as unpaid until a payment exists for them. That is not the import failing. If you need historical payments in the platform, that is the Product Payments step, run after Users.


5. Run it and watch it

  1. Download the example CSV. The download icon on the step gives you a file with the exact headers that step reads. Build your file from it rather than guessing.
  2. Choose CSV. Orgo checks the file size, the encoding and the delimiter as it reads.
  3. Start Import. Validation and processing run in the background, in batches, so a large file keeps going after you close the tab.
  4. Watch the progress. A live percentage with running counts of successful, failed and skipped rows.
  5. Read the errors. Expand the row in Import History for per-row failures: row number, message and the raw row data.

Orgo does not email you when an import finishes. Keep the page open, or come back to the history table.

Validation runs before any row is written. Orgo looks for the header row in the first ten lines and checks the required columns. If they are missing, the import fails naming the columns it wanted and the ones it found, and nothing is created. A file that fails this way costs you nothing except the time to fix the header.


6. Reading the result: successful, skipped, failed

Import History table showing imports by type and status, including a Modify Contacts import processing at 64 percent with 407 of 640 rows done, a Failed Company Members import with 0 of 18, and Completed and Rolled Back imports with Rollback buttons

Three counts come back and they mean different things.

SuccessfulThe record was createdThis is the only count thatput new people in yourmember directorySkippedThe person already existsMatched on user_legacy_id,or failing that on email.Nothing about them changedNo error is loggedFailedThe row was rejectedAn error is logged with the rownumber, the message and theraw row dataThe rest of the file continues

A failed row does not stop the import and does not undo the rows around it. Processing carries on, so you end up with a partly loaded file and a list of what did not make it. That is the design: fix the failed rows in a smaller file and run that file, rather than starting again.

The errors panel lists the first 20 failures with the total count underneath, so a file with hundreds of failures usually has one cause. Read three of them, find the pattern, fix it in the spreadsheet.

Fixing a failed row

What the errors panel shows youRow 47Missing required field: user_legacy_idRow data, Rosa, Whitfield, Norfolk, 2019-03-14the first cell is emptyWhat you upload in the fix-up fileRow 21043, Rosa, Whitfield, Norfolk, 2019-03-14Same header row, only the rows that failed. Everything already imported is skipped anyway.

The two failures you will actually meet on the Users step are an empty user_legacy_id, and a first or last name containing characters the platform does not accept. Both are cell-level problems, both are visible in the raw row data, and both are fixed in the spreadsheet.


7. Rolling back

Every completed import has a Rollback button in Import History, until you use it once. For the create steps it deletes the records that import made, in reverse dependency order, so nothing is left pointing at a missing parent. The whole rollback is one transaction, so it either completes or changes nothing.

Rollback is a migration tool, not an undo button for everyday use. Two things to know before you press it:

  • It can reach people who already existed. When a row matches somebody already in your database by email and also carries a user_legacy_id that differs from what was stored, that existing account is stamped with this import, and rollback deletes accounts stamped with the import. If you are rolling back a file that overlapped with members you already had, check what you are about to lose first.
  • For a modify import, it restores the values as they were at import time. If another import or an administrator changed those records afterwards, those later changes are reverted too.

Statuses you will see in the history: Pending, Validating, Processing, Completed, Failed, Rolled Back. The history keeps the 50 most recent imports.


8. Changing people who already exist

The create steps never update. If you need to change members who are already in the platform, the last two steps on the page, under Modify existing records, are the ones that do it.

  • Modify Users matches on email, then user_legacy_id, then phone_number, in that order.
  • An empty cell leaves that field unchanged. Only columns you fill in are written, so a correction file can carry two columns and nothing else.
  • A row that matches nothing falls back to creating a contact, provided it carries at least an email or a name.
  • Usernames, passwords, permissions and API tokens can never be written by an import.

9. What the imported members get

Nothing. Import sends no email at all, so tell people yourself that their account exists.

The password the import writes is a placeholder nobody knows, so an imported member signs in with the email one-time code from the login page, or through a password reset. A row with no usable email address gets a generated placeholder address that cannot receive mail, so those members cannot sign in until you correct the address.

Custom fields settings page listing profile custom fields including Skills, Professional Interests, T-Shirt Size, Professional Registration Number and Motivation for Joining, each showing its field type and its custom_field identifier

Any column Orgo did not recognise is now a profile custom field, created as a text field visible on the profile. This is worth checking after your first import: if you meant a column to land on a built-in field and it shows up here instead, the header was wrong. Roll the import back, fix the header, run it again.

If two of your fields share a label, a column named custom_field_123 writes to the existing custom field with that id instead of matching by name.

Duplicates afterwards

Merge Records page with a manual merge panel for choosing a source record to delete and a target record to keep, and a Duplicate Suggestions table listing pairs of user records with match scores and a Merge button on each

If the same person arrived twice, from two files or from an import plus a self-registration, merge them rather than deleting one. The Merge Records screen suggests likely pairs and shows you what will be kept before you commit. Once the file is in, the rows are ordinary records in your member database, searchable and filterable like any other.


Before you upload, check these six things

  1. Each sheet is saved as its own CSV file.
  2. user_legacy_id is present, spelled with underscores, and unique.
  3. The same person carries the same user_legacy_id in every file.
  4. Every date column is in YYYY-MM-DD form.
  5. date_joined is filled in, unless you are happy with today’s date.
  6. Headers are lowercase with underscores, not camelCase, and match the example CSV.

Frequently asked questions

Why does my import say most rows were skipped?

Skipped means the person already exists. The create steps never update an existing record: a row is skipped when its user_legacy_id already exists in your organisation, or when its email address already belongs to someone. That is the expected result if you run the same file twice. To change people who already exist, use the Modify Users step instead.

Can I undo an import?

Yes, once. Every completed import has a Rollback button in Import History, and it disappears after you use it. For create steps it deletes the records the import made, in reverse order so nothing is left pointing at a missing parent. The whole rollback runs as one transaction, so it either completes or changes nothing.

My spreadsheet has several tabs. Do I upload the whole file?

No. Import reads one CSV at a time and a CSV holds exactly one sheet. Save each tab as its own CSV file and upload it on the step that matches what it contains. A workbook saved as CSV keeps only the sheet that was active when you saved it, which is how people lose half their data without any error appearing.

SHARE