A WordPress site nobody had touched since the early 2000s left the park with no Google Business Profile, no analytics, and a page ranking fifth of six locally. I rebuilt it from scratch: real rates on the screen, a warm read instead of a utilitarian one, and a funnel that's still just a phone call.
San Bernard River RV Park didn't have a Google Business Profile. There was no way to track analytics, and the site itself was falling apart underneath: broken links, dead Facebook embeds, photos that wouldn't load. It read like somebody had left GoDaddy's autorenew switched on sometime in the early 2000s and never touched the place since.
My goal was to build a new site from scratch: scrape whatever was actually true out of the old one, shoot new photos, and get the owner ranking far higher on search than a relic like that ever could.
San Bernard River RV Park is a family-owned riverside park near Brazoria, Texas, running since 2004, and none of that showed up anywhere in its search position. It ranked fifth of six locally, which on a single-screen map of competitors means effectively invisible. It published no rates anywhere, so anyone weighing a stay had to call or email first just to learn the price, and most people never did. And it read like roadside utility, not the river retreat the place actually is, which lined up with a 3 of 5 TripAdvisor score.
The brief was concrete: surface real rates immediately, move from invisible to top three for searches like "RV park near Brazoria," "near Surfside," or "near Lake Jackson," reframe the property as somewhere people actually want to stay, and keep the whole conversion path human. Call only. No forms, no deposits taken online, no email funnel. I rebuilt the site from scratch as eight static pages to do exactly that.
The owner told me something early on that reshaped the whole build: most of the park's customers aren't weekend campers. They're out-of-town workers doing six-month to year-long stays while they commute to the chemical plants around Brazoria: Dow Chemical, BASF, Freeport LNG, Phillips 66. That's the real customer, and the old site never said a word about it.
That had to sit up front, not three clicks deep. Someone checking the site on a phone needed to know within one swipe whether this place worked for a stay that long, so the homepage and the amenities page both carry a section pitched straight at them: monthly rates, full hookups, free WiFi, and flexible check-in, described plainly as a comfortable base while you're on assignment. For guests who want a real roof over an RV for a few months, there's also a single furnished mini-house built for exactly this length of stay: 500 square feet, two bedrooms, monthly only, three-month minimum.
A full-height drone shot of the park behind the headline "Welcome home," then a rates teaser, amenity highlights, a photo strip, the real Google review count (4.6 of 5 across 64 reviews), and a location preview. One call to action, repeated: phone the park.
There was no pricing anywhere on the old site, so people called or emailed just to learn the cost. The new page publishes it plainly: RV sites at $45 a night, $250 a week, or $450 a month plus electric, across 50 full-hookup sites. The mini-house rents monthly only, at $850 with a three-month minimum and a $400 refundable deposit. An FAQ block is marked up with schema.org for search, and every inclusion claim reads from a single site-config file so the copy can never drift from the source of truth.
The old site listed amenities but never made clear that pets are welcome or that the park is built for long-term contractors. A checklist covers what's on site: full hookups, free WiFi, a washateria, a tree-covered picnic area, a private fishing pier and boat dock. A pets section spells out the policy plainly (leashed, cleaned up after, no aggressive breeds) so nobody is surprised at check-in.
The old site had no real visual showcase, no sense of the river, the pier, or the layout. The rebuild ships 26 photos in a responsive grid, lazy-loaded so the page stays fast. The lightbox is a native HTML <dialog>, with keyboard arrow keys, touch swipe, and click-through navigation and a running photo count, so there's no carousel library sitting around waiting to go stale.
Ranking fifth locally meant losing the geo-specific searches, things like "RV park near Surfside Beach" or "near San Bernard NWR." This is a page built to win exactly those: cards for Brazoria and San Bernard National Wildlife Refuges, Surfside Beach, Quintana Beach, Bryan Beach, and Sea Center Texas, each with a real drive time and a link straight to more information.
The old site had vague written directions and no visual sense of the layout. The rebuild gives clickable turn-by-turn from Houston, I-10, and US-59, a clickable address that opens Google Maps, and GPS coordinates that link straight to navigation, alongside a satellite embed and a numbered site-layout diagram. A crew on assignment can tap once and drive, and everyone else knows the place before they arrive.
On mobile, the number used to be a scroll away, and that friction loses calls. Now a bar pinned to the bottom of the screen (mobile only; the header already shows both numbers on desktop) fires a tel: link in one tap, and respects the iPhone safe-area inset so it never hides under the home indicator.
I wrote and wired everything below myself. The site is fully static, so it loads under a second on 4G, which matters most when the rates page is the thing people came for. SEO is structural, not bolted on afterward: the homepage carries campground and LocalBusiness schema plus JSON-LD with the real Google aggregate rating (4.6 of 5 across 64 reviews), and @astrojs/sitemap regenerates the sitemap on every build. The gallery lightbox is hand-rolled vanilla JavaScript instead of a library, so there's nothing to age out. The part I'm proudest of is how small the surface area stayed: no CMS, no external booking system, no forms. Every factual claim on the site (rates, amenities, inclusions) reads from one site-config file, so the copy stays honest by construction and can't drift between pages. It deploys on Cloudflare Pages with an automatic build on every push to main.