Store content
Shopify Blog Posts: Export and Import
Last updated
Use the Blog Posts resource to export or edit Shopify articles, their parent blogs, featured images, tags, publication settings, SEO fields, custom metafields, and comments through a CSV or XLSX spreadsheet.
Shopify calls an individual post an article in parts of its API. EditEngine uses the merchant-facing name Blog Post, matching the resource and spreadsheet name.
Before you start
- Install EditEngine Bulk Product Editor in your Shopify store.
- Use Advanced import for the edited spreadsheet.
- Keep one untouched copy of the export. Advanced imports do not have one-click undo.
- Test handle changes, comment operations,
DELETE, andREPLACEon one or two non-critical posts before importing the complete file.
EditEngine follows the Matrixify Blog Posts spreadsheet format, including its Blog, Comment, and Metafield columns. Important EditEngine-specific behavior—especially the default Blog Post command and blank-cell handling—is called out below.
Step 1 — Export Blog Posts
Open EditEngine → Export, choose Blog Posts as the resource, and select the fields you need.

Keep these columns in a normal round-trip file:
- ID — the safest identifier for an existing post.
- Handle — the article portion of
/blogs/blog-handle/article-handle. - Command — controls how EditEngine processes the post. Exports contain
MERGE. - Title and Author — required when creating or recreating a post.
- Blog: ID and Blog: Handle — identify the parent blog.
Select the other groups only when you need them:
- Base — content, summary, tags, publication, and article template.
- Media — featured image URL, dimensions, and alt text.
- Blog — parent-blog identity and settings.
- Comments — one row per comment when selected.
- Metafields and SEO — custom data and search metadata.

