---
title: "Put a Client Site Behind an AEO Edge Proxy—and Stop Counting Fake Bots"
description: "A hands-on agency walkthrough for routing a client site through an edge proxy, serving crawler rules and local schema, verifying AI bot traffic, and rolling back safely."
url: "https://groas.com/post/tutorial-put-a-client-domain-behind-an-a"
image: "https://pub-87da24ecbbfc4c3bad6875f3aa013712.r2.dev/generated-images/66f02b45-e4a7-4647-9adb-f92bf9236e45.png"
published: "2026-10-10T05:37:02.779Z"
modified: "2026-10-10T05:37:02.848Z"
---

October 10, 2026 · 10 min read

# Put a Client Site Behind an AEO Edge Proxy—and Stop Counting Fake Bots

[Alexander PerelmanHead Of Product @ groas](https://groas.com/author/alexander-perelman)[LinkedIn](https://www.linkedin.com/in/alexander-433793253/)

![A nightclub doorman shines a flashlight on a queue of people in cardboard robot masks with "BOT" badges, letting through only one with a real ID.](https://pub-87da24ecbbfc4c3bad6875f3aa013712.r2.dev/generated-images/66f02b45-e4a7-4647-9adb-f92bf9236e45.png)

In this article

1. [What you will have when you finish](#what-you-will-have-when-you-finish)
2. [Before you start: ask for four things, not a WordPress login](#before-you-start-ask-for-four-things-not-a-wordpress-login)
3. [Step 1: Save the DNS baseline before editing anything](#step-1-save-the-dns-baseline-before-editing-anything)
4. [Step 2: Connect the edge, then switch the web records](#step-2-connect-the-edge-then-switch-the-web-records)
5. [Step 3: Serve crawler rules without blocking retrieval](#step-3-serve-crawler-rules-without-blocking-retrieval)
6. [Step 4: Inject local schema only where it matches the page](#step-4-inject-local-schema-only-where-it-matches-the-page)
7. [Step 5: Verify crawlers before calling them AI traffic](#step-5-verify-crawlers-before-calling-them-ai-traffic)
8. [Step 6: Hand off a report the client can use](#step-6-hand-off-a-report-the-client-can-use)
9. [Rollback: restore the saved route, then verify the origin](#rollback-restore-the-saved-route-then-verify-the-origin)

A client’s developer does not need to touch the CMS for your agency to change what crawlers receive. With DNS access and a configured edge proxy, you can route a client site through the edge in an afternoon. The harder part comes after launch: **a bot user-agent is not proof that an AI engine visited.** On our own edge, `/robots.txt` took 13,835 bot-UA hits; only 3,419 were verified.

That distinction matters if you sell [white label local SEO](https://groas.com/for-agencies) or Answer Engine Optimization. The edge can serve crawler instructions, adjust response headers, and inject structured data before a request reaches the origin. It can also show you which apparent crawler visits deserve a place in the client report. This walkthrough covers both jobs. For more on the architecture, see [how the underlying edge proxy setup works](https://groas.com/post/how-an-edge-proxy-lets-an-agency-fix-15).

## What you will have when you finish

You will have a client domain routed through an edge proxy without a CMS edit, with HTTPS and origin routing checked; edge-served `/robots.txt` instructions and a reachable sitemap; `LocalBusiness` structured data on the intended location pages; and a report that separates **raw bot-UA hits from verified crawler fetches**. You will also have the original DNS records ready if you need to roll back.

This assumes the edge service can accept the client’s domain, provision a certificate, reach the existing origin, and serve or modify responses. DNS access alone cannot make an unconfigured proxy do those things.

## Before you start: ask for four things, not a WordPress login

Send the client this checklist before touching the zone:

- **Authoritative DNS access:** A role that can edit the records for the domain, whether the provider is Cloudflare, GoDaddy, Namecheap, AWS Route 53, or another host.
- **Origin TLS status:** Confirmation that the current host serves HTTPS and what certificate arrangement it uses.
- **Existing proxy status:** Confirmation of any CDN, Cloudflare configuration, or managed-host proxy already in the request path. Do not stack another proxy blindly.
- **A TTL change:** Ask for the root (`@`) and `www` record TTLs to be set to `300` seconds twenty-four hours ahead of the switch, if the provider permits it. A short TTL helps rollback, but it does not guarantee every resolver updates in five minutes.

Do not request CMS credentials, FTP keys, or SSH access for a DNS-and-edge job. They widen the scope without solving the routing problem.

![Diagram of DNS routing through an edge proxy before requests reach the origin server.](https://pub-87da24ecbbfc4c3bad6875f3aa013712.r2.dev/generated-images/dbb3fde3-8ab9-4716-aad3-731226cc3070.png)

## Step 1: Save the DNS baseline before editing anything

**Action:** Export the zone from the authoritative DNS console. Then query the live records from a terminal:

```bash
dig +noall +answer A example.com
dig +noall +answer AAAA example.com
dig +noall +answer MX example.com
dig +noall +answer TXT example.com
```

Record the original `@` and `www` values, their record types, and the origin address the proxy will use. Note any other records you need to leave alone. The root `A` answer is useful, but check whether it points to the host itself or an existing proxy before treating it as an origin target.

**Expected result:** You have both a usable upstream target and an exact record-by-record rollback plan. Mail and verification records remain untouched.

**Common mistake:** Replacing a whole zone from memory when you meant to change web routing. Another is putting an ordinary `CNAME` at the apex without checking provider support. If the edge supplies a hostname instead of an IP, confirm that the DNS host supports **CNAME flattening** or **ALIAS/ANAME** records for `@`. The [custom-domain routing explanation](https://approximated.app/blog/custom-domains-for-saas-guide/) is useful background, but your provider’s supported record types decide the move.

## Step 2: Connect the edge, then switch the web records

**Action:** In the edge management console, add the client’s apex and required subdomains as managed routes. Set the upstream to the origin target saved in Step 1. Before editing DNS, confirm these settings:

1. **Original `Host` header preserved:** The origin must receive the client’s domain, not an internal worker hostname.
2. **Upstream SNI set for the origin connection:** The TLS handshake must reach the intended host.
3. **HTTPS to origin enabled:** Use **Full** or **Full (Strict)** where those are the available modes, rather than **Flexible**.
4. **Edge certificate ready:** The client domain must be covered before you send live traffic to it.

Now change only the intended `@` and `www` web records to the edge target, using the record type the DNS provider supports. Leave the saved origin configuration in place upstream.

Flexible mode is a particularly effective way to manufacture `ERR_TOO_MANY_REDIRECTS`: the browser reaches the edge over HTTPS, the edge asks an HTTPS-enforcing origin over HTTP, and the origin redirects the request back to HTTPS. [Cloudflare’s redirect troubleshooting documentation](https://developers.cloudflare.com/ssl/troubleshooting/too-many-redirects/) describes that failure mode. Use TLS to the origin instead.

![Ink cartoon of a marketer facing an ERR_TOO_MANY_REDIRECTS error while an edge proxy and origin server point fingers in a loop.](https://pub-87da24ecbbfc4c3bad6875f3aa013712.r2.dev/generated-images/ba19fcd2-fa35-4f7b-91f4-946f3b0a9523.png)

Run the checks from a terminal rather than trusting a cached browser tab:

```bash
curl -s -o /dev/null -w '%{http_code} -> %{redirect_url}\n' http://example.com
curl -Iv https://example.com 2>&1 | grep -E 'HTTP/|server:|x-edge|SSL certificate verify ok'
```

**Expected result:** HTTP redirects once to HTTPS. The HTTPS request completes with a valid certificate and the intended site, with an edge-identifying header if your provider supplies one. Do not insist on a particular HTTP version or header name; those vary by setup.

**Common mistake:** Treating a default-host page or a redirect loop as propagation noise. Check the upstream target, `Host` header, SNI, and TLS mode before moving on. A site that loads the wrong page is not live merely because it returns `200`.

## Step 3: Serve crawler rules without blocking retrieval

**Action:** Create an exact-match edge route for `/robots.txt` and return this payload. Keep the sitemap reference pointed at the client’s actual sitemap; the example below uses the sitemap path already in this walkthrough.

```txt
User-agent: GPTBot
Disallow: /

User-agent: ClaudeBot
Disallow: /

User-agent: OAI-SearchBot
Allow: /

User-agent: Claude-SearchBot
Allow: /

User-agent: PerplexityBot
Allow: /

User-agent: ChatGPT-User
Allow: /

User-agent: Claude-User
Allow: /

Sitemap: https://example.com/sitemap.xml
```

This separates **training crawlers from search-retrieval and user-prompt fetchers**. `GPTBot` and `ClaudeBot` are listed here as disallowed training crawlers; the search and user agents are allowed. If the client wants a different policy, decide that before publishing, not by blocking every user-agent containing `bot`. For engine-specific variations, use the [crawler-rules swipe file](https://groas.com/post/the-ai-crawler-swipe-file-copy-paste-rob).

Check that the edge returns the intended text for `/robots.txt`, and confirm the advertised sitemap loads:

```bash
curl -i https://example.com/sitemap.xml
```

**Expected result:** The robots response contains the discrete rules, and the sitemap reference resolves to a real sitemap rather than an edge error or redirect loop.

**Common mistake:** Pasting `User-agent: *` with `Disallow: /` as a precaution, then wondering why allowed retrieval is not happening. A robots directive expresses a crawl policy; it is not authentication. The telemetry check in Step 5 is how you avoid mistaking an agent’s label for its identity.

![Infographic separating AI training crawlers, search indexers, and live user-prompt fetchers by crawl policy.](https://pub-87da24ecbbfc4c3bad6875f3aa013712.r2.dev/generated-images/6c361876-811a-44a9-94f2-72c6321726d8.png)

## Step 4: Inject local schema only where it matches the page

**Action:** In the edge HTML rewrite rule, target the intended location pages and insert a JSON-LD block in the `head`. Use the client’s actual business details and match the relevant Google Business Profile and visible page content. Here is the sample block to adapt:

```html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "PlumbingService",
  "name": "Austin Emergency Plumbing",
  "image": "https://example.com/images/logo.png",
  "telephone": "+1-512-555-0199",
  "url": "https://example.com/locations/north-austin",
  "priceRange": "$$",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "10404 N Interstate 35",
    "addressLocality": "Austin",
    "addressRegion": "TX",
    "postalCode": "78753",
    "addressCountry": "US"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 30.3667,
    "longitude": -97.6944
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
      "opens": "00:00",
      "closes": "23:59"
    }
  ]
}
</script>
```

**Expected result:** The returned HTML for each selected location page contains one appropriate block with the right name, address, phone, coordinates, and hours. The origin can continue serving its regular markup while the edge adds the data. [Edge HTML rewriting patterns](https://blckalpaca.at/en/knowledge-base/seo-geo/technical-seo/edge-seo-cdn-level-optimization-with-cloudflare-workers) show how this can work without a CMS plugin.

**Common mistake:** Shipping the sample business, coordinates, or all-day hours unchanged. Another is injecting a second, conflicting block into a page that already has schema. Check the returned HTML and the client’s actual details first. **Schema describes the business; it does not fix contradictory business information.** Matching name, address, and phone across the page and business profile is the practical starting point for local entity clarity, as the [local schema guide](https://avision.org/localedge-post/local-business-schema-markup-2026-complete-technical-guide/) explains.

## Step 5: Verify crawlers before calling them AI traffic

**Action:** In the edge log, keep the request path, user-agent, source IP, and verification status together. For each claimed AI crawler, check the source against the engine’s published IP ranges or its supported forward-confirmed reverse DNS procedure. OpenAI’s published lists include `openai.com/gptbot.json`, `openai.com/searchbot.json`, and `openai.com/chatgpt-user.json`; Anthropic lists `claude.com/crawling/bots.json`, and Perplexity lists `perplexity.com/perplexitybot.json`. The [AI crawler IP infrastructure overview](https://www.ip-trackers.com/blog/ai-company-ip-ranges) gives the background.

For a manual reverse-DNS check, use the source IP from your log, then look up the hostname returned by the first command:

```bash
dig -x 20.171.206.123 +short
dig searchbot-20-171-206-123.openai.com +short
```

The second line illustrates the forward lookup for a hostname of that form; **use the actual PTR result**, not an assumed hostname. It must resolve back to the originating IP, and its domain must meet that engine’s published verification criteria. A matching forward lookup alone does not establish that a request came from the engine.

**Expected result:** Your report has separate counts for total bot-UA attempts, verified search-indexer fetches, and verified live user-prompt fetches. Do not label a search-indexer request a live-answer fetch just because both came from an AI company.

**Common mistake:** Exporting raw `User-Agent` counts as engine interest. Anyone sending an HTTP request can write `ChatGPT-User` in that header. On our production edge, `/robots.txt` recorded **13,835 bot-UA hits over thirty days, but only 3,419 passed verification**. The remaining 10,416 were unverified, not 10,416 proven spoofs. That is still more than three-quarters of the raw count you should not present as confirmed engine activity. Our [closer look at claimed AI bot hits that failed verification](https://groas.com/post/76-of-our-ai-bot-traffic-couldn-t-be-ver) shows why this distinction belongs in the report, not in a footnote.

![Graphic contrasting a large group of unverified bot-UA requests with a smaller group of verified AI crawler hits.](https://pub-87da24ecbbfc4c3bad6875f3aa013712.r2.dev/generated-images/483d7a51-9409-4951-b285-bfe280cd1aa0.png)

## Step 6: Hand off a report the client can use

**Action:** Build the first client-facing summary from verified activity and business outcomes, while retaining raw logs for diagnosis:

- **Show the client:** Verified crawler and on-demand fetch activity; structured-data validation status; observed AI search citations where you can substantiate them; and qualified pipeline or booked calls where those outcomes are tracked.
- **Keep for operations:** Raw user-agent attempts, the 10,416 unverified hits in the example above, edge execution latency, cache behavior, and DNS records.

If your agency uses [groas for agencies](https://groas.com/for-agencies), keep the same distinction between edge execution and the branded summary. A client needs to know what was deployed and what happened, not read a reverse-DNS worksheet.

**Expected result:** The client can distinguish confirmed crawler activity from observed citations and downstream business results. Those are different measures; none stands in for another.

**Common mistake:** Reporting a spike in unverified bot-UA hits as a spike in AI visits. The chart may look better. It will be harder to explain when it produces no customer lead.

## Rollback: restore the saved route, then verify the origin

**Action:** If the edge breaks routing or serves the wrong response, return to the authoritative DNS console and restore the original `@` and `www` records exactly as saved in Step 1. Do not turn an original `www` hostname record into an origin `A` record by habit. Keep the edge configuration available for diagnosis, but stop directing the affected web traffic through it.

After the change, check DNS resolution and the HTTPS response:

```bash
dig +noall +answer A example.com
dig +noall +answer AAAA example.com
curl -Iv https://example.com
```

**Expected result:** Resolvers that have refreshed return the saved destination, and the site serves the intended origin response without edge-only headers. A `300`-second TTL makes this easier to reverse; caches and resolver behavior can still delay what some visitors see.

**Common mistake:** Declaring rollback complete as soon as the DNS console saves. Verify from outside the console, then keep checking until the site behaves correctly. If the saved address was itself an existing CDN or managed proxy, the expected result is the _original route_, not necessarily a direct connection to a server.

Once the route, crawler rules, and schema check out, make one change first: **replace raw bot-UA totals in the client report with verified fetch counts.** The edge work is useful. Reporting what the edge can actually confirm is what keeps it honest.

## Frequently Asked Questions

### Can an agency route a client site through an edge proxy without getting CMS or SSH access?

Yes. With authoritative DNS access and an already configured edge proxy, you can route a client site through the edge without a CMS edit. CMS credentials, FTP keys, or SSH access are not needed for a DNS-and-edge job and only widen the scope.

### What should I ask a client for before moving their site behind an edge proxy?

Ask for authoritative DNS access, confirmation of the origin's HTTPS and certificate setup, confirmation of any existing CDN or managed-host proxy in the request path, and a TTL of 300 seconds on the root and www records twenty-four hours before the switch. Do not request CMS, FTP, or SSH credentials.

### Why should I export DNS records before switching a site to an edge proxy?

Exporting the zone and querying the live records gives you the original root and www values, record types, and origin address. That baseline is both the upstream target for the proxy and an exact record-by-record rollback plan, while leaving mail and verification records untouched.

### Why does Flexible TLS mode cause ERR_TOO_MANY_REDIRECTS when using an edge proxy?

Flexible mode makes the edge connect to an HTTPS-enforcing origin over HTTP, so the origin redirects the request back to HTTPS in a loop, producing ERR_TOO_MANY_REDIRECTS. Use Full or Full (Strict) TLS to the origin instead, and also preserve the original Host header and set upstream SNI correctly.

### How should robots.txt be set up to allow AI search bots but block training crawlers?

Create an exact-match edge route for /robots.txt that disallows GPTBot and ClaudeBot as training crawlers, while allowing OAI-SearchBot, Claude-SearchBot, PerplexityBot, ChatGPT-User, and Claude-User. Include a sitemap reference pointing to the client's actual sitemap, and decide the policy deliberately rather than blocking every user-agent containing bot.

### Can I add LocalBusiness schema to a client site without editing the CMS?

Yes. An edge HTML rewrite rule can insert a JSON-LD block into the head of the intended location pages while the origin continues serving its regular markup. Use the client's real business details matching its Google Business Profile and visible content, and avoid injecting a second, conflicting block into pages that already have schema.

### How do I verify that claimed AI crawler traffic is genuine and not spoofed?

Check each request's source IP against the engine's published IP ranges, or run forward-confirmed reverse DNS: resolve the IP to a PTR hostname, then confirm that hostname resolves back to the originating IP and meets the engine's published criteria. Anyone can write ChatGPT-User in a User-Agent header, so a matching user-agent alone proves nothing.

### Why shouldn't raw bot user-agent hits be reported as AI visits in a client report?

Because most are unverified. On the production edge described, /robots.txt took 13,835 bot-UA hits over thirty days but only 3,419 passed verification, leaving 10,416 unverified requests. Reporting raw counts as confirmed engine activity overstates AI interest and will not hold up when it produces no customer leads.

## Pay For Results, Not For Hours

Businesses buy the outcome, agencies resell it, and groas answers for it either way.

[See If You Qualify](https://groas.typeform.com/to/xC1bQNUT)

## Structured data

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://graph.groas.com/entity/groas","name":"groas","url":"https://groas.com/","logo":{"@type":"ImageObject","url":"https://groas.com/icon-512.png","width":512,"height":512},"sameAs":["https://www.linkedin.com/company/groas/"]},{"@type":"WebSite","@id":"https://groas.com/#website","name":"groas","url":"https://groas.com/","inLanguage":"en-US","publisher":{"@id":"https://graph.groas.com/entity/groas"}},{"@type":"WebPage","@id":"https://groas.com/post/tutorial-put-a-client-domain-behind-an-a#webpage","url":"https://groas.com/post/tutorial-put-a-client-domain-behind-an-a","name":"Put a Client Site Behind an AEO Edge Proxy—and Stop Counting Fake Bots","description":"A hands-on agency walkthrough for routing a client site through an edge proxy, serving crawler rules and local schema, verifying AI bot traffic, and rolling back safely.","inLanguage":"en-US","isPartOf":{"@id":"https://groas.com/#website"},"about":{"@id":"https://graph.groas.com/entity/groas"},"primaryImageOfPage":{"@type":"ImageObject","url":"https://pub-87da24ecbbfc4c3bad6875f3aa013712.r2.dev/generated-images/66f02b45-e4a7-4647-9adb-f92bf9236e45.png"},"breadcrumb":{"@id":"https://groas.com/post/tutorial-put-a-client-domain-behind-an-a#breadcrumb"},"dateModified":"2026-10-10T05:37:02.848Z","mainEntity":{"@id":"https://groas.com/post/tutorial-put-a-client-domain-behind-an-a#article"}},{"@type":"BreadcrumbList","@id":"https://groas.com/post/tutorial-put-a-client-domain-behind-an-a#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://groas.com/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https://groas.com/blog"},{"@type":"ListItem","position":3,"name":"Put a Client Site Behind an AEO Edge Proxy—and Stop Counting Fake Bots","item":"https://groas.com/post/tutorial-put-a-client-domain-behind-an-a"}]},{"@type":"BlogPosting","@id":"https://groas.com/post/tutorial-put-a-client-domain-behind-an-a#article","url":"https://groas.com/post/tutorial-put-a-client-domain-behind-an-a","mainEntityOfPage":{"@id":"https://groas.com/post/tutorial-put-a-client-domain-behind-an-a#webpage"},"isPartOf":{"@id":"https://groas.com/blog#blog"},"headline":"Put a Client Site Behind an AEO Edge Proxy—and Stop Counting Fake Bots","description":"A hands-on agency walkthrough for routing a client site through an edge proxy, serving crawler rules and local schema, verifying AI bot traffic, and rolling back safely.","datePublished":"2026-10-10T05:37:02.779Z","dateModified":"2026-10-10T05:37:02.848Z","image":{"@type":"ImageObject","url":"https://pub-87da24ecbbfc4c3bad6875f3aa013712.r2.dev/generated-images/66f02b45-e4a7-4647-9adb-f92bf9236e45.png"},"author":{"@id":"https://groas.com/author/alexander-perelman#person"},"publisher":{"@id":"https://graph.groas.com/entity/groas"},"keywords":"edge, proxy, edge proxy, client, com, origin, client site, example com","wordCount":2041,"inLanguage":"en-US"},{"@type":"Person","@id":"https://groas.com/author/alexander-perelman#person","name":"Alexander Perelman","jobTitle":"Head Of Product @ groas","description":"Ex Goldman Sachs and Ex Stanford Computer Science","image":"https://groas.com/media/blog/4f17cac3a81acc224cc1b2cfab8f94bbc295a3089d13e8421125771ef8d4064f.jpg","worksFor":{"@id":"https://graph.groas.com/entity/groas"},"sameAs":["https://www.linkedin.com/in/alexander-433793253/"]},{"@type":"FAQPage","@id":"https://groas.com/post/tutorial-put-a-client-domain-behind-an-a#faq","mainEntity":[{"@type":"Question","name":"Can an agency route a client site through an edge proxy without getting CMS or SSH access?","acceptedAnswer":{"@type":"Answer","text":"Yes. With authoritative DNS access and an already configured edge proxy, you can route a client site through the edge without a CMS edit. CMS credentials, FTP keys, or SSH access are not needed for a DNS-and-edge job and only widen the scope."}},{"@type":"Question","name":"What should I ask a client for before moving their site behind an edge proxy?","acceptedAnswer":{"@type":"Answer","text":"Ask for authoritative DNS access, confirmation of the origin's HTTPS and certificate setup, confirmation of any existing CDN or managed-host proxy in the request path, and a TTL of 300 seconds on the root and www records twenty-four hours before the switch. Do not request CMS, FTP, or SSH credentials."}},{"@type":"Question","name":"Why should I export DNS records before switching a site to an edge proxy?","acceptedAnswer":{"@type":"Answer","text":"Exporting the zone and querying the live records gives you the original root and www values, record types, and origin address. That baseline is both the upstream target for the proxy and an exact record-by-record rollback plan, while leaving mail and verification records untouched."}},{"@type":"Question","name":"Why does Flexible TLS mode cause ERR_TOO_MANY_REDIRECTS when using an edge proxy?","acceptedAnswer":{"@type":"Answer","text":"Flexible mode makes the edge connect to an HTTPS-enforcing origin over HTTP, so the origin redirects the request back to HTTPS in a loop, producing ERR_TOO_MANY_REDIRECTS. Use Full or Full (Strict) TLS to the origin instead, and also preserve the original Host header and set upstream SNI correctly."}},{"@type":"Question","name":"How should robots.txt be set up to allow AI search bots but block training crawlers?","acceptedAnswer":{"@type":"Answer","text":"Create an exact-match edge route for /robots.txt that disallows GPTBot and ClaudeBot as training crawlers, while allowing OAI-SearchBot, Claude-SearchBot, PerplexityBot, ChatGPT-User, and Claude-User. Include a sitemap reference pointing to the client's actual sitemap, and decide the policy deliberately rather than blocking every user-agent containing bot."}},{"@type":"Question","name":"Can I add LocalBusiness schema to a client site without editing the CMS?","acceptedAnswer":{"@type":"Answer","text":"Yes. An edge HTML rewrite rule can insert a JSON-LD block into the head of the intended location pages while the origin continues serving its regular markup. Use the client's real business details matching its Google Business Profile and visible content, and avoid injecting a second, conflicting block into pages that already have schema."}},{"@type":"Question","name":"How do I verify that claimed AI crawler traffic is genuine and not spoofed?","acceptedAnswer":{"@type":"Answer","text":"Check each request's source IP against the engine's published IP ranges, or run forward-confirmed reverse DNS: resolve the IP to a PTR hostname, then confirm that hostname resolves back to the originating IP and meets the engine's published criteria. Anyone can write ChatGPT-User in a User-Agent header, so a matching user-agent alone proves nothing."}},{"@type":"Question","name":"Why shouldn't raw bot user-agent hits be reported as AI visits in a client report?","acceptedAnswer":{"@type":"Answer","text":"Because most are unverified. On the production edge described, /robots.txt took 13,835 bot-UA hits over thirty days but only 3,419 passed verification, leaving 10,416 unverified requests. Reporting raw counts as confirmed engine activity overstates AI interest and will not hold up when it produces no customer leads."}}]}]}
```
