3D Spaces presents virtual tours and related services for showing physical spaces online. I rebuilt its WordPress website in Next.js with AI coding collaborators, using the existing content, page organization and presentation as the reference.
The migration had a constraint beyond the website: incoming email still depended on the old hosting server. Moving web traffic could not mean retiring that server or replacing unrelated DNS records.
I had to treat the pages, enquiries, analytics and mailbox as different parts of the cutover, even though a visitor encounters them through one domain.

Preserve the site people could already reach
The inventory included service pages, articles, archives, images, embeds, redirects and feeds. It became the checklist for the replacement. Matching the homepage would not establish that an old article URL, an archive or an image still worked.
The first migration pass preserved the content but lost presentation details. A correction pass restored header dimensions, typography, spacing and pricing layouts from the original pages, cached HTML and a read-only backup. Those details became bounded presentation fields rather than requiring the WordPress builder markup and plugin code to run in the replacement.
The Next.js implementation generates captured content pages and feeds statically, while search and enquiry handling run on the server. The live domain can be indexed by search engines; preview environments keep indexing disabled.
The launch checks covered 78 routes and 45 redirects. The sitemap has 38 selected canonical URLs, which is a different inventory from every preserved route. The detailed counts belong to migration verification, rather than being a measure of traffic gained.
A gallery card should open one tour
The tour gallery has 24 cards. It begins with poster images, not 24 embedded players running at once. A visitor opening a card creates that tour's iframe, the embedded viewer. Closing it removes the viewer, returns focus and restores page scrolling.
Optional-media consent alone does not load every player. Consent and opening a particular tour are separate actions. Browser checks followed both, including Escape to close the modal.
That behavior gives the gallery a clear interaction: browse the cards, choose a space, inspect its tour, then return to the list. I have not measured a before/after speed gain from the change.
The website moves; the mailbox stays
- 01Capture routesPreserve content, paths and redirects
- 02Rebuild viewsLoad one tour iframe after opening it
- 03Check deliverySubmit an enquiry and inspect the result
- 04Switch web DNSKeep unrelated mail records intact
Keep useful analytics without sending the enquiry
The existing GA4 property stayed in place, preserving its reporting history. The enquiry event sends a fixed form name rather than the person's name, email, phone, location or message.
Search tracking uses the generic search-page path and title without the search term. Rejecting optional cookies removes the Google tracking scripts.
The live Tag Assistant checks confirmed one initial pageview, one pageview after navigating inside the site and one enquiry event for the accepted test. That also checked a common migration problem: counting one navigation twice through overlapping tracking settings.
Change the web records, keep the mailbox
Only the two website DNS records changed. The 16 unrelated records, including mail and verification records, stayed intact. The old server remained available for its mailbox dependency and rollback.
Then the enquiry flow was checked on the live domain. The owner notification was accepted by its mail server, and the matching visitor confirmation was opened in Gmail Inbox with the expected summary and Reply-To.
Those are different levels of delivery evidence. The visitor message was seen in the inbox; the owner's final mailbox folder and an actual reply were not inspected.
The replacement went live on the same domain with HTTPS and its www redirect working. The launch application passed 65 tests and Linux checks. The website is now served from Vercel, while moving the mailbox remains a separate piece of work. Keeping those responsibilities separate was part of getting this particular migration over the line.
Project sources & checks
Next.js replacement on the existing 3D Spaces domain.
The launch record covers 78 routes, 105 original assets, 45 legacy redirects, 38 canonical sitemap URLs and eight feeds. The launch application passed 65 tests and Linux checks.
The 24-card gallery starts with no players; opening a card creates one viewer. Tag Assistant verified initial navigation and enquiry events.
The owner notification was accepted by its mail server. The visitor confirmation was opened in Gmail Inbox. Owner mailbox placement and an actual reply were not inspected.