casesth-neva-beauty

rudiscuss your taskmenuclose

Beauty salon, Koh Samui, Thailand · 

Moving off a website builder without losing a single price

A salon on Koh Samui changed its name and moved off a website builder to its own site. The whole price list moved, down to the last line, and it is now impossible for the old name to return to the pages.

First screen of the new website of the salon on Koh Samui

The business

Neva Beauty — Koh Samui is a beauty salon on the island of Koh Samui in Thailand. Five areas and sixteen services: hair, hair removal, device-based aesthetic treatments, skin care treatments, and body contouring. Visits are by appointment, people get in touch on WhatsApp, Telegram, and Instagram, and service is in Russian and English.

The customers fall into two groups, and that matters more than it seems. Some live on the island permanently. Others have come for two or three weeks, and their first question is not “how much does it cost” but “will I have time during my trip.” A course of laser hair removal takes a year, and a course of endosphere therapy takes five weeks; a person needs to understand this before they message.

What it delivered

The salon moved off the website builder with nothing lost: the whole price list is in place, a price is edited in one line, and if a number anywhere differs from the price list, the build will not publish the site. A person who has come for two weeks sees, even before booking, whether they will have time to complete a course. There are no numbers for this work yet; the “Why no numbers” section explains why.

Where I started

The salon had a website, and it worked. The problem was not the site but that everything around it had changed while it stayed the same.

The old site is no longer online: the domain was not renewed, and it expired at the end of August. The “before” screenshot was taken from a saved copy of the site, which survived in full, images and layout included.

The salon ran on the website builder Tilda under the name Avocado Beauty — Samui, on the domain doctor-cosmetolog.pro. Along the way, the salon became part of the Neva Beauty brand, which has a second location in Vietnam and a new-style website of its own. The Koh Samui site was left with the old name, at an address that matched neither the old name nor the new one.

First screen of the old site on the website builder: the name Avocado Beauty — Samui
The old site: the same photo as on the new one, but a different name in the shop window

The price list lived inside the page layout

On the laser hair removal page alone, prices were typed in 32 times: in the table of zones, in the combo sets, in the description text. When a price changed, every spot had to be found by hand. Missing one is easy, and the miss may only be noticed at the front desk, while talking to a customer.

The name matched nothing

The site address was about an aesthetic doctor, the name on the pages was Avocado Beauty, and the salon was Neva Beauty. Someone who had been recommended the salon by its new name had to take it on faith that they were in the right place.

Two salons of one brand looked like strangers to each other

The Da Nang location already had a new site, while the Koh Samui location had a site from a past life. Nothing linked the two: a person who found one never learned about the other.

What I did

I moved the whole price list and put it under lock and key

All two hundred and four price list items moved over from the old site. Eleven of them left on August 26, 2026, along with a service the salon no longer offers, so as of September 9, 2026, the site has one hundred and ninety-three items across sixteen services. All of them are gathered in one file, and that is now the only place where prices live. Before publication, an automatic check goes through the built site and verifies against that file not just the number but the price list section, the item’s label, and the promo tag as well. If anything at all differs, the site does not go online. It does not “show a warning”; it simply does not go online.

Prices in the text are no longer written by hand

A service description and the answers to common questions do not contain a number; they contain a reference to a price list item, and the build fills in the number. So the text and the table cannot drift apart, even if someone edits the table and forgets about the text. In the screenshot below, every amount in the paragraph came from the price list by itself.

The price block on the laser hair removal page: the amounts in the text are filled in from the price list

I changed the name so that the old one could not come back

The build checks every finished page for words from the old brand and the old address and does not publish the site if even one remains. The same list of banned words includes the name of the city where the second location is: the site is built with the same engine as the sister salon’s site, and another location’s place names must not end up on these pages. Here a copying mistake is caught by a machine, not by a reader.

I removed from the pages what the salon no longer has

The salon does not offer permanent makeup, yet the site had a section about it, along with eleven lines in the price list. I removed both the section and the prices. An inquiry about a service that does not exist is a bad impression for the person and wasted time for the receptionist.

I showed the search engine the price list line by line

For the search engine, every page carries structured data: a beauty salon on Koh Samui, its services, the answers to customers’ questions. The main thing in it is the price list. Every item is declared as a separate price in baht, so a robot does not see “a salon somewhere on the island”; it sees a specific treatment for a specific amount of money. Items that are not sold separately (the extra charge for thick hair, the price per unit of a product) are flagged and stay out of the markup: otherwise the site would state a price at which nothing can be bought. The same markup makes the site readable by AI assistants, which also get asked where to go for a treatment on Koh Samui.

