Moving off a page builder: our karate school’s rebuild

Moving our karate school’s site off Thrive to a block theme: what we replaced, how we kept every URL, the traps, and launching with Site Replica Pro.

Sunshine Coast Karate home page side by side: the old Thrive design with a busy photo banner and free trial badge, and the new navy and orange design with a booking form beside the headline

Sandra and I run Sunshine Coast Karate, a karate school in Maroochydore. For years its website was built with Thrive Themes, and by the time we started this rebuild it ran on 15 active plugins. This is the honest story of moving off a page builder: rebuilding the site as a custom block theme with a few small plugins, keeping every address search engines know about, and launching it with Site Replica Pro on 4 October 2026. It covers what we found, what we replaced, the traps that cost time, and how launch day works.

Sunshine Coast Karate home page on desktop, before and after. Left: the Thrive version with the old logo, a photo banner, a Get Started Today button and a free trial badge. Right: the new block theme with a navy header, the headline Kids love it. Adults love it. You will too., and a trial booking form in the hero.
The home page on a desktop screen. Before (Thrive) on the left, after (new block theme) on the right.

Where we started

The first job was an audit, done read-only before anything changed. The site had 1,830 published posts, 58 published pages and 2.8 GB of uploads. The theme was Thrive Theme Builder and every page was built with Thrive Architect. Three other Thrive products, Leads, Ultimatum and the A/B testing plugin, were installed but not doing anything: no campaigns, no tests, empty tables.

The free trial form was the dojo’s only real source of new students, and it was Contact Form 7 with two add-ons. Every booking went to email and nowhere else, so one failed email meant one lost enquiry.

It was also slow. Lighthouse on the live site (mobile) scored 55–57 for performance, with the largest content taking 7.7–14.3 seconds to appear against a 2.5-second target. The causes were the usual ones: 235–350 KB of inline CSS and about 30 render-blocking files from the page builder, plus a server with no compression that took 750–860 ms to start answering.

Why you can’t just switch the theme

This is the part most people find out too late. 46 of the 58 pages were Thrive “landing pages”, which ignore the theme completely. Their real content lives in Thrive’s own fields, and the normal page content WordPress keeps is a plain-text copy that leaves out the buttons, FAQ toggles, forms, maps, videos and countdowns. If Thrive had been switched off, 34 pages would have lost their header and menu, 31 their call-to-action buttons, 16 their FAQs (including the home page and every program page) and 6 their forms.

The old Karate for Kids page, built as a Thrive landing page: its own header and menu, a photo banner with a Get Started Today button and a free trial badge, and a yellow swoosh heading.
Before (Thrive): the Karate for Kids page was a Thrive landing page. Its header, menu, buttons and free trial badge all lived in Thrive’s own fields.

So the new theme couldn’t be switched on until every one of those pages had been rebuilt. Before you move off any page builder, find out where it stores your content and what is left if you deactivate it.

Rebuild in place, not a new site

We worked on a local copy of the site on my Mac, and rebuilt each page in place: the same page, with the same ID and the same address, given new block content. Thrive kept showing its own version until launch, while a small local-only preview plugin showed the new theme on top. That meant no new URLs to redirect and no menus to rewire, and the old Thrive version of each page was checked to be unchanged, word for word, so visitors saw the old site intact until launch.

Here is one program page at the same address, before and after:

The old Karate for Adults page in Thrive: photo banner with a Get Started Today button, a free trial badge and a yellow swoosh heading.
Before (Thrive): Karate for Adults
The rebuilt Karate for Adults page in the new block theme: heading Karate for Adults and Over 50s, a short introduction, Book a free trial lesson and See class times buttons, and a dojo photo.
After (new block theme): the same page, ID and address

The look is Sandra’s design: Montserrat and Manrope type, navy with a sunrise gradient, and the dojo’s own photos. It is a full block theme that does presentation only. The colour palette, type sizes and spacing are locked, so nothing off-brand can be picked by accident; the range of looks comes from section styles and patterns instead. There are 27 patterns, from heroes and testimonial sliders to complete home, program and campaign pages, and a synced pattern with overrides took over from Thrive’s global “symbols”. Building a new campaign page from the patterns takes a few minutes.

The whole Karate for Kids page, top to bottom, old Thrive version on the left and the rebuilt block theme version on the right.
The whole Karate for Kids page, top to bottom. Before (Thrive) on the left, after (new block theme) on the right.

