Frequently Asked Questions

Common questions and errors before and during a migration. Can’t find your answer? Contact us.

Connection & credentials

“Test connection” fails with “Not Found”

Your site’s REST API isn’t reachable at the pretty URL WPMove uses (/wp-json/...). This usually means the site’s permalink rewrite rules aren’t active — common right after installing a new plugin, changing themes, or on a fresh install. Fix: go to Settings → Permalinks on that site and click Save Changes (even without changing anything). This regenerates the rewrite rules. Retest the connection afterwards.

“The target user does not have sufficient permissions”

The target site’s user needs both upload_files and edit_posts capabilities — in practice, a role of Author, Editor, or Administrator. A Subscriber or Contributor account won’t work. Create or use an account with at least the Author role and generate its Application Password from there.

Application Password looks correct but the connection still fails

A few things to check: the Application Password must be generated from Users → Profile → Application Passwords on the site itself (not typed manually) — spaces in the generated password are cosmetic and safe to keep or remove. If the site is protected by an extra layer (HTTP Basic Auth / “Directory Privacy” on some hosts, a firewall rule, or a security plugin blocking REST API or XML-RPC-style requests), WPMove’s connection will be rejected before WordPress even sees it. Temporarily allow REST API access for WPMove, or exempt the /wp-json/ path from that protection.

SSL / certificate errors

Both the source and target sites must be reachable over HTTPS with a valid, trusted certificate. A local development site with a self-signed certificate (e.g. .devel, .local, .test domains) will fail — WPMove doesn’t disable certificate verification for security reasons. Use a staging domain with a real certificate (Let’s Encrypt is fine) instead.

“The request was blocked by a security firewall”

Some hosts place a firewall in front of WordPress that blocks repeated automated requests before WordPress ever sees them. Your credentials are not the problem — the site never received the request. Ask your host to allow requests coming from the other site, or wait a few minutes and try again. If it keeps happening, migrating in smaller batches (fewer posts per run) usually stays under the threshold.

Migration behavior

Custom post types (CPT) don’t appear in “Post types to migrate”

The list is fetched live from your source site once its credentials are saved and “Test connection” succeeds. If a CPT is missing, it was almost certainly registered without REST API support (show_in_rest) by the plugin or theme that declares it — WPMove can only see and migrate post types exposed through the REST API of the site it reads (the source for a direct or pull migration, the target for a push). Fix: install the free WPMove Migration Connector on that site (2.1.9 or later, or Premium 2.6.20+) and tick the type in its “REST API visibility” section — per type, nothing else changes, with one caveat shown there: an exposed type becomes readable through that site’s public REST API. Then click “Test connection” again so the list refreshes. If no plugin can be installed on that site, the must-use plugin from the next entry works the same way with register_post_type_args.

A custom post type’s categories or custom taxonomy never migrate

This is almost always the same cause as the previous entry — the taxonomy itself wasn’t registered with show_in_rest support by the plugin or theme that declared it — but it can happen even when the post type and its other fields migrate fine, since a post type and its taxonomies are registered separately. Two fixes, depending on what’s installed on the affected site: if the WPMove Migration Connector (Lite or Premium) is installed there, open its settings and use the “REST API visibility” section to opt that taxonomy in — nothing else needs to change. If no connector plugin can be installed on that site, ask whoever manages it to add a small must-use plugin that forces show_in_rest for that taxonomy specifically, saved as a .php file directly inside that site’s wp-content/mu-plugins/ folder (create the folder if it doesn’t exist yet — no activation needed):

<?php
/**
 * Plugin Name: Force show_in_rest on a custom taxonomy
 * Description: Exposes a specific taxonomy through the REST API so tools
 *              like WPMove can read its terms. Replace 'your_taxonomy_slug'
 *              with the actual taxonomy name.
 */
add_filter( 'register_taxonomy_args', function ( $args, $taxonomy ) {
	if ( 'your_taxonomy_slug' === $taxonomy ) {
		$args['show_in_rest'] = true;
	}
	return $args;
}, 10, 2 );

Media isn’t migrating even though “Import media” is checked

On the Free plan, media is never migrated regardless of that checkbox — it’s a plan limitation, not a bug. Media migration is available on Starter, Pro and Unlimited plans, each with its own yearly media quota (see the Pricing page).