I linked the brand’s two salons

The header of both sites has a city switcher with the same list of locations; the only difference is the mark showing where the visitor is now. Someone who was looking for a salon in Thailand and landed on the Vietnamese site gets to the right one in a single tap and does not leave to search all over again.

There is no monthly fee anymore

The site sits on free hosting for static pages. It no longer has a domain of its own: it lives on a subdomain of the brand’s main address, and the old domain was not renewed. The salon is left with no monthly costs for the site.

Are you on a website builder and afraid your price list will get lost in the move?

Message me

Why this case study has no numbers

They are left out on purpose. The site opened at its own address on August 3, 2026, and at the time of publication it is a month old. Over a stretch that short, there is nothing to see from search yet: search engines have only just found these pages, and everything visible in analytics is noise, not a result.

There is a reference point close by. For the same brand’s sister salon, in Da Nang, search became the top source of visitors, but even there the numbers for comparison were taken over a period that ended almost two months after launch. That much time has not passed here yet.

The analytics was carried over from the old site and has been running since day one, so there will be something to compare against. As soon as a period comparable to the old one has built up, the numbers will go into this case study. And without any analytics, this much is already visible as of September 9, 2026: the site opens at th.neva.beauty, the whole price list is in place, and the prices on the pages match the price list.

What this gives the business going forward

How many places do I edit if a price changes?

One: the line in the price list. In tables, descriptions, and answers to questions, the number fills in by itself, and if it still differs from the price list somewhere, the build will catch it and will not publish the site.

How does a move like this go?

First the new site replaces the old one in full, with the complete price list and every service, and only then is it tuned up: text for customer searches, markup, removing a service that is no longer offered. Not the other way around: the salon does not stay on the old site while the new one is being polished.

How it works technically

A custom static site generator in Python 3.12: content in YAML and JSON, Jinja2 templates, clean HTML as output. The price list is the single source of truth for prices; the text holds {price:service:item} placeholders, which the build replaces with the number. Schema.org markup as one connected graph (Organization, BeautySalon, WebSite; pages add Service, FAQPage, BreadcrumbList, ItemList, and OfferCatalog, where every price list item is a separate Offer with a numeric price; the range in AggregateOffer is computed from the same catalog). Sitemap.xml with an honest lastmod based on a content fingerprint, robots.txt, llms.txt. Self-hosted fonts as instances and subsets from variable masters, CSS in nine layers merged into one minified bundle, responsive WebP by a table of widths. The gate before deploy: 127 unit tests in pytest plus two end-to-end checks on the built site, a price parity test and a page quality check (traces of the old brand, broken links, duplicate meta tags, invalid JSON-LD, a broken heading hierarchy, characters outside the subsetted fonts). The build and publishing run in GitHub Actions; hosting is GitHub Pages on the brand’s subdomain.

Who did the work

It’s just me behind jw-dev.pro, not a studio or an agency. That means you talk directly to the person doing the work: no manager, no brief relayed through third parties, and no passing the project to another contractor partway through.

My time zone is UTC+7, the same as Bangkok and Hanoi. I build websites, Telegram bots, and automation: a task rarely ends with a page, and it usually has to be connected to what you already have running.

As time goes on, the task sounds like “build a website” less and less often. One person needs a price to be changed in one place, not on twenty pages. Another needs the channel to run without them. A third needs the whole price list to sit inside Telegram, where their customers already go every day. That’s why the list of what I do is open-ended: if your task isn’t on it, that doesn’t necessarily mean it can’t be solved.

I write case studies so that they can be checked: what was there, what was done, and how it was measured. If there is analytics data, I give the numbers and the period they cover; if it is too early to measure, I say so. You won’t find “increased sales” here: that is a promise, not a result.

Need something similar?

Whether it’s a website, a bot, or something that is now done by hand, tell me what’s going on, and I’ll tell you whether it can be solved or not.

This kind of work is the service “Website migration from Wix, Tilda, and other website builders.”

I have your request

I’ll read it myself and reply where you told me to.

Send another one

What you need you can pick several

In your own words: what you have now and what you want to get. If you have a website or a bot, paste the link.

Your request will come to me on Telegram, and I’ll reply myself.

If it’s easier, contact me directly: on Telegram, on WhatsApp, or by email.

Not sure what’s wrong with your website? Check it for free on Telegram: @jw_site_check_bot.

Who owns everything afterward and what happens if I disappear: answers on the home page.