Getting started
This walks through one complete import, start to finish, on a site where nothing has been set up yet.
If you want to try it without touching real data, download the sample CSV from Importundo → Settings → Sample file. It imports cleanly on a fresh install and can be rolled back afterwards.
1. Prepare the file
Any CSV works. The first row should be a header row naming the columns — the importer uses those names to guess the mapping for you.
Header names are matched loosely, so Post Title, post_title and post-title are all recognised as the title. Case, spaces, underscores and hyphens are all ignored.
A minimal file looks like this:
title,content,status,categories
"Hello world","<p>My first imported post.</p>",publish,"News"
"Second post","<p>Another one.</p>",draft,"News, Updates"
Two things worth knowing before you export:
- Save as UTF-8 if you can. If you cannot, that is fine — Windows-1252 files from Excel are detected and converted, so accented characters and smart quotes survive. The importer tells you when it has done this.
- Semicolons are fine. European Excel exports use them. So are tabs and pipes. The delimiter is detected from the file.
2. Choose the file
Go to Importundo in the admin menu (it is also listed under Tools → Import).
Pick the post type you are importing into, then drop the file onto the page or use the file picker.
If the file is bigger than your server's upload limit, the page tells you what that limit is. Upload the file to wp-content/uploads with FTP or your host's file manager, then open My file is too big to upload and enter the full server path instead. Nothing is copied — the importer reads it where it sits, and never deletes a file you supplied that way.
3. Check the mapping
The importer reads the header row, guesses what each column is, and shows you the guess next to the first three real values from that column. Reading down the sample column is the fastest way to spot a mapping that went to the wrong field.
For each column you can:
- Change what it maps to. Post fields, taxonomies and the featured image are grouped in the dropdown. Choose Custom field (meta key)… to store the column as post meta under a key you type.
- Leave it unmapped. Choose — do not import —. The column is ignored entirely.
- Add a transform. Trim whitespace, strip HTML, change case, or parse the column as a date in a specific format. Transforms run in the order listed, before anything else happens to the value.
- Decide what an empty cell means. By default, an empty cell on an updated post leaves the existing value alone — this is almost always what you want, because it means a file with only two populated columns will not blank out everything else. Switch it to Set empty for columns where a blank genuinely means "clear this".
- Set a default. Type a value that is used whenever the cell is empty.
If the columns look wrong entirely — everything crammed into one column, or garbled characters — open Do the columns look wrong? and set the delimiter or encoding by hand, then press Re-read file. That resets the mapping, because the columns themselves change.
4. Decide create versus update
Under Create or update, pick what identifies an existing post:
| Matching key | Use it when |
|---|---|
| Nothing | You are importing new content and there is nothing to match against. Every row creates a post. |
| Post ID | Your file came from an export of this same site. |
| Slug | Your file has a stable, unique URL slug per row. |
| Title | Titles are unique and stable. Be careful — titles change. |
| A custom field | Best option for recurring imports. Map a column such as sku or external_id to a custom field, then match on it. |
Then choose the behaviour:
- When a row matches — update the existing post, skip the row, or record it as an error. Updating is the default.
- When nothing matches — create a new post, or skip the row. Use skip for an "update only" import that must never add anything.
This is what makes an import repeatable. With a matching key set, running the same file twice changes the same posts rather than creating a second copy of everything.
5. Read the preview
Press Preview import.
The preview resolves the first ten rows the same way the import will, and shows you what each one does. Nothing is written to your database at this point — the preview performs no writes at all.
Each row shows:
- Create or Update, decided by your matching key. Updates link to the post they will change.
- A field-by-field diff for updates: the current value, an arrow, the new value. Changed rows are highlighted.
- Terms, with any that do not exist yet marked as new so you know what the import will add to your taxonomy.
- The featured image URL, with the result of an actual reachability check.
- Warnings: rows with no title, dates the importer could not read, ambiguous dates, an author it could not match, a duplicate matching key earlier in the same file.
If the preview says something you did not expect, go Back to mapping and change it. You can go back and forth as often as you like without re-uploading the file.
The retention window is shown here too, so you know how long this import can be undone for before you commit to it.
6. Run it
Press Import.
The import runs in background batches on your server. You can close the tab, navigate away, lose your connection or restart PHP — it keeps going and resumes from the last committed row without repeating anything.
The progress screen shows rows processed and remaining, live counts of created, updated, skipped and failed, a rows-per-second rate, and an estimate of the time left. Pause stops it after the current batch; Resume continues from where it stopped. Cancel stops it for good, and everything it already wrote remains rollback-able.
You can leave and come back through Importundo → History.
7. Afterwards
When it finishes you get a summary and, if any rows failed, the error log below it.
Failed rows
Each one lists its row number, error type, reason and raw content. Filter by type using the chips. Two ways forward:
- Download failed rows as CSV gives you a file containing only the failures, with the original columns plus
_source_row,_error_typeand_error. Fix it in a spreadsheet, delete the three diagnostic columns, and import that file. - Retry failed rows re-runs just the failures against the same mapping. Useful when the cause was transient — a slow image host, a term that has since been created.
Rollback
The Roll this import back button undoes the whole thing:
- Posts the import created are deleted, along with images it downloaded for them.
- Posts the import updated are restored to exactly the values they had, including custom fields, taxonomy terms and the modified date.
- Posts the import never touched are not affected.
- You get a report of what was reverted, and what could not be — for example a post you deleted yourself since the import.
Rollback is also available from Importundo → History, where each import shows the date its rollback window closes.
8. Save the mapping
If you will import a file with these columns again, press Save as template on the mapping step. The template stores the mapping, transforms, matching key and behaviour settings.
Next time, upload the new file and apply the template from the dropdown at the top of the mapping step. If the new file is missing a column the template expects, you are told which one — the mapping is not silently dropped.