Guides → Migrate posts via CSV import — SGEN

Migrate posts via CSV import

How to move blog posts from any CMS into SGEN using a CSV file

Moving your blog into SGEN is a clear ten-step process. You export from your old CMS, convert the data to SGEN's CSV column format, upload the file, map your columns to SGEN's fields, run a small test batch, publish, and set up redirects so your old URLs keep working. This walkthrough takes your business — a coffee roaster migrating 50 blog posts from WordPress — through every step.

SGEN has no platform-specific importers. There is no "WordPress Import" button or Squarespace connector. Every migration goes through the same path: export from your old CMS, convert that export to SGEN's CSV format, upload. The conversion step is yours. This guide shows you exactly what columns the file needs and how to verify each stage before committing.

What is this for?

Use this workflow when you are moving published blog posts — titles, bodies, categories, tags, authors, publish dates, URL slugs — from an existing CMS into SGEN. It covers the full journey: data preparation, upload, import preview, field mapping, import confirmation, public-site verification, redirect configuration, and a post-import media audit.

Blog posts are distinct from pages in SGEN. Pages (About, Contact, Services) are evergreen and live at a fixed URL. Blog posts are time-stamped and appear on the blog archive. If your content has a date and will age, it belongs here, not in the Pages import path.

This workflow uses SGEN's Tools → Post Migration → Import screen, which accepts CSV files with a nine-column schema and JSON arrays. The field-mapping UI lets you rename your columns on the fly if they do not match SGEN's expected names exactly.

Good use cases

Full WordPress blog migration

— you are shutting down a WordPress site and moving every post to SGEN. Export XML from WordPress, convert to CSV, import 50 posts in two batches (5-post test first, then the remaining 45), set up 301 redirects, and retire the old domain.

Squarespace or Ghost to SGEN

— you have a JSON export from Squarespace or Ghost. Convert the JSON array to a CSV (one row per post, nine columns) and follow this same workflow.

Phased migration — high-traffic posts first

— you are running both sites in parallel while you migrate. Move your 10 most-trafficked posts first, set up 302 Temporary redirects, and flip them to 301 Permanent once the old site is decommissioned.

Content consolidation

— you are merging two SGEN sites into one. Export posts from the source site using the per-post Export button, convert to CSV, import onto the target site.

Audit-and-archive

— you retired an old blog on a separate platform and want every post preserved in SGEN as Drafts for legal or brand reference, not necessarily published.

What NOT to use this for

Do not expect images to migrate automatically

The CSV holds text fields. Images referenced inside post bodies still point at your old CMS's image URLs. After import you must re-upload images to SGEN's Media library and update each reference in the post body. Plan media migration separately and do it while the old site is still live.

Do not import before creating categories

SGEN matches your CSV's category column by name against categories that already exist on the site. If the category does not exist, the post lands uncategorized. Create your categories at Blog → Categories before you upload the CSV.

Do not skip the test batch

Import 5 posts first. Verify them on the public site. Then import the remaining 45. One encoding problem silently corrupts every row; finding it in 5 rows is a 5-minute fix, finding it in 50 is an afternoon.

Do not set up redirects before the SGEN posts are published and live

A redirect pointing at a draft or unpublished post sends visitors to a 404. Publish first, redirect second.

Do not use this for migrating pages, products, or forms

This workflow covers blog posts only. Each content type has its own migration path.

Do not use regex in your redirect rules after migration

Regex redirect rules save without error on this version but do not fire on the public site. Create one plain redirect rule per post URL using the bulk CSV import at Redirects.

How this connects to other features

— the per-post Export button at Blog → post → Export handles single-post backups and SGEN-to-SGEN transfers. Use it alongside this CSV workflow if you need to carry full SEO fields and custom-field data for individual posts. The two approaches are complementary, not alternatives.

— after import and publish, use bulk redirect import to forward your old URLs to their new SGEN paths. The redirects guide covers the seven-column CSV format, 301 vs 302 choice, and the Hits counter you use to verify rules are firing.

— images do not travel in a post CSV. Upload them to the Media library after import and paste the new SGEN media URLs into the post bodies before publishing.

— the Blog list is where your imported posts land as Drafts. That guide covers publishing, editing, duplicating, and the status filter pills you use to find newly imported posts.

