Our Charleston roofing page ranks. Dental doesn't.
Two pages, same template, same week, opposite results. Here is how to read who owns page one in Charleston before you spend money trying to rank on it.
I ran our own rank checks this morning and got a result I did not love.
Search "seo for charleston roofers" and our roofing page is the top organic result. Search "Charleston SEO companies for roofers" and an AI assistant names us in the answer. Good week. Then search "dental seo charleston" and we are nowhere. Not page two. Nowhere in the first ten.
Those two pages were built the same month, off the same template, by the same person, at almost exactly the same length. One of them wins and one of them does not exist as far as Google is concerned. The difference has nothing to do with the pages.
It has to do with who was already standing on page one.
Page one comes in three shapes
Every keyword you are thinking about targeting has an incumbent situation, and there are basically three of them. Which one you are walking into decides whether a good page is enough, whether it is nowhere near enough, or whether you should not be building a page at all.
Most people never look. They pull a keyword out of a tool, see a volume number and a difficulty score, and start writing. The difficulty score is a blended average. It does not tell you what kind of fight it is.
Shape one: nobody is home
This is the roofing situation, and it is the one worth hunting for.
Look at what is actually on page one for "seo for charleston roofers" right now. There is a blog post from PalmettoSoft. There is a page from Sailor SEO scoped to North Charleston. There are pages from Vorgestern Agency and Holy Webs that follow the exact same URL pattern: state, then city, then trade, then service. Those are programmatic pages. Somebody generated a page for every combination of city and trade in the country and pushed them live.
My favorite one on that page is from WideNet, which has a page targeting roofers in Charleston, Vermont. Vermont. Population around a thousand people, and I am fairly sure not a lot of them are searching for roofing SEO.
That is what "nobody is home" looks like. The results are technically relevant and nobody actually wrote them for a Charleston roofer. When your competition is a template that filled in a blank, one page written by a person who knows what a hurricane season does to roofing demand wins. Not because we are brilliant. Because we showed up.
Shape two: the national specialist
Now look at "dental seo charleston," where we lose.
Page one there is The Dental SEO Experts. Connect The Clinics. Clear To Launch Dental. DDS Web Solutions. Form + Function. Read those names again. Every one of those companies does dental and only dental. They have hundreds of dental case studies, dental-specific review profiles, and a decade of content about insurance verification and Invisalign funnels.
Semrush's own agency directory holds two more slots on that page.
Our dental page is good. It talks about insurance-acceptance search, emergency dental intent, the split between downtown professionals and Mount Pleasant families. It is more Charleston-specific than anything those national shops have. And it is losing, because Google is not weighing Charleston-specificity here. It is weighing whether you are a dental company, and five results ahead of us are unambiguously dental companies.
At this point somebody is thinking: so just make the page better. More words, more schema, more FAQs. I have watched people spend six months on that. It does not work, and the lawn care test this spring showed schema markup does not move rankings at all. You do not out-page a specialist. You out-prove them, with real named clients in that vertical and reviews that say the vertical out loud, and that takes years, not a content sprint.
Shape three: the directory wall
The third shape is the one that eats the biggest keywords, and it is why the head terms are so miserable.
Search "charleston web design." Page one is Clutch, then Upwork, then Yelp, then Expertise.com, then a site literally called Web Design Rankings. Search "mount pleasant seo" and you get Comrade, RankWorks, Thrive, Mimvi, and OneLittleWeb, none of them within six hundred miles of Shem Creek. One of the results on that page is for Mount Pleasant, Tennessee.
Google has decided those queries mean "show me a list to compare." Not "show me one company." When that is the read, no amount of on-page work makes you the answer, because you are not what the searcher is being served.
The move there is not to beat the directories. It is to be in them, and to build the page that serves the comparison intent honestly. That is exactly what I did to our Charleston web design page this week: added a section that just tells people the five questions to ask any designer, including us, and an FAQ that says out loud that those page-one lists are paid placements and review counts rather than build quality. If the query means comparison, serve comparison.
The part that annoys me
Here is a thing I found this week that sits badly.
There is a Charleston agency that gets named by AI assistants for "charleston seo" week after week. I went to audit them properly. Their blog has not published since February 2024. Two and a half years. They have three service pages total, no neighborhood pages, and most of their recent site activity is a WooCommerce store selling a course. Their homepage took five seconds to respond when I checked it.
We publish every single week and we are not in that answer.
That gap is entity recognition, not content. They have been a named Charleston marketing company since 2013, they are in the directories, and they have accumulated the mentions that make an assistant confident saying their name. We have been doing this in public for a few months. There is no content trick that closes that. You close it with time, citations, and named clients, which is the boring answer nobody sells you.
What to actually do with this
Before you pick your next keyword, spend ten minutes on page one and sort the results into the three buckets. I wrote about the intent version of this check when I killed a keyword off our own build list, and this is the competitive half of the same ten minutes.
Count how many of the top ten are programmatic city-plus-trade pages, directories, or national specialists in your exact niche.
If you see mostly templates and thin pages, build the page. You will win, probably faster than you expect.
If you see national specialists in your exact vertical, do not build the page yet. Go get three named clients in that vertical and get them to write reviews that say the vertical by name. Then build it.
If you see Clutch, Yelp, Expertise, and Upwork holding half the page, stop trying to rank against them. Get listed on them, and point your own page at the comparison question instead of pretending you are the only answer.
For a Charleston service business, this usually means your money is better spent on the narrow term than the fat one. "Metal roof replacement mount pleasant" has a page one full of nobody. "Charleston roofer" does not. The narrow one books work this quarter. The fat one is a two-year project you should be honest with yourself about starting.
This week, pick one keyword you have been assuming you should target, open a private window, and actually read the ten results. Bucket them. If it is shape two or shape three, take it off the list and go find a shape one.
That is most of what we do for our service-business clients in the Lowcountry before we write a single word of a page.