Website Design / Website Development / UI/UX Design / SEO / Web Hosting / 2026
Gosheni Safaris: 484 WordPress pages, rebuilt as a booking platform
Client: Gosheni Safaris
Fifteen years of safari content — 173 tours, 306 lodges and camps, 126 journal posts — lived inside a WordPress and Elementor build whose homepage shipped 737KB of HTML, 41 stylesheets and 33 scripts before a single photograph. We rebuilt it as a Laravel platform with its own visual page builder, three languages, a booking engine and 691 legacy URLs redirected, so nothing that had earned a ranking lost one.
The challenge
Gosheni sells trips that cost as much as a car, and the site that sold them was a page builder standing on eight plugins: Elementor Pro, Dynamic Content for Elementor, ThePlus, FluentForm, a Turnstile widget and the Hello theme underneath. The homepage answered in six seconds and finished in ten. Its hero was a 48MB background video that, in every browser we pointed at it, never started — so the first thing a visitor saw was a grey rectangle where the Serengeti should have been.
The deeper problem was that nothing was a record. A tour was a hand-built page, so its price, its itinerary and its departure dates were paragraphs — impossible to filter, compare, translate, or quote from. Adding a language meant rebuilding 484 pages by hand. Adding a booking meant a form plugin and an inbox. And every page was one careless drag away from breaking, so the people who owned the content had learned not to touch it.
The approach
We audited before we wrote anything: every route, every template, every plugin, and where each of them would land afterwards. That map is what made the rest boring, in the way a migration should be.
Then we modelled the business rather than the pages. Forty-four Eloquent models — Tour, ItineraryDay, TourPrice, Accommodation, Destination, Country, MonthGuide, Booking, Payment, Quote, Inquiry — so a tour is a record that knows its own itinerary, its own seasons and its own price, and every listing, filter, sitemap entry and quote is a query rather than a copy.
Marketing kept the freedom the page builder gave them, minus the weight: Timeless Builder is a 35-widget visual editor with versioning, scheduled publishing and preview, built into the admin and rendering through the same React components the public pages use. Editors drag blocks; the page still ships two stylesheets.
The move itself was the part nobody sees: 3,410 media files onto Cloudflare R2, 691 legacy URLs mapped and verified before go-live, redirect chains flattened, sitemaps regenerated, and 514 automated tests standing behind it — plus releases the client can run from the admin, with a database backup, a health check and a rollback path built into the button.
The results
The homepage went from 737KB of HTML to 156KB, from 41 stylesheets to 2, and from 33 external scripts to 2. Time to first byte fell from 5.9s to 1.2s and the load event from 10.6s to 3.7s — the median of three runs per page with the cache disabled.
Behind it: 173 tours, 306 lodges and camps, 114 destinations across 6 countries and 126 journal posts are now records rather than pages — searchable, filterable, translatable into English, French and German, and bookable with payment through Pesapal. 691 old URLs still resolve. The sitemap went from 484 URLs to 686.
What did not improve, and we would rather say it than let somebody else find it: the new homepage transfers 5.6MB on a cold load against the old one's 1.2MB, and 4.4MB of that is photographs. The old page was lighter because it showed almost nothing — its hero was a 48MB background video that never finished loading, so the pictures below it stayed deferred. The new page shows the photographs, and it paints and finishes sooner doing it. Responsive sources, a CDN in front of the bucket, and a hero video that is measured in megabytes rather than tens of them are the next round of work.