# Import and export content as CSV or JSON

> Bring a spreadsheet of posts, testimonials or FAQs into a collection as drafts, check every row first, undo an import, and download a collection.

Last updated: November 9, 2026

Source: https://www.willo.ai/docs/content/import-and-export

Move a collection in and out of Willo as a file. Import a spreadsheet of posts, testimonials or FAQs, or download a collection to edit, archive or use elsewhere.

## Import a file

1. Open your business and go to **Content**, then pick the collection.
2. Select **Import / Export** in the toolbar, then **Import a CSV or JSON file**.
3. Drop the file in, or click to choose it. Willo checks every row and changes nothing yet.
4. Read the check: each row shows its title, its slug and **OK**, **Skipped** or the fields to fix.
5. Select **Create N drafts**.

Every imported item is a **draft**. Nothing goes live until you publish it. From the result, **Publish all** opens the usual publish step for the new drafts (up to 100 at a time), or you can review them in the list first.

A file holds up to 2,000 rows and 10 MB. Editors, admins and owners can import.

## How columns are matched

The first row names the columns. Each name is matched to a field of the collection, ignoring case: `Description`, `description` and `fields.description` all fill the description field, and `title` always fills the collection's title. To find a collection's names, export it and look at the header row.

| Value | Write it as |
| --- | --- |
| Text and Markdown | As is. Quoted cells can hold line breaks. |
| Date | `2024-03-01`, `2024-03-01T09:30:00Z` or `March 1, 2024` |
| Yes/no | `true`/`false`, `yes`/`no` or `1`/`0` |
| Number | `12` or `12.5` |
| Choice | One of the field's options |
| List (tags, categories) | Items joined with `\|`: `news\|tips` |
| Search settings | One column per setting: `seo.title`, `seo.description`, `seo.noindex` |
| Image | A full `https://` address, or a path on your site |
| Anything else | `fields.<name>` keeps it as an extra value |

- **Slug** is optional. Without one, Willo makes it from the title. If an item with that slug already exists, the row is **skipped**. To update those items instead, tick **Update items whose slug is already in use** before you choose the file. Updates to a published item wait as unpublished edits. A scheduled item is skipped; cancel its schedule to update it from a file.
- With updates turned on, an empty cell clears that field on the existing item. Leave a column out of the file to keep its values.
- **Status** is ignored. Items always import as drafts, and the check says so.
- **id**, **created_at** and the other dates Willo sets are ignored.
- A row with a field that doesn't fit, such as a word in a number field or a missing title, shows the field and the problem, and isn't imported. Fix the file and import it again.

Files saved as CSV UTF-8 work best. Separators can be commas, semicolons or tabs. A CSV cell holds up to 131,072 characters; import a longer post as JSON.

## Images

Image addresses in image fields are copied into your own storage during the import, and the item points at the copy. The copies appear in **Assets**. An image that can't be copied, for example over 8 MB or not an image, keeps its original address and is listed in the result. One import copies up to 200 images.

## Undo an import

The result has **Undo import**. It deletes the drafts that import created. Items you published, scheduled or edited since are kept and named. Items an import updated keep their changes; open an item's **History** to go back to an earlier version.

## Export a collection

Select **Import / Export**, then **Export as CSV** or **Export as JSON**. The file includes drafts.

- **CSV** has one row per item: `id`, `slug`, `status`, every field by name, `body`, then `published_at`, `created_at` and `updated_at`. Lists are joined with `|`. A cell that a spreadsheet would run as a formula starts with `'`, and the import removes it again.
- **JSON** is a list of items in the same shape the content API and agents use.

An exported CSV imports straight back, so you can export, edit in a spreadsheet and import with updates turned on.

You can also ask Willo in chat: "Export my blog as a CSV." Willo replies with a link that downloads the file when you open it, signed in to Willo. Connected AI agents read a collection with the `willo_content_export` tool, which returns files up to 2 MB.

## From Google Sheets

In Google Sheets, choose **File → Download → Comma-separated values**, then import that file. With [Google Workspace connected](https://www.willo.ai/docs/connectors/get-started), you can also ask Willo in chat to read the sheet and draft items from it.

Related: [Drafts and publishing](https://www.willo.ai/docs/content/drafts-and-publishing), [Collections and items](https://www.willo.ai/docs/content/collections-and-items), [Edit CMS content and publish](https://www.willo.ai/docs/ai-agents/edit-cms-content-and-publish).

## Questions

### Can an import publish items?

No. Every imported item is a draft. Publish them from the result with Publish all, or from the Content tab like any other draft.

### What happens if I import the same file twice?

Willo tells you in the check. Rows whose slug already exists are skipped; rows without a slug would be added again.
