GoHighLevel SEO settings most service businesses miss — all 18 covered with exact click-paths. Fix canonicals, LocalBusiness schema & blog fields in 2026.
You've connected your custom domain, published your pages, and waited. Google ignores you. You search your own business name and find nothing but your GBP listing. Meanwhile, you're still writing $3,000 checks to Google Ads every month.
The platform isn't broken. The configuration is.
GoHighLevel ships with solid SEO infrastructure — canonical URL controls, schema injection points, per-page indexing toggles, a sitemap generator. Every one of those features ships empty or off by default. This guide walks you through all 18 settings, in order of impact, with the exact click-path to find each one.
GHL is not a "bad SEO platform." We've built it into the primary organic traffic engine for HVAC companies, plumbers, and roofing contractors — generating 40–80 qualified visits per month within four to six months of correct setup. The platform is capable. The default state is not.
Here's what most users encounter: GHL auto-populates page titles with whatever name you typed during build. A funnel page called "Step 1" gets indexed as "Step 1." A service page titled "Home Services — New Page" competes with that exact string on Google. No canonical URLs are set, so the .pages.highlevel.io subdomain and the custom domain both sit in Google's index as separate sites, splitting every ranking signal down the middle.
The missed settings fall into three categories:
We worked with a roofing company paying $297/month for GHL and $3,000/month in Google Ads. Zero organic leads. When we audited the account, 11 of the 18 settings in this guide were either blank or misconfigured. Six months after fixing them, they cut their ad spend by 40% because organic started converting.
Work through the checklist in the next section first. Then go section by section.
Use this table to identify your quick wins before diving into each section.
| # | Setting Name | GHL Navigation Path | Priority | Status Tag |
|---|---|---|---|---|
| 1 | Page Meta Title | Sites > Websites/Funnels > Page > Settings icon > SEO Meta Data | Critical | Most Missed |
| 2 | Page Meta Description | Sites > Websites/Funnels > Page > Settings icon > SEO Meta Data | Critical | Most Missed |
| 3 | Funnel Step Duplicate Descriptions | Funnel > each Step > Settings icon > SEO Meta Data | Critical | Most Missed |
| 4 | Open Graph Image | Page Settings > Social Media Preview Image | High | Most Missed |
| 5 | Open Graph Title | Page Settings > Social Media Preview Title | High | Most Missed |
| 6 | Canonical URL | Page Settings > SEO Meta Data > Canonical URL | Critical | Most Missed |
| 7 | Funnel Step Indexing | Page Settings > SEO Meta Data > Allow Indexing toggle | Critical | Most Missed |
| 8 | Per-Page Indexing Toggle | Page Settings > SEO Meta Data > Allow search engines to index | Critical | Commonly Done |
| 9 | Site-wide Robots.txt | Settings > Domains > Robots.txt editor | High | Most Missed |
| 10 | XML Sitemap | yourdomain.com/sitemap.xml (auto-generated) | High | Commonly Done |
| 11 | GSC Sitemap Submission | Google Search Console > Sitemaps | High | Most Missed |
| 12 | LocalBusiness Schema | Settings > Custom Code > Header Scripts | Critical | Most Missed |
| 13 | Page-Level Schema | Page Settings > Custom Code > Head | High | Most Missed |
| 14 | Blog Post Slug | Blog > Posts > Edit Post > Slug field | High | Most Missed |
| 15 | Blog Category Meta Description | Blog > Categories > Edit > Meta Description | Medium | Most Missed |
| 16 | Featured Image Alt Text | Blog > Posts > Media selector > Alt Text field | Medium | Most Missed |
| 17 | Page Speed / Image Compression | Media Library + Page Builder element settings | High | Most Missed |
| 18 | URL Redirects + Custom 404 | Settings > URL Redirects / Settings > General > Custom 404 | High | Most Missed |
The click-path differs slightly between funnels and websites — this is where most people give up and assume the field doesn't exist.
For funnel pages: 1. Open Sites in the left nav 2. Click Funnels > select your funnel 3. Click the Settings icon (gear) on the specific funnel step 4. Select the SEO Meta Data tab in the slide-out panel 5. Edit Meta Title and Meta Description fields directly
For website pages: 1. Open Sites > Websites 2. Click into your website > hover over the page > click Settings (gear icon) 3. Select SEO tab 4. Edit Page Title and Meta Description
The fields look identical once you're there — a single-line text input for title and a textarea for description. Neither shows a character counter, so you're working blind unless you count manually or paste into a tool like Spotibo.
GHL auto-populates blank title fields with the page name you assigned during build. A plumber's page called "Emergency Services" gets the meta title "Emergency Services" — no city, no keyword, no intent match. We've seen pages titled "Step 1" ranking for absolutely nothing for 14 months before anyone noticed.
Before: Step 1 (GHL default)
After: Emergency Plumber in Austin TX | Rivera Plumbing
Before: HVAC Services (GHL default)
After: AC Repair & HVAC Service in Phoenix AZ | CoolAir Pro
Apply these rules without exception: title ≤ 60 characters, description ≤ 160 characters. Front-load the primary keyword — don't bury it after your brand name.
Every funnel step in GHL is a crawlable, indexable URL. If you built a 3-step funnel and left all three steps with identical meta descriptions (or no meta descriptions at all), Google sees three pages competing with each other — or worse, flags the duplication and suppresses all three.
Fix: Noindex all funnel steps except your canonical landing page. Go to each step's SEO Meta Data tab and uncheck Allow search engines to index this page. Keep only Step 1 (or whichever page carries your primary keyword) set to index.
If you built a multi-step quote funnel and left all steps indexed with the same description, you're actively diluting your own rankings. We found this on 7 out of 10 GHL accounts we've audited in the last 12 months.
Click-path: Sites > Funnels or Websites > Page Settings > Social Media Preview section.
You'll find two fields: Social Media Preview Image and Social Media Preview Title. Both are blank by default on every GHL account we've opened.
OG tags control what appears when someone shares your page on Facebook, pastes the URL into a Google Business Profile post, or sends the link via SMS. Service businesses share their pages constantly across all three channels — and a blank OG image causes Facebook and LinkedIn to grab whatever image their crawler finds first, usually your logo at the wrong aspect ratio, or nothing at all.
The indirect SEO connection is real: a properly formatted OG image with a compelling title drives higher click-through rates from social shares. More branded searches and direct traffic tell Google this URL earns attention — which feeds into trust signals.
Recommended image dimensions: 1200 × 630 px. Upload a job-site photo or a before/after image — not a logo.
OG title copy formula: [Service] in [City] — [Benefit or USP]
Examples:
- Roof Replacement in Denver — Free Same-Day Estimate
- AC Repair in Tampa — 24-Hour Emergency Service
Keep the OG title under 60 characters so it renders fully on Facebook without truncation.
This is the most technically damaging GHL-specific SEO mistake we see, and it runs silently for months before anyone notices.
When you build a funnel in GHL before connecting a custom domain, every page gets a URL on the .pages.highlevel.io subdomain — something like yourcompany.pages.highlevel.io/roofing-estimate. Connect a custom domain later, and the custom domain URL goes live. But the .pages.highlevel.io version often stays indexed.
Run this check now: Open Google and search site:pages.highlevel.io yourcompanyname. If results appear, Google has indexed your HighLevel subdomain as a separate site. Every backlink and ranking signal is split between two URLs.
Run the site:pages.highlevel.io check on every GHL account you manage, including existing clients. In our experience, roughly 60% of accounts built before mid-2024 have at least one subdomain URL still indexed.
https://yourdomain.com/your-page-slugUse a self-referencing canonical when your custom domain is the definitive version of that page. Use a canonical pointing to a different URL only when the current page is a near-duplicate of another page you want Google to rank instead.
Critical three-step audit:
- Step 1 — Search site:pages.highlevel.io yourcompany in Google to find indexed subdomain pages
- Step 2 — Open GHL > Page Settings > SEO Meta Data for each affected page and verify indexing status
- Step 3 — Set the canonical URL on every page to the custom domain version
A roofing company we audited had their homepage ranking on both premierroofingco.pages.highlevel.io and premierroofingco.com. Neither URL had enough link equity to rank on page one. Combined, they would have. Setting canonical tags on the custom domain and noindexing the subdomain URLs pushed the correct page to position 4 within 11 weeks.
Never leave the .pages.highlevel.io subdomain accessible and indexed alongside your custom domain. This is not a theoretical risk — it actively splits your ranking signals and confuses Google's understanding of which URL to rank.
Two settings control what Google is allowed to crawl. Both are misconfigured on most GHL accounts.
Per-page indexing toggle: Sites > Funnels or Websites > Page Settings > SEO Meta Data > Allow search engines to index this page checkbox.
Site-wide robots.txt: Settings > Domains > click your domain > Robots.txt editor.
The indexing toggle is a noindex directive. Uncheck it and Google ignores that page entirely — it won't crawl it, won't rank it, won't count links on it. Check it and the page enters the crawl queue.
Google allocates a finite crawl budget to each domain. Waste it on thank-you pages, order confirmations, and booking confirmation screens, and your actual service pages get crawled less frequently. For a local service business with 10–20 pages, this matters more than most people realise.
The rule we apply across every GHL build:
After applying these settings, verify the outcome: open Google Search Console > Indexing > Pages > Why pages aren't indexed > look for "Excluded by noindex tag." Scan that list for false positives — service pages accidentally noindexed during a site rebuild.
Do not toggle the robots.txt to Disallow: / on the entire site while testing — this has happened to GHL users during site rebuilds and wipes every indexed page within days. Always use per-page noindex for individual pages instead.
GHL auto-generates a sitemap at yourdomain.com/sitemap.xml. Open that URL in a browser right now — it exists whether you configured it or not. The problem is that almost no one submits it to Google Search Console, so Google discovers your pages through crawl alone, which is slower and less reliable.
Exact GSC submission steps:
1. Open Google Search Console and select your property
2. Click Sitemaps in the left navigation
3. In the "Add a new sitemap" field, type sitemap.xml
4. Click Submit
GSC will return a count of submitted URLs versus indexed URLs within 24–72 hours. If submitted = 18 but indexed = 4, you have a quality or canonicalisation problem that no amount of sitemap submission will fix.
Before submitting, open your sitemap in a browser and scan it manually. GHL includes every published page — including funnel step URLs and thank-you pages. If those pages appear in the sitemap but carry a noindex tag (from Setting #8), Google will discover the conflict, crawl the page, read the noindex directive, and exclude it. That's acceptable. What's not acceptable: funnel step URLs in the sitemap with no noindex tag and no canonical pointing elsewhere.
From our builds, accounts that submit their GHL sitemap to GSC within the first 30 days see service pages indexed an average of 3–4 weeks faster than accounts where we add the sitemap later. Crawl discovery through backlinks alone is unpredictable.
GHL does not auto-inject LocalBusiness schema. Every service business installs it manually or goes without — and going without means zero eligibility for Knowledge Panel display, reduced local pack signals, and no structured data for Google to parse when determining your service area and business type.
Navigation path — site-wide: Settings > Custom Code > Head (scripts added here fire on every page)
Navigation path — page-specific: Sites > page > Settings > Custom Code > Head
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Plumber", // Change to: HVACBusiness, RoofingContractor, etc.
"name": "Rivera Plumbing Co.",
"url": "https://riveraplumbing.com",
"telephone": "+1-512-555-0182",
"address": {
"@type": "PostalAddress",
"streetAddress": "4821 Burnet Rd",
"addressLocality": "Austin",
"addressRegion": "TX",
"postalCode": "78756",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 30.3265, // Find yours at maps.google.com
"longitude": -97.7362
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "07:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "08:00",
"closes": "14:00"
}
],
"serviceArea": {
"@type": "GeoCircle",
"geoMidpoint": {
"@type": "GeoCoordinates",
"latitude": 30.3265,
"longitude": -97.7362
},
"geoRadius": "40000" // Radius in metres (~25 miles)
},
"priceRange": "$$", // Optional: $, $$, $$$
"sameAs": [ // Add every social/directory profile URL
"https://www.facebook.com/riveraplumbing",
"https://www.google.com/maps?cid=YOUR_CID"
]
}
</script>
Validate this block at search.google.com/test/rich-results before going live. Paste your URL after publishing, and Google's Rich Results Test will flag any field errors.
Method 1 — Site-wide (recommended for LocalBusiness schema): 1. Click Settings in the left nav 2. Select Custom Code 3. Click + Add Custom Code 4. Name it "LocalBusiness Schema," select Head placement, paste the JSON-LD block 5. Set to All Pages and click Save
Method 2 — Page-specific (use for Service or FAQ schema on individual pages): 1. Open the page in the builder 2. Click the Settings (gear) icon in the top bar 3. Select Custom Code tab 4. Paste the JSON-LD in the Head section 5. Click Save and publish
Use Method 1 for LocalBusiness schema. Use Method 2 when adding Service schema or FAQPage schema to a specific page without affecting the rest of the site.
The GHL blog module has its own separate SEO layer. It is almost universally ignored, which is why most GHL-hosted blogs generate zero organic traffic despite consistent publishing.
Post slug customisation: Blog > Posts > Edit Post > Slug field (below the post title). GHL defaults to a numeric post ID. Change every slug to a keyword-rich format before publishing: /best-plumber-austin-tx, /ac-not-cooling-phoenix-fix, /roof-repair-vs-replacement-denver. Short, keyword-dense, hyphenated. Never change a slug after a post is indexed without setting a 301 redirect (Setting #18).
Category page meta descriptions: Blog > Categories > Edit > Meta Description. Category pages aggregate all posts within a topic. A well-configured category page titled "AC Repair Tips" with a meta description targeting "AC repair service Austin TX" ranks for service-intent queries — not just informational ones. We've seen GHL category pages reach position 6–8 for "[service] near me" queries within 90 days with zero link-building, purely from correct on-page configuration.
Featured image alt text: Open the post editor > click the featured image > find the Alt Text field in the media selector. Describe the image using a keyword: "HVAC technician replacing capacitor on Carrier unit in Phoenix home." Alt text feeds both image search rankings and content relevance signals for the surrounding page.
Author profile settings: Blog > Authors > Edit > fill in name, bio, and upload a headshot. Google evaluates author credentials for local service content — especially for anything touching health, safety, or financial decisions (a roofing estimate qualifies). A complete author profile with a bio describing years of experience adds demonstrable E-E-A-T signals that an anonymous post lacks.
Set up one author profile for the business owner with their real name, photo, and a two-sentence bio that includes their license number or years of experience. Apply that author to every post. This single change upgrades the E-E-A-T profile of your entire blog archive instantly.
Core Web Vitals matter — but only the GHL-specific controls
Grab the Free GoHighLevel SEO Checklist and Fix All 18 Settings Today
Every setting from this guide — formatted as a printable checklist with click-paths and copy-paste templates. Zero fluff, ready to use in your GHL account right now.
Written by Tim Hershberger, founder of Automate the Journey. Tim has built 500+ marketing automation systems for service businesses since 2009. Book a free strategy call to see how we can help.
Everything in this guide runs on GoHighLevel. Try it free for 30 days and see why we chose it.
No credit card required · Cancel anytime