CPR West Covina Logo

Case study: our own business

How We Run Our Own CPR Training Company

Every system we sell was built to fix a problem we had ourselves. Here is what was broken at CPR West Covina, what we built, what it produced, and what we would do in a different order next time.

4.9 from 300+ 5★ Google & Yelp Reviews on this business

Specifications

The verified numbers

All from our own account and our own booking system. Nothing here is borrowed.

Cost per booked student in Google Ads
$21
Return on ad spend on the same account
596%
Click through rate on search campaigns
9.5%
Conversion under-report found and fixed
~29%
Pages migrated to server-rendered HTML
89
Bookings a month through the booking system
~137
Rating across 300+ 5★ Google & Yelp Reviews
4.9

The situation

CPR West Covina is an operating AHA Training Site and Red Cross provider in Southern California. Real classrooms, real manikins, real instructors driving to real classes. It sells BLS, ACLS, PALS, and Heartsaver courses to two very different buyers: healthcare students who need a specific card by a specific date, and managers buying training for a team.

The business was working. Students booked, classes ran, reviews came in. That is exactly the condition where problems hide, because nothing is on fire and nobody has a reason to open the hood. Bookings were arriving, so the assumption was that the marketing stack was fine. It was not.

Before and after

What was broken, and what we built

Four things, none of which produced an error message, and the six pieces built to answer them.

What was broken

  • A website Google could barely readThe site was a JavaScript shell. What the crawler fetched was an empty container, and the course text arrived only after scripts ran. In the browser it looked finished. In a source view there were almost no words on the page.
  • Conversions under-reported by roughly 29%Reported conversions in Google Ads did not match the payments that had actually settled. Ads was lower, by close to three in ten bookings. Every bid decision after that was made against a number that was wrong in a direction nobody could see.
  • Payments landing with no booking attachedMoney arrived in the payment processor for students who had no seat recorded anywhere. Somebody had to notice, find the person, and put them on a roster by hand, usually after the class had already been staffed.
  • No renewal follow-up at allEvery card issued expires in two years. That is a dateable repeat purchase sitting in the database. Nothing was sending those students anything, so they searched Google again when the deadline came and often found somebody else.

What we built

  • The site moved to server-rendered pages89 pages migrated with a full redirect map, old URL to new URL, one at a time. Course text now ships in the HTML. The pages that ranked kept their titles and their copy so the migration did not cost the positions we already had.How we build and migrate training sites
  • Booking moved onto our own domainThe booking widget renders natively on the page instead of framing a scheduler from somewhere else. Students pick a course, a date, and pay without leaving the site, and the click ID from the ad is still on the page when the booking happens.The booking calendar
  • Tracking rebuilt around completed paymentsConversions fire on a payment that actually settled, not a button click. Phone and walk-in sales get matched back to the click that produced them and uploaded as offline conversions, so the keyword that earned the sale finally gets credit for it.The free tracking audit
  • The ad account rebuilt by buyerHealthcare students and workplace managers got separate campaigns. Mostly exact match, one course intent per ad group, near-me and city groups of their own, and shared negative lists that keep online-only and job-seeker traffic out.Google Ads for CPR training
  • Orphan payments now raise an alertWhen money arrives without a matching booking, the system says so the same day instead of waiting for a person to spot it. The student gets seated before class day rather than after somebody notices the roster is short.Payment matched to every booking
  • A renewal engine that runs on its ownEvery issued card has an expiry date, so the reminders schedule themselves ahead of it. The follow-up that used to be nobody's job is now the most predictable revenue in the business, and it costs nothing per student to send.Renewal reminders

The right column is in build order. The crawler and the tracking came before anything clever, because everything downstream depends on both being true.

The through line is that all four were measurement and plumbing failures, not effort failures. Nobody was being lazy. The systems simply did not talk to each other, so a human had to be the integration layer, and humans miss things while holding a manikin.

What it produced

The Google Ads account runs at $21 per booked student, a 596% return on ad spend, and a 9.5% click through rate. The number that changed the most was not any of those, it was the denominator: once the roughly 29% under-report was closed, the reported cost per booking dropped without a single bid change, because the account finally counted bookings that had been happening all along.

On the operations side, the booking system runs around 137 bookings a month. Class events write themselves to the instructor calendar, students get confirmed the instant they pay, payments that arrive without a booking raise an alert the same day, and renewal reminders schedule themselves off each card's expiry date. The business reviews at 4.9 across 300+ Google and Yelp reviews, which is downstream of classes that are staffed correctly and students who know where to be.

The 89-page migration to server-rendered HTML is the least visible item and arguably the most important. Before it, the course copy was invisible to a crawler. After it, the pages exist as far as Google is concerned, which is the precondition for every SEO decision made since.

Known limitations

What we would do differently

A case study with no mistakes in it is an advertisement. Here are the four we would change.

Four corrections

  • 01We should have reconciled the numbers in month oneThe 29% gap was found by accident, not by process. Comparing reported conversions against settled payments takes twenty minutes and we went a long time without doing it. That single check is now the first thing we run on any account, ours or a client's, and it is the reason the audit is free.
  • 02The migration should have come before the ad spend scaledWe spent real money sending traffic to a site Google could barely read. The ads worked anyway, because search intent for certification is strong, but the organic side sat still for months longer than it needed to. Fix what the crawler sees first, then scale paid.
  • 03Offline conversion import is still not fully closedPhone sales are matched and uploaded, but the feed still has gaps we are working through, which means our reported numbers likely understate reality even now. We would rather say that than present a clean chart. Anyone claiming perfect attribution on a phone-heavy local business is describing a spreadsheet, not an account.
  • 04This is one business, in one marketEvery number here comes from our own CPR training company in Southern California. Course mix, class price, and auction competition all vary by metro. What transfers is the order of operations and the structure, not a promise that your account will produce $21 per booked student.

Troubleshooting

Case study questions, answered

Whose business is this case study about?
Ours. CPR West Covina is an operating AHA Training Site and Red Cross provider that we own and run. Every number on this page comes from that business, not from a client we are quoting.
How was the 29% conversion under-report found?
By comparing reported conversions in Google Ads against payments that had actually settled for the same period. Ads was materially lower. Tracing the gap led to a booking flow that dropped the click ID, phone sales that never left the payment processor, and a conversion firing on the wrong event.
What does $21 per booked student mean exactly?
Ad spend divided by students who actually booked and paid, on our own Google Ads account. Not cost per lead, not cost per form fill. Alongside it the account runs a 596% return on ad spend and a 9.5% click through rate.
Why did the website migration matter so much?
The old site rendered its text in the browser, so the crawler was fetching a near-empty page. Moving 89 pages to server-rendered HTML meant the course copy finally shipped in the document. Redirects were mapped one to one so the pages that already ranked kept their positions.
Do you have client case studies as well?
This is the case study we can prove, because it is our own company with our own money and our own account. We are not going to invent client logos or borrow someone else's results to look established.
Can I see any of this live?
Yes. Book a 15-minute call and we will screen share the ad account, the booking system, and the ops dashboard. That is a faster and more honest answer than any screenshot on a page.

Need a hand

See it live instead of reading about it

Book a 15-minute call and we will screen share the ad account, the booking system, and the dashboard, then run the same reconciliation on your account for free.

We work with CPR and certification training companies nationwide