Charleston SEO pages are being generated by the hundred
I counted the templated Charleston pages that landed on page one this month. One agency runs 101 city pages. Here is what still beats them, with receipts.
Last week I argued that page structure is what earns you visibility in Charleston. I want to walk part of that back, because I spent this week counting and the numbers embarrassed me.
Here is what I found. One agency now runs 101 city pages under a single /seo-by-city/ folder, and one of them holds a page-one slot for "charleston seo agency," a term no genuinely Charleston-based shop cracks. Another runs a 137-page site where 86 of the URLs are location pages, covering eleven cities across South Carolina and Texas, sliced four trades deep and four services wide. Every single one of those 137 URLs carries the same last-modified date: May 5, 2026. One batch. One afternoon, probably.
And that second site now sits on page one for "seo for charleston roofers," which is the exact search where we hold the number two organic slot and get named in the AI answer.
So no, structure is not the moat. Structure is a weekend.
The four things I actually counted
I am not going to name every domain, but I will give you the shape, because the shape is the point.
| What I found | Scale | Where it landed |
|---|---|---|
National agency, /seo-by-city/ grid |
1,512 total URLs, 101 city pages | Page one, "charleston seo agency" |
Two-state home-services agency, /locations/{state}/{city}/{trade}/{service}/ |
137 URLs, 86 location pages, all stamped 2026-05-05 | Page one, "seo for charleston roofers" |
| Out-of-market shop, Charleston roofing SEO page | ~1,200 words, zero neighborhoods named, Atlanta area code | Top ten, same search |
| A page about roofers in Charleston, Vermont | ~2,500 words, Orleans County | Surfaced on a Charleston SC query |
That last row is the comedy, and I almost led with it. There is a live, indexed, 2,500-word page about programmatic SEO for roofers in Charleston, Vermont, population roughly a thousand, showing up when people search for Charleston roofing help. The generator did not know there are two Charlestons. (Nobody told it about the harbor.)
But the comedy is a distraction, and I want to be careful here, because the easy version of this post is "templated pages are garbage" and that version is wrong.
The uncomfortable part
I pulled the two-state agency's Charleston roofing page and read the whole thing expecting slop. It is not slop. It runs eighteen hundred to two thousand words. It names Mount Pleasant, Summerville, West Ashley, James Island, North Charleston, Daniel Island, Johns Island, Goose Creek, Hanahan, Isle of Palms, and Sullivan's Island. It talks about how urgency and budget differ between the islands and the suburbs.
Those are the same neighborhoods I name. Their template is good.
At this point a lot of people reading this are thinking: fine, so just write more, publish weekly, out-effort them. I do publish weekly and I am telling you that is not the mechanism. The best-ranked Charleston agency page I audited two weeks ago has not published anything in eleven months. Volume is not the answer and neither is structure. Both are now commodities.
Even the small shops are converging. Offset Digital is a North Charleston owner-operator with a forty-five-URL site and a blog that has been quiet for a year. Since June they have added HVAC and plumbing trade pages. Everybody is building the same grid.
What a generator cannot produce
Here is the thing a template cannot hold: a checkable local fact that would be flat wrong in any other market.
I will give you the best one I know, and Charleston roofers should steal it today.
Inside the Old and Historic District and the Old City District, roof work visible from the street goes through the City of Charleston Board of Architectural Review before a building permit issues. The Board adopted a written roofing policy by motion at its December 10, 2014 meeting. It says, in order:
- Historic roofs get repaired, not replaced, wherever possible. No historic roof is replaced in full unless you can document that it is beyond reasonable repair.
- When replacement is approved, it must be in kind, with matching construction methods. Where terne metal is unavailable, staff may approve aluminum or coated copper.
- Standing-seam terne can be replaced with uncoated standing-seam copper under staff approval, but not on Category 1 or Category 2 structures.
- All standing-seam metal roofs must use traditional hand-crimped detailing. Modern snap-lock and commercial-grade metal panels are inappropriate for historic structures and will not be approved.
- Synthetic materials, artificial slate included, are generally not appropriate.
Read item four again. Every roofing company in this market that advertises snap-lock standing seam as its flagship product is advertising itself out of every job below Calhoun Street, and most of them do not say so on their site. Meanwhile the homeowner in Harleston Village typing "metal roof historic Charleston" is trying to find out whether the thing they want is even legal.
Nobody answers that question. A grid generated in Austin structurally cannot, because it does not know the Board of Architectural Review exists.
That is not a content idea. That is a moat.
The test I now run on every page
Steal this. It takes ten minutes.
- Pick any page on your site targeting a Charleston search.
- Swap every instance of "Charleston" for "Tulsa."
- Read it again.
- If it still reads as true and useful, delete it or rewrite it. It is a template and you will lose to people who template faster.
- If three or more sentences become factually wrong, you have something defensible.
Apply that to our own Charleston roofing SEO page and the Board of Architectural Review section fails the Tulsa swap in six places. Good. That is the whole idea. We added that section this week specifically because of what I counted, and I would rather publish the rules than pretend they are proprietary.
Your version of this is not roofing. If you are a plumber it is the cast-iron and clay lateral stock under the peninsula and what the city requires when you open a street. If you run a dental practice it is which carriers the big Mount Pleasant employers actually use. If you run a charter it is the Coast Guard inspection tier your boat falls into and what that means for the group size you can legally take out.
That is knowledge you already have and have never written down. The generators cannot get it, and the directories that own so much of page one will never bother.
Do this week
Open the page you most want to rank. Run the Tulsa swap on it. Count the sentences that break.
If the count is zero, block ninety minutes and write down five things about operating in Charleston that a competent marketer in another state would get wrong. Permit realities. Seasonal timing that is actually local, not "summer is busy." A rule with a date attached. Put them on the page in plain language.
That is what we do for our service-business clients across the Lowcountry, and after this week's counting exercise it is the only durable thing I am confident about.