=== Easy WP Migration ===
Contributors: easywpmigration
Tags: backup, migration, migrate, restore, export
Requires at least: 5.8
Tested up to: 7.1
Requires PHP: 7.2
Stable tag: 1.9.20
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Migrate and back up WordPress with no plugin-imposed archive-size cap. Free chunked import. Upgrade for scheduled cloud backups and Sync.

== Description ==

**Easy WP Migration** bundles your entire WordPress site - database, media library, plugins, themes and other wp-content files - into a single portable `.ewpm` archive that you can download, keep as a backup, or restore on another site.

**No plugin-imposed archive-size cap (free)** - archives are uploaded in chunks by design, so imports do not depend on PHP's normal whole-file upload ceiling or an Unlimited Extension. Available disk, memory, database, filesystem, network, proxy, and execution-time limits still depend on the host.

**Export (free)**

* One-click export of your whole site into a single archive
* Choose exactly what to include: database, media, plugins, themes, other files
* Pick individual plugins and database tables
* Advanced find & replace with serialized-data safety and optional email-domain protection
* Time-budgeted batching for large sites

**Import (free)**

* Drag & drop - no plugin-imposed total archive-size cap
* Automatic URL migration when restoring to a different domain
* Live progress with an activity log

**Manual backups and staging (free)** - keep archives on the server, or create a private noindexed staging copy in a subfolder.

