Back to blogContent

A blog post is beating my Charleston service page

The page outranking my roofing service page is a blog post from Christmas Eve, never edited since. I checked the timestamps. Here is what it does differently.

6 min read·September 18, 2026·By Charlestowne Marketing

The best page I have ever built is sitting at number two, and the thing beating it was written on Christmas Eve and has not been touched since.

I want to be specific, because vague competitive complaints are worthless. The query is "seo for charleston roofers." Our page at Charleston roofing SEO has held a top-two organic spot for six consecutive weeks now, and it is cited second in the AI answer. I am not upset about it. It is the only genuinely ranking asset this whole site has.

The page above it belongs to PalmettoSoft, a Mount Pleasant shop that has been doing this since 2005. And it is not their Charleston SEO service page. It is a blog post: "Local SEO for Roofing Companies in Charleston SC: A Step by Step Roadmap."

So I pulled the raw HTML instead of trusting a summary, and read the structured data. Published 2025-12-24 at 10:45 UTC. Modified 2025-12-24 at 11:25 UTC, forty minutes later, which is the author fixing a typo. Never edited again. Nine months.

A nine-month-old blog post that nobody has opened since Christmas is outranking a purpose-built service page that I refresh constantly.

This is not one weird result

My first instinct was to call it a fluke and move on. I made myself go count instead, because I spent last week counting templated pages and the counting is what changed my mind then too.

Four instances, all live on page one this week:

Query The page holding a top slot What kind of page it is
seo for charleston roofers PalmettoSoft roadmap article Blog post, Dec 2025
local seo charleston sc Spark Digital Group 2026 playbook Blog post, Mar 2026
charleston seo company Baldwin Digital agency comparison Resource article, May 2026
seo for charleston electricians PalmettoSoft electrical article Blog post, Feb 2026

Every single one of those outranks somebody's carefully built service page. Spark Digital Group's has held its slot since at least June, and it is one post on an otherwise quiet blog. Baldwin Digital's is a listicle that names competitors and publishes his own price. A fifth showed up on the local SEO query this week, a Charleston post from Stingray Branding, which I had never seen before.

(I also want to correct something in my own notes. Back in June I recorded PalmettoSoft's blog as dormant with zero Charleston content. That was wrong. Their sitemap has 261 posts, 67 of them naming a South Carolina city, and they ran eight Charleston trade articles between November 12 and February 2 before rolling the identical template out to Columbia, Greenville, Myrtle Beach and Spartanburg. I had checked a lastmod date and drawn a conclusion from it. Lastmod dates lie.)

What the winning page actually does

Here is the part that took me a while to admit. I went in expecting to find thin AI slop propped up by a twenty-year-old domain. That is not what is there.

The PalmettoSoft roofing post is eight numbered steps, in this order: lock down the Google Business Profile, build Charleston-specific service pages, establish consistent citations, build a review system, use geo-tagged job content, earn local backlinks, optimize for calls rather than rankings, and track the right metrics monthly. Then a ninth section that puts those eight in priority order for a roofer who cannot do all of them.

It names Mount Pleasant, North Charleston, West Ashley, James Island, Johns Island, Summerville and Goose Creek. It names exactly zero real businesses, which is its actual weakness and I will come back to that.

Now compare that to what a service page does. My roofing page opens by telling you what we sell. It talks about storm season, insurance claim content, and the local pack signals roofers need. It is honest and it is specific and it is still, structurally, a pitch.

The blog post is not a pitch. It is instructions. A roofer can read it and go do seven of the eight steps himself without ever calling PalmettoSoft.

That is the whole difference, and it turns out to be the thing Google is rewarding on these queries. When somebody searches "seo for charleston roofers," a meaningful share of them are not shopping for an agency at all. They are trying to figure out what to do. A page that sells has nothing for that searcher. A page that instructs answers them completely, earns the dwell time, and gets summarized cleanly by the AI layer on top.

At this point a lot of people are thinking: fine, so teaching people to do it themselves loses you the sale. I thought that too, and I think it is backwards. The roofer who reads eight steps, tries three of them, and realizes step five requires content he has no time to write is a far better lead than someone who landed on a sales page. He now knows what the work is. He has pre-qualified himself. Giving away the method has never been the risk. The risk is being invisible to him entirely.

What I am doing about it

Not deleting service pages. That would be an overcorrection and the pages still do a job, which is converting the person who has already decided to hire somebody. Two different readers, two different assets.

What I am doing is building the missing instructional half, and starting where nobody is standing. I checked electricians this week. Page one for "seo for charleston electricians" is one PalmettoSoft blog post, three contractor directories, and a page written for Charleston, West Virginia. Roofing has six agencies fighting over it. Plumbing and HVAC are getting crowded. Electrical is empty, so that is where our new Charleston electrician SEO page went, and it is written as job-by-job instruction rather than a menu.

If you run a service business here and you want to test this on your own site this week, do this:

  1. Search the thing your customer would actually type, not your service name. "Why does my electrical panel keep tripping," not "electrical panel upgrade Charleston."
  2. Look at what type of page is winning. Service page, blog post, directory, or forum.
  3. If it is a blog post or a guide, you cannot win that slot with a service page. Build the instructional version.
  4. Number the steps. Every single one of the four pages above uses numbered or clearly sequenced steps.
  5. Then do the one thing none of them do: name a real job you did, on a real street, with a real outcome.

That last step is the opening. Every winning page I looked at this week is genuinely useful and completely anonymous. PalmettoSoft's roofing roadmap names seven Lowcountry places and not one actual roof. That is the seam, and it is the same conclusion I reached from the opposite direction last week: a template can produce structure, and it can even produce good advice, but it cannot produce the specific job you did in West Ashley in March. It is also why an agency site that has not changed a byte in a year can keep getting recommended, since the AI layer is reading for usefulness, not freshness.

Go run step one on your own top query today. It takes about five minutes and it tells you whether you have been building the wrong shape of page this whole time. I had been, on at least one trade, and I would rather find that out by counting than by waiting.

#content#local-seo#home-services#charleston#service-businesses#site-structure

Want this kind of result for your business?

Free SEO audit. Two business days, no obligation, yours to keep.

Get a Free SEO Audit