# Importing content from a spreadsheet

> How to bring posts, articles and short posts from an .xlsx or .csv spreadsheet with their original date and author (file, columns, options, preview, progress and report), what makes a row get skipped, each warning and the limits.

The **Import content** button brings into the community the history that lived somewhere else (WordPress, Substack, Circle, an old group, a spreadsheet): each row of the spreadsheet becomes a post, an article or a short post, with its **original date** and, when possible, its **original author**. You say where each column goes, check a preview and only then import. No one is notified.

## What it's for

| Community | Spreadsheet |
|---|---|
| Moving from a blog or newsletter | The export of the articles, with title, HTML text, date and the author's e-mail |
| Old forum or group | The discussions, each with the e-mail of whoever started it, going into a Feed space |
| Association | The archive of announcements from the past years, all in a Content space |
| Course | The class notices as short posts, in the order they went out |

## How it works

### Where it is and who can

In the header of **Content** and **Feed** spaces, click the arrow next to **New Content** (in the Feed, **New Status**) and choose **Import content**. Only the **owner** and **admins** see this option; for the other roles it doesn't show up, and the API refuses.

With the community's joining suspended by Memberfy, the import doesn't start. See [Suspension of joining and sales](/membros/politica-de-convites#suspension-of-joining-and-sales).

### The three types

| Type | How it comes in | Where it can go |
|---|---|---|
| **Post** | Title and text | Content or Feed space |
| **Article** | Title and text | Content or Feed space |
| **Short post** | Text only, up to 500 characters, with no title and no tags | Feed space only |

The type applies to every row (the **Type** option) or comes from a column of the spreadsheet, with values such as *post*, *article* or *short* (also *status*, *blog*, *newsletter*, in English, Portuguese, Spanish, Italian or German).

### What the import respects

- **The original date stays.** The post comes in with the spreadsheet's date as its [publication date](/espacos/conteudo#publication-date), at that date's place in the Feed and in the space's list, not at the top.
- **Silently.** Nothing is notified: no member gets a notice or an e-mail, the posts stay out of the news e-mails and highlights, and no one earns points in the [Ranking](/espacos/ranking). Only whoever imported gets, at the end, an e-mail with the summary.
- **The author comes by e-mail.** The author e-mail column links each row to a person in the community. They must be a member and have a **role below yours** (the owner imports on behalf of admins, moderators, finance and members; the admin, on behalf of moderators, finance and members). Otherwise the row is skipped and the report says why. Your own e-mail always works. Whoever imported is recorded in the [Logs](/membros/registros-de-atividades) on every post made on behalf of someone else.
- **A future or invalid date doesn't go in.** The row is skipped. An **empty date** becomes the import date, and the row goes in with a warning.
- **Nothing goes in twice.** A post or article with the same title and the same date as one already in the community is skipped; importing the same spreadsheet again doesn't duplicate anything. Rows repeated within the spreadsheet itself also go in only once.
- **The images come along.** The images inside the text are downloaded and hosted on Memberfy, with the same limits as an image uploaded through the app; the links in the text stay as they are. An image that can't be downloaded stays as a link to the original, and the report tells you.
- **Links become a player or a card.** The links in the text of each imported post become a [player or a card](/espacos/conteudo#links-become-a-player-or-a-card), up to 5 per post, in the background, after the post comes in.

### Limits

| What | Limit |
|---|---|
| File | **.xlsx** or **.csv**, up to **5 MB** |
| Rows | Up to **5,000** data rows (and 100 columns) |
| Images per row | **20**; the rest stay as links |
| Images per import | **300** or **500 MB**, whichever comes first; the rest stay as links |
| Imports at the same time | **One** per community; the next starts when the previous one ends |

A spreadsheet whose texts add up to more than 25 MB is refused before it starts: split it into smaller parts.

## Step by step

### 1. File

1. In the Content or Feed space, click **Import content**.
2. Drag the spreadsheet or click to choose (**.xlsx or .csv · up to 5 MB and 5,000 rows**).
3. Check how it was read:
   - **Sheet**: in an .xlsx, which sheet to read.
   - **Header row**: Memberfy finds it on its own; to change it, click another row of the table.
   - **Delimiter** (comma, semicolon, tab or pipe) and **Encoding**: in a .csv, worked out on their own; you can change them.

### 2. Columns

Each column shows up with its first 3 rows and a suggested destination in **Goes to**. Adjust what you need; whatever is left on **Ignore** isn't imported. Each destination takes one column only.

| Destination | What goes in it |
|---|---|
| **Title** | Required for posts and articles. Titles over 300 characters are cut |
| **Content** | Text, Markdown or HTML. Required to continue |
| **Author e-mail** | The post goes under the name of the community member with this e-mail. Without this column, everything goes out under your name |
| **Publication date** | The original date. A date without a time zone uses the community's time zone |
| **Space** | The id, the address or the name of a Content or Feed space (capitals and accents don't matter) |
| **Type** | post, article or short |
| **Tags** | Several, separated by commas, semicolons or pipes (up to 20 per post) |

### 3. Options

- **Space** (or **Default space**, when there's a space column): where the posts go, or the space used when the row has no valid one. **None (skip the row)** skips the rows without a valid space.
- **Type** (or **Default type**): Post, Article or Short post. Short posts only go into Feed spaces.
- **Who can see**: **Members only** or **Public**.
- **Date order**, which shows up when the spreadsheet has dates like 03/04/2024: **Day/month/year** or **Month/day/year**. The screen shows an example from the spreadsheet (*"03/04/2024 will be read as April 3, 2024."*) and, when the spreadsheet has a date that only fits one order (like 12/25/2023), picks that order and tells you.
- **Time zone**: dates without a time zone are read in the community's time zone, which the screen shows.
- **Author with an unknown e-mail**, for when the spreadsheet's e-mail belongs to no one in the community: **Skip the row** or **Publish under my name** (the row goes in with a warning).

Accepted dates: YYYY-MM-DD (with or without time and time zone), DD/MM/YYYY or MM/DD/YYYY (with `/`, `.` or `-` and an optional time), dates with the month's name in English (*15 March 2024*, *Mar 15, 2024*) and Unix timestamps. In an .xlsx, an Excel date cell counts as it is.

### 4. Preview

The preview saves nothing. It shows the summary (rows in the spreadsheet, how many will be imported, how many with their original date, how many without a date, skipped rows, rows with warnings, images to download and the size of the texts) and the **first 10 rows** as they will look: type, title, space, author, date and warnings, with the skipped ones marked.

### 5. Confirm

Click **Import N posts** and confirm. The import runs in the background: you can close the window.

### 6. Progress

The screen shows *"120 of 800 rows"*. **Cancel import** stops the remaining rows; posts that already went in stay published.

### 7. Report and history

At the end, the screen shows **Imported**, **Skipped**, **Failed** and **With warnings**, the **Rows that didn't go in** (with the reason) and the ones that **Went in with warnings**. **Download report** creates a CSV with the row, the result, the title and the reason. Whoever imported also gets the summary by e-mail.

**Previous imports**, at the top of the window, lists the community's imports, with their status (**Not started**, **Queued**, **Importing**, **Completed**, **Failed**, **Canceled** or **Abandoned**) and **View** to open the report. A spreadsheet that was read but not imported within 24 hours becomes **Abandoned**.

## Why a row was skipped

| In the report | What it means | What to do |
|---|---|---|
| **No title** | A post or article without a title | Fill in the title or import the row as a short post |
| **No content** | A short post without text | Fill in the content |
| **No valid space** | The row has no space that takes this type, and there's no default space that fits | Choose a default space, or fix the space column |
| **Invalid date** | The date wasn't understood, or doesn't exist (like 02/31) | Fix the date or change the **Date order** |
| **Date in the future** | The date is later than now: the import doesn't schedule posts | Fix the date |
| **Content too long** | A short post with more than 500 characters | Import it as a post or article |
| **Repeated in the spreadsheet** | Same type, title, date and start of the text as an earlier row | Nothing: the first one went in |
| **A post with this title and date already exists** | An identical post or article is already in the community, from an earlier import or made by hand | Nothing: that's what prevents duplicates |
| **The author e-mail belongs to no one in the community** | The e-mail isn't a member's, and the option is **Skip the row** | Invite the person first, or choose **Publish under my name** |
| **You can only publish under the name of someone with a lower role than yours** | The e-mail belongs to someone with a role equal to or above yours | Ask an owner to import, or remove the e-mail from the row |
| **Error while saving** (result **Failed**) | Something went wrong while saving that row | Import the spreadsheet again: what already went in is skipped |

## What each warning means

A row with a warning **went in**; the warning says what changed.

| Warning | What it means |
|---|---|
| **Type not recognized** | The Type column's value isn't post, article or short; the type from the options was used |
| **Title cut** | The title was over 300 characters and was cut |
| **Space not found** | The row's space doesn't exist in the community; the default space was used |
| **Space of another kind** | The row's space doesn't take this type (for example, a short post in a Content space); the default space was used |
| **No date** | The date cell was empty; the post went in with the import date |
| **Author not found** | The e-mail belongs to no one in the community; the post went out under your name (the **Publish under my name** option) |
| **Tags ignored** | Short posts don't have tags |
| **Image not downloaded** | An image in the text couldn't be downloaded; a link to the original was kept |
| **Image not supported** | The image's address isn't a web link that can be downloaded; it was kept as a link |
| **Too many images in the post** | The text had more than 20 images; the rest were kept as links |
| **Import image limit** | The import reached 300 images or 500 MB; the rest were kept as links |

## Frequently asked questions

**Will members get a flood of notices?**
No. Nothing in the import notifies members or counts points, whatever the date.

**Can I import comments and likes?**
No. The import brings posts, articles and short posts. To bring people, use [Import members from a spreadsheet](/membros/importar-membros).

**I imported and some authors were missing. Can I import again?**
Yes. Invite the people, import the same spreadsheet and the rows that already went in are skipped as *A post with this title and date already exists*. Short posts don't go through that check: on a second import, keep only the rows that were missing.

**What if I get a post's date wrong?**
Edit the post and change the **Publication date**. See [Publication date](/espacos/conteudo#publication-date).

## Through the assistant

The assistant does the same import in four steps: `analyze_content_import` (reads the spreadsheet), `preview_content_import` (the summary, without saving), `start_content_import` (imports after showing the summary) and `get_content_import` (progress and report). See [Tools · Content](/mcp/ferramentas-conteudo#analyze-content-import).

## In the API

`POST /api/import/spreadsheet` (uploads the file and returns the analysis), `POST /api/import/spreadsheet/{id}/preview` (the summary and the first 10 rows), `POST /api/import/spreadsheet/{id}/start` (confirms and queues it), `GET /api/import/spreadsheet/{id}` (progress and report), `GET /api/import/spreadsheet` (history) and `DELETE /api/import/{importId}` (cancels). Owner and admin only, with the `X-CommunityId`. See [Import](/api/referencia/import).

## Related

- [Content](/espacos/conteudo)
- [Feed](/espacos/feed)
- [Import members from a spreadsheet](/membros/importar-membros)
- [Logs](/membros/registros-de-atividades)
