Puerto Jiménez, Costa Rica

info@gexpsoftware.com

© 2026 Marcelo Retana

All work

How I replaced a firm’s WordPress site without losing 52 addresses

What I decided, and why, when an accounting and legal firm in Costa Rica moved from WordPress to a bilingual site built with Next.js.

Client
MAV Boutique
Sector
Accounting and legal advisory
Location
Pérez Zeledón, Costa Rica
Year
2026
Visit live site(opens in a new tab)
Desktop home page of MAV Boutique: the headline “Patrimonio bajo control.” beside an outline map of Costa Rica with the MAV mark.
The home page: headline, two calls to action and the Costa Rica plate.

Start with the list of old addresses

The firm behind this site does accounting, tax and corporate legal work in Pérez Zeledón, and its old website ran on WordPress. The goal was to replace it without breaking anything people already use. So before building the production site, I listed every public page I could find on the old site, with its address.

There were 52. Each one may sit in a bookmark, an email signature or Google’s index. Page by page I decided whether it keeps its address or redirects, which means sending the visitor to the new page automatically. In the end 47 kept the same path and 5 redirect. All 52 were checked against the live site again: every one ends on a working page. Figures in this story are as of 30 October 2026.

The firm’s building in Pérez Zeledón, with its signs on both fronts
The firm’s building, as shown on its About page.

My first version was too thin

My first production build, on 25 September, was a home page plus a few thin subpages, with most old addresses redirected into sections of the home. On 26 September I dropped that plan for the other option on the table: every old page keeps its own path on the new site.

So the project grew into the whole website: 26 Spanish pages and 25 English ones, 47 of them carried over from the old site. Then I compared new with old, page by page. On 45 carried-over pages, at least 95% of the old words are still there, along with every old heading.

Two languages need one more thing. Each paired page tells search engines where its twin lives, using a tag called hreflang. One Spanish landing page has no English twin, so its language switch opens the English home.

English page “Accounting Services” with a side index of related services and the first sections of text.
The English version of the accounting pillar; the header switch now reads ES.

Three directions before one site

From May to August the project ran as a showroom of three working directions: Planta, an industrial poster; Protocolo, a case file; and Torre de Control, an instrument panel. All three were live pages the owner could open and compare. On 20 August 2026 the owner chose Torre de Control.

The downside is real: two of the three were never used. I still recommend it to a firm whose business is trust, because choosing between finished pages is easier than choosing between pictures.

The design showroom page “Tres direcciones. Una sola marca.” with three panels named Planta, Protocolo and Torre de Control.
The three directions the owner compared.

A hero that phones do not pay for

The home page opens on a map of Costa Rica. On a large screen with a mouse, it is a 3D plate, and I limited the 3D version to those screens. On a phone, or when a visitor asks their device for less motion, the page draws a flat version of the map and never loads the 3D library.

Measured on the live site, uncompressed: the site’s own JavaScript (the code the browser downloads to run it) comes to about 700 KB on a phone and about 1.6 MB on a desktop running the 3D plate. Nothing in the scene moves by itself for more than five seconds, the point where the web accessibility guidelines ask for a pause control.

One small detail: the first outline of the country in the code was typed from memory and read as a generic blob. It was replaced with one traced from a licensed vector map, simplified from 801 points to 286.

Phone view of the home page: headline, two buttons and the top of the Costa Rica map.
On phones the hero stacks and uses the light map drawing.

The form confirms only what was sent

Applying to this firm takes three steps, not a message box. A form that fails silently is the worst case for an owner, because the lost message leaves no trace. So the confirmation screen appears only after the email provider accepts the message. If it does not, the visitor is told so, and every answer stays on screen.

From there they can send the same text by WhatsApp, copy it, download it or email it. The cost is more code and more screens to test. I think one lost application costs more than that.

The application page at step 1 of 3, with empty fields for name, company, email and phone and a button to continue.
The application form starts with contact details; later steps ask about the business.

What the checks show, and what they miss

Run again, three of the project’s checks gave these results. An accessibility scan with axe, an open-source checker, covered all 51 pages at phone and desktop width and found no serious or critical issue. A script that compares the new site with the old one passed 548 checks against the live domain. A third script reads the site’s text and fails on promises, hours, prices or percentages the owner has not confirmed; it came back clean. The 360 unit tests in the repository pass as well.

Automated checks have limits. They catch regressions and common mistakes; they do not replace a person reading each page or the owner approving the wording. The accessibility scan also listed four moderate heading-order notices on two pages.

What I'd tell an owner

  • List every old address before designing anything, then decide for each one: keep it, redirect it, or retire it on purpose.
  • Ask for three working directions instead of mockups, and accept that two of them will be thrown away.
  • A form should confirm a message only after the email service accepts it, and keep the visitor’s answers when it fails.
  • Ask what the site loads on a phone. Heavy visuals can be reserved for the screens that can carry them.
  • Run accessibility and SEO checks on the live site, not only on a test copy, and read the pages yourself.

Stack

  • Next.js
  • React
  • TypeScript
  • Tailwind CSS
  • GSAP
  • Three.js
  • Bun
  • Vercel
  • Resend