Who this case is for
Tour companies, travel agencies, and any business with thousands of products on a website built with Next.js, React or another JavaScript framework.
This case shows that a page people can see in full is not necessarily a page Google can see in full. Standard site-audit tools often miss this problem, because the page looks perfectly normal in a browser.
At the end of this article there is a 2-minute check you can run yourself to see whether your site has the same issue.
We do not name the company, its licence, competing websites, or the sites that link to it.
1. An outbound tour company with everything in place, but little traffic from Google
This company sells outbound tours, tour packages and private group tours. The site is built with Next.js, has thousands of tour programmes in its system, and already has country pages with content and FAQs. It has more raw material than most tour companies.
| Item | What we found |
|---|---|
| Domain age | 13 years 3 months |
| URLs in the sitemap | 3,841 (individual tour pages 3,463 · tour listing and country pages 207 · articles 162) |
| Pages audited in detail | 478 pages |
| Keywords ranking in Thailand | 45 keywords (Top 3 = 5 keywords · positions 4–10 = 18 keywords) |
| Visits from Google (Ahrefs estimate) | 210 per month |
| Domain Rating | 13 |
We checked 4 sources
- Page audit of 478 URLs, covering both the HTML the server sends before JavaScript runs and the fully loaded page
- Lighthouse on mobile, measuring the homepage and the Japan tour page
- Ahrefs, Thai market, for keywords, links and ranking pages
- Live search results for country tour keywords
2. What we found
People searching for country tours could not find the sales pages
Almost every keyword that brought visitors landed on the homepage. The country pages, which should be the main sales pages, were stuck at positions 20–30.
The good news is in the same search results. Country tour keywords have very low difficulty (KD). “ทัวร์ญี่ปุ่น” (Japan tour) has a KD of 2, and a DR 10 site with no external links pointing to that page ranks at position 5 on Google’s first page. Domain strength is not the barrier. The problem is how the site delivers its content for Google to read.
Major issue 1: Country pages deliver content through JavaScript only
We opened the Japan tour page in 2 ways. The first is the HTML the server sends before JavaScript runs, which is what Google receives on its first pass. The second is the page users see once it has finished loading.
The text "Loading... Searching..."
An average of 79 characters per page
No H1 on 206 of 207 pages
No links to tour pages
H1 and country description
Frequently asked questions (FAQ)
A list of 475 tours
30 links to the first batch of tour pages
Google can render JavaScript, but it has to wait in a queue, and it tends to give more weight to what is in the HTML from the start. The result: content for 28 countries that the team had prepared was barely counted, so the main sales pages stayed stuck at positions 20–30.
The individual tour pages work the same way. We sampled 100 of the 3,463 pages. None of the 100 had an H1 in the source HTML, and they averaged only 131 characters of text, with no day-by-day itinerary. That makes it hard for tour pages to compete on specific searches such as “ทัวร์มาเก๊า 3 วัน 2 คืน” (Macau tour 3 days 2 nights).
We did not draw conclusions from the HTML alone. Reading only the HTML, a site like this looks like a blank page. Opening it only in a browser, everything looks fine. So we always compare both before writing a conclusion.
Major issue 2: All 161 articles told Google they were the same page
161 of 161 article pages used the same page title, and their canonical tag pointed to the blog index page, both in the source HTML and after the page finished loading. Google therefore treated every article as a copy of the index page.
The effect is already visible in Ahrefs. Two articles about theme parks in China, with 450 and 500 monthly searches, ranked with the blog index URL instead of the actual article.
The report also advised not to write new articles until this is fixed, because new articles would hit the same canonical problem straight away.
Other issues ranked in the report
| Issue | Evidence | Priority |
|---|---|---|
| Duplicate meta descriptions, and country page titles too short | 199 of 207 pages use the same description · titles have no year, selling point or price, while first-page competitors include all of these | High |
| Country pages very slow on mobile | Japan tour page: Performance 12, LCP 12.0 s, CLS 0.78 | High |
| Old URLs not redirected | Old-format URLs return 200 with a canonical to the homepage · old URLs that still rank return 404 | High |
| Non-www domain not redirected | Returns 200 with only a canonical to www · Ahrefs sees non-www pages ranking | Medium |
| Sitemap sends inaccurate signals | lastmod changes every time the file is requested · includes country pages with no tours at all | Medium |
| Most links come from automated domains | 2,428 domains but DR 13 · around 10 domains are links from real Thai websites | Medium |
| Traffic concentrated on the homepage | Almost all keywords with visits land on the homepage; if it drops, the whole site is affected | Medium |
| Lighthouse mobile | Homepage | Japan tour page | Good threshold |
|---|---|---|---|
| Performance | 42 | 12 | 90+ |
| Largest Contentful Paint | 6.8 s | 12.0 s | 2.5 s or less |
| Total Blocking Time | 3,020 ms | 5,170 ms | 200 ms or less |
| Cumulative Layout Shift | 0.018 | 0.78 | 0.1 or less |
What is already working well
| Item | Details |
|---|---|
| Old domain and a clear licence | The tour operator licence number is shown in the content, which builds trust |
| Solid homepage basics | Has an H1, page title and meta description; all 56 images have alt text; Lighthouse SEO 100 |
| Structured Data | Homepage has TravelAgency and AggregateRating, country pages have BreadcrumbList, tour pages have Product |
| Individual tour pages | Unique page titles and self-referencing canonicals on all 100 of the 100 sampled pages |
| Ready for AI Search | robots.txt allows the bots of the major AI Search providers |
| Country page content already exists | The remaining work is getting that content into the HTML from the start, not rewriting everything |
3 tasks to do first
Out of all the issues, we picked 3 tasks that take little effort but unlock the most pages. Speed and links follow in the next phase.
| Task | How | Timeframe |
|---|---|---|
| 1. Fix article metadata | Generate each article’s page title, description and canonical from its slug with Next.js generateMetadata, then resubmit the sitemap | 1–2 days of development · 2–6 weeks to see results |
| 2. Serve country page content from the server | Render the H1, description, FAQ and first batch of tours on the server · write a title and description for each country · reserve image space to reduce CLS | 2–3 weeks · 2–4 months to see results |
| 3. Consolidate URLs with 301s | Build a table mapping old URLs to new URLs, set up 301s, then write a script to check every route | 2–3 days |
What does not need doing yet: no need to buy more links, and no need to disavow spam links, because there is no sign of a Manual Action.
We have fixed a problem like task 2 before, on a car information site where 49 main pages also had no HTML for Google to read. See the sedan information site rebuild case.
3. Expected results
This report does not set monthly target numbers. This is all the report expects, and none of it is a result that has already happened.
| Task | Expected outcome |
|---|---|
| Fix article metadata | Articles get ranked as individual pages and can genuinely act as entry points to country and tour pages |
| Serve country page content from the server | Country pages move from positions 20–30 towards the first page for tour keywords of the 9 main countries, which together get 29,700 searches a month |
| Consolidate URLs with 301s | Rankings and links that old pages built up are passed on to the current pages |
How we will measure it: indexed pages and clicks per page from Search Console, compared before and after at 4 and 8 weeks; rankings for country tour keywords; and mobile Lighthouse for the country pages, which currently score 12.
Rankings depend on competition and on changes at Google, so nobody can guarantee them. But the search results show that sites with a lower DR than this one still reach the first page for these keywords, as long as the page delivers its full content for Google to read.
This report has just been delivered. We will update this case when we have real numbers.
Check it yourself in 2 minutes: can Google see your whole page?
- Open your most important product or category page on a computer
- Right-click and choose View Page Source (or type
view-source:in front of the URL) - Press Ctrl+F or Cmd+F and search for the heading text you see on screen
If you cannot find it, or you only find “Loading…”, that content is built by JavaScript after the page loads, and Google may not be counting it yet.
Checklist for sites with a large catalogue
- Category and product pages have their H1 and main text in the HTML from the start
- Each article has its own page title and canonical, not pointing to the index page
- Meta descriptions are not duplicated across hundreds of pages
- Every old URL redirects with a 301 to the new URL, not returning 200 or 404
- The www and non-www versions of the domain go to the same place with a 301
- The sitemap only lists pages with real products, and lastmod changes only when the content changes
Questions travel businesses often ask us
Can’t Google read JavaScript now? It can, but it has to wait in a rendering queue, and it does not render every page every time. Sites with thousands of pages are at a big disadvantage. Sending the H1, description and key links in the HTML from the start is the safest approach, and many AI bots still cannot read JavaScript at all.
Do we need to move away from Next.js? No. Next.js can already render on the server. The work is moving the important parts of the page to be built on the server, not switching frameworks.
We have links from thousands of domains. Why is our DR still low? Because most of those links come from automated domains that nobody visits. The links that genuinely help come from travel media, partners and real Thai websites, and in this case there were around 10 such domains.
Should we write more articles first? Not while existing articles still point their canonical to the index page, because new articles would not be counted either. Fix the structure first, and then every article, old and new, starts working.
We audit websites like this for travel businesses
If your site has a large catalogue but gets little traffic from Google, start with a free website audit. We always compare what Google receives with what people see. Or see the details of our SEO Audit service.
