Website audit · paradisegreens.com
Search audit · October 15 to 16, 2026, facts re-checked October 19 · prepared by Local Howl

The site is big. Very little of it is doing any work.

A crawl of paradisegreens.com finds 815 URLs: 462 posts, pages and products, plus archive and paging pages. Only 33 of them bring in any visitors from Google, and two out of every three of those visitors land on the homepage. Everything below is measured, dated and repeatable. Each finding has a plain-English summary first, then the technical evidence behind it.

33
pages that get any Google traffic, out of 815 crawled
67%
of all Google visitors land on the homepage (621 of 923 a month)
6 to 8.5 s
for service and city pages to show their main content on a phone (Google's target is 2.5 s)
287
keywords stuck on page 2 of Google (positions 11 to 20)
0
monthly visitors to the Scottsdale page, your home city
42
pages whose business data Google reads as broken

The short version

Your business is strong. Your website is not keeping up with it. You have a 5.0 rating on 200 Google reviews and you show up near the top of the Scottsdale map results. But the website behind that profile is slow on phones, buries its useful pages under hundreds of old ones, and tells Google you are an "Arizona" company instead of a Scottsdale one.

More people are finding you on Google, but fewer of them click through to your website. Profile views are up 21% from last year. Website clicks are flat.

One thing to check this week, rebuild or not: we could not find any backups of the website inside WordPress. Backups may well run outside WordPress; a quick note on where the latest copy is and how old it is settles this. See Inside WordPress.

A second quick fix: your domain's email settings only authorize Google Workspace indirectly, through an old hosting company, and there is no DKIM or DMARC, so business email (including quote replies) is easier to spoof and more likely to be filtered. See our standard.

These are not one or two loose screws. Most of the problems come from how the site was built, so they repeat on every page. That is why we recommend a rebuild instead of a long list of patches. See why rebuild.

The live site keeps running while the new one is built. The new site is built in a staging copy that both development teams can work in, with shared code, hosting, sFTP and WordPress access. Both teams stay involved the whole way and work toward the same goal: a lean, thorough site built to SEO best practices. See how we would work together.

Where the traffic actually goes

Every page type on the site, how many pages of that type Google can reach, and how many of them earn even one visit a month. Source: Semrush Site Audit (815 URLs, Oct 15) joined to Semrush Organic Pages (US, Oct 14).

Page typePages crawledGet any trafficMonthly visitsShare of the site's traffic

Homepage includes the http and https rows Semrush lists separately (382 + 239). Live check: http correctly redirects to https in one hop, so this is one page, not a duplicate. "Blog listing pages" are the /blog/?query-...-page=N URLs the blog grid creates, three variants per page number. Tag, author, search and landing pages are set to noindex, which is correct.

Google Business Profile: views up, website clicks flat

Profile viewsWebsite clicks (x30 scale)

Mar to Sep 2025 vs Mar to Sep 2026: views 14,121 to 17,089 (+21%), calls 100 to 131 (+31%), website clicks 435 to 430 (flat). September alone: views +30%, website clicks -19%. Source: Google Business Profile insights in the Local Howl dashboard.

Where your keywords sit on Google

1,471 US keywords. Only 52 are in the top 3. 287 are on page 2 (positions 11 to 20) and 243 more at 21 to 30. Those are the closest wins, and they need strong, fast, specific pages to move up. Source: Semrush Domain Overview, Oct 15. The chart shows the 1,343 keywords with a regular position in the top 100.

The keywords that bring the traffic

The top 100 keywords by estimated monthly visits, where each one shows up on Google, and the page it lands on. Source: Semrush Organic Rankings (US, Oct 15, 2026); together they account for 798 of about 920 estimated monthly visits.

About 4 in 10 of the Google visits credited to your website really come from your Google Business Profile. 34 of these keywords (372 of about 920 visits a month) are map-pack results: people click your listing on the map, and the map links to your homepage. That is your reviews and profile at work, not the website.

Take away the map pack and searches for your own name, and the website's own rankings bring about 164 visits a month. 13 of those come from a page about Tiger Woods' PopStroke, from people searching "tiger woods tucson" and "putt putt in phoenix az", who are not looking for turf.

Another 105 visits come from Google Images, mostly photos on two blog posts about front yards and landscaping ideas.

372
visits from the map pack (34 keywords), credited to the homepage
138
visits from people searching the brand name ("paradise greens", "paradise turf")
164
visits from the website's own non-brand rankings (37 keywords)
105
visits from Google Images (23 keywords)
19
visits from Google AI Overviews (4 keywords)
KeywordWhere it showsVisits / moSearches / moLanding page

"Where it shows": a number is the regular Google result position; Map pack, Google Images and AI Overview mean the visit came through that feature. Visits are Semrush estimates; with Search Console access these become Google's real click counts.

What this means for the rebuild

Findings

Ordered by how much they cost you in search. Switch to Summary only at the top to hide the technical detail.

Structured data: today and what it should be

Structured data (schema) is the hidden label that tells Google and AI assistants exactly what a page is. Below is what five types of page send today, word for word, and the exact replacement, ready to paste. Every value comes from the live site and WordPress; nothing is a placeholder.

In plain English: today 42 service and city pages carry a partial copy of the business record (name and web address only). It points to the full record on the homepage, but Google checks each page on its own and reads a local business with no address, phone or photo. Blog posts and products tell Google nothing at all. The replacements give Google one business record and connect every page to it.

Example: https://www.paradisegreens.com/

Today

{
  "@context": "https://schema.org",
  "@type": "HomeAndConstructionBusiness",
  "@id": "https://www.paradisegreens.com#business",
  "name": "Paradise Greens",
  "url": "https://www.paradisegreens.com/",
  "image": "https://www.paradisegreens.com/wp-content/uploads/Frame-1000002331-1.png",
  "telephone": "(480) 586-0655",
  "sameAs": [
    "https://www.facebook.com/paradisegreens/",
    "https://twitter.com/ParadiseGreens?lang=en",
    "https://www.instagram.com/paradisegreens/"
  ],
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "8321 E Gelding Dr",
    "addressLocality": "Scottsdale",
    "addressRegion": "Arizona",
    "postalCode": "85260",
    "addressCountry": "US"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": "33.61595318089842",
    "longitude": "-111.90145832330393"
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Monday",
      "opens": "08:00",
      "closes": "16:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Tuesday",
      "opens": "08:00",
      "closes": "16:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Wednesday",
      "opens": "08:00",
      "closes": "16:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Thursday",
      "opens": "08:00",
      "closes": "16:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Friday",
      "opens": "08:00",
      "closes": "16:00"
    }
  ]
}