Everything that is content rather than presentation (locations, classes, instructors, testimonials, FAQs) lives in a plugin, so it survives a future theme change. Core blocks came first; custom blocks were written only where core has nothing, such as the timetable, testimonials and a countdown.

Five small plugins instead of eleven

Each replaced plugin was mapped to what took over its job:

Switched offReplaced by
Thrive Architect and Theme BuilderThe block theme, core blocks and the sck-blocks plugin
Thrive Ovation (testimonials)A testimonials type in sck-core, with consent holds
Thrive LeadsLead boxes in sck-leads
Thrive UltimatumA countdown block
Thrive Optimize (A/B testing)Split testing in sck-stats
Contact Form 7 and two add-onssck-leads
Redirect Redirectionsck-redirects
Hide Admin Toolbarsck-core
Thrive Product Manager was switched off with the rest of Thrive. The old folders stay on the server for a few weeks in case anything needs checking.

Eleven plugins were switched off on launch day, and the push removes two more: WishList Member, a membership plugin the site no longer used, and an old release of my image optimiser. That takes the site from 15 active plugins to nine: All in One SEO, AccessNow Image Optimizer, Site Replica, Spam Eater, and the five small SCK plugins. The theme and each plugin has its own page in our projects directory.

  • sck-core holds the content types, the business name, address and phone (typed once, shown everywhere), the settings and the structured data for search engines.
  • sck-blocks adds eight blocks and the pattern library.
  • sck-leads runs the booking and contact forms. Every booking is stored before it is emailed, so a mail failure no longer loses a student. The trial form now asks a child’s age, suggests the program, and offers only the classes that suit, with each class’s next date. No personal data ever goes into a web address.
  • sck-redirects holds 697 rules for retired addresses. A rule only acts when the page would otherwise be a 404, so a redirect can never hide a live page, and it keeps a 404 log with no IP addresses.
  • sck-stats counts visits and bookings with a script of under 1 KB: no cookies, no IP address and no browser details. It also replaces Thrive Optimize with split testing that picks its own winner, after at least 14 days, 200 visits per version and 20 bookings, at 95% confidence.

The free trial form, on a phone:

The free trial page on a phone. Left: the old Contact Form 7 form with contact name, email, phone and class drop-downs, and a reCAPTCHA badge. Right: the new booking form with first name, last name, email, mobile and a Who is the trial for? question.
The free trial page on a phone. Before (Thrive): Contact Form 7 with a reCAPTCHA badge. After (new block theme): the sck-leads booking form.

Where AccessNow’s own plugins came in

Three of the remaining plugins are mine, and each had a real job in this project.

Spam Eater protects the new forms instead of Google reCAPTCHA. The booking form asks Spam Eater whether a submission is spam, so there’s no puzzle for parents to solve and no Google script on the page. Without JavaScript, the form falls back to Spam Eater’s basic check plus a minimum time and a send limit.

AccessNow Image Optimizer replaced an early release of itself that the site had run for years. On the rebuilt site it keeps a backup of every original, caps images at 2,560 pixels wide and makes WebP copies, because the host doesn’t support AVIF. Most of the site’s images had no WebP copy before; now every size has one.

Site Replica did the launch itself, which has its own section below.

Cleaning up before the move

A rebuild is the cheapest time to clear out years of build-up, because everything gets checked anyway.

  • The blog: 1,829 posts were sorted into a spreadsheet with their search clicks and a suggested verdict. 163 stay as they are; 980 are kept as history, out of the sitemap and marked noindex; 76 are set aside to merge later; 610 are retired, made private rather than deleted, each with a redirect. Apart from six slugs WordPress tidied up, which redirect, no post changed its address.
  • Old posts converted to blocks: 452 classic posts, each compared word for word before saving.
  • Dead images: 1,678 references to images that were already missing on the live site were removed from 607 posts.
  • Size: 446 unused attachments (backed up first), revisions trimmed to the newest three per post, 65 tables left behind by old plugins, and 203 stale WishList member accounts. The database went from 93 MB to 76 MB, and uploads from 2.8 GB to 2.5 GB.
  • Character encoding: the core tables were still latin1 from the site’s early days, so any character outside Windows-1252, such as an arrow, an emoji or Japanese characters, was quietly saved as a question mark. 70 tables were converted to utf8mb4, checked with checksums, and 450 double-encoded values from around 2011 were repaired first.

The blog listing, before and after:

The old blog listing in Thrive: a search bar on a yellow band, the latest post with two photos, and a free trial badge and archives in the sidebar.
Before (Thrive): the blog
The new blog listing: the heading News and stories from the dojo, a search box, category filter buttons and a grid of post cards with images.
After (new block theme): the same address, with category filters