**Pro features** (annual license from [easywpmigration.com](https://easywpmigration.com/pricing/) - Personal $79 / 2 sites, Freelancer $149 / 10 sites, Agency $299 / 50 sites - same price every year)

*Every plan:*

* Scheduled backups (daily / weekly / monthly) with retention strategies
* Cloud destinations: Google Drive (one-click OAuth), Dropbox, OneDrive, Box, pCloud, Amazon S3 & S3-compatible (DigitalOcean Spaces, Backblaze B2, Google Cloud Storage, Wasabi, Cloudflare R2, MinIO), Azure Blob Storage, WebDAV (Nextcloud, ownCloud), FTP/FTPS
* Restore verification and recovery points
* Sync: full push and selective differential push with conflict detection
* Pro auto-updates
* Fair licenses: activations you control; Free staging never uses a license seat

*Freelancer and Agency add:*

* Remote Pull: site-to-site migration over authenticated REST
* WP-CLI automation

*Agency adds:*

* Multisite tools: export one site of a network as a standalone site, or add a standalone site into a network

**Always excluded for safety:** WordPress core files (wp-admin, wp-includes), wp-config.php, .htaccess and the backups folder itself.

Easy WP Migration is independent software and is not affiliated with ServMask or All-in-One WP Migration.

== Free vs Pro ==

* Free: chunked export/import with no plugin-imposed archive-size cap, search-replace, manual backups, staging sites
* Personal: scheduling, cloud offload, restore verification, recovery points, Sync
* Freelancer: everything in Personal, plus Remote Pull and WP-CLI
* Agency: everything in Freelancer, plus the multisite tools and priority support

== External services ==

This plugin may contact the following external services:

* **easywpmigration.com** - license activation/verification and Pro update checks when a license key is entered; optional usage heartbeat (site URL, plugin/WP/PHP versions, free/Pro status) about once per day - disabled unless an administrator explicitly opts in under Settings; OAuth broker for one-click cloud-drive connect - Google Drive, Dropbox, OneDrive, Box, pCloud (Pro). The broker exchanges the sign-in and returns the access token to your site; it is only used if you choose one-click connect rather than your own app credentials.
* **Google APIs** (accounts.google.com, oauth2.googleapis.com, www.googleapis.com) - when Google Drive is configured as a backup destination
* **Dropbox** (dropbox.com, api.dropboxapi.com, content.dropboxapi.com) - when Dropbox is configured as a backup destination
* **Microsoft** (login.microsoftonline.com, graph.microsoft.com) - when OneDrive is configured as a backup destination
* **Box** (account.box.com, api.box.com, upload.box.com) - when Box is configured as a backup destination
* **pCloud** (my.pcloud.com, api.pcloud.com, eapi.pcloud.com) - when pCloud is configured as a backup destination
* **Your configured S3, Azure, WebDAV and FTP hosts** - when those destinations are used
* **Peer WordPress sites** - when using Sync or Remote Pull (URLs you enter)

See the privacy policy at https://easywpmigration.com/privacy/

== Installation ==

1. Install from WordPress.org or upload the plugin ZIP via Plugins -> Add New.
2. Activate **Easy WP Migration**.
3. Go to **Easy WP Migration** in the admin menu to create your first export.
4. Optional: purchase Pro at https://easywpmigration.com/pricing/ and activate the key under **License**.

== Frequently Asked Questions ==

= Is there an upload size limit for imports? =

Easy WP Migration imposes no total archive-size cap. Archives are uploaded in small chunks, so imports do not depend on PHP's normal whole-file upload limit. The host must still have enough disk and database capacity, filesystem permissions, memory, execution time, and network/proxy tolerance for the operation. There is no Unlimited Extension paywall on free imports.

= Can I restore an older .wpress backup? =

Yes, if it was created by Easy WP Migration or its former WP Site Porter name. Those legacy archives remain restorable. `.wpress` is also used by other migration products, whose archive formats are not compatible with Easy WP Migration.

= Does it work when moving to a different domain? =

Yes. The importer rewrites URLs - including inside serialized data - to the new site's URL.

= What happens to my wp-config.php and .htaccess? =

They are never exported and never overwritten on import.

= Do I need a license for basic migration? =

No. Free export and import have no plugin-imposed archive-size cap.

= How does Pro licensing work? =

Plans are annual: Personal (2 sites), Freelancer (10 sites), Agency (50 sites). You control activations - deactivate a site to free a seat. Same list price every renewal. Purchases are processed by Paddle (merchant of record). Manage your key at https://easywpmigration.com/account/

== Screenshots ==

1. Export your site - choose what to include
2. Import - drag & drop with chunked upload and no plugin-imposed archive-size cap
3. Sync - push to another site (every Pro plan)
4. Settings - license, schedule, and cloud destinations

== Changelog ==

= 1.9.20 =
* Fixed: on a network, restoring across different table prefixes fixed roles only for the site the restore ran on. Every other site keeps its own options table, so their `{prefix}{id}_user_roles` still named the old prefix and those sites' roles stayed broken. Every blog is now covered.
* Added: a regression test for the whole prefix scenario — statement routing, recovering the prefix from a dump that never recorded it, roles surviving the change, subsite capability keys keeping their blog id, and an ordinary same-prefix restore staying untouched.

= 1.9.19 =
* Fixed: after restoring a backup from a site with a different table prefix, accounts came back with no role — which looks like a broken password. WordPress stores the prefix inside the data as well as in table names: usermeta rows keyed `{prefix}capabilities` and `{prefix}user_level`, and the `{prefix}user_roles` option. 1.9.17 moved the tables but left those keys naming the old prefix, so WordPress looked for a capability record that was not there. Those keys are now rewritten too, on both restore paths.

= 1.9.18 =
* Fixed: a full Sync push could leave the receiving site empty. The push uploads an archive and the DESTINATION restores it, so the destination needed the table-prefix fix from 1.9.17 as well — installing it only on the sending site changed nothing. Both restore paths are now prefix-aware, including the fallback used when a restore finishes in one pass.
* Note: for a full Sync push, update BOTH sites. The site doing the restoring is the one that needs this.

= 1.9.17 =
* Fixed: restoring a backup whose site used a different table prefix left the site empty. Operators change the prefix for security, and a backup captures every table in the database — so an archive can also carry a second, unrelated WordPress install. The restore put every table back under its original name, and when that was not this site's prefix, WordPress read the wrong half: the restore reported success and the site came up blank with no explanation. The archive's tables are now placed on this site's prefix, and any other install's tables in the same backup are left alone. The prefix comes from the backup itself, or is read out of the database dump for backups made before it was recorded.

= 1.9.16 =
* Added: on a network, a recovery point can now cover one site instead of only the whole network. The screen says what each choice covers before you make it — a single-site point carries that site’s content and uploads, while network-wide users, roles and the site list are shared by every site and are not rolled back.
* Added: an optional off-site copy of a recovery point. It is a copy, not a hand-off: the local point stays where it is, because rolling back should not depend on the destination being reachable at the moment you need it.

= 1.9.15 =
* Added: a scheduled backup can now cover several sites of a network, not only one site or the whole network. Each chosen site is saved as its own standalone backup, keeps its own retention count, and has its own incremental chain. A run that misses any chosen site is reported as a failure, naming the sites that failed.
* Fixed: retention could delete another scope's backups. A whole-network backup and a single-site backup both begin "scheduled-", so they were counted against the same "keep how many" and could rotate each other away — a site could be pruned to nothing while its keep count still looked satisfied.
* Fixed: incremental backups shared one chain across sites, so one site's incremental could be built on another site's full backup and could not be restored. Each site now keeps its own chain; existing single-scope chains are unaffected.

= 1.9.14 =
* Fixed: on a network, opening a plugin screen from a site URL instead of the Network Admin URL showed "Sorry, you are not allowed to access this page" and stopped there. The forward to Network Admin was attached to a hook that WordPress runs after it has already refused the request, so it never had a chance to act. It now runs at the point of refusal and takes you to the right screen, keeping the address exactly as it was. This is what an OAuth return from Google Drive was hitting.

= 1.9.13 =
* Added: a clear explanation when a plugin screen is opened on a network by someone who is not a Network Administrator. WordPress previously answered with a bare "you are not allowed to access this page", which named neither the plugin nor the reason.
* Changed: the minimum PHP version is now 7.2 (was 7.4).
* Changed: internal restructuring so paid features register themselves rather than being switched on inside the free code. No change to what any plan includes.

= 1.9.12 =
* Changed: Staging sites are now included in Free, with no license required.
* Changed: Sync is now included in every Pro plan, starting with Personal.
* Fixed: a scheduled recovery point could stop with a PHP error. Work that runs on a schedule was calling a WordPress function that only exists on admin screens; the same applied to two other places reached by scheduled runs and by site-to-site sync.
* Fixed: this plugin could interrupt its own restore. While the database was being replaced, its own background work wrote a row the restore was about to write too, and the restore stopped with a duplicate-entry error, leaving the site half-restored. Background work now stands down for the duration.
* Fixed: a backup could be reported as "Not restorable" when it was perfectly fine. The check test-restores into temporary tables, and on sites with long table names (WooCommerce in particular) those names exceeded what MySQL allows, so the test could not run. A name that still cannot fit is now reported as something the check could not verify, never as a broken backup.
* Fixed: an interrupted transfer left a near-empty file in the backups list that looked restorable. Restoring one applied the other site's settings without restoring any content. These are now labelled Incomplete, cannot be restored, and are cleared automatically.
* Fixed: a large transfer could end with "Network error during pull" after a single slow moment. Transfers now retry and resume where they left off, and wait far longer before giving up.
* Fixed: the verification result now explains itself. The badge opens a report showing every check, what passed, and what did not.
* Improved: the Backups list keeps its columns aligned, no longer scrolls sideways, and its row actions are icons with hover labels.

= 1.9.11 =
* Fixed: a restore of a large site could stop partway through with an empty HTTP 400 on every remaining step. While the database is being replaced there is a brief moment when the `active_plugins` row does not exist, and in that moment WordPress ignored the safeguard that keeps this plugin loaded — so the plugin driving the restore stopped loading and its request handler ceased to exist. Reported on a 410 MB pull.
* Fixed: a restore could finish with every plugin on the site switched off, because the option that records them was written in a way that silently did nothing when the row was missing.
* Fixed: on multisite, finishing a restore could network-deactivate every other network-activated plugin. Per-site plugin lists were not affected.
* Fixed: a restore step that ran for more than five minutes could make the safeguard remove itself mid-restore, with the same result. It now tolerates a much longer step and refreshes its heartbeat when a step ends as well as when it begins.
* Fixed: the safeguard now records the real storage path, so a site with a relocated storage folder is protected too.
* Added: feature packaging is controlled from the licence server, so which plan unlocks which feature can change without a plugin update.
* Added: optional free trials.

= 1.9.10 =
Fixes a restore that could stop part-way with an unexplained error, and several faults that quietly lost content when pushing between sites.

**Fixed — restores**
* A restore could stop part-way with an empty "server error", most often near the end. Replacing the database also replaces the login sessions stored in it, so the person running the restore was signed out by their own restore and the remaining steps were rejected — the work was fine, but nobody could finish it. A restore now carries its own authority through to the end. Archives created before this version still hit the old behaviour, because the code that finishes a restore comes from the archive; re-export once on this version and it is gone for good.
* A failed step no longer ends the restore silently. Steps are resumable, so one is retried before giving up, and if it does give up it says what happened and that starting again resumes from where it stopped.
* Verification no longer asks the site for its own homepage with a long wait while the restore request is still open, which could stall or be cut off on servers with few PHP workers.

**Fixed — sync**
* Featured images lost their alt text and caption when pushed. Re-pushing repairs images sent by earlier versions.
* Categories and tags were dropped when the destination did not have the plugin that owns them — a WooCommerce product pushed to a site without WooCommerce lost its categories permanently. They are now kept and appear as soon as that plugin is active.

= 1.9.9 =
Promotes Remote Pull from a generic advanced row into a prominent premium feature card with clear no-download benefit copy, an entitlement-aware Freelancer or Included badge, responsive layout, and a stronger locked-state treatment.

= 1.9.8 =
Adds compact, right-aligned plan badges to locked Sync and Staging navigation items. Free sites see Pro, Personal sites see Freelancer, and eligible Freelancer or Agency sites see clean navigation without badges.

= 1.9.7 =
Adds a purpose-built monochrome Route Loop icon to the compact WordPress admin sidebar, replacing the generic migration glyph while preserving native hover, inactive, and selected-state behaviour.

= 1.9.6 =
Refines the Easy WP Migration identity with the selected Route Loop symbol: a cleaner open migration path and forward arrow that remains recognizable at small sizes. Updates the plugin header, wordmarks, favicons, and WordPress.org artwork while retaining WordPress's native sidebar glyph.

= 1.9.5 =
Introduces a cleaner, scalable brand system with a compact site-to-site transfer symbol, horizontal and monochrome logo variants, favicons, and coordinated WordPress.org icons and banners. The plugin header now uses the crisp SVG symbol while the compact WordPress sidebar retains its native migration glyph.

= 1.9.4 =
Restores WordPress's native migration glyph in the compact admin sidebar, while retaining the full brand mark in the spacious plugin header and WordPress.org artwork.

= 1.9.3 =
Adds a new Easy WP Migration brand mark to the WordPress admin menu and plugin header, with optimized WordPress.org directory icons and a safe icon-font fallback.

= 1.9.2 =
Improves the migration experience with an action-first dashboard, clearer Migrate out/Migrate in navigation, a three-step migration journey, safer restore confirmations, transfer speed and time estimates, and a post-restore verification checklist.

= 1.9.1 =
New backups use the `.ewpm` extension, avoiding ambiguity with other migration products. Backups created by Easy WP Migration and its former WP Site Porter name with the legacy `.wpress` extension remain supported.

= 1.9.0 =
Adds per-site pushes on multisite, three translations, and fixes several faults that could interrupt a restore or leave a site broken afterwards. (Supersedes 1.8.4, which was never released.)

**New**
* Sync: "push the whole site" now honours the site you pick on each end. Choosing a site on a network packs just that site and replaces only the matching site on the destination — the rest of both networks is left alone. Leaving both pickers on the main site still pushes the entire install.
* Translations: Spanish, Spanish (Peru) and German, covering the admin screens. Pick one under Settings; it applies to this plugin only.
* Restoring a database now reports its progress and resumes in slices, so a large database no longer looks frozen near the end and can no longer run out of PHP execution time.

**Fixed — restores**
* Restoring a large site could stop at 99% with an empty error. Updating addresses across every table ran as one uninterruptible request, long enough for a strict host to kill it while the restore itself had actually finished. It now runs in resumable slices and reports which table it is on.
* Verification asked the site for its own homepage with a fifteen-second wait, from inside the request finishing the restore. On a host with few PHP workers that request cannot be answered until the current one ends, so it stalled or was killed. It now waits five seconds, treats being unable to reach itself as a warning rather than a failed migration, and the whole verification stage is time-bounded.
* A restore could stop the plugin running it from loading. Archives frequently do not list Easy WP Migration among their active plugins, and the protection that keeps only this plugin loading during a restore read that list and concluded it was not needed. It now loads unconditionally while a restore is in progress, and an archived copy of that protection is never restored or exported.

* A restore could kill itself. wp-content is replaced file by file while the import keeps making requests, so a plugin caught half-written was loaded and fatalled, the import stopped with "Server error during import (HTTP 500)", and the site was left down. Only Easy WP Migration is loaded now while a restore runs.
* A restore could switch Easy WP Migration off. A site extracted from a network ships without it, so restoring that archive removed the plugin performing the restore and its screens answered "Sorry, you are not allowed to access this page". The plugin now stays active.
* Restoring onto a network no longer wipes that install's own connection key, licence, saved connections or cloud tokens — those are network options and were not being preserved.
* Restoring an archive that cannot be restored here (single site onto a network, or a sub-domain/sub-directory mismatch) is refused when you click, instead of failing partway through. Pulling one site of a remote network is likewise refused before the transfer, not after it.

**Fixed — multisite**
* Adding a site to a network failed on PHP 8 at the first folder in the archive.
* Adding a site to a network rewrote the archive's old address inside every other site on that network. Only the new site is touched now.
* A subsite carrying a stray, unprefixed `wp_user_roles` row could not be exported and re-imported (duplicate key). (Reported and fixed by a contributor testing on a live network.)
* Choosing a site that no longer exists on either end is refused, rather than quietly falling back to the network's main site.
* Pulling a whole network onto a single site is now refused before the transfer starts instead of after it. The restore always blocked this — a network archive carries the network's tables but not the multisite constants, rewrite rules or per-site addresses it needs — but the check only ran once the manifest was read, which is after the entire archive had been downloaded. The refusal now explains the two ways forward: pull one site of the network as a standalone site, or make the destination a network of the same type first.
* A standalone site can now sync into one site of a destination network. The "push into" picker only appeared when the site you were pushing *from* was itself a network, so there was no way to name a site on the far end; supplying it by hand was then refused with a message about networks that did not apply. Picking a site on the destination now works from any install, and the rest of that network is left alone.
* Choosing which site to sync is now its own step on the Sync page, between connecting a destination and choosing what to push. It appears only when one of the two ends is a network, and the step after it is numbered accordingly.
* The chosen site is remembered against the connection, so it survives reloading the page and reconnecting. Previously the picker reset to the destination network's first site each time, which could aim a repeat push somewhere you did not intend.
* Scheduled backups are a network-wide setting again, visible from every site.
* Backups keep the label saying which site they came from.

**Fixed — transfers**
* Uploading a backup failed with HTTP 500 on the second chunk: the chunk size arrived in the browser as text rather than a number, so the uploader asked for the whole remaining file at once. (Diagnosed by a contributor testing on a live network.)
* A UTF-8 byte-order mark emitted by the far site broke the handshake and corrupted transferred bytes; it is now stripped. (Fixed by a contributor testing on a live network.)
* Sites that block `/wp-json/` but allow `?rest_route=` are now detected and used automatically, instead of looking like the plugin is not installed there. (Fixed by a contributor testing on a live network.)
* "Push Everything (Full Site)" failed with "Invalid request signature" at 99%, after the transfer and the restore had both finished. Restoring the destination's database briefly replaced its connection key with the incoming site's, so the last few requests were checked against the wrong key. The destination now keeps using the key it advertised for the length of the transfer.

**Fixed — content sync**
* Featured images lost their alt text and caption when content was pushed. The destination looked for both, but the source never sent them, so every pushed image arrived with the text screen readers announce — and search engines read — silently missing. Re-pushing now also repairs images sent by earlier versions.
* Categories and tags were dropped when the destination did not have the plugin that owns them. Pushing a WooCommerce product to a site without WooCommerce stored the product but discarded its product categories, and they stayed missing after WooCommerce was installed. The terms are now preserved and appear as soon as that plugin is active.

* Pushing a post that uses ACF or Secure Custom Fields now takes the field group with it. Previously only the values travelled, so unless you happened to tick the field group as well, the fields did not appear on the destination at all — the data was there but invisible, which looked like the push had done nothing. The groups a selection depends on are sent first, and the Sync page ticks and locks them so they cannot be left behind.
* A group counts as required both when a selected post stores one of its values and when its location rules attach it to that post's type, so a post with nothing filled in yet still brings its fields along.

**Fixed — licensing**
* Plan limits are enforced: Personal covers scheduling, cloud storage, verification and recovery points; Freelancer adds Sync, Remote Pull, Staging and WP-CLI; Agency adds the multisite tools. Upgrade prompts name the plan a feature needs and its price.
* The in-plugin language picker had no effect, and listed raw locale codes when the site had no outbound network access.

**Fixed — interface**
* Three progress and status messages printed their own placeholders instead of the values, e.g. the Sync page showing "Connected: %1 · %2" in place of the site name and address. The upload and download progress labels were affected the same way.
* The direction row on the Sync page no longer leaves an empty bar behind when there is nothing to show.

= 1.8.3 =
* Cloud connect (Google Drive, Dropbox, OneDrive, Box, pCloud) now opens in a popup window instead of redirecting the whole Settings page.

= 1.8.2 =
* Fix Google Drive (and other OAuth cloud) connect: after auth, Settings now reopens Scheduled Backups on the connected destination panel instead of hiding it.

= 1.8.1 =
* Fix import/restore sessions being lost when AJAX lowercased mixed-case tokens; harden session state writes.

= 1.8.0 =
* Rebrand - product renamed to Easy WP Migration (slug `easy-wp-migration`, prefix `ewpm`, hub https://easywpmigration.com). Existing Easy WP Migration and WP Site Porter `.wpress` backups remain restorable. Settings and backup storage migrate automatically from prior WP Site Porter installs.

= 1.7.0 =
* NEW - Sync now works with WooCommerce, ACF/SCF, Contact Form 7, WPForms, Gravity Forms, Ninja Forms and Formidable (Pro). The Sync scan detects what changed and lets you push it to another site.
* NEW - WooCommerce: push products, product variations, coupons, product images and galleries, and global product attributes. Variations stay attached to their product and their images are recreated on the destination.
* NEW - Plugin data to push: form definitions that live in custom database tables (Gravity Forms, Ninja Forms, Formidable) and WooCommerce attributes are detected by content hash and pushed on demand.
* SAFETY - Definitions and configuration only: form entries/submissions, WooCommerce orders and customer accounts are never read or written, so a push can never overwrite the data your live site has collected.
* FIX - Pushed content now keeps parent/child relationships (WooCommerce variations, hierarchical pages) instead of flattening them to top level.

= 1.6.25 =
* NEW - Backup Assurance (Pro): every scheduled backup is automatically test-restored into a throwaway scratch database to prove it can actually be restored, then the scratch tables are dropped. A "Verified restorable" badge appears on each backup, and you can verify any backup on demand.
* NEW - Backup failure alerts (Pro): get an email (plus optional Slack / Discord / custom webhook) the moment a backup fails or a verification finds a problem, with a backup-health dashboard widget and a watchdog that warns if a scheduled backup silently stops running.
* NEW - Recovery points (Pro): snapshot your site in one click before a risky change and roll back to it just as easily; recovery points are never removed by retention.
* NEW - Incremental backups (Pro): scheduled backups can archive only the files that changed since the last run, with a periodic full to cap the chain, far smaller and faster, so hourly/daily backups stop straining the server. Restoring an incremental automatically rebuilds the full site from its chain.
* NEW - Staging sites (Pro): clone your site into a private, noindexed subfolder in one click to test updates and changes safely, then remove it when you are done.
* Positioning and pricing: Personal $79 / 2 sites, Freelancer $149 / 10 sites, Agency $299 / 50 sites
* Hub / Plugin URI aligned to easywpmigration.com
* Stronger Pro CTAs after free export and import success
* Compare messaging: chunked free import + fair licenses vs All-in-One WP Migration Pro
* Security: removed a development-only override that allowed OAuth redirects on any host; production redirect-host rules are enforced again
* Privacy: the optional usage heartbeat no longer transmits your license key (a one-way hash is sent instead)

= 1.6.5 =
* New backup destinations: Dropbox, OneDrive, Box, pCloud, Azure Blob Storage, WebDAV (Nextcloud, ownCloud)
* S3 destination now offers one-click presets for DigitalOcean Spaces, Backblaze B2, Google Cloud Storage and Wasabi
* Cloud drives connect with your own app credentials (no shared broker)

= 1.5.1 =
* Stronger Pro upsells and plan comparison in Settings
* Optional usage heartbeat (opt-out) for install analytics
* Export success CTA and Backups schedule nudge

= 1.5.0 =
* Freemium: Pro licensing via easywpmigration.com (activate/check/deactivate)
* Pro gates: scheduled backups, cloud destinations, Sync, Remote Pull, WP-CLI
* In-plugin upsells and Pro auto-update checks
* OAuth broker and Plugin URI on easywpmigration.com
* External services disclosed for WordPress.org

= 1.4.1 =
* Rebranded to Easy WP Migration
* New: Connect with Google - direct Google Drive OAuth authentication

= 1.4.0 =
* Scheduled backups, remote destinations, sync history improvements

= 1.3.0 =
* Sync page - full and selective push

= 1.2.0 =
* Pull from another site

= 1.1.0 =
* Redesigned admin interface

= 1.0.0 =
* Initial release

== Upgrade Notice ==

= 1.9.20 =
Completes the table-prefix repair for multisite: every site of a network now has its roles restored, not only the one the restore ran on.

= 1.9.19 =
Completes the table-prefix repair. Restoring across different prefixes left every account without a role, which presents as a broken password. Update both sites if you use full Sync push.

= 1.9.18 =
Update BOTH sites if you use full Sync push: the receiving site performs the restore, so it needs this fix too. Completes the table-prefix repair from 1.9.17.

= 1.9.17 =
Important if you have ever changed your table prefix. Restoring such a backup could leave the site empty while reporting success. Restores now place the backup's tables on this site's prefix.

= 1.9.16 =
Recovery points can now cover a single site of a network rather than only the whole network, and can optionally be copied off-site while the local point is kept.

= 1.9.15 =
Recommended on multisite. Scheduled backups can now cover several sites at once, and two retention faults are fixed: backups of different scopes could rotate each other away, and incremental chains could be built across sites.

= 1.9.14 =
Fixes a network-only fault: a plugin screen opened from a site address refused the request instead of forwarding you to Network Admin, which is where these screens live. Affects OAuth returns from cloud destinations.

= 1.9.13 =
Recommended on multisite: opening a plugin screen without Network Administrator rights now explains why, instead of a bare WordPress refusal that named neither the plugin nor the reason. Minimum PHP is now 7.2.

= 1.9.0 =
Recommended for anyone who restores or syncs sites. Fixes faults that could stop a restore partway and leave the site unreachable, and one that made uploading a backup fail. Adds per-site pushes on multisite, plus Spanish and German. Sync, Remote Pull and WP-CLI need Freelancer or above.

= 1.6.25 =
Pricing seats updated (2 / 10 / 50). Free unlimited migration unchanged. Hub URL is easywpmigration.com.

= 1.5.0 =
Adds optional Pro licensing. Free unlimited migration continues to work without a key. Schedule, Sync, cloud destinations, Pull, and WP-CLI require Pro.
