Case study

BookModels: a 2 month rebuild that 5x’d search clicks and lifted daily revenue 715%

We took an unmaintained PHP site off GoDaddy and rebuilt all of it, the marketing site, the model and advertiser app, and the admin, on Vercel, Supabase, Astro, and Next.js. Search traffic, page speed, and revenue all moved in the same direction at the same time.

SEO  /  Attribution  /  Marketing

Visit BookModels

// results: bookmodels.com

Avg daily revenue

+715%

Search clicks

~5x 6x trough to peak

Search impressions

786K

Core Web Vitals, mobile

50s → 99/100

Lighthouse perf + SEO

100/100

Rebuild time

2 mo

01 A fast enough idea on a stack that could not keep up

BookModels is a two sided marketplace. Models list profiles on one side, advertisers book them on the other, for events, shoots, conventions, brand work, and product demos. The product worked, in the narrow sense that it was online. Everything underneath it was a problem.

It ran on PHP and MySQL inside a GoDaddy cPanel account, and it had not been touched in a long time. Pages were slow. On mobile, most of the site scored in the low 50s for Core Web Vitals, and the pages people actually convert on, login, hire, the article hub, dropped into the 40s and the 30s.

The business model had the same shape as the codebase. One lifetime offer. A model paid once and was listed forever. A lifetime price feels generous to the customer and looks clever on a landing page. It is also a slow way to run out of money on the people who like your product the most, because the relationship turns into pure cost the day after they pay.

So the brief was not a fresh coat of paint. It was a full rebuild, with the search rankings kept intact, and a revenue model that grows instead of caps.

02 A full rebuild in two months

The marketing site, the model and advertiser app, and the admin that runs it, all rebuilt.

The marketing site runs on Astro. It is static and fast, and the home page ships almost no JavaScript to the browser, which is most of why it loads the way it does. The app runs on Next.js. Data, auth, and storage sit on Supabase. The whole thing is hosted on Vercel, with Cloudflare handling DNS and image storage. None of that stack is exotic. The point of naming it is that boring, well chosen infrastructure is what lets a two person job hold up under 50,000 profile pages.

Before

Old BookModels home page, red banner with a date picker over a faded photo

After

New BookModels home page, editorial layout reading Become a Model, Every City, Every Type

03 We kept the rankings, then grew them

A migration that did not cost traffic

The accepted wisdom on a site migration is that you brace for a traffic drop and claw it back over the next three months. We did not want to spend a quarter recovering ground the old site already held.

So we kept every URL slug that was already ranking, exactly as it was, and set 301 redirects only where the structure genuinely changed (the old cities path now canonicalizes to /locations). Search engines saw the same addresses pointing at faster, better pages, not a new site they had to relearn.

Clicks went up after launch instead of down. You can see the line.

Google Search Console showing a clear step up near launch
// Google Search Console showing a clear step up of 5x clicks after launch

The programmatic surface is the engine

The growth is not one or two hero pages. It is a large, genuinely useful long tail built from real data:

  • profile pages for 40,000+ models and 10,000+ advertisers
  • 92 city pages
  • 104 model type pages
  • the combinations of the two, so a query like Los Angeles print models lands on its own page (live: /models?city=los-angeles&type=print)

That is tens of thousands of pages, and they are organized so search engines can crawl them without choking. The index is split across a primary sitemap plus content, profile, and photo sub sitemaps, with a robots file that points at the right places. Big surface, clean structure.

Before

Old BookModels cities page

After

New BookModels cities page reading Models in every major city, 92 cities

Speed people can feel

Mobile Core Web Vitals went from the low 50s to 99 and 100 across the site. The home page passes Core Web Vitals on real Chrome user data, on both mobile and desktop, with Lighthouse Performance and SEO each at 100.

Mobile

PageSpeed Insights mobile, Core Web Vitals passed, Performance 100, SEO 100

Desktop

PageSpeed Insights desktop, Core Web Vitals passed, Performance 100, SEO 100

// core web vitals: mobile lighthouse, best of two passes

/ (home) 55 100
/models 55 100
/models?city=los-angeles&type=print 55 100
/rankings 52 100
/locations 52 100
/events 57 100
/articles 41 100
/services 42 100
/become-a-model 85 100
/hire 82 100
/faq 48 99
/login 36 100
/services/runway-model-100bm 56 98
/articles/youtube-for-models-building-a-channel-1015bm 52 98
/cities/chicago-models-10bm 54 100
/boston-brand-ambassador-alicia-108823bm 56 99

A couple pages were already light on the old site and scored well. The pages that mattered most for converting visitors were not, and those are the ones that moved the furthest.

Ready for AI search, not just Google