EditEngine always includes ID and Handle as round-trip keys. It exports MERGE in Command and REPLACE in Tags Command, so an untouched export reproduces the exported article and tag state.
These columns are export context only:
- Created At and Updated At
- Image Width and Image Height
- Blog: Feedburner URL and Blog: Feedburner Path
- Blog: Created At and Blog: Updated At
- Row #, Top Row, Comment: Body HTML, Comment: IP, Comment: Browser, Comment: Created At, and Comment: Updated At
Download the file, duplicate it, and edit only the duplicate. Keep the original as your recovery and comparison reference.
Step 2 — Identify the post and its parent blog
EditEngine first uses ID to identify an existing post. Without ID, it searches by Handle, or by Title when Handle is blank. Blog: ID or Blog: Handle narrows that search to the correct parent blog.
For the safest update, keep all four exported identity columns:
ID,Handle,Command,Title,Author,Blog: ID,Blog: Handle
558137311,summer-care-guide,UPDATE,Summer care guide,Avery Stone,22920047635,news
A Shopify post belongs to one blog. For a new post, provide at least one of Blog: ID, Blog: Handle, or Blog: Title. If EditEngine cannot find the blog and Blog: Title is present, it creates the parent blog before creating the article.
ID,Handle,Command,Title,Author,Body HTML,Blog: Handle,Blog: Title
,,NEW,How to care for linen,Avery Stone,"<p>Wash linen in cool water.</p>",journal,Journal
Shopify generates the article Handle when it is blank.
If you move posts to another store, remove the source store's article and blog IDs. Shopify IDs are store-specific. Use
NEWor an intentionalMERGEwith Handles and the destination blog identity.
Step 3 — Choose the Blog Post Command
| Command | What EditEngine does |
|---|---|
MERGE | Updates the matching post, or creates one when no match exists. This is the exported round-trip command. |
NEW | Creates a post and fails if the identified post already exists. |
UPDATE | Updates an existing post and fails if EditEngine cannot find it. |
REPLACE | Deletes the existing post and recreates it only from the spreadsheet. The post ID changes and existing comments are lost. |
DELETE | Deletes the post matched by ID or its Blog/Handle identity. |
IGNORE | Skips the post without changing Shopify. |
Important: blank Command follows the import-screen default
For Blog Posts, a blank Command cell uses the Default Command selected on the Advanced import screen. That screen defaults to Merge, so an untouched setup makes blank Blog Post commands behave as MERGE.
This differs from Matrixify's documented blank-command default of UPDATE. Keep the explicit MERGE values from an EditEngine export, or write the intended command into every important row.
Use REPLACE only when you deliberately want a new record. EditEngine validates Title, Author, and parent-blog identity before deleting the original, but omitted article data and all existing comments are still lost after a successful replacement.
Step 4 — Edit article content and settings
Title, Author, Body HTML, and Summary HTML
- Author is required for
NEW, for a create-through-MERGE, and forREPLACE. A blank Author on an in-place update leaves the current author unchanged. - Body HTML accepts HTML or plain text. Plain text is converted to paragraphs and line breaks.
- A blank Body HTML cell clears the article body when the column is included.
- A blank Summary HTML cell is a no-op in EditEngine; it does not clear the existing summary.
- Omitting a column is the clearest way to leave that field unchanged.
The Remove images from Body HTML Advanced import option strips embedded <img> tags when enabled. It does not remove the article's separate featured image.
Published and Published At
Use TRUE to publish and FALSE to unpublish. EditEngine also accepts YES/NO and 1/0. A blank Published cell is a no-op; use FALSE explicitly when you want the post hidden.
Use Published At with the Matrixify date-time format for a current or past publication date:
ID,Handle,Command,Published,Published At
558137311,summer-care-guide,UPDATE,TRUE,2026-08-25 09:00:00 +0530
Matrixify documents future Blog Post publication dates as unsupported. EditEngine sends the supplied date to Shopify, so use Shopify's supported current or past value and review any row error returned by Shopify.
Article template
Set Template Suffix to the article template suffix you want. A blank cell clears the article's current template suffix when the column is included; omitting the column leaves it unchanged.
Step 5 — Manage tags safely
Tags is a comma-separated list. Tags Command controls how that list affects existing tags:
| Tags Command | Result |
|---|---|
MERGE | Adds the listed tags and keeps existing tags. |
DELETE | Removes only the listed tags. |
REPLACE | Replaces the entire tag set with the spreadsheet value. This is the default and exported value. |
Examples:
ID,Handle,Command,Tags,Tags Command
558137311,summer-care-guide,UPDATE,Linen,MERGE
558137312,winter-care-guide,UPDATE,Archived,DELETE
558137313,fabric-guide,UPDATE,Care guides,REPLACE
When the Tags column is present, a blank Tags cell with the default REPLACE behavior clears all article tags. Remove the entire Tags column when tags should remain unchanged.
Step 6 — Update the featured image
Enter a public image URL in Image Src. Shopify downloads that image and stores it with the article. Include Image Alt Text on the same row when you want to set the alt text.
ID,Handle,Command,Image Src,Image Alt Text
558137311,summer-care-guide,UPDATE,https://example.com/images/linen-care.jpg,Folded natural linen fabric
- Blank Image Src does not remove the existing featured image.
- Image Alt Text is applied only when Image Src is also supplied.
- Image Width and Image Height are export-only measurements.
Step 7 — Understand parent-blog settings
The Blog: columns describe the container that holds the article. They are not separate settings for each post.
- Blog: ID and Blog: Handle identify the parent blog.
- Blog: Title is needed when EditEngine must create a new parent blog.
- Blog: Commentable accepts
yes,moderate, orno. - Blog: Template Suffix changes the parent blog's theme template.
Changing Blog: Commentable or Blog: Template Suffix on one article row updates the shared blog, so the result affects every post in that blog. Blank values leave those settings unchanged.
EditEngine does not rename an existing parent blog through Blog: Title or Blog: Handle. Those columns identify the blog or supply values during blog creation.
Step 8 — Change a post Handle and keep its redirect
Identify the article by ID, keep its parent Blog columns, and enter the new Handle. The Advanced import options enable Transliterate handles to English alphabet and Create redirects for changed handles by default.
For an ID-matched rename, Shopify creates a redirect from the old /blogs/blog-handle/old-article-handle URL to the new article URL. A Handle-matched row cannot safely rename that same Handle because it is being used as the identity.
The transliteration option applies to the article Handle. It deliberately does not rewrite Blog: Handle, which identifies the existing parent blog.
Step 9 — Edit SEO and custom metafields
EditEngine exports Blog Post SEO as Matrixify-compatible metafield columns:
Metafield: title_tag [string],Metafield: description_tag [string]
How to care for linen | Example Store,"Wash, dry, and store linen correctly with this practical guide."
Custom article metafields use the same header pattern:
Metafield: custom.series [single_line_text_field]
Care guides
Keep the exported type in the header. A blank cell in an included metafield column deletes that metafield; omitting the column leaves it unchanged. See Matrixify's Metafields reference for the spreadsheet convention.
Step 10 — Export or import comments when needed
Comments are optional and are not selected in a default Blog Posts export. Selecting any Comments column expands an article into Matrixify-style rows: the first row contains the article plus its first comment, and continuation rows repeat ID and Handle beside the remaining comments.
Keep Row # order intact when sorting the spreadsheet. Article-level values on repeated rows must either agree or be blank; conflicting values fail that post instead of silently choosing one.
To create a comment, leave Comment: ID blank and provide all three required values:
ID,Handle,Comment: Author,Comment: Email,Comment: Body,Comment: Status,Comment: Command
558137311,summer-care-guide,Sam Lee,sam@example.com,This guide was helpful.,published,MERGE
Use these comment commands:
MERGE— updates the Comment ID when found; with a missing or stale ID, creates a comment when Author, Email, and Body are present.UPDATE— requires Comment ID and fails when it is absent or not found.DELETE— removes the Comment ID; a comment already missing is treated as successfully deleted.
A blank Comment: Command defaults to MERGE.
For Comment: Status, EditEngine can publish a comment, mark it as spam, or remove it. Shopify does not allow an existing published/spam/removed comment to be moved back to pending or unapproved through this API. Comment: Body HTML is export-only; import editable text through Comment: Body.
A comment row without Comment ID can create a duplicate if imported again. Keep exported IDs for updates and test comment imports on a small batch.
Matrixify's store-cloning tutorial shows the same Blog Post, Blog, and Comment row relationship.
Step 11 — Import through Advanced import
Open EditEngine → Import, select Advanced import, and upload the edited CSV or XLSX.

