UjjainTemple.com is our own guide to the temples of Ujjain: what each temple is, where it is, when it opens and how to reach it. It runs in English at the root and in Hindi under /hi/.
In June 2026 it had hundreds of pages and 8 impressions on Google in a month. The content was not the problem. The template was.
One template, one page
The site was a single-page React app. Every route rendered from the same index.html, which carried the homepage's title and canonical tag. To a crawler, a page about a small neighbourhood temple declared itself to be the homepage. Google did what it was told and folded everything into one URL.
| Layer | Choice | Why |
|---|---|---|
| Rendering | Vite + React with static site generation | Every URL ships as real HTML, readable without JavaScript |
| Per-page head | Own title, description, canonical and structured data | Each page now says what it is, in its own language |
| Languages | English at /, Hindi at /hi/, old /en/ URLs 301 to the root | One canonical home for each language, no duplicates |
| Search | Pagefind static index | Site search with no server to run |
| Hosting | Static files behind Cloudflare | Fast everywhere, little to break |
Then the slow, specific fixes
- Speed. A 2 MB hero image was preloaded on all 442 pages and never shown. Removing it took desktop LCP on the temple listing from 10.0s to 1.0s.
- Pages that should never have gone. 166 temple pages had been removed while they still ranked. Together they carried 5,483 impressions a month, 29% of the site's total. We restored them.
- A Hindi blog without a rebuild. Posts come from our own news engine and go live without redeploying the site.
Result
| June 2026 | Aug 30 – Sep 27, 2026 | |
|---|---|---|
| Google impressions | 8 | 277,295 |
| Google clicks | — | 2,578 |
The site now has 484 pages in its sitemap, 243 in English and 241 in Hindi. An Android companion app, "Ujjain Guide: Mandir & Yatra", is live on Google Play.
What carries over to client work
Most "SEO problems" on modern sites are rendering problems. If every page cannot say what it is in plain HTML, no amount of content fixes it. We check that first, on every site we touch.