Should be

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "HomeAndConstructionBusiness",
      "@id": "https://www.paradisegreens.com/#business",
      "name": "Paradise Greens",
      "alternateName": [
        "Paradise Greens & Turf",
        "Paradise Greens and Turf Company"
      ],
      "url": "https://www.paradisegreens.com/",
      "logo": {
        "@type": "ImageObject",
        "url": "https://www.paradisegreens.com/wp-content/uploads/Frame-1000002331.png",
        "width": 414,
        "height": 58
      },
      "image": "https://www.paradisegreens.com/wp-content/uploads/front-yard-grass-1024x328.webp",
      "description": "Paradise Greens installs artificial grass, putting greens, pet turf, playground turf and artificial green walls for homes and businesses in Scottsdale and across Arizona.",
      "telephone": "+1-480-586-0655",
      "address": {
        "@type": "PostalAddress",
        "streetAddress": "8321 E Gelding Dr",
        "addressLocality": "Scottsdale",
        "addressRegion": "AZ",
        "postalCode": "85260",
        "addressCountry": "US"
      },
      "geo": {
        "@type": "GeoCoordinates",
        "latitude": 33.61595318089842,
        "longitude": -111.90145832330393
      },
      "hasMap": "https://www.google.com/maps?cid=7358689993993321031",
      "openingHoursSpecification": [
        {
          "@type": "OpeningHoursSpecification",
          "dayOfWeek": [
            "Monday",
            "Tuesday",
            "Wednesday",
            "Thursday",
            "Friday"
          ],
          "opens": "08:00",
          "closes": "16:00"
        }
      ],
      "areaServed": [
        {
          "@type": "City",
          "name": "Scottsdale",
          "sameAs": "https://en.wikipedia.org/wiki/Scottsdale,_Arizona"
        },
        {
          "@type": "City",
          "name": "Phoenix",
          "sameAs": "https://en.wikipedia.org/wiki/Phoenix,_Arizona"
        },
        {
          "@type": "City",
          "name": "Paradise Valley",
          "sameAs": "https://en.wikipedia.org/wiki/Paradise_Valley,_Arizona"
        },
        {
          "@type": "City",
          "name": "Fountain Hills",
          "sameAs": "https://en.wikipedia.org/wiki/Fountain_Hills,_Arizona"
        },
        {
          "@type": "City",
          "name": "Cave Creek",
          "sameAs": "https://en.wikipedia.org/wiki/Cave_Creek,_Arizona"
        },
        {
          "@type": "City",
          "name": "Tempe",
          "sameAs": "https://en.wikipedia.org/wiki/Tempe,_Arizona"
        },
        {
          "@type": "City",
          "name": "Mesa",
          "sameAs": "https://en.wikipedia.org/wiki/Mesa,_Arizona"
        },
        {
          "@type": "City",
          "name": "Chandler",
          "sameAs": "https://en.wikipedia.org/wiki/Chandler,_Arizona"
        },
        {
          "@type": "City",
          "name": "Gilbert",
          "sameAs": "https://en.wikipedia.org/wiki/Gilbert,_Arizona"
        },
        {
          "@type": "City",
          "name": "Glendale",
          "sameAs": "https://en.wikipedia.org/wiki/Glendale,_Arizona"
        },
        {
          "@type": "City",
          "name": "Peoria",
          "sameAs": "https://en.wikipedia.org/wiki/Peoria,_Arizona"
        },
        {
          "@type": "City",
          "name": "Surprise",
          "sameAs": "https://en.wikipedia.org/wiki/Surprise,_Arizona"
        },
        {
          "@type": "City",
          "name": "Goodyear",
          "sameAs": "https://en.wikipedia.org/wiki/Goodyear,_Arizona"
        },
        {
          "@type": "City",
          "name": "Avondale",
          "sameAs": "https://en.wikipedia.org/wiki/Avondale,_Arizona"
        },
        {
          "@type": "City",
          "name": "Buckeye",
          "sameAs": "https://en.wikipedia.org/wiki/Buckeye,_Arizona"
        },
        {
          "@type": "City",
          "name": "Queen Creek",
          "sameAs": "https://en.wikipedia.org/wiki/Queen_Creek,_Arizona"
        },
        {
          "@type": "City",
          "name": "San Tan Valley",
          "sameAs": "https://en.wikipedia.org/wiki/San_Tan_Valley,_Arizona"
        },
        {
          "@type": "City",
          "name": "Casa Grande",
          "sameAs": "https://en.wikipedia.org/wiki/Casa_Grande,_Arizona"
        },
        {
          "@type": "City",
          "name": "Tucson",
          "sameAs": "https://en.wikipedia.org/wiki/Tucson,_Arizona"
        },
        {
          "@type": "City",
          "name": "Prescott",
          "sameAs": "https://en.wikipedia.org/wiki/Prescott,_Arizona"
        },
        {
          "@type": "City",
          "name": "Prescott Valley",
          "sameAs": "https://en.wikipedia.org/wiki/Prescott_Valley,_Arizona"
        },
        {
          "@type": "City",
          "name": "Flagstaff",
          "sameAs": "https://en.wikipedia.org/wiki/Flagstaff,_Arizona"
        },
        {
          "@type": "City",
          "name": "Yuma",
          "sameAs": "https://en.wikipedia.org/wiki/Yuma,_Arizona"
        }
      ],
      "sameAs": [
        "https://www.facebook.com/paradisegreens/",
        "https://twitter.com/ParadiseGreens",
        "https://www.instagram.com/paradisegreens/"
      ]
    },
    {
      "@type": "WebSite",
      "@id": "https://www.paradisegreens.com/#website",
      "url": "https://www.paradisegreens.com/",
      "name": "Paradise Greens",
      "publisher": {
        "@id": "https://www.paradisegreens.com/#business"
      },
      "inLanguage": "en-US"
    },
    {
      "@type": "WebPage",
      "@id": "https://www.paradisegreens.com/#webpage",
      "url": "https://www.paradisegreens.com/",
      "name": "Artificial Grass Installation Arizona | Paradise Greens",
      "isPartOf": {
        "@id": "https://www.paradisegreens.com/#website"
      },
      "about": {
        "@id": "https://www.paradisegreens.com/#business"
      },
      "inLanguage": "en-US"
    }
  ]
}
</script>

