How to migrate from Blogger to WordPress and keep your old addresses
Blogger's backup now comes from Google Takeout as a feed.atom file, and the Blogger importer WordPress lists does not read it. Check your file first, set the time zone and the permalink structure before importing, and redirect the addresses that still differ. On blogspot.com, connect a domain first.
- By
- WP Ministry
- Published
- Tested on
- WordPress 7.1.3, PHP 8.3.35
In short
- Blogger's backup is now a feed.atom file from Google Takeout. The Blogger importer under Tools, then Import was written for the older .xml backup and imports nothing from the new file.
- Search your file for kind#post before you rely on that importer. If it is not there, the importer says "All done." and brings in nothing.
- Set WordPress's time zone to the blog's, and the permalink structure to /
%year%/ %monthnum%/ %postname%.html, before the import and not after. - WordPress builds each post's address from its title. Blogger shortened titles, dropped words and kept old names, so some addresses differ and answer 404 until they are redirected.
- A link copied on a phone ends in ?
m= 1. WordPress reads that as a date and answers 404. - A blogspot.com address cannot be pointed at another host. Blogger redirects it only to a custom domain connected to the blog, so connect your domain before you move it.
You can move a Blogger blog to WordPress on your own hosting yourself. Three things decide how it goes: whether your importer can read the file Blogger gives you, whether each old address still leads to its post, and whether the blog is on a domain of your own or on blogspot.com.
Two of those are not what most instructions say. Blogger's backup now comes from Google Takeout as a file named feed.atom, and the Blogger importer that WordPress lists under Tools, then Import does not read it. And an imported post does not get the address it had on Blogger. WordPress builds a new one from the title, and some of those differ.
Start with the address your readers use
Everything else depends on which of two cases you are in.
A blog on its own domain
The domain is yours and moves with you. Today it points at Google: Blogger's setup uses a CNAME record to ghs.google.com. When the new site is ready, you change the domain's records to your new host, and every old link arrives at WordPress. WordPress then has to answer each one, which is what "Make the old addresses answer" below is for.
Blogger does not serve a blog on a bare domain. Google's help says the address needs www or another subdomain in front, and offers a redirect from the bare name. So your old links point at www.example.com. Give the new site that name, or check that it redirects to the name you choose.
A blog on blogspot.com
A blogspot.com address belongs to Google. You cannot point it at another host, and Blogger has no setting that forwards it to a site of your choosing. This is what Google's help says an owner can do.
| Setting in Blogger | What Google says it does | What it is worth in a move |
|---|---|---|
| "Custom domain", under "Publishing" | Serves the blog at a domain you own. The blogspot.com address then redirects to that domain, which Google says can take up to 24 hours to begin | The one documented way to send blogspot.com visitors on |
| "Custom redirects", under "Errors and redirects" | Sends an address of the blog to another post or page of the blog | Nothing. Google describes it for addresses inside the same blog |
| "Post feed redirect URL", under "Site feed" | Redirects all traffic for the blog's post feed to the address you enter | Enter the new site's feed address, so that feed readers follow you |
| "Remove your blog", under "Manage blog" | Deletes the blog. Google says a deleted blog can be restored within 90 days, and that a permanently deleted blog's address cannot be used again | Do not use it. Whatever the blog was redirecting stops |
So the route is to connect the domain you will use for WordPress to the Blogger blog first, while the blog is still on Blogger. From then on Blogger redirects the blogspot.com address to your domain. Later you point the domain at your WordPress host, and an old link travels from blogspot.com to your domain and arrives at WordPress.
Google's help leaves two things unsaid, so test them yourself.
- What kind of redirect it is. On a Google-run blog checked on October 10, 2026, an old blogspot.com post address answered 301 and gave the same path on the blog's own domain.
- Whether it carries on once the domain no longer points at Blogger. Nothing in Google's help promises it. Run a few blogspot.com addresses through the redirect checker on the day you switch, and again some weeks later. Keep the Blogger blog and its domain setting as they are.
Many instructions tell you to paste a script or a meta tag into the Blogger theme instead. Blogger's help documents no such feature. What that code would be is a redirect made inside the page, by the visitor's browser. Google Search's documentation puts those below a redirect that a server sends: it reads an instant meta refresh as permanent, and says to use a JavaScript redirect only where the other kinds are not possible, because Google may never see one on a page that fails to render.
If you connect no domain, the old blog stays where it is, with the same posts as the new site at other addresses. A link from the old blog to the new one tells readers where you went. It is not a redirect.
What moves and what does not
This table follows Google's Blogger help for what the backup holds, and the readme of the Blogger Importer on WordPress.org for what that importer does with it. Another importer differs: read its own page.
| What | Where it is | With the Blogger Importer |
|---|---|---|
| Posts | In the backup file | Imported: published, scheduled and draft |
| Comments | In the backup file | Imported, except spam. The readme says Blogger's data gives no commenter email addresses, so comments arrive without avatars |
| Labels | With each post | Each becomes a category. The importer's advice is to turn the ones you want as tags into tags afterward |
| Images in posts | On Google's image servers, not in the backup file. Google says an owner's images appear in Takeout too | Copied from Google's servers during the import. See the checks below |
| Pages | In the backup file | Not imported. Recreate each one by hand |
| Videos uploaded to Blogger | Downloadable in Blogger: Settings, then "Videos from your blog" | The readme does not mention them. Download each and add it to the new site |
| Theme, layout and gadgets | Blogger's theme backup is a Blogger theme | Not imported. Choose a WordPress theme and rebuild the sidebar |
| Authors | Named in the backup file | Matched to WordPress users on a screen during the import |
| Each post's address | In the backup file | Kept with the post in a field named blogger_. The post itself gets a new address |
What has to be redirected
| Kind of address | On Blogger | On WordPress |
|---|---|---|
| Post | /: the year, the month, a short form of the title, then .html | Set by the permalink structure. / gives the same shape |
| Page | / | The page's slug: / under that structure |
| Label | / | / |
| Post feed | / | / |
| Any of these, opened on a phone | The same address with ? on the end | WordPress reads m as a year and month, finds nothing, and answers 404 |
The post and page addresses are the ones in Google's own Blogger documentation. The label address and the ? are how Google's blog about Blogger answered on October 10, 2026: asked for by a phone, it replied with a redirect to the same address with ? added.
How long each part takes
| Part | What the documentation says |
|---|---|
| Google preparing the Takeout archive | From a few minutes to a few days. Most people get the link the same day. The archive expires in about 7 days |
| A new DNS record for a custom domain taking effect | Wait at least one hour |
| The blogspot.com address starting to redirect to a custom domain | Up to 24 hours |
| The import | No figure is published. It depends on the number of posts and images, and each image is a download from Google's servers |
Before you start
List every address the blog answers at. Open / on the blog and copy the addresses into a spreadsheet. It lists posts. Add your pages, which sit under /, by hand. The website migration checklist covers what else to record before a move.
Note the blog's time zone. In Blogger it is under Settings, then "Formatting", then "Time zone". You will give WordPress the same one.
Count what you have. Note how many published posts, drafts, pages and comments the blog holds. The importer's last screen gives no counts, so these numbers are your check.
Rent hosting and install WordPress at a temporary address. Build there while the blog stays live. Leave the blog public and unchanged until the images have been copied: they are fetched from Google's servers.
On blogspot.com, connect your domain to the blog now. The redirect from the blogspot.com address can take a day to begin, and you want it working before the domain moves.
Get the backup from Blogger
Step 1: Ask for the backup
In Blogger, choose the blog, go to Settings, and under "Manage blog" select "Back up content", then "Download". Google's help says the backup is now made by Google Takeout. Use the Google account that is an administrator of the blog.
Step 2: Find feed.atom
When the archive arrives, open it and go into "Takeout", then "Blogger", then "Blogs", then the folder with your blog's name. The file is
feed.atom. Google's help says it is the file that holds posts, pages and comments.Step 3: Keep any older backup you have
Blogger used to hand out its own backup as an .xml file. If you have one from before the change, keep it beside the new file. The next section says why.
Step 4: Download your videos
Videos uploaded to Blogger are not in that file. Under Settings, then "Manage blog", "Videos from your blog" lists them with a "Download" for each.
Find out whether your importer can read the file
WordPress offers an importer for Blogger under Tools, then Import. It is the Blogger Importer plugin from WordPress.org. Read this before you trust it with your file.
- It was written for the older file. Its instructions name an "Export Blog" option that downloads an XML file, and WordPress.org's own page on importing still says to export your Blogger contents as XML.
- It finds posts by a marker. In the export format that Google's developer documentation describes, every post carries a category that ends in
kind#post. The importer skips every entry without one. - A Takeout file has no such marker. Its entries are labeled with
<blogger:type>instead. Given that file, the importer shows no authors to assign, says "All done." and imports nothing: no posts, no comments, no categories. A user reported the same on the plugin's support forum in July 2025. The report has no reply. - Its listing is old. As read on October 10, 2026, the plugin directory shows version 0.9.3, last updated on October 21, 2024, and tested up to WordPress 6.6.10. The directory adds its notice that the plugin has not been tested with the latest three major releases of WordPress.
So open your file in a text editor and search for kind#post.
If it is there, you have a file in the older format, and the Blogger Importer can read it. The steps below use it.
If it is not, that importer cannot help, and you have three choices.
- Another importer. Search the WordPress.org plugin directory for "Blogger". Some importers there say they read the .atom file from Google Takeout. Others say they read the public blog itself, by its ID or its feed. They are other people's plugins, and this guide ranks none of them. On each listing, read when it was last updated, whether the free version limits the number of posts, whether it brings pages, comments and images, and what it does with each post's old address.
- An older .xml backup, if you kept one. Posts written since then are added by hand.
- Copying by hand, for a blog with a few posts.
Whichever you use, make the two settings in the next section first, and run the checks after it.
Set up WordPress before you import
Two settings decide the address of every imported post. Change them before the import. The Blogger Importer uses both while it runs, and another importer may too.
Step 1: Set the time zone to the blog's
In WordPress, go to Settings, then General. Under "Timezone", choose a city in the blog's time zone and select "Save Changes".
The importer converts each post's time to the site's time zone. On a site left on UTC, a post published at 8:08 in the evening on May 31, Pacific time, is dated June 1. Its address moves from
/to2012/ 05/ /, and the old one answers 404. From the command line, the same setting is:2012/ 06/ bashwp option update timezone_string "America/Los_Angeles"Step 2: Set the permalink structure to Blogger's shape
Go to Settings, then Permalinks. Choose "Custom Structure", enter
/, and select "Save Changes". With WP-CLI, it is one command:%year%/ %monthnum%/ %postname%.html The importer rewrites links between your own posts as it goes, to the address each post has at that moment. Import on "Plain" and those links are saved as
/?.p= 123 Under this structure the rest of the site drops its final slash as well: a page is at
/, andabout /is redirected to it.about/ bashwp rewrite structure '/%year%/%monthnum%/%postname%.html'Step 3: Delete the sample content
Delete the sample post and the sample page that a new WordPress site starts with.
If you would rather have another structure, such as "Post name", set that one now. Every old post address then needs a redirect. The file under "Make the old addresses answer" makes them. How to change WordPress permalinks covers changing your mind later.
Import with the Blogger Importer
These steps are for a file that has the kind#post marker.
Step 1: Install and run the importer
Go to Tools, then Import. Under "Blogger", select "Install Now", then "Run Importer".
Step 2: Upload the file
Select the file under "Choose a file from your computer:", then "Upload file and import". The screen states the largest file the server accepts. If your file is larger, ask your host to raise the upload limit.
Step 3: Assign the authors
The next screen is headed "Assign Authors". For each author it lists, type a login name beside "as a new user:", or choose a user beside "or assign posts to an existing user:". A user the importer creates gets a random password and the site's default role, which is subscriber on a new site. Set both afterward.
The screen lists the authors named at the head of the file. A post by anyone else is given to the user who runs the import.
Step 4: Submit and wait
Select "Submit". The importer brings in the posts, then the comments, then the images, then mends the links between posts, and ends with "All done." It shows no progress and no totals.
Step 5: If it stops, upload the same file again
The importer skips every post and comment it already has, so a second run adds only what is missing.
Check what arrived
Count. Compare the posts, drafts and comments with the numbers you noted. Pages are not imported. A comment on a post that no longer exists is skipped.
Look at the categories. Each label is now a category. Under Tools, then Import, "Categories and Tags Converter" turns the ones you choose into tags.
Look at comments with replies. Check that a reply still sits under the comment it answers.
Search the posts for what was left behind. The importer works through images and links in a single batch of 20 posts, the newest first. On a longer blog, older posts keep their image addresses on Google's servers and their links to the old blog. Uploading the file again does not reach them, because the batch starts from the newest posts again. A user reported the same of featured images on the plugin's forum in 2023.
These two commands list every post and page whose text still names Google's image servers or a blogspot.com address. In the dashboard, the search box on the Posts screen does the same.
wp post list --post_type=post,page --post_status=any --s='googleusercontent.com' --fields=ID,post_title
wp post list --post_type=post,page --post_status=any --s='blogspot.com' --fields=ID,post_titleDo not judge by the Media Library. A post that both shows an image and links to another post of the blog can end with the file copied and the post still loading it from Google. Open such a post and look at where its image comes from.
An image left on Google's servers goes on showing while Google serves it. To bring one across, download it, upload it to the Media Library and replace it in the post. For a link, edit it to the post's new address. Until every post is clean, leave the Blogger blog and its images where they are.
Recreate the pages. Give each new page the same slug as the last part of its old address: about for /. The file below relies on it.
Make the old addresses answer
Why some addresses differ
The importer does not copy a post's Blogger address into WordPress. WordPress makes a slug of its own from the title. These are the posts in Google's own Blogger documentation, and what each old address answers after an import under the structure above.
| Title | Address on Blogger | Address in WordPress | The old address answers |
|---|---|---|---|
| Latest updates, August 1st | / | The same | 200 |
| Blogger Documentation has moved to developers.google.com | / | / | 301, by a guess |
| A new post | / | / | 404 |
| An updated post | / | / | 404 |
Blogger shortened a long title, left the "A" off the front of another, and kept a post's first address when its title changed. Blogger also lets an author type a "Custom Permalink" for a post. WordPress knows none of that.
The 301 in the second row is WordPress guessing: it found one post in that month whose slug begins with the words asked for. The guess is not a map. How to change WordPress permalinks says when it fires and when it picks the wrong post.
The date can differ too. In a time zone with daylight saving, the importer applies the offset in force on the day of the import to every post. A post from the other half of the year is then an hour out, and one published within an hour of midnight at a month's end can land in the neighboring month.
See which addresses changed
The Blogger Importer keeps each published post's old address in a field named blogger_. This command prints it beside the address the post has now.
wp post list --post_type=post --post_status=publish --meta_key=blogger_permalink --fields=ID,blogger_permalink,url --format=csvEvery row where the two differ is an old address that needs a redirect. If another importer brought your posts in, the list may be empty. Work from your spreadsheet.
Add one file that redirects them
This file is a must-use plugin: WordPress loads every PHP file in wp-content/ without it being switched on. Create that folder if the site does not have one, and save the file in it as blogger-addresses.php. It is written for a WordPress installed at the root of the domain.
<?php
/**
* Plugin Name: Blogger addresses
* Description: Sends addresses from the old Blogger blog to the same content on this site.
*/
// Blogger sent phones to the same address with ?m=1 on the end. WordPress reads "m" as a date.
add_action( 'init', function () {
if ( is_admin() || ! isset( $_GET['m'] ) || ! in_array( $_GET['m'], array( '0', '1' ), true ) ) {
return;
}
wp_safe_redirect( remove_query_arg( 'm' ), 301 );
exit;
} );
add_action( 'template_redirect', function () {
$path = (string) wp_parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
$target = '';
if ( preg_match( '#^/search/label/([^/]+)/?$#', $path, $label ) ) {
// A label's page goes to the category the importer made from the label.
$term = get_term_by( 'name', rawurldecode( $label[1] ), 'category' );
if ( $term ) {
$target = get_term_link( $term );
}
} elseif ( ! is_404() ) {
return;
} elseif ( preg_match( '#^/\d{4}/\d{2}/[^/]+\.html$#', $path ) ) {
// A post goes to the post that has this address in its blogger_permalink field.
$posts = get_posts( array( 'meta_key' => 'blogger_permalink', 'meta_value' => $path, 'fields' => 'ids', 'posts_per_page' => 1 ) );
if ( $posts ) {
$target = get_permalink( $posts[0] );
}
} elseif ( preg_match( '#^/p/([^/]+)\.html$#', $path, $page ) ) {
// A page goes to the published page with the same slug: /p/about.html to "about".
$found = get_page_by_path( $page[1] );
if ( $found && 'publish' === $found->post_status ) {
$target = get_permalink( $found );
}
} elseif ( preg_match( '#^/feeds/posts/default/?$#', $path ) ) {
$target = get_feed_link();
}
if ( $target && ! is_wp_error( $target ) ) {
wp_safe_redirect( $target, 301 );
exit;
}
}, 1 );What it does, case by case:
| A request for | Is sent, with a 301, to |
|---|---|
Any address ending in ? or ? | The same address without it |
| An old post address that would answer 404 | The post that holds that address in blogger_ |
/ | The published page whose slug is about |
/ | The category named "News" |
/ | The site's feed |
It acts on a post address only when WordPress has nothing at it, so a post whose address did not change is served as before. An address no post ever had still answers 404. The file works under any permalink structure: under "Post name", / goes to /.
Two limits. The post rule reads the field the Blogger Importer writes. If another importer made your posts, it has its own way of keeping old addresses, and only the other four rules apply. And a label is matched to a category by its name, so a label you turned into a tag is not found.
If you would rather not add code, a redirect plugin can hold the same pairs, one row for each address that changed. How to set up redirects in WordPress compares the ways, and the redirect map builder turns a list of old and new addresses into rules.
Ask for an old address
Before the domain moves, ask the new site for old paths at its temporary address. Take one whose address changed. The first line of the answer should say 301, and the "Location" line should name the post.
curl -sI https://example.com/2012/05/new-post.htmlThen try the same address with ? on the end, a page under /, and a label. After the domain moves, run the list in your spreadsheet through the redirect checker, which follows a redirect and shows each hop.
Switch the domain
Check these first.
- Every address in the spreadsheet loads on the new site or redirects to the right post.
- No post still loads an image from Google's servers, or you have decided which ones may.
- Under Settings, then Reading, "Discourage search engines from indexing this site" is not ticked.
- You know where your email is hosted, and which of the domain's records belong to it.
Then point the domain at the new host. If the site was built at a temporary address, give it the real one first: how to change your WordPress URL covers that. Leave the domain's email records alone.
On blogspot.com, the domain is still set as the blog's custom domain in Blogger. Leave that setting as it is, and test a blogspot.com address as described at the top of this page. In Blogger, enter the new site's feed address under "Post feed redirect URL".
A blog that was already on its own domain has kept its domain, so there is no change of domain to announce. A blog that left blogspot.com changed its address on the day the domain was connected, and the redirect for that is Blogger's to send. How to migrate a website without losing SEO covers what search engines need after any move, and how to move WordPress to a new domain covers a change of domain made later.
Where it goes wrong
- "All done." and an empty site. The file was a
feed.atomfrom Takeout and the importer was the Blogger Importer. Search the file forkind#post. - Posts in the wrong month. The time zone was set after the import, or never. The file above still sends the old address to the post.
- Links that answer 404 on phones only. They end in
?.m= 1 - Images that vanish later. They were still loading from Google when the old blog was cleared out. Search the posts before you remove anything from Blogger.
- Pages missing. The importer brings none. Recreate each and keep its slug.
- A blog deleted too soon. A blogspot.com address redirects only while the blog exists. Google gives 90 days to restore a deleted blog.
- Posts under the wrong author. Only the authors named at the head of the file can be assigned. Check the others by hand.
Our WordPress migration service moves one WordPress site from one host to another. A change of platform is a different job: platform moves are quoted after a free assessment. See platform migrations.
Common questions
Can I keep my blogspot.com address?
No. It belongs to Google and cannot be pointed at another host. What you can do is connect a domain of your own to the blog in Blogger, so that Blogger redirects the blogspot.com address to it, and then move that domain to WordPress.
The importer said "All done." but nothing was imported. Why?
The Blogger Importer finds posts by a marker, kind#post, that Blogger's older .xml backup carries. A feed.atom file from Google Takeout does not have it, so the importer finds no posts and still finishes without an error.
Do I have to use addresses that end in .html?
No. The structure / lets a post whose slug matches keep its exact address. Under any other structure, every old post address needs a redirect, and the file on this page makes them for posts the Blogger Importer brought in.
Does the importer copy my images?
It copies images for the 20 newest posts in a run, from Google's servers into the Media Library. Older posts keep loading theirs from Google. Search your posts for googleusercontent.com to find them.
When can I delete the Blogger blog?
On a domain of your own, after no post loads an image from Google and every old address has been checked. On blogspot.com, not at all if you want old links to keep working: the redirect to your domain exists only while the blog does.
- ResourceWebsite migration checklist: before, during and after the move
- ResourceWebsite redesign SEO checklist: what to record, map and check on a rebuilt site
- Cost guideWordPress migration cost: which job you are being quoted for, and what moves the price
- Glossary term301 redirect
- Glossary termCanonical URL
- Glossary termDNS propagation

