# Import members from a spreadsheet

> How to bring a list of people from any .xlsx or .csv spreadsheet into the community - origin, file, columns, groups and tags, consent, summary and report -, what each person gets by email and how they decline the invite.

The **Import spreadsheet** tab of the **Invite Members** window brings the people in a spreadsheet into the community: the attendee list of an event, a member base, the students of a class. Any spreadsheet works: you say where each column goes, choose role, groups and tags for everyone, check a summary and only then import. Each new person gets an invitation by email.

> [!WARNING]
> Only import people who **agreed** to receive emails and to join the community. Bought lists, giveaways and data collected by bots are forbidden. Read the [Invitation and member import policy](/membros/politica-de-convites) before importing.

## What it's for

| Community | Spreadsheet |
|---|---|
| Event | The attendees who ticked *"I want to join the community"*, with the ticket type column becoming a tag |
| Association | The member base, with company and job title becoming custom fields |
| School | The semester's enrolled students, all in the class group |
| Coworking | The residents, with the *Floor* column going to Groups |

## How it works

### Who can import

The **owner** and **admins**. The import only gives the **Member** or **Moderator** role: anyone who needs to join as admin or finance is invited from the **Type e-mails** tab. See [Invite members](/membros/convidar-membros).

### The file

- **.xlsx** or **.csv**. The old `.xls` and `.xlsm` (with macros) are refused, even renamed.
- Up to **5 MB**, **5,000 data rows** and **100 columns**.
- Formulas count by their calculated value; merged cells, by the value of the first one.
- In a CSV, Memberfy works out the **encoding** on its own (correct accents even in a file saved by an old Excel) and the **delimiter** (comma, semicolon, tab or pipe). You can change both.

### What happens to each row