One near miss is worth passing on. The media audit listed 23 old PDFs as orphans, attached to no page. Those 23 files earned 47% of the site’s search clicks. Before deleting anything as unused, check it against your Search Console data.

Not losing a single address

Search rankings belong to addresses, so the rebuild was measured against the old site URL by URL. A crawl requested all 3,511 addresses from the audit’s inventory on the rebuilt copy and compared each one with the live site’s answer: 1,550 load as before, 747 redirect to a page that loads, and most of the remaining 404s are attachment pages of deleted media with no search clicks, pages that were already 404 on the live site, or old PDFs we chose to delete (the ones with newer versions elsewhere now redirect there). Only three addresses that weren’t planned came back 404, and all three were already broken on live.

A post from 2012 shows what that means in practice: the same address, in the new design.

The 2012 post How to tie your karate belt in the old Thrive theme, with a yellow breadcrumb band, a search bar and a sidebar of categories and recent posts.
Before (Thrive): How to tie your karate belt, from May 2012
The same 2012 post, How to tie your karate belt, in the new block theme at the same address, with breadcrumbs, the date, the category and a Your first lesson is free panel.
After (new block theme): the same post at the same address

Titles and canonical addresses stayed the same. All in One SEO stays for now, and sck-core adds local business details, the logo and social profiles to its structured data, which the old site didn’t have.

The live server runs PHP 8.1 and my Mac runs a newer version, so code that works locally could still fail there. Every PHP file in the theme and plugins, 160 in all, is linted with a real PHP 8.1 in Docker before anything ships.

Traps that cost time

  • Page templates reset while Thrive is active. Saving a page re-checks its template against Thrive, doesn’t find the new one, and quietly sets it back to Default.
  • Patterns made of other patterns open locked. WordPress 7.1 inserts them as linked pattern blocks you can only edit text in, so a countdown’s date couldn’t be changed. Full-page patterns now include their sections directly.
  • Don’t call a palette colour “text”. The slug generates a class with the same name WordPress gives every block that has a custom text colour, so every custom text colour on the site rendered grey.
  • PHP notices on screen break redirects. Thrive’s deprecation notices, printed before the page headers, stopped every redirect from working on a test install. On the live site, error display must be off.
  • WordPress’s built-in cron runs on a visitor’s request. Background work added about 0.6 seconds to a booking. A real cron job on the server now runs it instead.

Launching with Site Replica Pro

The launch is a push: the rebuilt local copy is sent to the live site with Site Replica Pro, and the live site keeps its own users and comments tables. Everything else, from pages and posts to settings, theme, plugins and media, comes from the copy. Live content is frozen on launch morning, and Site Replica’s “What changed” report lists anything the live site gained since the copy was made, so it can be re-created first. This morning it found nothing new to re-create.

Site Replica's Review the restore screen on the live site: restoring from localhost/wp-sck into www.sunshinecoastkarate.com.au, a backup made at 12:33 on 4 October 2026 with 62 tables, 132,134 rows and 57,601 files (3.9 GB). Nothing on the site has changed yet.
The restore plan on launch day. Nothing on the live site changes until it’s confirmed.
Restore options on the live site: Keep me logged in ticked; Discourage search engines, Block all outgoing email, Deactivate SSL-forcing plugins and Leave post GUIDs unchanged all unticked; Restore files and Restore the database ticked. Below, the list of tables to keep, with only wp_comments and wp_commentmeta ticked in this part of the list.
The choices we made: “Leave post GUIDs unchanged” unticked, and only four tables kept from the live site: wp_users, wp_usermeta, wp_comments and wp_commentmeta. The suggested “people’s data” preset had also ticked old Thrive and scheduler tables.

The restore is staged. The backup is imported into temporary tables while the old site keeps serving visitors, and only at the end are the new tables swapped in by renaming them. The old site is kept until someone presses Keep, so Roll back puts it back exactly as it was. Our rule is to decide within two hours. Only files the live site doesn’t already have, or that have changed, are sent.

Site Replica on the live site after the restore: Restored. Keep this version or roll back?, with buttons to open the site, keep the restored site or roll back, and a log showing row counts verified, 36,458 files copied and 21,143 unchanged files linked, and the switch to the restored copy.
Switched. The old site stays on the server, ready for Roll back, until Keep is pressed.

The rehearsal

