V3 PLATFORM
Migrate a V2 Client to V3¶
Use this procedure to move a client whose website runs the NetWise V2 theme onto the V3 platform.
The client keeps its news, documents, pages, councillors and menus, because they're already in its database. What a theme change loses is the settings layer, and the NetWise Onboarding plugin rebuilds it. All of the work happens on a WP Toolkit copy of the live website, which the client checks before anything replaces the real one.
For a client with no NetWise website yet, use Onboard a New Client instead.
This procedure was documented on 15 September 2026, rewritten on 28 September 2026 after the first live migration (Piddington & Wheeler End, 22 September 2026), and updated on 1 October 2026 after the second (Fawkham). It was written when NetWise-V3 1.0.118, NetWise Onboarding 0.13.0, NW Event Manager 1.0.46, NW Forms 1.4.0 and NW Planning 1.2.2 were current; the 1 October additions need NetWise Onboarding 0.14.2 (directory), 0.15.0 (mega menu) or 0.16.0 (tidy pages), NetWise-V3 1.0.124 (simple page editor) and NetWise Email Subscribers 1.0.6. The 7 October 2026 additions need NetWise Onboarding 0.18.1 (tidy pages closes Shift+Enter gaps) and NetWise-V3 1.0.130 (picture tools in the page editor). It was updated again on 29 October 2026 with what Fawkham's go-live (12 October) and Siston's migration (19–20 October) taught: build slots need NetWise Onboarding 0.18.2, and Siston went live on NetWise-V3 1.0.155, NW Event Manager 1.0.71, NW Forms 1.4.2 and NW Planning 1.2.4. The current releases are authoritative.
Never change the live website or the V2 repository
Don't run WP-CLI (wp) commands on a live client website, even just to look. Loading WordPress can run the website's scheduled jobs, and those write.
Don't change the NetWise-V2 repository or its releases. Nearly 400 live websites update from it.
Before you start¶
Every step is a wp nw-upgrade command, run in the build account's own cPanel Terminal, which you reach through WHM. Don't use WP Toolkit's WP-CLI panel: it mangles PHP code.
Each command previews by default and writes only when you add --run. Each one saves its result to nw-upgrade-<step>.json in the build account's home folder, and keeps what it replaced so wp nw-upgrade restore <step> can put it back. It refuses to run anywhere except a build slot's domain.
Read every preview before running the step for real.
Build slots¶
Since 13 October 2026 there can be up to three migrations at once, each in its own build slot: a cPanel account with its own domain, set up identically.
- Slot 1: account
nwupgrades, domainupgrades.netwisetraining.com. - Slot 2: account
nwupgrades2, domainupgrades2.netwisetraining.com. - Slot 3: account
nwupgrades3, domainupgrades3.netwisetraining.com.
All three slots were ready on 29 October 2026, each with a 20 GB quota, PHP 8.3, shell access and suspended outgoing email.
To make a slot in WHM, use Create a New Account with the Enterprise Pro package. Tick Select Options Manually only to set Max hourly emails per domain relayed to 100: the package says 500, but the server's Tweak Settings cap new accounts at 100 and the form is refused otherwise. Leave every other limit on Unlimited. Chrome fills the form's username and password with the WHM login, so clear both before typing new ones. Then suspend the account's outgoing email, set PHP 8.3 in MultiPHP Manager, and run AutoSSL for it. Until a slot's outgoing email is suspended, don't use it: a copy of a live website in it could email residents. A fourth slot needs a new NetWise Onboarding release.
Wherever this page says nwupgrades or upgrades.netwisetraining.com, read your slot's account and domain.
Each slot holds one copy at a time. An empty account is a free slot. If you find a website or result files in one that you didn't put there, find out whose they are before deleting anything — somebody else's migration may be in progress.
Use one Terminal per slot, and check that the Terminal's prompt shows the slot's account before typing a command. A command typed into the wrong slot's Terminal runs on another client's copy.
Track it in the Hub¶
Each migration is a V2 → V3 move job in the NetWise Hub (Trello is no longer used for migrations, since 19 October 2026). Its checklist follows the steps below.
- When you start, check the Hub's migration jobs that are in build or ready for a note naming a slot, then pick an empty one.
- Add a note to the client's job saying which slot it is in, and move the job to In build.
- Tick each stage as it is done, and add notes for anything the next person needs, such as the plugin list from Step 9.
- Move the job to Ready once the client has signed the copy off, and to Aftercare after go-live.
Claude can run this for you
The same procedure is kept as a Claude skill, netwise-v2-upgrade, in NetWise-UK/netwise-ai-toolkit. It carries the same steps plus the traps met on real migrations. This page and that skill are kept in step with each other.
Check who holds the domain¶
Do this before anything else
The tooling pulls documents and other content in from the client's old website, so it needs unfettered access. NetWise must control the domain's DNS, so that we can pause Cloudflare if we need to during the migration. Don't start the migration until this is done.
Follow Bring a Client's Domain Under NetWise Control. In outline:
- Check whether the domain's DNS is already in NetWise's Cloudflare account. If it is, there's nothing to do.
- If not, ask the client for a complete copy of their existing DNS records.
- Add the domain to NetWise's Cloudflare account and import the DNS records from the client's copy. Don't let Cloudflare scan for them, then change the nameservers.
The domain doesn't need to be registered with NetWise. Only the DNS matters.
1. Look at the live website¶
Use the domain the live website actually answers on. The Hub can hold an old one: Siston's job said .org.uk, but its website is on .gov.uk.
Check which V2 version it runs, and which plugins it has. Use the client's WordPress Plugins screen or cPanel File Manager. Don't change anything.
Note any plugin that sends email through an outside mail server (SMTP), sends newsletters, or makes backups, and any of NW CouncilDocs, The Events Calendar and WPForms.
Also note three that need extra work later: Contact Form 7 or Forminator (the forms step only converts WPForms; search the live page source for wpcf7), Email Subscribers & Newsletters by Icegram (its subscribers move across separately), and Connections (a business directory).
A copy can act like the live website
The build account can't send email itself, but an SMTP plugin can get round that. A copy could also send the live website's newsletters or overwrite its backups. Decide how such a plugin will be stopped on the copy before you clone.
2. Clone the live website into the build account¶
In WP Toolkit on server.netwisetraining.com, open the client's website and click Clone.
Choose Use existing domain, then select your slot's domain, such as upgrades.netwisetraining.com.
The form defaults into the live account, and the path box hides a folder
The form opens on Create subdomain → staging.
Click into the path box and delete its contents, even if it looks empty. The form can keep a hidden default path of staging.
Check that the database name starts with your slot's account name, such as nwupgrades_, then click Start.
After it starts, WP Toolkit shows where the copy is going. Check that it's the location you intended.
3. Stop the copy acting like the live website¶
Use the copy's card
In WP Toolkit, the live website's card has exactly the same switches as the copy's. Check the owner is nwupgrades before changing anything.
On the copy's card, switch off Take over wp-cron.php and switch off search engine indexing. Leave password protection off: the copy must open with no login, so the operator and the clerk can look at it without being given a password.
Switching off the wp-cron takeover also removes the setting that stops scheduled jobs. Set it again straight away in the Terminal:
cd ~/public_html
wp config set DISABLE_WP_CRON true --raw
Set the copy to PHP 8.3. The cloned .htaccess keeps the live website's ea-php81 handler even when cPanel shows 8.3 as the server default.
If the live website has ever run Wordfence, open the copy's .htaccess in File Manager and delete everything from # Wordfence WAF to # END Wordfence WAF. That block tells the server to load a file from the live account, which the copy can't read, so every page of the copy is blank. Terminal commands still work normally — only visiting a page shows the problem.
4. Install V3 and run the safety check¶
cd ~/public_html
wp --skip-plugins --skip-themes theme install \
https://github.com/NetWise-UK/NetWise-V3-releases/releases/latest/download/NetWise-V3.zip
wp --skip-plugins --skip-themes plugin install \
https://github.com/NetWise-UK/nw-onboarding-releases/releases/latest/download/nw-onboarding.zip --activate
wp nw-upgrade check
check must report every line OK before you go on, except one. It confirms you're in the build account, scheduled jobs are off, search engines are discouraged, and the versions are recent enough. It also says "The copy is not password protected"; that line is expected, because the copy is deliberately left open.
5. Pin, switch and apply¶
wp --skip-themes nw-upgrade pin
wp nw-upgrade switch
wp nw-upgrade apply
Pin before switching to V3
The first time V3 loads, it writes some settings of its own under names V2 also used. A plan read after that presents V3's defaults as the client's own settings. Pin while the copy is still on V2.
switch and apply are separate commands on purpose: V3 has to load once in between.
The pin lists the settings that will carry across, the logo, the councillors, how many documents and meetings the website has, any warnings, and the jobs that need a person. Read it before applying.
6. Move the content across¶
Install NW Event Manager, then preview and run each migration in turn:
wp plugin install \
https://github.com/NetWise-UK/nw-event-manager-releases/releases/latest/download/nw-event-manager.zip --activate
wp nw-upgrade members
wp nw-upgrade tec
wp nw-upgrade councildocs
Add --run to each once you've read its preview.
Councillors. Check anyone filed as staff or as a district or county councillor, and any old group the preview calls "not recognised".
The Events Calendar. The step refuses to run if it wouldn't see every event. If it refuses, update NW Event Manager rather than working round it. Afterwards, file any events with no type at Meetings → Check filing, then check the homepage shows the right next meeting. A pair of meetings on the same May date — the annual meeting and the ordinary one — is normal, not a duplicate.
CouncilDocs. Run it, check that an old meeting address redirects to its new page, then run it again with --run --delete to remove the plugin. The imported meetings, their papers and the redirects all stay.
Galleries. Nothing to do. Photo galleries move across by themselves the first time the website loads under V3.
Meeting papers¶
Run wp nw-upgrade papers after councildocs, then --run. It attaches each old agenda and set of minutes to the meeting held on the date in its title. It only adds, so it can be run again, and restore papers undoes it.
Many clerks title their minutes with a month and year only, such as "Minutes July 2026". papers leaves those for a person, and on Orton Longueville that was 58 of 87 papers. Match them in two more passes, both previewing before they change anything:
- By month. Attach each one to the single council meeting held in that month. A title naming the residents' Annual Parish Meeting is left alone, and an agenda whose date differs from the calendar meeting in the same month is attached but listed, because one of the two dates is wrong.
- By the date inside the document. What is still left is usually meetings the old calendar never held. Read each PDF for the real meeting date, which the minutes give as "held on" a named weekday, and create the missing meetings with their papers attached. Check every date against the weekday. If a heading has no date at all, take it from the neighbouring minutes' "date of next meeting" line and tell the clerk it was inferred.
The scripts and the exact rules are in the netwise-v2-upgrade skill in NetWise-UK/netwise-ai-toolkit. Until the month matching is built into the papers step itself, use them.
Don't run papers --run again afterwards
Once the Annual Parish Meetings are created as events, running papers --run would put their agendas on the council's annual meeting of the same day.
7. Rebuild the website's own pieces¶
wp nw-upgrade homepage
wp nw-upgrade banner
wp nw-upgrade footer
wp nw-upgrade header-menu
wp nw-upgrade docs
wp nw-upgrade tidy-pages
Preview each, then add --run.
These rebuild the homepage sections from the V2 homepage, turn the old carousel into the V3 banner, carry the footer links and privacy page across, switch off V3's header menu once its links are in the footer, and give a document its file where the PDF was pasted into the page body.
tidy-pages (NetWise Onboarding 0.16.0 or later) tidies the old static pages without rewording them. A short line that is all in bold becomes a real heading. Word's leftover formatting, non-breaking spaces and empty spacer lines are removed. From NetWise Onboarding 0.18.1, a run of line breaks inside one paragraph (a gap made with Shift+Enter) becomes a proper paragraph break. The preview lists each page's changes and the headings it would make. --pages=<ids> limits it to some pages, and wp nw-upgrade restore tidy-pages puts every page back. The simple page editor in NetWise-V3 1.0.124 applies the same rules each time a clerk saves a page, so a tidied page stays tidy.
Nothing needs running for the old pages' pictures: from NetWise-V3 1.0.128 a picture set to align right, left or centre is shown where it says. See The Page Editor.
V2's "Council websites by NetWise" line is not carried across: V3 prints its own credit.
An empty footer preview is not a failure. It prints nothing when there's nothing to carry across. Read nw-upgrade-footer.json to see what it found.
Make the old Home icon plain "Home" text. V2 menus have a custom Home link with the CSS class home. V3 draws any such item as a white house icon, which is invisible on light menu bars (the classic, centred and stacked headers, and the White header background option), so Home looks missing. Remove the class on the copy, after the header-menu step. This removes only home, keeps any other classes, and prints each item it changed:
wp eval 'foreach(get_posts(["post_type"=>"nav_menu_item","numberposts"=>-1,"post_status"=>"any"]) as $p){$c=(array)get_post_meta($p->ID,"_menu_item_classes",true);if(in_array("home",$c,true)){$n=array_values(array_diff($c,["home"]));update_post_meta($p->ID,"_menu_item_classes",$n);echo $p->ID." ".$p->post_title." was ".implode(",",$c)." now ".implode(",",$n)."\n";}}echo "done\n";'
This is to become a proper wp nw-upgrade step; until then, use the command above.
After the homepage step, open NetWise → Site layout → Homepage sections and press Save once. The screen's own checks are the proof that every field is valid.
After the banner step, check Site layout → Banner → Change slides automatically says what the client wants, and that the homepage banner moves if it should. Check it again after any theme update. On Fawkham it came back as No after an update; the likely cause is the Banner tab's Save changes button, which saves whatever that dropdown shows.
The directory, if the website used Connections¶
wp nw-upgrade directory
This makes a V3 directory listing for each Connections entry, with its contact details, categories and picture. Entries that weren't public come across as drafts, and Connections' private notes are never copied. Afterwards, point the old directory page's menu entries at /directory/ and deactivate Connections. Most websites don't use Connections; the step says so and stops.
The mega menu, if a dropdown is big¶
If one menu item has more than about six pages under it, or two levels of sub-pages, it reads better as a mega menu with headed columns. Choosing the headings is a judgement: Claude proposes the columns from the page titles, the operator approves them, and wp nw-upgrade mega-menu --plan=<file> applies them. Preview, then --run. The netwise-v2-upgrade skill has the details of the plan file.
News and notices, if the council wants one News section¶
Most councils keep News and Notices separate. If the council asks for one News section, combine them on the copy. This is a theme setting, not an onboarding step. Only an administrator sees it.
- Open NetWise → Site layout → Notices. At the top, choose Combine Notices into News and press Save News and notices setting, not the Notification bar's Save changes further down. The Notices menu and the
/notices/pages go. Nothing is moved or deleted yet. - The card now says how many notices are left. Press Move them into News. Each notice becomes a news article in the default category, with the same words, picture, expiry date and Notification Bar setting. Its old
/notices/…address forwards to the news article. - Take the Notices item out of the main menu. A menu item that pointed at the Notices list disappears by itself; a custom link to
/notices/now forwards to the News page. - Open a news article's edit screen and check it has Show this news article in the Notification Bar.
Once combined, Notification bar is in the main menu where Notices was. It opens the bar settings on Site layout → Notices.
To undo, choose Keep News and Notices separate and save. Notices comes back empty: the moved notices stay in News and their old addresses still forward.
Note
This needs NetWise-V3 1.0.134 or later, released on 5 October 2026 for Fawkham.
8. Forms, the meetings split, and finishing¶
wp plugin install \
https://github.com/NetWise-UK/nw-forms-releases/releases/latest/download/nw-forms.zip --activate
wp nw-upgrade forms
wp nw-upgrade split
wp nw-upgrade finish
wp nw-upgrade report
Forms. WPForms Lite forms become NW Forms, their embeds are swapped, and WPForms is switched off. A number field labelled Tel, Phone or Mobile becomes a phone field. If no form was placed on any page, the contact form — or the website's only form — goes at the foot of the Contact Us page. The preview says so first.
Split. Separates Meetings from Events. NW CouncilDocs must be gone first, because it owns a "Meetings" menu.
Read the list of committees in the split preview before running it. On Siston, a long event title (a rights of way sub-committee meeting) was offered as a committee name. File such events as events at Meetings → Check filing, preview again, then run it.
The tec and split previews give counts only. To see which events they mean, list them with wp post list --post_type=nw_event --post_status=any --fields=ID,post_title,post_date.
Finish. Switches on the Clerk Assistant and the Morning brief dashboard, switches off empty SiteOrigin CSS, and keeps a default WordPress theme in place.
Contact Form 7 or Forminator. The forms step reports "No WPForms forms" and moves nothing. Rebuild the form by hand in NW Forms.
The copy can't send email, so forms are tested after go-live.
NW Planning¶
Only if the client has a planning applications page. Since 1.2.2 its built releases are public, so it installs like the other plugins:
wp plugin install \
https://github.com/NetWise-UK/nw-planning-releases/releases/latest/download/nw-planning.zip --activate
The map is off by default. A website on 1.2.1 or older never sees an update, because its update check looked at the private repository: install 1.2.2 or later over it once, by hand. After that, updates appear in Dashboard → Updates.
Newsletter subscribers¶
Only if the website used Email Subscribers & Newsletters by Icegram. Nothing in the migration moves its subscribers; the safety check only makes you switch it off on the copy.
- Count what's really there, on the copy: Icegram's
ig_contactsandig_lists_contactstables, grouped by status. Don't rely on anyone's headcount: Fawkham's clerk thought there were five, and the database held 497 contacts, of whom 46 had confirmed. - In Icegram, export the list. The file's columns are First Name, Last Name, Email, List, Status, Opt-In Type and Created On.
- Decide with the operator about the Unconfirmed people. NetWise's rule is to carry across only people who confirmed, so delete the Unconfirmed rows from the file unless the operator wants them kept as pending.
-
Install NetWise Email Subscribers
1.0.5or later:wp plugin install \ https://github.com/NetWise-UK/nw-email-subscribers-releases/releases/latest/download/netwise-email-subscribers.zip --activate -
Import the file at Email Subscribers → Import / export. Subscribed people come in as active, unconfirmed people as pending (sent nothing until they confirm), and anyone who unsubscribed is left out. The result message says how many.
- Find where the old signup form was. It is usually in a text widget rather than a page, and it disappears silently once Icegram is off. Put NetWise Email Subscribers' form in its place.
Sign-up dates aren't carried across: imported people are dated the day of the import.
Colours¶
Pick the colour scheme for its layout, then enter the client's own colour as Brand colour override — primary, and a secondary if they have one.
Since NetWise-V3 1.0.96 every text colour on the brand colour is worked out to WCAG 2.2 AA, and the website's tints and dark tones become shades of it, so any colour is safe and there is no trial and error. Run WAVE on the homepage once to confirm.
For a client whose colours are burgundy, maroon or red-brown, choose Burgundy (in the Estuary style). It gives a parchment page instead of Estuary's light blue-grey, with Fawkham's colours built in; leave the override fields empty for exactly Fawkham's look, or enter the client's own.
Two more choices sit on the same Site style tab: White header background, and Top bar colour (standard, a darker shade of the brand, charcoal, white, or the same as the header). Fawkham uses white and charcoal.
9. Do the jobs for a person¶
wp nw-upgrade report lists what the migration couldn't do on its own. Depending on the website, that can include footer boxes with nowhere to go, councillors' website addresses, Additional CSS, form fields with no NW Forms equivalent, documents with no file, banner captions V2 hid, and the V2 intro picture.
Then look through the copy logged in: the homepage, the menus, the footer, a councillor, a meeting, a document, the planning page, and a page on a phone.
Clear any saved login before saving Meetings → Settings
Chrome can fill a saved login into Suggest an event or NetWise update license. Clear both before saving, or a password can be stored as the website's update licence.
Accessibility¶
Open Accessibility → Overview on the copy.
Describe pictures lists photographs with no description. Describe them, or tick them as decoration.
Never write a description that says the picture is decorative
Wording such as "decoration only" in a picture's description is WCAG failure F39. A decorative picture keeps an empty description.
Switch the accessibility statement over. From NetWise-V3 1.0.108, the website writes the statement itself. The V2 page's text is kept but no longer shown. Run the dry run first:
wp nw a11y-statement switch --dry-run
It lists what is kept — the prepared date read from the old statement, the contact details, the last review — and what the clerk should check on Accessibility → Statement. When you're happy:
wp nw a11y-statement switch --check
--check runs the first monthly accessibility check straight away. If the dry run says no district or unitary council is on record, add it in Customise → Contacts. Leave the tick boxes and the first review for the clerk.
The privacy notice asks for a review of its own. Leave that for the clerk too.
The score is not a compliance mark
The score shown on the statement comes from the monthly automated check. Never describe it to a client as compliance or conformance.
Notification bar. If the copy's notification bar is switched on with nothing in it, switch it off at Site layout → Notices, so the clerk isn't puzzled by it later.
Meeting papers and document dates¶
If papers are attached to meetings by hand on the copy, search the Media Library for the file first. On Siston, nine papers were uploaded again through meetings' papers boxes and became duplicates beside the originals; each meeting was relinked to the original file and the duplicate binned.
Documents with no date of their own can show the day of the migration. On Siston, the Policies were redated to their file's upload date. Minutes were left alone, because their date is the meeting's. Ask before redating a category.
Keep only NetWise plugins¶
A V3 website runs NetWise's own plugins and nothing else, so that every plugin on it can update itself (Adam's rule, 11 October 2026). Anything with no NetWise replacement is a question for Adam, not a plugin to keep.
List the copy's plugins with wp plugin list --fields=name,status,version. For every plugin that isn't NetWise's, active or not, note what it did and what does that job now. Most are covered: WPForms by NW Forms, The Events Calendar and NW CouncilDocs by NW Event Manager, Connections by the directory, newsletters by NetWise Email Subscribers, and breadcrumb, icon, cookie banner and custom CSS plugins by the theme. Watch for these:
- Shortcodes left in page text. Once a plugin is off, a page shows its shortcode, such as
[table id=3], as text. Switch the other plugins off on the copy, then search the published pages for shortcodes that no longer work, and rebuild that content. - Redirects from the Redirection plugin or an SEO plugin. V3 has no redirect screen. Export the list before the plugin goes and ask Adam which still matter.
- Mail-sending plugins such as SMTP plugins. V3 sends through the server, so the go-live form test is the proof that mail arrives.
- SEO and analytics plugins. Custom page titles, descriptions and visitor statistics stop. Tell the client in the go-live message.
Write the list, and what replaced each plugin, in a note on the client's Hub job. The folders are deleted at go-live, not before.
Remove the V2 leftovers¶
Delete the old theme folders NetWise-V2, NetWise-V2-Child and any NetWise-V2.bak-…. Keep NetWise-V3 and the default WordPress theme.
10. Let the client check the copy¶
Send the client the copy's address. There is no password to give them. Make any changes they ask for on the copy.
Tell the clerk how the page editor works: pictures have their own buttons, a picture needs a description before a page can be published, and clerks have no Code tab. The short version is in The Page Editor.
11. Go live¶
This replaces the client's live website with the finished copy. It was first done on 22 September 2026.
Agree a date with the client, and a content freeze. Anything added to the live website between the clone and go-live is lost.
Don't rely on the freeze: check it. Fawkham's clerk added a notice and a news post after being asked not to. From the Mac, list what the live website has added or changed since the clone date, for each content type, for example:
curl -s "https://<domain>/wp-json/wp/v2/posts?modified_after=<clone date>T00:00:00&_fields=id,date,slug"
Repeat it for pages, media, documents and notices. Add anything missing to the copy before Copy Data.
Make the website's email work before the day¶
Every V3 form, councillor message and Clerk Assistant email is sent from wordpress@<the client's domain> through our server. The build account can't send email, so nothing on the copy proves this works; the go-live form test is the first time. Check the client's DNS from the Mac first:
dig +short TXT <domain>
dig +short TXT _dmarc.<domain>
dig +short TXT default._domainkey.<domain>
dig +short MX <domain>
Fix what's missing in Cloudflare before the day. Fawkham had neither of the first two, so its form messages would have gone to junk or been refused.
- SPF. Keep one record, and add the server's IP to it, keeping the client's own mail provider, for example
v=spf1 include:emailarray.com ip4:194.76.17.83 -all. Check the IP in WHM first. - DKIM. In the client's live cPanel account, open Email Deliverability → Manage and copy the DKIM record's value into Cloudflare as a TXT record named
default._domainkey, DNS only. Ignore the SPF record cPanel suggests there: it drops the client's mail provider. Read the record back withdig. On Fawkham, the record's name was first pasted into its content, and a stray full stop after the closing;made strict receivers reject it. - Email Routing. When the MX records point elsewhere (emailarray, Microsoft 365, Google), set the live account's Email Routing to Remote Mail Exchanger. Otherwise messages to the client's own addresses land in an unused mailbox on our server.
Then, on the copy, so the settings arrive with it:
- Set the admin email to the clerk's address in phpMyAdmin (
admin_emailin the copy's options table; delete anynew_admin_emailandadminhashrows). Settings → General would wait for a confirmation email the build account can't send. - Check each NW Forms form's Send to. A form made while the admin email was NetWise's address sends there.
- At Meetings → Settings, set Minutes reminders → Send to to the clerk's address, and the Council email address under Council details for the Clerk Assistant to the client's own address. The Clerk Assistant's emails go there, not to the admin email. The weekly digest and urgent emails are off by default; switch them on only if the client asks.
Prepare the copy¶
Delete the result files first, so they don't travel to the client's account:
wp nw-upgrade cleanup
Also delete any Terminal output files, pin.json, apply.json and uploaded zips in /home/nwupgrades. They hold councillors' names, email addresses and phone numbers.
cleanup needs NetWise Onboarding active, and deletes at once with no preview.
Delete the copy's public_html/error_log too. On Fawkham it was 92 MB, almost all copied from the live website by the clone. Remove any plugin on the copy that hasn't been released, or it is carried to the live website.
Then remove the copy's safety settings: wp config delete DISABLE_WP_CRON, search engine indexing back on (wp option update blog_public 1). The copy has no password, so there is none to remove.
Back the live website up¶
WP Toolkit keeps only one restore point per website
Copy Data makes a restore point, but a second Copy Data replaces it with a snapshot of whatever is live at that moment. On the first live migration, the V2 restore point was lost to a second run, leaving only a snapshot of a half-copied website.
Take a real backup first: the live website's card → Back Up / Restore → Back Up, or confirm Acronis has an overnight backup of the account. Keep it for a few weeks.
Check the live account has room first. The backup and Copy Data's restore point are both stored in the client's account and count against its quota. WHM's account summary gives the limit and the space used. For Fawkham, the quota was raised from 10 GB to 20 GB for the day, and put back once the backup and restore point were deleted.
Copy the website over¶
On the copy's card, click Copy Data and set:
- Target — the client's live domain. Check this is the client's account, not the build account.
- Files and Database, with Replace files modified on target ticked.
- Remove missing files — leave unticked. It can delete files that aren't part of WordPress. The old V2 themes and plugins are removed by hand afterwards.
- All tables, and untick Exclude content-related tables.
Exclude content-related tables is ticked every time the form opens
Left ticked, it leaves out the posts, pages, users and picture records — every page, menu, meeting and councillor. The live website then has V3's settings over V2's content: blank pictures, the old menu, and missing pages.
If it happens, run Copy Data again with Database only, all tables, and the box unticked. Straight after the copy, check that the live website's newest pages are today's, matching the copy.
Press Start. Files and database together take a few minutes. WP Toolkit changes upgrades.netwisetraining.com to the client's own domain.
After the copy¶
Set the live account to PHP 8.3: WHM → MultiPHP Manager → User Domain Settings, filter for the domain, choose PHP 8.3 (ea-php83) with Inherit unticked. The live card still reports 8.1 until you do.
Switch the newsletter plugin back on if the website has one. Copy Data carries the copy's switched-off state across. For a client moved to NetWise Email Subscribers, that's the one to switch on; Icegram's plugin stays off.
Purge the Cloudflare cache for the domain.
An old domain parked in its own folder, holding only a redirect, can stay on PHP 8.1.
Then check the live website: the homepage, a meeting, a document, the planning page, the councillors, logging in, and Accessibility → Overview. Send a test message through the contact form and confirm it reaches the clerk — the live account can send email, so this is the first real test. In the received message's headers, look for spf=pass, dkim=pass and dmarc=pass. Search a page's source for any leftover build slot address, such as upgrades.netwisetraining.com.
Check the planning page's address too. On Fawkham, NW Planning's page was given /planning-applications-2/ because a page in the bin held the slug. Once the binned page has released it, change the planning page's slug back to planning-applications with Quick Edit.
Logins are as they were when the website was cloned
Everyone's password is the one they had on the day of the clone. A password changed since then no longer works, and needs a reset.
If anything is wrong, restore the restore point made by the first Copy Data, or the backup taken above.
Tidy up¶
On the live website, delete the old V2 themes from Appearance → Themes. Delete every plugin folder that isn't NetWise's — the list in the Hub job's notes from Step 9, such as The Events Calendar, NW CouncilDocs, WPForms Lite and Breadcrumb NavXT, and Icegram's Email Subscribers & Newsletters once its subscribers are checked — in File Manager rather than with WordPress's own Delete, which runs each plugin's clean-up routine. Plugins → Installed Plugins must then show NetWise plugins only.
Deactivate and delete NetWise Onboarding: only the migration needs it, and the CouncilDocs redirects belong to NW Event Manager. Then check in File Manager that its folder has gone from wp-content/plugins. On Siston the folder was still there afterwards and was deleted by hand.
Switch on auto-updates for every remaining plugin (Plugins → Enable auto-updates on each line). They are all NetWise's by now, so each release reaches the website within about 12 hours.
If the client wants a spam check on the contact form, switch on reCAPTCHA or Cloudflare Turnstile at NW Forms → Settings. reCAPTCHA loads Google's script and sets Google cookies, which belongs in the client's privacy notice; Turnstile doesn't. Both sit on top of the hidden checks NW Forms always applies.
NW Forms uses reCAPTCHA v2 with the "I'm not a robot" checkbox. Keys made for v3 or v2 Invisible show "Invalid key type" on the form. Create them in Google's reCAPTCHA admin as Challenge (v2) → "I'm not a robot" Checkbox, for the client's domain.
Move the Hub job to Aftercare with a note of the go-live: the date, the backup kept, the versions, and what is still owed.
A few weeks later, delete the backup and the restore point from the live account (the restore point is on the card's Dashboard → Updates → Restore Point row), and put back any quota you raised. Fawkham went over its quota when it was set back to 10 GB before both were deleted.
Finally, remove the copy from the build slot — WP Toolkit → Remove, with its database — so the slot is free for the next client.
Troubleshooting¶
Every page of the copy is blank¶
The copy still has the live website's Wordfence block in its .htaccess file. Remove it, as in Step 3.
The copy was created in a staging folder¶
The Clone form kept its hidden default path — see Step 2.
A step refuses to run¶
Every step refuses outside upgrades.netwisetraining.com, and writes nothing when it refuses. Read the message it prints:
- Nothing was pinned while the copy was on V2 — a plan can't be pinned after the switch. Make a fresh copy of the live website and start again.
- What the pinned record would apply has changed since pinning — a person must confirm which settings record is the live one.
- It has already been applied — undo it first.
- The Events Calendar import wouldn't see every event — update NW Event Manager.
Put a step back¶
wp nw-upgrade restore <step>
Every step keeps what it replaced. Restore refuses on a different copy of the website.
The subscriber import added nobody¶
NetWise Email Subscribers before 1.0.5 only recognised a header row whose first column was the email address. Icegram's export starts with First Name, so every row was skipped. Update to 1.0.5 or later and import again; nothing was added the first time, so there's nothing to tidy.
The homepage banner stopped changing slides¶
Check Site layout → Banner → Change slides automatically, set it to Yes, and save. See Step 7.
An already-live website still has the old accessibility statement¶
Switch it over from the dashboard at Accessibility → Statement, which moves the old page aside and can bring it back. Don't run commands on a live website.
Final check¶
Before considering the migration complete, confirm:
- The copy is in an empty build slot named on the client's Hub job, with scheduled jobs off and search engine indexing off while it's being built. It has no password.
wp nw-upgrade checkreported every line OK.- Every migration step's preview was read before it was run.
- The jobs from
wp nw-upgrade reportare done, or recorded for later. - The client has seen the copy and is happy with it.
- A backup of the live website exists before Copy Data runs.
- Before go-live: the client's SPF includes the server's IP, its DKIM record is published, and the admin email, form recipients and Clerk Assistant email are the client's own.
- After go-live: the live website's newest pages are today's, a test form message reached the clerk, the live account runs PHP 8.3, Cloudflare has been purged, only NetWise plugins remain with auto-updates on, and the Hub job is in Aftercare.
- The build slot is empty, with no result files left, ready for the next client.