Before you start

  • You are signed in to SGEN as an Administrator.
  • Your SGEN site already has the blog categories and tags you need. Create them at Blog → Categories and Blog → Tags before importing — the importer matches by name, not by creating new ones.
  • You have exported from your old CMS and have the export file available. The format does not matter yet (XML, JSON, or CSV — any can be converted to SGEN's CSV format).
  • You have a spreadsheet tool (Google Sheets, Excel, LibreOffice) or a developer available for the conversion step. For 50 posts, a spreadsheet works fine. For an error page or more, a script is faster.
  • You have a list of your old post URLs. You will need these for the redirect step. Export them from your old CMS's analytics or sitemap before decommissioning the old site.
  • Your browser can download files from your SGEN admin. If a corporate proxy blocks downloads from /sg-admin/, allow-list the SGEN admin URL before starting.

Where to go

  1. Open the left navigation.
  2. Go to Tools → Post Migration → Import to reach the CSV upload screen.
  3. Alternatively, the import screen is also linked from Blog → All Posts via the Import button in the top toolbar.

The import screen lives at /sg-admin/tools/post-migration/import on your SGEN admin.

Steps

1
Export from your old CMS

Each platform has its own export path. The output format varies, but the content you need is the same: title, body (HTML), slug, excerpt, categories, tags, author, publish date, status.

WordPress: go to Tools → Export → Posts → Download Export File. The download is an XML file (WXR format). You will convert this in Step 2.

Squarespace: go to Settings → Advanced → Import/Export → Export. The download is a WordPress-compatible XML — same conversion path as WordPress above.

Ghost: go to Settings → Labs → Export your content. The download is a JSON file. Your conversion path is JSON → CSV.

Any other platform: export as CSV if available. If the platform only gives you HTML or a proprietary format, work with your developer to extract post data into rows in a spreadsheet.

The goal of this step is a file — any format — that contains at minimum: title, body, slug (or full URL), publish date, and status. Everything else can be filled in manually after import if needed.

2
Convert your export to SGEN's CSV format

SGEN's import screen accepts a CSV file with nine columns. The header row (row 1) must contain these column names exactly:

title,slug,body,excerpt,category,tags,author,date,status

Column reference:

ColumnWhat goes hereRequired?
titlePost title as displayed to visitorsYes
slugURL slug — no leading slash, no domainYes
bodyPost body as HTMLYes
excerptShort summary, plain text, no HTML tagsNo
categoryCategory name — must already exist in SGENNo
tagsComma-separated tag names — wrap the whole cell in quotes if using commasNo
authorAuthor display nameNo
datePublish date — YYYY-MM-DD or YYYY-MM-DD HH:MM:SSNo
statuspublish or draft — all imported posts land as Drafts regardless; this is a review hintNo

A populated sample for your business' first three posts:

title,slug,body,excerpt,category,tags,author,date,status
"How to Brew the Perfect Pour-Over",how-to-brew-the-perfect-pour-over,"<h2>Equipment</h2><p>Start with a Chemex or V60. The grind size matters more than the kettle..</p>","Guide to brewing pour-over coffee at home.",Brewing Tips,"brewing,pour-over,technique",an editor,2025-11-14,publish
"Our Favourite Ethiopian your product",our-favourite-ethiopian-yirgacheffe,"<h2>Origin</h2><p>your product sits in the Gedeo Zone of southern Ethiopia, one of the oldest coffee-growing regions in the world..</p>","Tasting notes and brew recommendations for this classic origin.",Sourcing,"sourcing,ethiopia,single-origin",a teammate,2025-10-28,publish
"Canvas Tote Bag — Why We Made One",canvas-tote-bag-why-we-made-one,"<h2>The idea</h2><p>We wanted something our regulars could carry to the farmers market and back..</p>","The story behind our Canvas Tote Bag.",Behind the Scenes,"products,merch",an admin,2025-09-03,draft

Conversion tips that prevent the most common import failures:

  • Wrap every cell containing HTML, commas, or line breaks in double quotes.
  • Inside a quoted cell, escape any existing double quotes as "" (two double quotes in a row, not a backslash).
  • Body HTML stays as literal HTML — <h2> not &lt;h2&gt;. The importer reads raw HTML from the cell.
  • Save as UTF-8 encoded CSV. If you see garbled accented characters after import (é instead of é), the file was saved with the wrong encoding. Re-export from your spreadsheet explicitly as UTF-8.
  • Do not include a byte-order mark (BOM). UTF-8 BOM causes the importer to read the first column name as title instead of title. Save as plain UTF-8, not UTF-8 BOM.

Once your file is ready, the first few rows in a spreadsheet view look like this before you export to CSV:

3
Upload the CSV to SGEN

Go to Tools → Post Migration → Import. The upload screen shows a file picker, a format selector, and two import options.

Click Upload and preview. SGEN parses the file and shows a row-by-row preview. No posts are created yet at this stage — the preview is a validation step only.

4
Review the parsed-row preview

After upload, SGEN shows the first 10 rows parsed into columns. Check each of the following before proceeding:

  • Title column populated. If titles show blank, the header row was not detected — your file likely has no header row, or the column name does not match title.
  • Body column shows HTML. A few tags and a paragraph is correct. If it shows raw CSV text with escaped quotes, the file encoding or quoting is wrong.
  • Dates are in a recognisable format. 2025-11-14 and 2025-11-14 09:00:00 both parse correctly. Day-first formats like 14/11/2025 may not.
  • Accented characters display correctly. é, ñ, ü should appear as themselves, not as é or â€.
  • Warning flags on individual rows. SGEN flags rows with known problems inline — read the Note column.

Row warning reference:

  • "Category not found in SGEN" — the category name in your CSV does not match any category on the site. Create the category at Blog → Categories, then re-upload the CSV.
  • "Slug already exists on this site" — a post at that slug already exists. Either rename the slug in your CSV, or enable Skip duplicate slugs and re-upload — the importer will skip that row rather than create a duplicate.
  • Blank title — the header row is missing or on the wrong row. Row 1 must be column names, not a post.

If the warnings are minor (1–2 rows), you can proceed and fix those posts manually after import. If most rows show warnings, fix the CSV and re-upload — correcting 50 posts inside SGEN is slower than fixing one CSV file.

5
Map fields to SGEN post fields

Below the preview, the field-mapping panel shows each column SGEN detected in your header row and a dropdown to match it to the SGEN field it represents. If your column names match the nine expected names exactly, the mapping is auto-detected and the dropdowns are pre-filled.

Once every column is mapped correctly, click Confirm mapping and import.

6
Run a 5-post test batch before the full import

Before importing all 50 posts, run a test batch of 5. Prepare a second CSV file with just the first 5 rows (including the header row). Import those 5, verify them in SGEN and on the public site, then import the remaining 45.

This is the single most important habit in any migration. One encoding problem, one mismatched category, one broken HTML cell — all of these are a 5-minute fix in a 5-post CSV and a multi-hour fix when you discover it after importing 50 posts.

After a successful 5-post test import, the confirmation banner shows the count and the new post IDs assigned:

If the test batch looks right, go back to the import screen and upload the full 50-post file. Enable Skip duplicate slugs so the 5 posts you already imported are skipped cleanly. The confirmation banner will read "Imported 45 of 50 posts. Skipped 5 (duplicate slug)."

7
Review and publish imported posts

Go to Blog → All Posts. Filter by Draft to see newly imported posts at the top.

For each post in the test batch (and then the full set):

  1. Click the title to open the edit screen.
  2. Check the body — correct HTML, no garbled characters, no raw CSV artefacts visible on the page.
  3. Set the correct category and tags if any were missed during import.
  4. Update the author display name if needed. Imported posts default to the importing admin's account.
  5. Click View in the section actions row to preview the post on the public site while it is still in Draft.
  6. When satisfied, set Status to Published and save.

After publishing, the Blog list for your business shows all imported posts alongside any content that was already on the site:

8
Set up redirects from your old URLs

Your old CMS had URLs structured differently from SGEN's. Once posts are published on SGEN, every old URL that visitors or search engines still know about needs a redirect to the new location.

For 50 posts, set up redirects in bulk using the redirect CSV import at Redirects → All Redirects → Import/Export.

Prepare a redirects CSV with these seven columns:

target,destination,type,is_regex,is_active,priority,stop_processing
2025/11/how-to-brew-the-perfect-pour-over,/news/how-to-brew-the-perfect-pour-over,301,0,1,0,1
2025/10/our-favourite-ethiopian-yirgacheffe,/news/our-favourite-ethiopian-yirgacheffe,301,0,1,0,1
2025/09/canvas-tote-bag-why-we-made-one,/news/canvas-tote-bag-why-we-made-one,301,0,1,0,1
2025/08/barista-t-shirt-sizing-guide,/news/barista-t-shirt-sizing-guide,301,0,1,0,1
2025/07/brewing-guide-2026-preview,/news/brewing-guide-2026-preview,301,0,1,0,1

Use 301 — Permanent when the old site is going offline permanently. Use 302 — Temporary if both sites are running in parallel while you finish the migration. Flip 302 rules to 301 once the old site is decommissioned.

After importing the redirects CSV, the All Redirects list shows all 50 rules with their Hits counters. Test each redirect by visiting an old URL in a private/incognito window — the browser address bar should show the new SGEN URL after the redirect:

9
Audit for missing images and broken inline links

The import moved post bodies as HTML text. Any image src values inside the body HTML still point at your old CMS's domain. Once the old site goes offline, those images break.

Work through this while your old site is still live:

  1. Open each imported post at Blog → All Posts → [post title].
  2. Scan the body for image references pointing at the old domain.
  3. Download each image from the old site while it is still accessible.
  4. Upload each image to SGEN's Media library at Media → Upload Media.
  5. Replace the old src URL in the post body with the new SGEN media URL.
  6. Also check inline links — any <a> pointing at an old-site URL that you did not set up a redirect for becomes a dead link once the old site goes offline.

For 50 posts, prioritise by traffic. Use your analytics to identify which posts get the most visits, and do those first. Posts with no images and no internal cross-links are done in under a minute each.

10
Final checks before decommissioning the old site

Before you take the old site offline, work through this checklist:

  • All 50 posts are published on SGEN and load correctly in an incognito window.
  • All 50 redirect rules are Active in Redirects → All Redirects, and the Hits counter is climbing on the high-traffic ones.
  • Images in every post body load from SGEN's media library, not from the old domain.
  • Inline links that referenced the old site have been updated or covered by redirects.
  • Your categories and tags on SGEN match the old site's taxonomy.
  • Your sitemap at /sitemap.xml on SGEN includes all 50 posts.

Once these are confirmed, you can decommission the old site. At that point, flip any 302 Temporary redirects to 301 Permanent using the Redirects bulk action.

What success looks like

Success looks like
  • All 50 posts appear in Blog → All Posts with correct titles, categories, and publish dates.
  • Opening each post on the public site shows the full body with correct formatting — no garbled characters, no raw HTML visible, no broken image placeholders.
  • Visiting any old URL in an incognito window redirects to the correct new SGEN URL. The browser address bar shows the new URL after the redirect.
  • The Hits counter on redirect rules is climbing after a day of live traffic.
  • Images in post bodies load correctly from SGEN's media library, not from the old CMS's domain.
  • The import confirmation banner reported "Imported 50 of 50 posts" (or the matching count reflecting skipped duplicates from the test batch).

What to do if it does not work

The upload fails with "Invalid file format." The file is not valid CSV. Open it in a plain text editor (not a spreadsheet) and confirm row 1 is the header row with nine column names, and that every row has the same number of comma-separated values. A missing or extra comma on any row invalidates the whole file.

The import completes but "Imported 0" is reported. The file was uploaded but the importer parsed no rows. Common causes: the header row is missing, the file is saved as UTF-16 instead of UTF-8, or the column separator is a semicolon (;) instead of a comma. Open the file in a plain text editor to verify the separator before re-uploading.

Accented characters appear garbled after import (é instead of é). Your CSV was saved with the wrong encoding. Re-open the file in your spreadsheet tool, choose Save As → UTF-8 (not UTF-8 BOM, not Windows-1252), and re-import.

Line breaks inside the body column are breaking the CSV parser. If your post bodies contain literal newlines (the Enter key, not <br> or <p> tags), those cells must be enclosed in double quotes in the CSV. Most spreadsheet tools do this automatically on export. If you built the CSV with a script, wrap every body cell in double quotes explicitly.

Categories land as "Uncategorized" after import. The category name in your CSV does not exactly match the category name in SGEN — spelling and capitalisation must match exactly. Check Blog → Categories for the exact names, update your CSV, delete the uncategorized posts, and re-import.

The importer creates duplicate posts. You imported the same file twice without enabling "Skip duplicate slugs." Go to Blog → All Posts, filter by Draft, sort by date, identify the extras by their timestamp, and move them to Trash.

Redirect Hits counter stays at 0 for several days. Verify the rule is marked Active in the list, not Inactive. Confirm the Target path in SGEN matches the exact path your old CMS used — a single trailing-slash difference causes a miss. Test in an incognito window; do not rely on a browser that has visited the old URL recently, as 301 redirects are cached aggressively.

An imported post's slug got a -2 suffix. The destination already had a post at that slug. Either rename the imported post's slug to the intended value, or trash the old conflicting post if it is genuinely superseded.

Examples

Example 1: Full WordPress to SGEN migration — 50 posts.

your business exports their WordPress blog via Tools → Export → Posts. They open the XML in Google Sheets using a free XML-to-CSV converter, add the nine SGEN column headers, clean up the body column (stripping WordPress shortcodes, replacing inline images with placeholder text), and save as UTF-8 CSV. They upload the CSV, run the 5-post test batch, find one category mismatch ("Roasting" existed in WordPress but had not been created in SGEN yet), create the category, re-import the test batch, verify all 5 posts on the public site, then run the full 50-post import. Import banner reads "Imported 50 of 50." They bulk-import 50 redirect rules from a matching redirects CSV and monitor the Hits counter for 48 hours before decommissioning the WordPress site.

Example 2: Phased migration — 10 highest-traffic posts first.

your business's head of content uses their analytics to identify the 10 posts that drive 80% of their blog traffic. They export just those 10 from Ghost, convert the JSON export to a nine-column CSV, and import to SGEN. They set up 302 Temporary redirects for those 10 URLs so search engines know the move is not final. Both sites remain live for 30 days while the rest of the migration runs. Once all 50 posts are on SGEN and verified, they bulk-update the 10 redirect rules from 302 to 301 using the Redirects bulk action, then shut down the Ghost site.

Example 3: Content archive — retired blog, preserved as Drafts.

your business acquired a small roasting blog from a supplier. The supplier's site is going offline, but your business wants every post preserved in SGEN for reference and potential republishing. They export the 22 posts as a CSV, import them onto their SGEN site with Default status set to Draft. All 22 land as Drafts — visible at Blog → All Posts → Draft, but not on the public site. No redirects are needed because your business is not routing traffic to the old URLs. They can publish any post individually whenever they decide to feature it.

Related reading

srcdoc iframes: 0 mocks: 6 (admin-list-view x3, admin-edit-form x2, settings-save-success x1) code fences: 3 (csv column schema, sample csv rows, redirects csv) named Example N scenarios: 3 (Examples 1-3 in Examples section) preview: migrate-posts-via-csv-import.preview.html audience: sgen-admins (customer) gate G1 (>=300 lines): pass gate G2 (>=6 mocks): pass — 6 macros gate G3 (ONE ## How to H2): pass — exactly 1 gate G4 (all required H3 groups): pass — What is this for / Good use cases / What NOT / How this connects / Before you start / Where to go / Steps / What success looks like / What to do if / Examples / Related reading gate G5 (### Steps has >= 3 #### N. items): pass — Steps 1-10 gate SEO: description 141 chars (<=155), H1 "Migrate posts via CSV import" contains primary_keyword verbatim gate G5 dev-isms: 0

-->

Export and import posts as JSON — single-post backup and SGEN-to-SGEN transfer using the per-post Export button.

Manage site redirects — full redirects reference including bulk import, 301 vs 302 choice, and the Hits counter.

Create and manage blog posts — editing, publishing, duplicating, and maintaining the blog on your SGEN site.

Upload and manage media — re-upload post images after migration and update references in post bodies.

On this page