After upload, verify:
- The detected resource says Blog Posts.
- Each existing post has the correct ID, Handle, and parent Blog identity.
- Blog Post Command and Tags Command are explicit where their behavior matters.
- Comment continuation rows still belong to the correct article.
- Handle transliteration, redirect creation, and Body HTML image removal match your intention.
- Every
DELETEorREPLACErow is intentional.
Start the import, then download the results file when it finishes. Review every failed row and warning even when the overall job says it completed.
Step 12 — Verify the round trip
Verify the result in Shopify Admin and with a fresh export:
- Open the affected articles under Content → Blog posts and inspect their content, visibility, author, tags, image, and SEO.
- Check the parent blog's comment policy and template if you changed a Blog: setting.
- Inspect affected comments, especially moderation-status changes.
- Open the old article URL after a Handle rename and confirm it redirects.
- Run a new Blog Posts export with the same column groups and compare it with your intended spreadsheet.
For REPLACE, Shopify receives a new article after the original is deleted, so its ID changes and old comments are gone. Re-importing the untouched export is not a guaranteed automatic rollback. For DELETE, the export is a reconstruction reference rather than one-click recovery.
Common mistakes
Assuming Matrixify's blank Command default applies unchanged.
EditEngine uses the Advanced import screen's default for Blog Posts, which starts as Merge. Keep the exported MERGE values or set every command explicitly.
Removing Blog identity from a new article.
A new post needs Blog: ID, Blog: Handle, or Blog: Title. Keep the exported Blog columns during a round trip.
Blanking Tags to mean “unchanged.”
With the Tags column present and default REPLACE, blank Tags clears the entire tag set. Remove the column to leave tags alone.
Changing Blog: Commentable on only one row without considering the other posts.
The setting belongs to the shared parent blog and affects every article inside it.
Expecting blank Body HTML or Template Suffix to be ignored.
Those blanks clear their existing values during an in-place update.
Trying to remove a featured image with a blank Image Src.
Blank Image Src is a no-op. EditEngine's Blog Posts importer does not remove an existing featured image through a blank cell.
Using REPLACE as a routine update.
It deletes and recreates the post, changes the ID, and removes existing comments. Use MERGE or UPDATE for in-place edits.
Related tutorials
- Export and import Shopify Pages — round-trip Online Store pages and their SEO/metafields.
- Export and import Shopify Custom Collections — round-trip manual collection details and membership.
- Export and import Shopify Smart Collections — round-trip automated collection details and rules.
About EditEngine: EditEngine Bulk Product Editor helps Shopify merchants bulk edit, import, and export store data from spreadsheets. Install on Shopify →