What changed and why

  • The one full business record. Every other page points to this @id instead of repeating a half-filled copy.
  • @id gets the slash before the hash (/#business). Every page below uses this exact string.
  • addressRegion "AZ" instead of "Arizona"; geo as numbers, not strings; one hours rule for Monday to Friday.
  • alternateName claims the other names in use: "Paradise Greens & Turf" (Rank Math settings, social graphics) and "Paradise Greens and Turf Company" (the site's own Google Maps link). The official name stays "Paradise Greens", matching the Google Business Profile.
  • hasMap uses the listing ID from the site's own Google Maps link. logo, description, areaServed (the 23 cities with pages) and a WebSite node are added.
  • Hours are copied from the current schema (8 to 4). Rank Math says 9 to 5. Confirm the real hours against the Google Business Profile before publishing.

Each "Should be" block replaces the whole ampv-auto-faq-schema output on that page (keep the separate FAQPage block on pages that have visible FAQs). After publishing, check each URL in Google's Rich Results Test and the Schema Markup Validator (validator.schema.org).

Code review: the theme's functions.php

From the AmpedPress child theme (GeneratePress parent) file shared with us on Oct 15. Each item names the function so it can be checked in seconds.

ItemWhereEffect
Regex missing its closing delimiterredirect_canonical filter for /products/ pagination: preg_match( '#/products/page/([0-9]+)/?$', ...)PHP raises "No ending delimiter '#' found" whenever this filter runs, and the condition can never be true, so the feature it was written for does nothing.
Error log panel reads a different server pathdisplay_error_log_contents() hardcodes /home/midamericagolf/webapps/midamericagolf/wp-content/debug.log and truncates it every 3 weeksThe "AMPV Dash" error panel can never show this site's errors, so warnings like the one above go unseen.
Unclosed HTML on every pageadd_custom_heading_between_logo_and_menu_toggle() opens <div class="custom-heading"> and never closes itMalformed markup in the mobile header sitewide. The phone number here is hardcoded while the desktop header reads it from ACF: two sources for the same number.
A link inside a link on every pagemy_custom_generatepress_header() wraps the_custom_logo(), which outputs its own <a class="custom-logo-link">, inside another <a href="home_url()">Nested anchors are invalid HTML; browsers split them unpredictably and crawlers see a duplicate homepage link in the header of all 580 pages.
Sitewide links that go nowhere usefulmy_custom_generatepress_header(): "made_in_usa" and "promo_image" image links to the homepage; bottom-bar and offer-banner links to /made-in-usa/ and /spring-sale/ with rel="nofollow"580 of 580 crawled pages carry links with no anchor text, 2 nofollowed internal links that both 301, and a "Get 20% Off" spring sale still showing in October.
Gallery scripts on every pageenqueue_justified_gallery_assets() loads justifiedGallery and lightbox scripts sitewide; fslightbox/index.js is enqueued from jsDelivr with no version number (WP Rocket currently serves a cached copy)Extra requests on pages with no gallery; the lightbox version can change whenever that cache is rebuilt.
Product URLs held together by workaroundsremove_blog_slug_from_product_permalink(), custom product and /shop/ rewrite rules, /shop/ to /products/ 301, versioned flush_rewrite_rulesThe product type inherits the /blog/ permalink base and is patched back out with string replacement. Works today, but fragile.
Updates hidden from the ownerremove_updaes_link() removes the Updates screen; the default dashboard redirects to "AMPV Dash"; updates go through MainWPManaging updates centrally in MainWP is a reasonable setup. The side effect is that the owner cannot see pending updates in their own admin, and several are pending (8 on Oct 16).
Leftovers from other buildsHeader fallback logo assets/new-england.svg; unhooked functions remove_custom_user_roles(), display_custom_dashboard_content(), display_admin_notices(); duplicate display_custom_page_title()Code shared with other builds. Using a shared starter theme is normal; these pieces were just never cleaned out for this site. Harmless alone.
The schema problem is the AMPV Auto FAQ Schema plugin's output, as configured on this siteComment: "AMPV handles structured data via JSON-LD"; live block id ampv-auto-faq-schemaThe 42 pages with errors get them from the AMPV plugin, so the fix is in that plugin's output or settings, not a Rank Math setting.

Also done right in this file, and worth saying: modal "dynamic.php" pages are noindexed, paginated Products and Projects pages get self-referencing canonicals, Font Awesome is no longer pulled from a CDN, and the product CSV export checks a nonce and capability.

In plain English: the theme is built on a shared starter that has not been fully adapted to this site. It still carries a few pieces from other builds, a small bug that writes a warning to the server log, and an error-log screen pointed at the wrong server path, so problems like that bug go unseen. None of these are disasters alone, and each is a quick fix. Together they show why changing this build is slow, and why we recommend a clean build.

What is working

Credit where it is due. A rebuild keeps all of this.

Reputation

5.0 stars on 200 Google reviews since 2012, about 1.2 new reviews a week over the last year. The two Scottsdale-named map competitors have 21 reviews each.

Map pack presence

Average leaderboard position 2.2 across the 5 primary Scottsdale terms we re-scan monthly, found in 48% of the grid. Across all 35 tracked terms, Paradise Valley is the strongest: all 7 Paradise Valley searches average rank 2.72 or better, and putting green paradise valley sits at 1.27 with 100% share of local visibility (Aug 28 baseline).

Backlinks

14.4K backlinks from about 3K referring domains. That authority is an asset; a rebuild must redirect every linked URL so none of it is lost.

Fastest homepage in the set

Homepage LCP about 4.1 s and 559 KB. The organic leaders' homepages score 25 to 35 and four of them load 7 to 40 MB. The inner pages are the problem, not the homepage.

Most complete business record

Of 10 sites checked, only Paradise and Waterloo include address, phone and geo in their LocalBusiness markup, and Paradise's service pages point back to it by @id. The fix needed is the stub's @type, not a new system.

Hosting and redirects

All four host variants reach https://www in one 301. HSTS is sent only on the bare-domain redirect. Server response about 0.15 s (RunCloud, nginx). No broken page links found (one placeholder video poster image 404s on /platform-golf/).

Index controls

Tag, author, search, landing and modal pages are noindexed. robots.txt is clean and does not block AI crawlers. Self-referencing canonicals on normal pages.

Name, address, phone

Name, address and (480) 586-0655 appear on every page sampled and match the homepage schema.

Inside WordPress

What the admin panel shows, read on Oct 16 with the access the owner provided. We changed nothing.

We could not find any backups. The backup plugin installed on your site has no schedule and has never made a backup. Backups may run outside WordPress (MainWP or server snapshots at the host), but nothing inside WordPress shows it. Worth confirming where the latest backup is and how old it is.

Google is being told three different versions of your business. Your Google profile says "Paradise Greens". The SEO plugin's business settings say "Paradise Greens & Turf" with no address and hours of 9 to 5. The schema on your homepage says "Paradise Greens" with hours of 8 to 4. One name, one address and one set of hours, everywhere, is the foundation of local search.

Software is behind. 8 plugin updates are waiting and automatic updates are off for all 24 plugins. WordPress itself flags the server's PHP and database versions as outdated.

1,593 redirects have built up, and 80 of them send visitors to a page that no longer exists or redirects again. Those 80 have been used 14,280 times.

AreaWhat we foundWhy it matters
BackupsUpdraftPlus 1.26.8: "Nothing currently scheduled" for files and database, 0 existing backups, "Nothing has been logged yet".If backups exist they are outside WordPress (RunCloud or MainWP). Needs a written answer before any rebuild or major change.
Business entityRank Math Local SEO: type "Organization" (not a local business type), name "Paradise Greens & Turf", address fields empty, description empty, hours start Monday 09:00 to 17:00. Live AMPV schema: "Paradise Greens", Mon to Fri 08:00 to 16:00. GBP: "Paradise Greens".Conflicting name and hours across the site, its settings and Google. Rank Math's own schema module is off, so these settings are mostly dormant, but they show there is no single source for the business record.
Rank Math modulesOn: 404 Monitor, Analytics, Local SEO, Sitemap, Instant Indexing, Link Counter, Content AI, AI Visibility, SEO Analyzer, ACF, Role Manager. Off: Schema, LLMS Txt, Redirections, Image SEO. Analytics shows "Connect Your Rank Math Account" (not connected to Google).One toggle (LLMS Txt) would create the missing llms.txt. Analytics is switched on but collects nothing, so there is no Search Console data inside WordPress either.
Plugins24 installed, 20 active, 4 inactive (Gravity Forms + 2 add-ons, WP Activity Log). Updates pending: GenerateBlocks 2.4.1 to 2.5.0, GenerateBlocks Pro 2.7.1 to 2.8.0, Rank Math 1.0.279 to 1.0.280, Search Regex, Simple History, Smart Slider 3 Pro, UpdraftPlus, WP Rocket 3.23.3.3 to 3.23.5.1. Auto-updates disabled on all 24.Security and compatibility exposure. Inactive plugins should be removed (Site Health flags this).
Overlapping toolsTwo full-page caches (RunCache NGINX FastCGI, reported "enabled and working", plus WP Rocket). Two redirect systems (Redirection plugin plus theme rewrite rules). Two activity logs (Simple History, MainWP Child Reports).Stacked caches make purges unpredictable and hide which layer is serving. Each duplicate tool is more code on every request.
RedirectsRedirection plugin: 1,593 rules, all 301, 907 never hit, 141,141 total hits. Sources: 656 old date URLs, 377 /blog/ URLs, 254 image files, 59 author URLs. Of 580 unique internal targets: 515 return 200, 53 return 404, 12 redirect again (7 product rules point at /shop/, which 301s to /products/; /form-quote/ points at a misspelled /form-estimte/). 80 rules hit a dead or redirecting target, with 14,280 historical hits.Visitors and Google following old links land on errors or extra hops. A rebuild's redirect map should replace this list, pointing every old URL at a live page in one hop.
Server and configPHP 8.1.34 and MariaDB 10.5.29 on Ubuntu 20.04, both flagged by Site Health. No persistent object cache. WP_DEBUG_LOG off. Theme and plugin file editors enabled (DISALLOW_FILE_EDIT not set). Comments open by default. Permalink structure /blog/%postname%/, the root of the /blog/product/ workaround in functions.php.Old stack, an editable codebase from the admin screen, and debug logging off (so the theme's error-log panel would show nothing even with the right path).
SizeDatabase 2.64 GB, uploads 2.68 GB, total install 5.94 GB. 1,540 media items. 288 published posts (+5 drafts, 1 private), 102 pages (+4 drafts, 2 private), 72 products (+3 drafts). 6 users, 4 of them administrators.A 2.6 GB database for about 460 posts and pages usually means log tables (activity logs, redirect logs). Worth measuring before migration.

Measured against the Local Howl website standard

Every site we build is checked against the same list before launch, covering search, AI assistants, measurement and upkeep. Here is paradisegreens.com against that list, checked Oct 16, 2026 on the live site, in the admin panel and in DNS.

4
pass
7
partial
14
fail
4
optional or to confirm, out of 29 checks

AI agents: early days, and the site is not set up for them yet. Google is pushing a new browser standard called WebMCP that lets a website label its forms so AI agents can fill them in reliably; it is in a Chrome trial now, developed with Microsoft's Edge team. Chrome's own site-quality tool, Lighthouse, now has an experimental "Agentic Browsing" check, and Google's documentation for it includes an audit for an llms.txt file, a short plain-text guide to a site for AI tools (Chrome developer docs). On the contact page the site fails 1 of the 2 scored checks: an image link has no text, so an agent cannot tell what it does. The quote forms sit in a GoHighLevel frame on another domain, where WebMCP labels cannot be added from the site.

To be fair about llms.txt: it is optional. Google says Google Search ignores it, and a 2026 Ahrefs study of server logs found most llms.txt files were never requested. The tools that read it today are mainly AI coding and documentation assistants, such as Claude Code and Cursor, when pointed at a site; Anthropic, OpenAI, Perplexity, Mistral, Stripe, Vercel and Cloudflare all publish one for their developer docs. On this site it is one switch in Rank Math, so we treat it as low-cost groundwork, not a ranking fix.

We found no sign of Bing Webmaster Tools, and your own tracking sees very little. There is no Bing verification record, file or tag. Bing can also be verified by importing from Search Console, which leaves no trace, so this is worth confirming: Bing powers Microsoft Copilot and is one of the sources behind ChatGPT search. Google Analytics is installed but tracks a single form event. There are no heatmaps or session recordings (Microsoft Clarity is free).

Your business email is less protected than it should be. Mail runs on Google Workspace, but the domain's SPF record only authorizes Google indirectly, through an old HostGator setting, and it sits at the 10-lookup limit, so a change upstream could break it. We found no DKIM key and no DMARC record. That makes the domain easier to spoof and more likely to be filtered by strict mail providers. It is a short DNS fix and worth doing this week, rebuild or not.

Your SEO plugin is the free version with its schema switched off. Our standard is the paid version owning titles, schema, redirects and image SEO in one place, plus our own plugin for the AI layer.

AreaOur standardparadisegreens.com todayResult
SEO pluginRank Math Pro or Business owns titles, meta, sitemap, schema, redirects and image SEORank Math free ("Unlock PRO" in the menu). Its Schema module is off; schema comes from the AMPV plugin. Redirects live in a separate plugin.Fail
Business identityOne business record, every page linked to it by @idHomepage record is complete, but 42 service and city pages carry a partial copy (name and URL only) that Google's test flags as a local business with no address. Blog and product pages have none.Fail
Business identityBrand name variants claimed (alternateName)Three names in use ("Paradise Greens", "& Turf", "and Turf Company"), none claimed.Fail
Business identityOwner and team marked up as people (Person schema) on a real About or Team pageNo Person node on any page checked.Fail
Business identityBrand recognized as an entity, not just a map listingGoogle knows the business through its Business Profile. On Oct 16, Google's public Knowledge Graph Search API returned no "Paradise Greens" brand entity, and Google's language analysis read the homepage as mostly about "turf", "providers" and "grass", not the business.Partial
AI search/llms.txt guide for AI tools404. Optional: Chrome Lighthouse checks for it (not scored), Google Search ignores it, and today it is read mainly by AI coding and documentation assistants. Rank Math's free LLMS Txt module is installed but switched off.Optional
AI searchMarkdown (.md) version of key pages for AI toolsNone. A convention from the llms.txt proposal, not a standard; Google says it is not needed for Search.Optional
AI searchSearch and AI agents allowed in robots.txtAll 13 checked agents allowed (Googlebot, Bingbot, OAI-SearchBot, Claude-SearchBot, PerplexityBot and the user-triggered agents). Homepage indexable.Pass
AI searchLead forms labeled for AI agents in the browser (WebMCP)None yet. WebMCP is in a Chrome origin trial (from Chrome 149), backed by Google and Microsoft's Edge team. The quote forms are GoHighLevel iframes on another domain, so WebMCP labels cannot be added to them from the site.Optional
AI searchLighthouse "Agentic Browsing" (experimental) passes on the contact pageLighthouse 13.5: 1 of 2 scored checks fail. Accessibility tree fails: an image link to the homepage has no text. Layout shift 0.075 passes. The WebMCP and llms.txt audits are not applicable.Fail
AI searchAI bot traffic measured (for example Known Agents or Cloudflare)Nothing set up.Fail
AI searchFull page content in the HTML, no JavaScript neededYes. WordPress renders the copy server-side.Pass
MeasurementGoogle Search Console shared with the agencyThe domain is verified in Search Console (Google verification record in DNS), but Local Howl has no access.Partial
MeasurementBing Webmaster Tools (Bing powers Copilot and is one of the sources behind ChatGPT search)No sign of it: no Bing verification record in DNS, no BingSiteAuth.xml, no verification tag. It can also be verified by importing from Search Console, which leaves no trace, so this needs confirming.To confirm
MeasurementIndexNow pings on publishRank Math Instant Indexing module is on.Pass
MeasurementGA4 installedYes, G-Z3W8YLS2XR through Tag Manager GTM-WK8HBR8R. Local Howl has no access.Partial
MeasurementFull form funnel tracked (form start, validation fail, submit error, lead)One custom GA4 event only ("form_submission"). The forms are third-party iframes, so starts and errors are invisible.Fail
MeasurementMicrosoft Clarity (free heatmaps and session replays, shows AI-referred visits)Not installed, on the page or in Tag Manager.Fail
MeasurementCall trackingWhatConverts present, but loaded twice on every page.Partial
MeasurementGoogle Ads conversion tag (if ads run)None in the Tag Manager container.Partial
TechnicalSupported PHP (8.3 or newer)PHP 8.1.34, past security support since Dec 31, 2025.Fail
TechnicalPlugins current, unused ones removed8 updates waiting, auto-updates off on all 24. Inactive and should be deleted: Gravity Forms, Gravity Forms Iframe Add-on, Gravity Forms reCAPTCHA Add-On, WP Activity Log, plus 3 inactive themes. Developer tools left active in production: Show Current Template, Search Regex. Duplicate Page is only tested up to WordPress 6.9. Every plugin is still maintained by its author.Fail
TechnicalBackups scheduled and restorableUpdraftPlus: no schedule, 0 backups, empty log.Fail
TechnicalComment and spam endpoints closedComments open by default; /wp-json/wp/v2/comments and /comments/feed/ return 200.Fail
TechnicalGeo meta tags, LCP image preload, image width and heightNo geo meta. LCP image is preloaded and every homepage image has width and height.Partial
TechnicalAccessible structure (skip link, main, footer landmark, iframe titles, contrast)Skip link and <main> present. No <footer> landmark, and color contrast fails Lighthouse on all pages tested. The form iframes do have titles.Partial
TechnicalOpen Graph and Twitter cardsPresent on the homepage.Pass
TechnicalSecurity headersOn www pages (checked Oct 19): no HSTS (sent only on the bare-domain redirect), no X-Frame-Options, nosniff, Content-Security-Policy, Referrer-Policy or Permissions-Policy.Fail
EmailDomain email authenticated (SPF includes the real mail provider, DMARC set)Mail runs on Google Workspace. SPF is v=spf1 a mx include:websitewelcome.com ~all: Google is authorized only indirectly through HostGator's include, and the chain uses exactly 10 DNS lookups, the SPF limit. No DKIM key found for Google Workspace. No DMARC record.Fail

Checks: our pre-launch checker (wiab-prelaunch-check, including Lighthouse 13.5 Agentic browsing and Google Knowledge Graph and Natural Language lookups), live HTML and headers, the Tag Manager container, DNS records, WordPress Site Health and the plugin list. Plugin maintenance status from WordPress.org.

How you compare

Paradise Greens next to the sites that outrank it in Google and the map pack. Fetched Oct 16; speed is a mobile lab run of each homepage under the same settings.

SiteCity in homepage title / headlineCity pagesCity + service pagesHomepage speed (LCP)Reviews shown on sitellms.txt
paradisegreens.comNo / No ("Arizona")2404.1 sNo Google rating (45 testimonial posts, newest 2023)No
azturfmasters.comYes / Yes10015.8 s4.6 from 304 Google reviewsNo
apexturfaz.comPhoenix / No18697.2 s5.0 from 387Yes
arizonaturfprofessionals.comScottsdale / No2416111.1 s4.7 from 222No
arizonaputtinggreen.comPhoenix / No2004.4 sNoneNo
bigbullyturf.comHeadline only11 in AZ18.4 sWidget, no countYes
waterlooturf.com/scottsdaleYes / Yes0037.1 s"1000+ 5-star" brand-wideNo
scottsdaleturfpros.comYes / Yes304.3 sNoneYes
scottsdaleturf.comYes / Yes397.6 sNoneNo

sgwarizona.com (a turf distributor, not an installer) was also checked: 1,084 sitemap URLs, homepage LCP 26.8 s. City and service page counts come from URL patterns in each site's sitemap. Review figures are what each site shows on its own pages.

You have the reviews and hide them

200 Google reviews at 5.0, nearly ten times what the two Scottsdale-named map competitors have, and the website shows none of it. Three organic competitors show their Google rating and review count on their homepage (4.6 from 304, 5.0 from 387, 4.7 from 222).

They build city + service pages

Apex has 69 pages like "putting greens in Scottsdale". Arizona Turf Professionals has 161. You have none. (Counting dedicated service-in-city pages; blog posts that mention a city are not counted.) Those are exactly the searches on the edge of page one.

The map leaders are tiny sites

Scottsdale Turf Pros (9 pages) and Scottsdale Artificial Turf (28 pages) have 21 reviews each, yet rank ahead of you on three of the five primary Scottsdale searches. Their edge is "Scottsdale" in their name, title and headline, not their websites.

Why rebuild instead of patch

A fair question. Here is the reasoning, in order of weight.

  1. The problems live in the template, so they are on every page. Five separate Semrush issues hit exactly the same 580 pages because they come from the shared header and footer. Speed problems come from page-builder sliders, a render-blocking form script and 125 to 150 KB of inline CSS in every page head. Fixing these one by one inside the current theme means rewriting the theme anyway.
  2. The content needs to be reorganized, not just repaired. 288 blog posts going back to 2009, 10 of which earn traffic. A dozen posts on the same "dogs and artificial grass" topic. A Scottsdale page that earns nothing. Consolidating this means redirect mapping and new page structure, which is rebuild work by definition.
  3. The site should be built around Scottsdale and the services that sell. The homepage targets "Arizona". The pages that should win (putting greens, pet turf, Scottsdale, Paradise Valley, North Scottsdale) need to be the fastest, richest pages on the site, with one connected schema graph.
  4. The current build leans on workarounds. Product URLs patched out of /blog/, two pagination systems on the blog, a regex bug, leftover code from other builds, and an updates screen removed from the owner's admin. Every future change costs more on this foundation.
  5. Nothing of value is lost in a careful rebuild. Every URL that earns traffic or holds backlinks keeps its address or gets a one-hop 301. The reviews, map rankings and Business Profile are unaffected by a website change.

What the rebuild delivers

Speed

A performance budget per page: main content visible under 2.5 s on a phone, no page-builder sliders, forms loaded without blocking the page, images sized to the screen.

Scottsdale first

Homepage and titles built around Scottsdale and the surrounding cities you actually serve, with one strong page per service and per city, each with local project photos and reviews.

Content that earns

The best blog posts kept and improved, the duplicates merged, the off-topic and empty posts retired with redirects. A short list of posts aimed at the 287 page-2 keywords.

One clean schema graph

One business record, Service pages that point to it, breadcrumbs, articles and products marked up correctly. Zero errors in Semrush and Google's test.

Ready for AI search

Clear Scottsdale pages, clean schema and an accessible structure that AI answers can quote for Scottsdale buying questions, not just general turf facts, plus an llms.txt file as a low-cost extra for the AI tools that read one.

Measured from day one

Google Search Console and GA4 shared with us (we have access to neither today), so every change can be measured against this audit.

How we would work together

A rebuild does not mean a handover. The current site and the people who look after it stay in place until the new site is checked and ready.

One shared goal: a lean, thorough website built to SEO best practices for Paradise Greens, the client we both serve.

Lean means fewer, stronger pages that load fast on a phone: one page per service and per city that sells, the duplicates merged, nothing on a page that does not help a customer or Google.

Thorough means nothing is left to chance: every old URL mapped to a live page, one clean business record in the schema, Scottsdale-first titles and headings, Search Console and Analytics in place from day one, and every change measured against the numbers in this audit. The current team's knowledge of the site's history and Local Howl's search work both go into the same build.

The live site is untouched

paradisegreens.com keeps running exactly as it does today, looked after by the current team, until launch day. Nothing in this plan changes the live site before then.

Built in a shared staging site

The new site is built on a private staging copy, hidden from Google and password-protected. Both teams can work in it and see every change as it happens.

Shared access, both teams

One shared git repository for the theme and code, plus hosting access, sFTP and WordPress admin on staging, for both teams alike. No black boxes on either side.

Content carries over

Posts, pages, products and photos move across from the current WordPress site following the migration plan below. Nothing is retyped, and every page that earns traffic or holds backlinks keeps its address or gets a one-hop redirect.

Checked before it goes live

Launch happens once staging has been reviewed by both teams and by Paradise Greens: the redirect map tested, forms and call tracking working, schema validated, speed measured against the numbers in this audit.

Both teams stay involved

The current team knows this site's history, hosting and integrations better than anyone. That knowledge goes into the new build, and their access continues after launch.

The migration plan

Every one of the 462 posts, pages and products on the site, sorted into what happens to it in a rebuild. Nothing that earns traffic is retired. Download the full list with the redirect target for every URL.

Preliminary. This plan is built from Semrush estimates and a crawl of the site, because we do not have access to the site's Google Analytics or Google Search Console. Before any page is merged, retired or redirected, we will check every decision against Google's own data: real clicks and impressions per page, which pages Google has indexed, and which pages bring in quote requests and calls. Expect some pages to move between columns once that data is in.
144
keep their address (90 as they are, 54 improved)
100
merge into a stronger page on the same topic
194
retire with a 301 to the closest relevant page (0 visits, 0 keywords between them)
24
utility pages (forms, thank-you, test pages) taken out of Google

By topic

TopicURLsKeepImproveMergeRetire

Improve first: pages already ranking just off page one

PageKeywords
/phoenix-az/114
/blog/types-of-artificial-grass/56
/popstroke-golftiger-woods/50
/mesa-az/38
/tucson-az/32
/synthetic-lawns/31
/scottsdale-az/26
/glendale-az/26
/peoria-az/24
/sports-athletics/23
/golf-simulators/23
/chandler-az/20

These rank for many keywords but earn less than half a visit per keyword, which means they sit below the top results or are too thin to win.

Download the full migration map (CSV, 462 rows)

Rules the map follows

In short: the technical debt

Every item below was measured on the live site or read in its code and admin panel between Oct 15 and 16, 2026. Each one alone is fixable. Together they are why we recommend starting clean.

2.64 GB

The database is almost as big as the entire photo library (2.68 GB). For about 460 posts and pages, that size points to years of stored logs, not content. The whole install is 5.94 GB.

0

Backups we could find inside WordPress. The backup plugin is installed with no schedule, no backups and an empty log. Backups may well run outside WordPress (MainWP or server snapshots at the host). If so, a note on where the latest copy is and how old it is closes this item.

midamericagolf

The theme still carries settings from another site. The admin error-log panel reads /home/midamericagolf/webapps/midamericagolf/wp-content/debug.log, a different server path, and the header falls back to a new-england.svg logo. A shared starter theme is common; these leftovers mean the error panel cannot show this site's errors.

1 bug, unseen

A broken regular expression in functions.php (missing its closing #) can never match and makes PHP raise a warning whenever that filter runs. It would not show up anywhere: the error panel reads a different server path and WordPress debug logging is off.

580 / 580

Every page ships invalid HTML from the header: a link nested inside another link around the logo, and a mobile-header <div> that is never closed. Plus two nofollowed menu links that both redirect, and a "Get 20% Off" spring sale still running in October.

24 plugins

8 updates waiting, automatic updates off on all 24, 4 inactive plugins and 3 inactive themes left installed. Two page caches stacked on each other, two redirect systems, two activity logs.

1,593

Redirect rules built up over the years. 907 have never been used. 80 point at a page that no longer exists (53 target URLs) or that redirects again (12); those 80 rules have been followed 14,280 times.

End of life

The server stack is past support: PHP 8.1 (security support ended Dec 31, 2025), MariaDB 10.5 (end of life June 2025), Ubuntu 20.04 (standard support ended May 2025) and OpenSSL 1.1.1 (end of life Sept 2023). WordPress's own Site Health flags the PHP and database versions.

3 names

Three versions of the business are in circulation: "Paradise Greens" (Google profile, schema), "Paradise Greens & Turf" (SEO plugin, social graphics) and "Paradise Greens and Turf Company" (the site's own Google Maps link), with two different sets of hours.

42 pages

The AMPV schema plugin ("AMPV Auto FAQ Schema") writes a partial business record (name and URL only) onto 42 service and city pages, which Google's test flags as a local business with no address, while blog posts and products get no structured data at all.

3 systems

Three competing pagination and URL schemes: /blog/page/N/ pages that all show the same 12 posts, a separate query-string paging system, and product URLs patched out of a /blog/ permalink base with string replacement.

1 of 2

Scored checks failed in Chrome Lighthouse's experimental Agentic Browsing test on the contact page (an image link with no text). The quote forms sit in a third-party frame where WebMCP labels cannot be added, and there is no llms.txt.

SPF + DMARC

Domain email is under-protected: mail runs on Google Workspace, but SPF only authorizes Google indirectly through an old HostGator include, at the 10-lookup limit, and there is no DKIM or DMARC record.

Open doors

Basic hardening is missing: theme and plugin code editors are enabled in the admin, 4 administrator accounts, admin usernames readable from a public URL, WordPress version files public, comments open by default. A "Hello world!" post from 2010 and a lorem ipsum page are still live.

The bottom line. Patching this site means working around every item above at once: each fix touches a shared theme, a page builder with stacked workarounds and a server past its support dates. A rebuild retires the whole list in one move and keeps what actually earns: the 33 pages with traffic, the 5.0 rating on 200 reviews, the map-pack position, about 3,000 linking websites and every old URL redirected in one hop to a live page.

What we would build instead: a fast, Scottsdale-first site with one business record, clean schema on every page type, the content consolidated per the migration plan, and Search Console and Analytics shared from day one so every change is measured against this audit.

Fixes that can go on the live site now

These do not depend on the rebuild decision. Each is small, and each helps the live site immediately. Every one is described in more detail above.

FixWhy nowEffort
Confirm where the latest backup is and how old it isNothing inside WordPress shows a backup. A written answer protects everyone before any change, big or small.Minutes
Point SPF straight at Google Workspace, turn on DKIM, add a DMARC recordProtects quote replies and business email from spoofing and filtering; the current SPF sits at its lookup limit.Under an hour in DNS and Google Admin
Share Search Console and GA4 with Local Howl (read-only)Replaces the Semrush estimates in this audit with Google's own numbers, and sets the baseline for any change.Minutes
Put Scottsdale in the homepage title, headline and introThe homepage carries the map-pack traffic and says "Arizona". 28 of the 35 searches we track say Scottsdale, and the other 7 say Paradise Valley. None say Arizona.Under an hour
Close the regex, the nested logo link and the unclosed mobile-header div in functions.phpA PHP warning and invalid HTML on every page.Under an hour
Point the AMPV error-log panel at this site's own logSo warnings like the regex one show up where someone will see them.Minutes
Fix the service and city page schema stubClears the schema errors on 42 pages. The fix is the @type and an @id reference to the homepage record.An hour or two
Apply the 8 pending plugin updates; remove inactive plugins and themesSecurity and compatibility.An hour, after a backup
Take down the October "spring sale" banner and the lorem ipsum and "Hello world!" pagesVisible to customers and to Google.Minutes

Effort is our estimate for someone who already knows this site. Doing these now does not change the case for a rebuild; it makes the live site safer and better measured while the new one is built.

What we could not see

This audit uses everything we could reach from the outside, our own dashboard and the WordPress admin. Two important sources were not available.

We do not have access to Google Analytics or Google Search Console for paradisegreens.com. The site does load a Google Tag Manager container (GTM-WK8HBR8R), but we cannot see what it reports, and the SEO plugin's Analytics module was never connected to Google. So the traffic numbers in this audit are Semrush estimates, and the speed numbers are lab tests, not real visitors.

With access, we could replace estimates with Google's own numbers and go further:

What we need: read access for Local Howl (Viewer on GA4 property G-Z3W8YLS2XR, Restricted or Full user on the Search Console property). The domain is already verified in Search Console, so whoever owns it can add us in a couple of minutes. Nothing is changed by read access.

Sources and method

SourceDateWhat it covers
Semrush Site Audit (full report + per-page export)Oct 15, 2026815 URLs, mobile crawler, JS rendering off. Site Health 78%, AI Search Health 74%, 60 errors, 2,068 warnings.
Semrush Organic Pages (US)Oct 14, 2026121 ranking URLs, 923 estimated monthly visits, 1,471 keywords.
Semrush Domain OverviewOct 15, 2026Traffic, position distribution, competitors, backlinks.
Google Rich Results TestOct 15, 2026, 6:47 PM/artificial-living-walls/: detected Local business with 4 missing fields.
Live crawl by Local HowlOct 15, 2026Redirects, robots.txt, sitemaps, meta robots, schema on every page type, on-page structure, city page text similarity, blog inventory via the WordPress REST API, image sizes.
Lighthouse (lab)Oct 15 and 16, 2026Home, /putting-greens/, /phoenix-az/, /scottsdale-az/, /pet-runs/, mobile, three runs. Reported as ranges; LCP is the stable measure. PageSpeed Insights was over its daily quota, so there is no field data.
Local Howl dashboardMar 2025 to Oct 2026Google Business Profile monthly insights, Local Falcon map-grid scans: 35 tracked keywords, all baselined Aug 28; the 5 primary Scottsdale terms re-scanned Sep 10 and Oct 5, reviews, AI answer mentions (Oct 1).
WordPress admin (read-only)Oct 16, 2026Plugins, Site Health, Rank Math modules and Local SEO settings, Redirection rules (all 1,593, targets checked), UpdraftPlus, RunCache, content counts. No settings were changed.
Competitor benchmarkOct 16, 20269 competitor sites plus Paradise: homepage title and H1, sitemap size by page type, schema, platform, Lighthouse mobile, llms.txt, reviews shown on site.
Migration mapOct 16, 2026All 462 published posts, pages and products from the WordPress REST API, joined to Semrush traffic and keywords.
Theme sourceOct 15, 2026functions.php of the AmpedPress child theme, as shared with us.

Semrush traffic numbers are estimates, best used for comparing pages and trends. We do not have access to Google Analytics or Search Console for this site; see What we could not see.