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.
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, 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. 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 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, 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
- In the Content or Feed space, click Import content.
- Drag the spreadsheet or click to choose (.xlsx or .csv · up to 5 MB and 5,000 rows).
- 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.
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.
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.
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.