Operations

We Rebuilt Our Entire Website With AI, in Three Days. See the Before and After.

In June 2026 we replaced our Dothan facility's website, dothan.safelockstoragecenters.com, from the ground up, and AI wrote essentially all of it. First commit June 10, production cutover June 12: three days from a blank folder to a live site, with Claude (Anthropic's AI, working in Claude Code) writing the generator, the pages, the copy, the tests, and the deploy pipeline, and a human reviewing and steering throughout. This post is the technical story. The before/after is best seen, not described:

Full-page capture of the new Dothan website: dark hero, live pricing, unit cards, Rent Now calls to action
⟨ ⟩

Drag the gold handle left and right, and scroll up and down inside the frame to walk the entire page, top to footer. Left: the old site as preserved by the Internet Archive's Wayback Machine (May 13, 2026; note the broken image in the photo carousel, captured exactly as visitors saw it). Right: the same URL today.

What was actually wrong

The old site wasn't ugly and it wasn't slow (it loaded in about a second). The problems were the kind you only find by auditing every link and every tag:

  • The main "Rent Now" buttons led to a 404. Online rentals for the facility run on CC Storage, and its rental URL requires a specific unit-type ID. The old site's generic buttons linked without one, so the highest-intent click on the site, the one from a person holding a credit card, dead-ended on an error page.
  • Six of ten unit cards showed no price at all, including the 5×10, the exact size the facility most needed to rent. Price-shoppers bounced to competitors who publish numbers.
  • Nothing measured the moments that matter. The rental checkout completes on CC Storage's domain, in a new tab, invisible to analytics. No conversion event fired on "Rent Now" clicks or phone taps. The Google Ads account was optimizing blind partly because the website gave it nothing to see.
  • Assorted trust leaks: copy bugs, a map pinned to the center of town instead of the facility, and amenity claims we couldn't back up.

How AI rebuilt it in three days

The honest answer to "how do you rebuild a website in three days" used to be "you don't." What changed is where the hours go. We described the outcome we wanted (every unit priced, every link working, every claim true, every meaningful click measured) and Claude did the part that used to consume weeks: it crawled and audited the old site, wrote a complete static-site generator, drafted every page's copy from the facility's real data, ported the brand, built the test suite, and fixed what the tests caught. Our job collapsed to the part humans are actually needed for: taste, priorities, and "no, that claim isn't true, take it out."

One data file, one build script, no CMS

The entire site is generated by a single Python script (about 1,600 lines, written by the AI, zero dependencies) from a single data file that holds every fact: units, prices, availability, service areas, FAQs, business info, tracking IDs. Run the script and it deterministically rebuilds every page from scratch. There is no CMS, no database, no JavaScript framework, and nothing to hack or patch: the "admin panel" is a text editor and a git commit, and the entire history of every price and every claim is version control.

When a rate changes in the booking system, we change one line in the data file and rebuild. Every unit card, every landing page, every piece of structured data updates together; prices can't drift apart across pages because they only exist in one place.

Served from the edge

The generated site deploys to Cloudflare Workers as static assets, served from Cloudflare's edge network, so the page comes from a data center near the visitor rather than from a server in one city. Pages are pre-built HTML: nothing renders on demand, nothing waits on a database. A tiny Worker in front does exactly one dynamic thing: it injects the analytics key at request time, so we can rotate keys without rebuilding.

Links that tell the truth

Every "Rent Now" button now deep-links to CC Storage with the exact unit-type ID: click "5×10" and you land on the 5×10 checkout, not an error page and not a generic search. Every unit card shows a real price: the same rate you'd see at checkout. We also removed claims the facility can't back (the old site advertised climate control; the facility doesn't offer it, so the new site doesn't say it). Fewer promises, all of them true.

Measuring what matters

Since checkout completes off-domain, the click that hands a visitor to checkout is the conversion moment, so the new site instruments it properly:

  • Structured analytics events on every meaningful action: rent clicks (with unit size and value), phone taps, directions, bill-pay, lead submissions.
  • Google Ads conversion tracking wired to those same events, so paid search finally learns which clicks become renters.
  • The Google click ID captured first-party and kept for 90 days, so completed move-ins can be matched back to the ad click that produced them and imported into Google Ads as offline conversions, closing the loop between ad spend and signed rentals.
  • Session replay and heatmaps, so when something confuses visitors we can watch the confusion instead of guessing.

The part we're proudest of: the site can't lie

An AI writing your website fast is only half the story. The other half is proving, on every change, that nothing broke. So the AI also wrote its own examiner: every deploy runs a zero-error verification gate that crawls the built site and fails the deploy if it finds any dead internal link, any rental link missing its unit-type ID (the exact bug the old site shipped for years), any page missing analytics or metadata, any malformed structured data, any displayed price that disagrees with the pricing data, or any leftover copy that doesn't belong. On top of that, an end-to-end browser test suite clicks through the site like a customer before and after every production deploy.

That's the real lesson of the rebuild: the old site's problems weren't design problems, they were unverified-claims problems. Broken links, missing prices, stale copy: all things a machine can check on every single change. Now a machine does.

Built for how people find storage now

Every page ships structured data (schema.org SelfStorage entity, per-unit Offers with live prices, FAQ markup) so search engines read facts instead of guessing from prose. And because a growing share of "best storage near me" questions are now answered by AI assistants, the site publishes a machine-readable summary of units, prices, and rental links (llms.txt and a JSON index), the AI-era equivalent of a sitemap, written by an AI for the AIs that come reading. Hyperlocal landing pages cover the searches real neighbors make: small units, military and PCS moves near Fort Novosel, travel nurses on 13-week contracts, RV and boat parking, and moving to Dothan.

Did it work?

The rebuild shipped June 12, right at the start of peak moving season, and became the substrate for the second act: we connected Claude to the facility's Google Ads account, let it audit thirteen months of outsourced spend, and rebuilt the campaign on top of this site's honest signals. Occupancy climbed from 86.7% to 92% at peak, and the emptiest unit size went from 50% to 60% occupied, every fill at full street rate. The numbers are laid out in the companion post: We put Claude in charge of our Google Ads, and conversions went up 1,400%.

Stack summary for the curious: Claude (Anthropic) in Claude Code wrote a Python static-site generator (~1,600 lines, zero dependencies) with one data file as source of truth, deployed on Cloudflare Workers static assets, gated by Playwright end-to-end tests and a custom zero-error verifier, instrumented with GTM + GA4 + Google Ads conversion tracking and PostHog session replay, and published with schema.org + llms.txt for search and AI discovery. Old-site screenshot courtesy of the Internet Archive's Wayback Machine.

← All posts