Two websites, one application, and finally visible to search engines.
The product site of an AI consultancy had zero indexed pages: its pages were built only in the browser and crawlers saw them empty. We moved it, together with the corporate site, into a single application that renders complete HTML on the server.
Two websites, one corporate and one for a product, were single pages built in JavaScript in the browser, alongside a WordPress install for the press review and forms. We replaced them with a single Laravel 13 and Filament 5 application that picks the site from the requested host, renders every page on the server with meta tags and JSON-LD, and has one panel for pages, articles, SEO and enquiries. We removed WordPress and handed over a server the client can run without us.
Context
The client is an artificial intelligence consultancy with a product for legal, compliance and procurement teams. Both sites had been exported from a design tool as single pages: good looking, but with all the text built by JavaScript on load. The press review and forms ran on a separate WordPress install, reached through proxies on the web server.
The problem
A crawler that doesn't run JavaScript finds an empty page: Search Console reported zero indexed pages for the product site. On top of that, form notifications from the old WordPress weren't being sent: a real sales enquiry received on 10 October had been sitting unseen.
What we did
- 01
One application, two sites
Laravel 13 and Filament 5 serve both domains from the same code and database, picking the site from the request host. An unknown host gets a 404, preview hosts send noindex.
- 02
Complete server-side HTML
Every page is rendered on the server with title, meta tags, JSON-LD and a sitemap per site. The two single pages became several pages, with redirects from the old addresses. The JSON-LD graph identifiers stayed exactly the same, because an external graph references them: one different character would have broken the link.
- 03
Goodbye WordPress
The 32 press review articles and the form history were imported into the new database. Articles that reproduced third-party texts in full became an original summary with a link to the source. Forms send notifications and receipts through Amazon SES, and the stuck enquiry was recovered and passed to the client.
- 04
One panel for the editors
Block-based pages, articles, SEO, form enquiries and users in a single panel, with Admin, Editor and Sales roles and two-factor authentication. Cookie consent goes through CF-Consent with Consent Mode v2.
- 05
A server that can be handed over
No third-party management panel: the EC2 server lives in the client's AWS account, is built by a script in the repository, deploys with GitHub Actions and Deployer, and has disk snapshots plus a nightly database dump. The old server stayed on for 14 days after go-live as a rollback path.
How it went
On 15 October 2026 both domains moved to the new server together, by changing two DNS records, with the old server ready for rollback. The sitemaps were submitted to Search Console and the main pages sent for indexing; the editors work from the panel, and form enquiries reach the people who need to read them.
Tools
FAQ
Why isn't a JavaScript-built site indexed?
Many crawlers, and almost all AI agents, read the HTML the server sends without running scripts. If the text only appears afterwards, the page is empty to them.
Is it worth serving two sites from one application?
When they share editors, content types and infrastructure, yes: one panel, one database and one server to maintain instead of two. Each site stays separate in domain, SEO and design.
What does a server you can hand over mean?
That the client can take control without depending on us: it lives in their account, can be rebuilt from a documented script and needs no subscriptions to third-party tools.