Two manufacturer websites, two separate engines
Astar is a Polish manufacturer of physiotherapy equipment based in Bielsko-Biała, in business since 1995. Electrotherapy, magnetotherapy, laser therapy, TECAR therapy, ultrasound, shockwave, vacuum therapy and accessories. Its distributor network spans dozens of countries, and for those distributors and for physiotherapists the website is the main source of product pages, specifications and user manuals.
The company runs two websites: astar.eu for international markets and astar.pl for the Polish market. Both worked the same way: a Next.js (React) frontend rendering every page on request, and a separate WordPress instance acting as the back end, from which the frontend pulled content over an API. Two layers and two things to maintain. We moved both websites to classic WordPress with a custom theme, one after the other.
The audit: what was actually inside
Before writing a single line of code we went through the whole of astar.eu: the sitemaps of every language version, the WordPress back end, Lighthouse measurements and screenshots of eleven pages on mobile and desktop. The audit changed the scale of the project.
Instead of a dozen or so products there were 58, plus 243 news posts, 80 countries on the distributor map, 27 devices with manuals in more than twenty languages and 1633 URLs spread across three language versions. Every one of them already had a history in Google.
Performance was poor: 59 out of 100 on mobile, main content after 9.1 seconds, server response after 1.15 seconds and 6.4 MB to download for the homepage alone.
The audit also produced the finding that shaped the whole project. The old back end publicly exposed complete data for all content: products, pages, distribution countries and news, all built on a single section engine. Instead of rewriting the website by hand, we wrote import scripts and a single renderer handling close to thirty section types.
Next.js frontend and a separate WordPress back end
Performance 59/100, main content after 9.1 s
Server response 1.15 s
6.4 MB on the homepage, no WebP images
Cookie consent without Consent Mode v2
Three language versions
Some content editable only by a developer
A single WordPress with a custom theme
SEO 92/100, zero layout shift
Server response 50 ms, server-side caching
801 KB on the homepage, 11,954 images in WebP
Custom consent mechanism with Consent Mode v2
Four language versions on subdomains
253 page sections editable in the admin panel, in every language
The process: astar.eu first, then astar.pl
The order was a decision, not an accident. The international website is the more complex one, because it has several languages. The theme built for it became the starting point for the Polish version, and the language switcher on astar.pl pointed to the new astar.eu from day one.
Audit and URL map
An inventory of 1633 URLs: 281 stay unchanged, 1050 get a 301 redirect to their new equivalent, 302 junk URLs get a 410 status so that Google forgets them
Theme and data import
A custom theme with a refreshed look, keeping content, URLs and images 1:1. Import scripts moved the products with 610 specification terms, the pages, the distributor map and the news
Four languages
Spanish and Czech from the existing back ends, Portuguese as a new version built from translations supplied by the client. Six rounds of feedback from the Astar team implemented before launch
Launching astar.eu
Deployment to the client's server, domain switchover, certificates for six hosts, a test of every URL in the map and migration of media to the new server
astar.pl on the same foundation
A separate copy of the theme developed independently, an import of 79 products and all content, features the international website did not need, and installation on the production server
Support after launch
Requests from the client's team handled as they come in: new admin panel features, fixes on the language versions, housekeeping on the server
astar.eu: four languages in one installation
We built the multilingual setup on WordPress Multisite, a single installation with a separate site for each language. That is exactly how the old back end worked, so the data moved across without transformation, and each country team got its own panel where it does not see other markets' content. Language versions run on subdomains, as they did on the previous website.
- English on astar.eu, Spanish, Czech and Portuguese on their own subdomains
- Localised page URLs, so "about us" has one address in Spanish and another in Czech
- hreflang tags emitted only when an equivalent page really exists in a given language, to avoid errors in Search Console
- Google Tag Manager containers assigned to markets and the correct page language in the code of each version
- Theme interface translated with language files, with no text hard-coded into templates
- The notice for healthcare professionals required for medical devices, in every language
The Portuguese version came in mid-project, outside the original scope. Thanks to the architecture, adding a fourth language meant cloning the structure of 58 products and 33 pages and then swapping the content, not building from scratch.
Product pages 1:1 with the previous website
The device page is the heart of the website: a slider with photos and videos, a 360-degree view, a specification table, related products and a gallery. The specifications rest on 551 technical terms. After the import we automatically compared all 146 product pages in three languages with the live website, row by row. Every difference was either explained or intentional.
Redirects and SEO with no losses
A manufacturer's website with years of history in Google cannot lose URLs in a migration. We set one rule: the look may be refreshed, but URLs, titles, descriptions and images stay 1:1.
After launch a script checked every one of the 1633 URLs in the map: whether it stays, redirects or disappears as planned. The first run showed more than a thousand discrepancies. After fixing the rules and pulling in the missing content, the final result was zero unexplained 404 errors, with 237 deliberate deviations from the map recorded in the documentation.
- Meta titles and descriptions carried over from the old website's SEO fields, without a plugin such as Yoast
- JSON-LD structured data: organisation, website and breadcrumb trail, plus a separate sitemap and robots.txt for each language version
- Redirect rules gated by domain, because "produkty" is an old Polish URL on the English version but a genuine URL on the Czech one
- Team member profiles that returned a server error on the old website now point to the team page
- A full audit after launch: 733 pages from all sitemaps and 6041 files from the rendered code, all returning 200
A website independent of the old server
Product and news images were served from the old back end. To keep their URLs unchanged, we moved 13,800 media files (3.1 GB) to the new server and pointed the old back-end domain at the new installation. The 360-degree views needed a separate approach: we decoded the tile format used by the viewer and downloaded the full set of 14,293 tiles without a single error. Image URLs in the page code did not change by a single character, and the website no longer depends on the old infrastructure.
Performance
The biggest gain came from the change of architecture: one server instead of two layers, plus server-side caching. The rest came from work on images and the critical loading path.
- 11,954 images converted to WebP without a plugin, served only to browsers that support them, under unchanged URLs
- The main page image went down from 740 KB as PNG to 16 KB as WebP
- Map and sliders loaded only when needed, with the map library hosted locally
- Font preloading, image dimensions in the code, responsive image variants
The result on mobile: server response down from 1.15 seconds to 50 milliseconds, homepage weight down from 6.4 MB to 801 KB, an SEO score of 92 out of 100 and zero layout shift.
An admin panel for the Astar team
On the old website some content could only be changed by a developer. This project assumed the opposite: the marketing and export team changes everything themselves, in every language.
- Homepage, therapy categories and all company pages built from ACF Pro sections that an editor adds, reorders and edits in the panel
- Global settings in one place: contact details, certificates, awards, social media, footer
- Admin panel in Polish, even though the website is in English, with Astar items at the top of the menu
- An editor's guide built into the panel, with links leading straight to the right screens, plus a PDF version with step-by-step examples
- Distributor map editable in the panel: country, coordinates, companies and contact details
User manuals for 27 devices in more than 20 languages
The manual request form is one of the most used features of the website. The user picks a device and a language and receives an email with a secure link valid for 48 hours. Following feedback from the client's team, we rebuilt the whole mechanism.
- 271 PDF files moved into the media library, so the editors upload a new manual once and it works across all four language versions
- Language choice narrowed to the versions that actually exist for a given device
- The email links to every file, including the technical description, which previously never reached the customer
- A before-and-after data comparison caught four discrepancies, among them a manual in one language attached to the wrong device
- Download statistics in the panel: devices, languages, countries, conversion from request to download, export to Excel, with no IP addresses or emails stored
Cookie consent and accessibility
Instead of a third-party plugin we built a custom consent mechanism with Google Consent Mode v2: default denial set before the measurement container loads, three consent categories, texts in every language. The theme meets WCAG 2.2 requirements: visible focus, touch targets of adequate size, dialogs accessible to screen readers, reduced motion on user request. We adjusted the brand red so that it meets AA contrast.
astar.pl: the same base, different requirements
The Polish website looked simpler, because it has a single language. In practice it had more content and more features. The astar.eu theme became the starting point, but as a separate copy developed independently. The cost is fixing shared bugs twice, the gain is zero risk to the international website that was already live.
The import script moved 79 products, 154 news posts, 56 pages, 27 devices with manuals, the team, authorised service centres, showrooms and sliders from the back end. Operational data, such as more than two thousand manual request logs, deliberately stayed in the old system.
astar.pl used URLs like /produkty and redirected the /produkty/ variant. WordPress does the opposite by default. We settled this on day one, before a single template existed, and carried it through consistently to canonicals, the sitemap, menus and internal links. As a result, the redirect map for 79 products and 54 pages did not need a single individual rule.
Features for service and sales in Poland
- A "Check a fault" configurator: serial number validated against a pattern for each product line, a tree of symptoms and causes, four result types ranging from self-repair to warranty service, automatic pre-filling of the service form and an attempt limit that protects against guessing serial numbers
- A product comparison tool, shared with astar.eu, showing parameters of up to four devices side by side
- A whistleblower reporting form with the option to report anonymously and attach a file, without collecting unnecessary personal data
- An interactive map of Poland divided into its 16 provinces, separately for authorised service centres and for sales representatives
- Manual download statistics and an editable distributor map, just as on astar.eu
Data verified, not assumed
The Astar team's first comments concerned parameters and equipment on the product pages. Instead of fixing pages one by one, we found a single cause behind many symptoms: the converter had confused identifiers from the old back end with local ones. After the fix, 78 of 79 products turned out to be identical to the source, and the only difference came from data deleted in the old system itself. Finally, we automatically compared the specifications with the live website: 79 out of 79 matched. Before installation the theme went through a full code review, which caught and closed ten bugs, including the configurator protection that, behind a CDN, would have blocked all users at once.
The new astar.pl runs on the client's production server and has passed verification of all URLs, redirects and forms. All that remains for full launch is the domain switchover on the client's side.
After launch
The project did not end on the day of the domain switchover. Requests from the Astar team reached us by email and messenger, and each one ended with a fix in production and an entry in the documentation.
- Uploading manuals from the panel: file size limit raised from 1.5 MB to 64 MB, verified with a real upload
- A full hosting account: identical files across language versions deduplicated, usage dropped from 5.3 GB to 2.4 GB, uploads and caching working again without buying extra space
- Tabs and links leading to 404 pages in the Spanish and Czech versions: one shared function for building localised URLs, verified on 82 links
- The data processing consent in forms pointed to a page that did not exist: fixed in four forms across four language versions
Technology stack
WordPress Multisite
PHP 8.4
Custom block theme
ACF Pro
Contact Form 7
REST API
WP-CLI
Leaflet
OpenStreetMap
LiteSpeed Cache
WebP
Google Tag Manager
Google Consent Mode v2
Schema.org JSON-LD
Wordfence
Docker
Results
What this project teaches
Migrating a manufacturer's website is above all work on data, not on looks. The new theme was the easiest part. The hard part was what nobody sees: 1633 URLs with a history in Google, specifications built on hundreds of terms, manuals in dozens of device and language combinations, media scattered across the old back end.
That is why every stage ended with a test, not a declaration. The URL map was checked by a script in production. Specifications were compared with the live website row by row. Manuals were compared before and after the change, file by file. As a result, the second website was built on a proven foundation, and bugs caught on the first did not reappear on the second.