PageSpeed now scores the site 2 of 2 on agentic browsing. That is a 2026 way of saying AI crawlers and assistants can read the pages and act on them. As AI search starts sending real referral traffic, a site that is already legible to it keeps compounding while everyone else scrambles to retrofit.

04 Knowing which side of the marketplace pays

A two sided marketplace has two funnels: getting models to list, and getting advertisers to book. You cannot run paid acquisition or lifecycle email against either one if you cannot see which actions matter. The old site could not. There was no usable measurement on it at all.

We wired the same event model we run on our own products. Every event belongs to exactly one of three categories, and the category decides where it fires from.

Server only

Subscription renewals, finished syncs. These fire from the server, where the data is authoritative.

Through the server

A booking message, a token purchase, a new subscription. GA4 fires from the browser on purpose, so Google Ads attribution survives. The lifecycle email fires from the server, where we can trust what actually happened.

Browser only

Hitting a limit, opening a modal. These fire client side, with a beacon for the cases where the visitor is about to navigate away and a normal request would get killed mid flight.


On top of that taxonomy: GA4 for product analytics, Google Ads for paid attribution that ties back to revenue rather than to clicks, and Microsoft Clarity for session replay and heatmaps, so we can watch where real people get stuck instead of guessing.

All of it runs behind a consent gate that handles the EU (opt in), the US (opt out), and a worldwide default, so analytics and ads only fire on the legal basis each visitor allows. Compliance and measurement are not at odds when the consent logic is built in from the start rather than bolted on.

05 From one payment to revenue that grows

The lifetime offer is gone. In its place, recurring revenue on the model side and consumable tokens on both sides.

Models

Pay a subscription to keep an active, ranked profile, and can buy ranking boost tokens to climb the rankings board for a window when it matters to them.

Advertisers

Spend tokens to unlock a model’s social handles and to message them to book.

The profile

New profile with GOLD and TOP RANKED badges and locked Instagram and X icons

The rankings board

Live rankings board where ranking boost tokens send a model

Here is the part that pays for itself. A lifetime price collects once, and after that the most engaged users on the platform are the most expensive ones to keep serving. Recurring revenue plus usage based tokens flips that: the more value a model gets from being seen and the more an advertiser gets from booking, the more the platform earns, every month, from both sides at once.

Average daily revenue rose 715% after the change.

06 The product talks back

Most feedback dies in an inbox. We put a Feedback button in the corner of every dashboard, and what a user types there does not drop into a support queue nobody reads. It opens a ticket on the dev team’s Jira board, tagged by type, in the same To Do, In Progress, Done flow the engineers already work from.

BookModels client dashboard with the Feedback widget in the bottom right corner
// the widget: one button, on every dashboard, no support email to hunt for.
The dev team Jira board titled BookModels User Feedback, with user suggestions as tagged work items across To Do, In Progress, and Done
// the same feedback, as real work items on the dev board.

Then the loop closes, which is the part most products skip. When a suggestion is acknowledged, when a bug is fixed, when a requested feature ships, the person who asked for it hears back, through in product messaging plus email or Telegram, whichever they have connected.

A roadmap built from what users actually ask for beats one built from what a team assumes they want, and telling someone you shipped their idea is some of the cheapest retention there is. The board fills with the real stuff: preview a profile before it goes live, see who you rank against in a category, fix a city that got assigned wrong. Some of it is just praise. All of it reaches the people who can act on it.

06 The brand caught up too

The old site read like a directory from 2014, right down to a blog post titled “Top 10 Butt Models.” The new one is editorial. Real typography, a clear position as the inclusive modeling platform, and photography that looks like a brand instead of a stock library.

Before

Old BookModels articles page

After

New BookModels articles page reading Modeling articles, working perspective

Before

Old BookModels model profile page

After

New BookModels model profile page

You cannot put a single clean number on brand lift. You can see it in the before and after, and you can see it in who replies to a booking request now versus who did before.

07 Two months, three things moving at once

  • Average daily revenue rose 715%
  • Search clicks climbed roughly 5x at the peak, against 786K impressions over the window
  • Mobile Core Web Vitals went from the low 50s to 99/100, with the home page passing on real user data
  • Lighthouse Performance and SEO both hit 100
  • The site reads cleanly for AI crawlers, scoring 2/2 on agentic browsing

The change is night and day! Whenever you work with somebody, you always wonder if it will pan out. The work Niche Nudge did was great, and well communicated the whole time. Highly Recommend.

Owner, BookModels

Work with us

We rebuild marketing sites, and the businesses attached to them.

And we keep the rankings while we do it. If that is the spot you are in, let’s talk.

Start a conversation

// see it live: bookmodels.com →