The day before, the whole launch was rehearsed into a throwaway WordPress install on the same Mac. Backing up the rebuilt site took 94 seconds, sending 3.2 GB to an empty site took 4.5 minutes, the restore took 65 seconds and Roll back took 8. More useful than the timings were the things it showed the written plan had wrong:

  • A push carries the active theme and plugins exactly. The first restored site came out on Thrive, with the old forms. The new theme has to be switched on and the old plugins switched off on the copy before it is backed up.
  • Must-use plugins are sent too. The local preview plugin would have gone to live, so it was moved out first.
  • Only a full restore removes plugins the live site has and the copy doesn’t. Untick any part and it becomes a partial restore, which would have left the old image optimiser and WishList Member behind.
  • Roll back never touches the tables you keep. That’s the point of keeping them, but it means changes to them can’t be undone by Roll back. Converting the users and comments tables to utf8mb4 and deleting the 203 stale accounts on live wait until after Keep.
  • Read every restore option. “Leave post GUIDs unchanged” is on by default for a live site; left on, 1,476 posts created locally would have kept a localhost GUID.
  • The receiving site needs an activated Pro licence, and because the restore replaces the options table, the licence record arrives from the copy. On live, choosing Migrate License sorts that out.

The disk quota

The site lives on a shared cPanel account with a 7.81 GB quota, about 3.8 GB of it free on launch morning. A full safety backup of the live site is about 3.5 GB, so keeping it on the server would have used almost all the free space before anything was sent. Instead the safety backup was pulled down to my Mac with the same connection used for the push, and it takes no space on the server. Before sending, the peak still has to fit: roughly twice the changed files, plus about three times the database, plus a margin. If your host is tight on space, do that sum before launch day, not during it.

Large sites on small hosting accounts are what Site Replica was built for; backing up a 3.4 GB site on hosting that fights you explains how it backs up in small pieces without filling the server’s disk. For the launch-day method in general, see how to push a staging site to live without losing orders, and the help articles on putting a redesign live and reading the restore plan.

What we’d tell anyone moving off a page builder

  1. Audit what the builder stores, and what is left if you switch it off, before you plan anything.
  2. Rebuild pages in place, at the same IDs and addresses, so there’s nothing to redirect.
  3. Count which plugins are actually doing something. Three of our Thrive plugins weren’t.
  4. Store form entries before emailing them.
  5. Crawl every address before and after, and check search clicks before deleting “unused” files.
  6. Rehearse the launch on a throwaway site, and fix the plan with what the rehearsal finds.
  7. Keep a way back that doesn’t depend on the server you’re changing, and check the disk space first.

How it went

We launched on Sunday 4 October, with the dojo closed for the long weekend. The push sent 862 MB: 36,458 files and the database. The 18,662 files the live site already had stayed where they were. It took nine and a half minutes, including two retries when the server was slow to answer. The restore then took a couple of minutes, and the site switched over in one step.

The checks took about an hour. We looked at every key page, made a real test booking and sent the contact form. We tried the redirects and the sitemap, then crawled all 3,511 addresses we know about. 3,487 behaved exactly as they had on the local copy, and none of the other 24 was broken. One thing we hadn’t caught: the Members login link pointed at a ClubWorx page that no longer exists. The theme now hides that link until there’s an address to show, so it comes back by itself when the new member system is ready. Then we pressed Keep.

  • Speed: Lighthouse mobile scores of 94 to 100 on the home page, a program page and a blog post, up from 55 to 57. The main content now appears on a phone in 1.1 to 2.8 seconds, down from 7.7 to 14.3.
  • Plugins: 15 active before, 9 now, and five of the nine are our own small plugins.

What we’d do differently:

  • Plan the cleanup twice. A restore keeps media and tables that only the live site has. That’s the safe default, but it meant the 2,340 old files we’d deleted on the copy were still on the server. Clear them on live too, or do the cleanup there in the first place.
  • Check old tables before converting them. Turning the kept users and comments tables into utf8mb4 failed on an index the Disqus plugin had left behind years ago. Dropping it fixed it, but it’s better found the day before.
  • Look at the server, not just the pages. The pages are now so light that the slowest part is the server, which takes about a second to start answering. That’s half the home page’s time on a phone, so a page cache is next.

Site Replica is free on WordPress.org, for backups, restores you can roll back, and moving a site. Pushing a copy to a live site while it keeps its own data is part of Site Replica Pro. The Site Replica project page has the details.

martin Avatar

Written by

Previous post

More from the blog