“Please wait N days before your next migration”

This is the Free plan’s cooldown between migrations. Paid plans (Starter, Pro, Unlimited) have no cooldown and allow unlimited migrations.

A migration seems stuck — no progress for a while

WPMove monitors migrations in the background; if one stops reporting progress for more than ~15 minutes, you’ll automatically receive an email about it (at most one per hour). From the Migrate page, use Restart to resume from where it left off, or Reset to clear it and start over. Migrations run via a queue, so brief pauses of a few minutes between pages are normal and not a sign of being stuck.

Elementor layouts, ACF fields or SEO metadata are missing after migration

WordPress’ REST API only carries the custom fields a plugin has explicitly opened to it — most plugins do not. Elementor layouts, ACF fields and some SEO metadata are therefore left behind, and nothing warns you. To carry them, install the free WPMove Migration Connector on both sites — the one you migrate from and the one you migrate to — then run the migration again. WPMove will transfer every custom field, including the images an ACF field points to. The plugin is free, needs no account, and only answers requests authenticated with the application password you already use here.

Media re-imported with a -1 suffix on the filename

This happens when “Skip already imported media” is unchecked (replace mode) and a file with the same name already exists on the target — WordPress adds a numeric suffix rather than overwrite by default. WPMove’s replace mode deletes the existing file first specifically to avoid this; if you still see suffixed files, they were likely uploaded outside of WPMove (e.g. manually) before the migration ran.

Sync mode migrated everything — or migrated nothing

Sync mode carries only what changed since your last successful migration between the same two sites, so a run that finds nothing to do is usually correct — nothing changed. It deliberately falls back to a full migration in four cases, and the migration log always states which one applies: there is no previous successful migration towards this target; the previous run stopped at your plan’s post limit, so older content is still waiting; you added a content type the previous run did not cover, whose existing content is older than the sync point and would otherwise be skipped for ever; or your earlier migrations predate sync mode and never recorded which content types they covered, so the first sync run cannot tell what a partial one would leave behind. That last case is the one most people meet: one full migration records the scope, and every sync after it is incremental. One limit worth knowing: content deleted on the source is never removed from the target. Sync mode adds and updates — it is not a mirror.

Comments are missing after a migration — or arrived awaiting moderation

Comments only travel when “Import comments” is ticked; it is off by default. When it is on, comments awaiting moderation come across too — and stay awaiting moderation, so nothing appears on your site without your say-so. Spam and trash are deliberately left behind: migrating is a good moment to be rid of them. Threads are rebuilt, with one exception worth knowing — a reply whose parent was not migrated is attached at top level rather than pointed at the wrong comment, and the log says so. Commenters always arrive as guests, identified by name and email: an account id from one site means nothing on another. Re-running a migration never duplicates comments already on the destination.

The post author received one email per migrated comment

That email comes from the target site, not from WPMove: WordPress notifies a post’s author whenever an approved comment is created, and a comment migrated over the core REST API is created exactly like a new one — moderation rules, duplicate check and notification included. The fix is to install the free WPMove Migration Connector (2.1.7 or later) on the target: WPMove then writes migrated comments through it, directly into the database, with none of those automatisms — no email, no comment sent to moderation, no reply rejected as a “duplicate”. The migration log tells you which path is in use. Without the plugin on the target, untick “Email me whenever anyone posts a comment” in Settings → Discussion there for the duration of the migration.

What does installing the free Connector on the target change?

Three things, all silent otherwise. Custom fields: the core REST API only carries the fields a plugin has opened to it, so Elementor layouts, ACF fields and SEO meta stay behind unless the Connector is installed on both sites (it also carries page templates). Comments: written directly into the database instead of through the core route — no moderation, no duplicate rejection, no notification email to post authors (see above). Reachability: with the Premium version, a site on localhost or behind a firewall can drive the migration itself. One requirement: the Application Password used on that site must belong to an administrator — the Connector writes past WordPress’ usual gates and only trusts an admin to do so. The plugin is free, needs no account, and is the same one used for file export/import.

WPMove
Privacy Overview

This website uses cookies to improve your experience. Strictly necessary cookies are stored in your browser as they are essential for WPMove to function. We also use third-party analytics cookies to understand how visitors use WPMove — only with your consent.