| Case | What happens |
|---|---|
| Email with no Memberfy account | Gets an account and joins the community, with the role, the groups (including the [default group](/membros/grupos-e-organograma)), the tags and the fields. Gets the invitation with **Set my password** |
| Has an account, but isn't in this community | Joins the community. The account's name and phone don't change (they apply in other communities). Gets the invitation with **Sign in** |
| **Already a member** | Role and name don't change. **Gains** the groups and tags (nothing is removed) and only the **empty** custom fields are filled in. Gets no email. Counts as *updated* |
| Email repeated in the spreadsheet | The first row counts; the others are skipped as *duplicate in the spreadsheet* |
| No email or an invalid email | Skipped with the reason, without stopping the rest |
| No consent | Skipped (when there's a consent column) |
| Asked not to take part in this community | Skipped; no email goes out |
| A value that doesn't fit the field | Only that field stays empty; the person joins and the report warns you |

### The invitation email

Every person **new** to the community gets an email on the community's behalf, with the **list origin** (*"You got this invitation because your details are in: Attendees of event X in 2026"*) and, in the footer, the link **Thanks for the invitation, but I do not want to join**. Someone without an account gets **Set my password** (the link is valid for 7 days and works once); someone with an account gets **Sign in**. Existing members get nothing.

Import emails **don't count** toward the [campaign quota](/notificacoes/campanhas-de-email#sending-quota).

### In the background

When you click **Import**, the import goes into a queue and runs on its own: you can close the window. Invitations go out at the same pace as campaigns, about **5 per second**, so a list of 3,000 people takes around 10 minutes to be fully delivered. At the end, whoever imported gets an in-app notice and an email with the summary.

A community reads **one spreadsheet at a time**. If someone else on the team is importing at the same moment, the screen says *"Another spreadsheet is being read right now. Try again in a moment."*

### What is kept

The import records who imported, when, the file name, the origin and the consent used (the column and the values, or the declaration). A **copy of the original file** is kept in private storage, with no deletion date: the owner and admins download it from the history (**Previous imports › View › Download the original file**). On the record of whoever joined, the team reads *"Origin: spreadsheet import on …"*.

## Step by step

*Role: owner or admin.*

1. **Administration › Members**, **Invite Members** button, **Import spreadsheet** tab.
2. At the top of the window, choose the **Role** (Member or Moderator), the **Groups** and the **Tags** for everyone. New groups and tags are created right there by typing the name. These three fields are the same as on the **Type e-mails** tab: what you choose on one applies to the other.
3. **1. Source.** Write the **List origin** (required, up to 150 characters, no links), for example *Attendees of event X in 2026*. It goes in each invitee's email. Choose the file (drag it or click) and click **Next**.
4. **2. File.** Check how it was read: the **Sheet** (in an .xlsx with several), the **Header row** (*"Header on row 8."*, when the spreadsheet has a title above it) and, in a CSV, the **Delimiter** and the **Encoding**. Changing any of them rereads the file.
5. **3. Columns.** Each column shows with its first 3 rows and the **Goes to** selector. Columns **Recognized automatically** (email, first name, last name, phone, existing fields) come first; the others are left on **Ignore**, collapsed under *"28 ignored columns — show"*. The destinations:

   | Goes to | Rule |
   |---|---|
   | **E-mail** | Required, one column only. Without it, *"Choose the e-mail column to continue."* |
   | **First name** and **Last name** | Together they make the full name. A full-name column also works |
   | **Phone** | Adjusted to the international format, with the community's country as the default; an unreadable one stays empty |
   | **Tags** | Each value becomes a tag (separate several with `,` `;` or `\|`). E.g.: *Ticket type* |
   | **Groups** | Each value puts the person in the group with that name; a missing one **becomes a new group** |
   | **Consent** | The column that says who agreed. Mark which values **count as yes** (*Yes*, *x*, *agreed*…) |
   | **Field: …** | An existing [custom field](/membros/campos-customizados) |
   | **+ New custom field** | Creates the field with the column's name (editable) and the type suggested by the content. It is created **optional** |
   | **Ignore** | The column isn't imported |

   Consent, Tags and Groups are never suggested: you choose them. Columns with the same name show separately (*Phone (col. 24)*, *Phone (col. 30)*), and only one can go to each of the person's details.
6. **Consent.** With a consent column, only rows with the marked values get in. Without one, tick the declaration *"I declare that everyone on this list agreed to receive e-mails and to join this community."* Without one of the two, you can't import.
7. **4. Summary.** Check before saving: **Rows in the spreadsheet**, **New people**, **Already members**, **Will be skipped** (with the reason), **Skipped because they asked not to join**, **Invite e-mails to be sent** and the groups, tags and fields that **will be created**, by name. Clicking **Import** confirms all of this; there's no other question.
8. **5. Result.** Progress shows in the window. At the end: **Imported**, **Updated**, **Skipped** and **Invites sent**, the list of **Skipped rows** with the reason, the **Rows imported with a warning** and the **Download errors CSV** button (the original rows with a reason column, to fix and import again).

**Previous imports**, on the same tab, shows the history: each import with date, counts, status and the original file.

## Decline the invite

Someone who was imported and doesn't want to take part has two ways out:

- **From the email:** the link **Thanks for the invitation, but I do not want to join** opens a community page, with no sign-in, with **Confirm: I don't want to join**.
- **In the community:** in **My Account**, the same sentence shows discreetly, with the explanation *"You were added to this community by a list import."*

On confirming, the person leaves the community and goes on the **decline list**: the community can no longer import or invite them. Their Memberfy account stays. They only come back by joining on their own, through open sign-up.

- The email link is valid for **30 days** and stops working when the person **accepts the invite** (sets the password and signs in) or when their **role changes**. After that, to leave, they talk to whoever runs the community.
- Declining **doesn't apply to team members** (moderator, admin, finance) or to anyone with an active or pending **subscription** in the community: the person cancels the subscription first.
- The decline list also applies to the **email invite** and to **New Member**: whoever declined comes back as *"Asked not to take part in this community"*, and no email goes out.

A single decline isn't a violation; many declines from the same list lead Memberfy to review the community. See the [Invitation policy](/membros/politica-de-convites#how-an-invited-person-declines-or-reports).

## Examples

**An event with 220 attendees.** The spreadsheet has a title in the first rows and the header on row 8. The organizers check the header row, send the *Agreed to receive news* column to **Consent** with *Yes* counting as yes, *Ticket type* to **Tags** and *Company* to **+ New custom field**. The summary shows 97 new people, 109 without consent, 12 duplicates and 2 without email. They import; 97 invitations go out.

**An association bringing in its base again.** Half are already members. That half gets the *Members 2026* group and fills in the *Company* that was empty, with no email; only the new people are invited.

## Common errors and how to fix them

| Message | What to do |
|---|---|
| *Upload an .xlsx or .csv file.* | Save the spreadsheet as .xlsx or .csv |
| *The file is over 5 MB.* / *The spreadsheet has more than 5,000 data rows.* | Split it into parts and import one at a time |
| *No clear header was found, so row 1 was used…* | Pick the right **Header row** in the File step |
| Garbled accents (*JoÃ£o*) | Change the **Encoding** in the File step |
| *Choose the e-mail column to continue.* | Send a column to **E-mail** |
| *Only one column can go to Phone.* | Leave the other on **Ignore** or send it to a custom field |
| *Mark which values of the consent column count as yes.* | Mark the values under **Count as yes** |
| *Tell where the list comes from.* | Fill in the origin in step 1 |
| *Check the consent declaration to import.* | Without a consent column, the declaration is required |
| *Another spreadsheet is being read right now. Try again in a moment.* | Wait a few seconds and click again |
| *Spreadsheet imports only accept member or moderator.* | For other roles, use **Type e-mails** |
| *Interrupted by the community's suspension* | Memberfy suspended people joining; what had already been processed stays. See [Suspension of joining and sales](/membros/politica-de-convites#suspension-of-joining-and-sales) |

## Frequently asked questions

**Can I import without sending an email?**
No. Every new person gets the invitation, with the origin and the decline link: that's what lets them know where their data came from and say no.

**Can I undo an import?**
There's no undo button. To remove someone, use [Manage members](/membros/gerenciar-membros).

**Can I import someone who declined?**
No. Someone who declined only comes back by joining on their own.

**The groups column has a name written differently from the group.**
The match ignores case and accents (*engineering* finds *Engineering*). A name that matches no group creates a new one, and the summary shows which before you import.

**Can I import through Claude or ChatGPT?**
Yes: attach the spreadsheet to the conversation and ask. See the recipe [Import a spreadsheet through the assistant](/mcp/receitas#61-import-a-spreadsheet-through-the-assistant).

## In the API

`POST /api/members/imports` (the file, as `multipart`), `POST /api/members/imports/{id}/preview`, `POST /api/members/imports/{id}/start`, `GET /api/members/imports`, `GET /api/members/imports/{id}`, `GET /api/members/imports/{id}/errors.csv` and `GET /api/members/imports/{id}/file`. Declining is `POST /api/invite-opt-out/{token}` (from the link) and `POST /api/profiles/me/decline` (signed in). See [Member Imports](/api/referencia/member-imports) in the API reference.

## Related

- [Invitation and member import policy](/membros/politica-de-convites)
- [Invite members](/membros/convidar-membros)
- [Custom fields](/membros/campos-customizados)
- [Groups and org chart](/membros/grupos-e-organograma)
- [Tags](/membros/tags)
