Cited by ChatGPT, Claude and Google AI. Built without a single backlink.

A food-tour operator nobody could find. Eight months of technical SEO, structured data and site architecture later, three independent AI systems recommend it by name.

Technical SEO AI search visibility (GEO/AEO) Structured data Organic growth
chatgpt.com Real result
theshiva AI visibility case study: ChatGPT ranking a client tour page first — "Best overall" — in Rome, desktop view
ChatGPT, asked for the best private vegetarian food tour in Rome: this client ranks first — above GetYourGuide.

The brief

A small food-tour operator in Rome. Genuinely good tours, real reviews, real guides — and a WordPress site nobody could find.

A page builder generating render-blocking CSS on every page. A booking widget loading twice. Hosting that couldn’t carry either. Category pages missing from the sitemap entirely.

Eight months later, ask ChatGPT, Claude or Google’s AI Mode for the best private vegetarian food tour in Rome and they all name the same operator.

This is a case study in AI search visibility built the unglamorous way: crawl, render, structured data, internal linking and speed. No links were bought. No ads were run. No agency was involved.

The outcome, first

Volume nearly doubled — and the customers got more valuable, not less

Percentages and method only throughout this page. No raw booking, revenue or guest figures — that’s the client’s data, not mine to publish.

+89%Bookings
+115%Revenue
+129%Guests
+14%Avg. booking value

Jan–Aug 2025 vs Jan–Aug 2026.

That last tile is the one I’d point at. Average booking value rose while volume nearly doubled. Normally you trade one against the other — more traffic, cheaper customers. Better-qualified traffic means you don’t have to.

★ The tour that had never sold

One tour had taken no bookings at all in the previous year. Not a few. None.

Its page was rebuilt from scratch. It started converting. Google AI Mode now cites it by name.

Seven positions of average rank, gained without a single link

  • Clicks +29%
  • Impressions +30%
  • Average position 20.4 → 13.3

One number I’m not going to dress up: click-through rate stayed flat at 0.8%. Impressions grew faster than clicks — which is what happens when you win visibility across a lot of new upper-funnel queries. It’s the honest read of the data, and it’s the next thing on the list.

search.google.com/search-console Real result
theshiva SEO case study: Search Console data showing organic clicks up 29% and impressions up 30% after a technical SEO rebuild
Google Search Console, two like-for-like periods. Raw counts redacted; percentage deltas are Google’s own.

People didn’t just arrive. They stayed and read.

  • Sessions +26%
  • New users +32%
  • On-site engagement events +121%

Sessions grew a quarter. Engagement events more than doubled — itineraries opened, FAQs expanded, booking steps reached. Traffic growth and engagement growth at those different rates is the signal that the right people started arriving.

analytics.google.com Real result
theshiva SEO case study: GA4 data showing 26% session growth and a 121% increase in on-site engagement events
GA4, same comparison period. Raw counts redacted; percentage deltas are GA4’s own.

The differentiator

Three independent AI systems. Three separate indexes. The same recommendation.

This is the part I didn’t expect to be able to screenshot.

ChatGPT puts it above the OTAs

Asked for the best private vegetarian food tour in Rome, ChatGPT returns this operator at number one — ahead of a GetYourGuide listing in the same answer.

What matters more than the ranking is where the detail came from. The duration, the neighbourhoods, the specific dishes, the meeting point — all of it lifted from the tour page. The model didn’t summarise a directory listing. It read the source.

chatgpt.com Real result
theshiva AI visibility case study: ChatGPT ranking a client tour page first — "Best overall" — in Rome, desktop view
Ranked first of three, with the map card and the tour detail pulled straight from the rebuilt page.

Claude names the site as its source

claude.ai Real result
theshiva AI visibility case study: Claude citing walkingourmet.com directly as one of two recommended private vegetarian food tours in Rome
Claude returns it as one of two recommended options, citing walkingourmet.com directly. Worth noticing: the competing card alongside it is illustrated with the client’s own photography. When a model builds a picture of “private vegetarian food tour in Rome,” this is the site it draws from — even for someone else’s listing.

Google AI Mode, on both target commercial queries

google.com/search Real result
theshiva AI visibility case study: Google AI Mode citing a client tour page for "vegetarian food tour Rome"
“Vegetarian food tour Rome” — cited alongside GetYourGuide.
google.com/search Real result
theshiva AI visibility case study: Google AI Mode citing a client tour page for "Jewish Ghetto food tour Rome"
“Jewish Ghetto food tour Rome” — same result, second query.
Three systems agreeing matters more than any one of them alone. A single citation can be a quirk of one model’s training data. Three, across independently-built indexes, is the site itself being legible.

And the blog owns the research query that feeds them

google.com/search Real result
theshiva AI visibility case study: Google featured snippet won for a client vegetarian-food-guide page
Featured snippet ownership on the upper-funnel query travellers search before the commercial one.

Measured in Google’s own reporting — with a caveat worth stating

search.google.com/search-console Real result
theshiva AI visibility case study: Search Console's Generative AI features report showing 13,427 impressions in AI Overviews and AI Mode
Search Console’s Generative AI features report, 16-month view: 13,427 impressions across AI Overviews and AI Mode.

Worth noting what that report does and doesn’t give you: impressions only. No clicks, no CTR, no position, no prompt data. Anyone quoting AI “traffic” from Search Console is quoting something that isn’t there.

The number that changed how I think about this work

analytics.google.com Real result
theshiva AI visibility case study: GA4 traffic acquisition data showing AI Assistant referral traffic engaging at 65.7%, higher than organic search at 57.1%
GA4 traffic acquisition: AI-assistant traffic engages at 65.7%, against 57.1% from organic search. Raw session counts redacted.

People arriving from an AI assistant are more engaged than people arriving from a search result. The model has already pre-qualified them. They land further down the funnel than a searcher does — which reframes AI visibility from a vanity metric into an acquisition channel.

analytics.google.com Real result
theshiva AI visibility case study: GA4 user acquisition data showing the AI Assistant channel driving new users as a first-touch source
AI assistants as a first-touch acquisition channel, not just a referrer.
analytics.google.com Real result
theshiva AI visibility case study: GA4 traffic sources showing ChatGPT split into distinct tracked channels — organic, referral, and ai-assistant
ChatGPT alone registers as three distinct tracked sources. Percentages marked ~ are estimated from a known total.
★ What none of this used
  • No backlinks. No link building, no digital PR.
  • No paid advertising.
  • No YouTube channel. No Reddit presence. No social media of any kind.
  • No agency team. One person.

Direct competitors have most or all of these. Everything above came from site architecture, content quality, structured data, internal linking and page speed.

Where it began

What I inherited: a site neither search engines nor AI could read

Three separate failures, stacked on top of each other. Each one would have capped the others.

01

Slow for structural reasons

  • A page builder generating render-blocking CSS on every page
  • Underpowered hosting, caching that barely functioned
  • Images with no compression, no responsive delivery, no CDN
  • The booking widget — heavy, render-blocking, live API calls — loading twice on the same page
  • Core Web Vitals failing as the inevitable result

02

Every page an island

  • No topical clusters, no meaningful relationships between pages
  • Blog URLs with no logical structure
  • No categories. No author attribution.
  • Category pages missing from the sitemap entirely — unindexed, invisible
  • Redirect chains, canonical conflicts, duplicate indexed URLs

03

Content that answered nothing

  • Thin pages with no itinerary, no dietary detail, no practical information
  • Pricing displayed with no explanation, so an honest number read as a bait-and-switch
✓ What wasn’t broken

The tours. The reviews. The guides. The business. The product was good.

The problem was discoverability and presentation, not quality. Diagnosing that correctly is what kept this from becoming an eight-month rebuild of things that already worked.

SEO strategy & site architecture

With no backlinks to work with, internal linking had to do the entire job

This is where the “no backlinks” claim gets its mechanism — the same site-architecture work I sell as the 6-month SEO strategy.

Turn a pile of pages into a structure

  • Blog URLs restructured into a logical, crawlable hierarchy
  • Categories introduced where none existed
  • Author attribution and author pages added
  • Topical hubs built — food, beer, history, nature, workshops
  • Clusters defined beneath each hub

Entity-first, not keyword-first

The old approach was exact-match keywords repeated across thin pages. The new one describes what things are and how they relate — tours, neighbourhoods, dishes, dietary categories, guides.

Search engines stopped matching strings a long time ago. AI systems never did it at all.

Internal links as authority flow

Informational content → commercial pages → booking. Contextual, entity-based anchors, nothing generic.

With no external links to distribute authority, every article was built to strengthen a specific money page — deliberately, page by page.

The audience was in the wrong country

The site was competing in Italian search. The customers were American.

Competitor research was rebuilt on US SERPs, and content written for how US travellers plan a trip to Rome — not how Italians describe their own city.

One content standard, applied to every page on the site

Original photography, never stock · a real itinerary · practical detail a traveller needs · dietary information · FAQs answering genuine questions · internal links · one clear booking path. Plus titles, meta descriptions, heading hierarchy, image alt text, semantic coverage and entity mentions — not a one-time pass, a standard.

Technical SEO

Most sites have schema. Almost none have a schema architecture.

Nothing gets published into a structure that can’t be crawled

Category pages weren’t in the sitemap and weren’t indexed. Redirect chains were absorbing authority. Canonical conflicts were splitting it. Duplicate URLs were competing with each other. Found with Screaming Frog crawls and Search Console’s coverage reporting, cross-checked against Ahrefs and Semrush — and all of it cleaned up before anything new went live.

A plugin outputs blocks. An architecture describes one coherent entity.

What determines whether a machine understands your business is whether those blocks describe one coherent entity — or eight disconnected fragments each claiming to be the root of the page. Every block here is JSON-LD, written and validated by hand. That’s the reason it holds together.

✕ Stacked — what a plugin gives you

Organization

Organization (theme)

LocalBusiness (plugin)

Product (widget)

AggregateRating

Five parallel blocks, no stated relationship. Validates cleanly. Reads as several different businesses.

✓ Nested — what was built here

Organization #organization

TouristTrip — provider: @id

Offer → #organization

AggregateRating — itemReviewed: @id → TouristTrip

One canonical node per real-world thing. Everything else references it by @id.

  • Nesting, not stacking. Types built inside each other to express real relationships — an offer belonging to a tour, a tour belonging to an organisation, a rating attached to the thing it actually rates.
  • One entity, one node. Each real-world thing defined once and referenced by @id everywhere else. This is the difference between a machine understanding “this is the same business across 50 pages” and reading it as fifty similar businesses.
  • Deduplication. A theme, a page builder and a booking widget will each happily emit their own version of the same entity. The result validates and still misleads. Finding and removing those conflicts is invisible work that changes how the whole site is understood.
Organization LocalBusiness TouristTrip Product FAQPage BlogPosting Review AggregateRating BreadcrumbList ItemList
// One entity, one node — referenced, never redeclared
{
  "@type": "TouristTrip",
  "provider": { "@id": "#organization" },
  "offers":   { "@type": "Offer", … }
}
search.google.com/test/rich-results Real result
theshiva structured data case study: Google Rich Results Test showing 13 valid structured data items on a client tour page
13 valid structured data items on a single tour page, confirmed by Google’s Rich Results Test. The list is the least interesting part — how they connect is the work.

The pricing fix that wasn’t an SEO fix

The site advertised a “from” price. A solo traveller reaching the booking step saw substantially more. Nothing was wrong with the price — these are private tours, the per-person rate falls as the group grows, and the higher figure is simply what a private tour for one person costs.

The problem was that nobody had ever explained it. So an honest price looked like a bait-and-switch, at the precise moment someone was deciding whether to book. Fixing it meant rewriting the pricing messaging and reflecting the pricing logic properly in the structured data. Explained rather than hidden, “it gets cheaper per person as your group grows” stops being a confusion and becomes a reason to bring friends.

That’s a conversion fix that surfaced during technical work — and it only surfaces if you understand the business model, not just the markup.

Diagnosing a loss, not just reporting the wins

One article on ancient Roman cuisine lost clicks after a content update, and its position dropped. I traced it back through the content changes, the shift in search intent and the structural edits, rather than waiting to see whether it recovered on its own.

Every case study shows the wins. The actual job is noticing the losses early enough to do something about them.

Method, not results

How a page earns a citation from ChatGPT, Claude and Google AI Mode

None of the citations at the top of this page were an accident. Here’s what produced them.

AI systems don’t retrieve — they read, summarise, and decide what to repeat

Traditional SEO optimises to be retrieved. That changes what a good page looks like: it has to resolve a question completely and unambiguously, in language a model can lift without needing to interpret it.

Machines reason about relationships. Keywords give them nothing to reason with.

Every meaningful thing on the site — a tour, a neighbourhood, a dish, a dietary category, a guide — defined as an entity, with stated relationships to the others. That’s the entity graph above, doing its second job.

Two schema types here produce nothing in Google. Both were implemented anyway.

A model deciding whether to cite a page is really answering one question: what is this page, and can I trust what it claims? A clean, deduplicated entity graph answers that with confidence. A pile of valid-but-unrelated markup doesn’t. Confidence is what determines whether you get cited or the competitor does.

TouristTrip generates no rich result. No stars, no carousel, nothing visible in the SERP. What it does is describe the trip itself — the route, the stops, the duration, the meeting point — in a structure a machine doesn’t have to infer from prose. When an assistant is planning someone’s three days in Rome, that’s what it reads.

FAQPage hasn’t produced rich results for most sites since Google restricted them in 2023 — they’re largely limited to government and health domains now. Plenty of people removed theirs when the dropdowns disappeared. It stayed here, because it still does the thing that matters: it labels a question as a question and an answer as an answer, unambiguously.

That’s the difference between doing schema for SERP features and doing it for machine comprehension. One of those still works.

Question-shaped content, built from real traveller questions

Is this suitable for vegans. How much walking is involved. What happens if it rains. Can you handle allergies. Who exactly is taking me. Formatted the way an answer engine wants to consume it — because those are the same questions a customer has.

Specificity is what gets quoted — the lesson I’d take from the whole project

When ChatGPT recommended the tour, it quoted the page directly:

“…treating vegetables as the foundation of Roman cuisine rather than an afterthought.”
— quoted verbatim by ChatGPT, from the rebuilt tour page

It quoted that sentence because that sentence was quotable. Specific, concrete, and unlike anything on a competitor’s page. Vague pages don’t get cited — not because a model dislikes them, but because there’s nothing in them worth repeating. Every generic sentence is a sentence that can’t be your citation.

EEAT signals a machine can actually verify

Named guides with real faces and real bios. Genuine reviews. Author attribution. Original photography. Attribution is increasingly what separates a claim a machine will repeat from one it won’t.

The crawler distinction almost nobody makes — and it takes two minutes to check

GPTBot is blocked on this site. ClaudeBot is blocked. ChatGPT still recommends it first. Claude still cites four of its pages. Those are different crawlers doing different jobs:

CrawlerWhat it doesOn this siteBlock it and…
GPTBot
ClaudeBot
Training. Collects content to build the model itself. Blocked Your content stays out of the training set. Citations unaffected.
OAI-SearchBot
Claude-SearchBot
PerplexityBot
Retrieval. Builds the index a model searches when someone asks a live question. Allowed You vanish from the answer entirely.
Google-Extended Neither. A training opt-out token, not a crawler. It doesn’t fetch anything. N/A Nothing changes in Search or AI Mode.

Most people don’t know there’s a difference. They read that AI is scraping the web, block everything AI-shaped, and go invisible without ever connecting the two.

Part of this work was verifying that the site’s managed AI-bot rules hadn’t caught the retrieval crawlers along with the training ones. They hadn’t. Had they, none of the citations above would exist.

And none of it works on a slow site

Everything above depends on the page being reliably crawlable, renderable and fast. Which is why the performance work came first.

Design & conversion

Search intent gets you found. Objection handling gets you booked.

The same page, in three versions — and the progression is the whole method in one sequence.

01 theshiva web design case study: the original tour page before the SEO and content rebuild — thin content, no structure

Phase one

Answered nothing

Eight bullet points and a photograph. No schema, no booking flow, no answers.

02 theshiva web design case study: a tour page after the first SEO-focused rebuild, with itinerary, FAQs and embedded booking

Phase two

Answered what people search for

Real itinerary, FAQs, guide profiles, booking embedded where intent peaks.

03 theshiva web design case study: the final, fully conversion-optimized tour page — dietary detail, guide profiles, clear booking path

Phase three

Answered what people worry about

Dietary specifics, walking distance, weather, group size, exactly who’s taking you.

Three generations of the same tour-page template — before the rebuild, after the SEO pass, and after the conversion pass.

Why direct booking was worth designing for

Booking flow, trust signals, guide profiles, dietary detail, pricing clarity, CTA placement — plus TripAdvisor review integration surfaced where it affects the decision, not buried in a footer. Every booking through GetYourGuide or Viator carries a commission. The site’s job is to be the better place to book.

The current phase: turning existing traffic into revenue

The work didn’t stop at visibility. Pages are now being optimised for conversion rate as well as discovery — turning the traffic that already exists into bookings, rather than only increasing the amount of it.

More visitors is an SEO goal. More revenue from the visitors you have is a growth one.

Performance & infrastructure

A page builder and a live booking engine stopped being an excuse

Speed first. Everything else sits downstream of whether the page actually loads.

The code was fixed before anything was migrated

  • Eliminated render-blocking JavaScript, deferred non-critical scripts
  • Reduced the page builder’s CSS overhead, removed unused CSS
  • Image compression, responsive sizing, CDN delivery via ShortPixel
  • Lazy loading and Intersection Observer deferral on the booking widget
  • Removed the duplicate calendar instance loading on the same page
98Desktop performance
1.0sLargest Contentful Paint (good < 2.5s)
0.9sFirst Contentful Paint
100Best Practices
pagespeed.web.dev Real result
theshiva performance case study: PageSpeed Insights desktop score of 98 after a full site performance rebuild
Desktop. Measured with Lighthouse and PageSpeed Insights throughout.
pagespeed.web.dev Real result
theshiva performance case study: PageSpeed Insights mobile score of 72 after a full site performance rebuild
Mobile: 72. The honest number — the booking widget’s live API calls are the remaining ceiling, and that’s the next piece of work.

Then — and only then — the infrastructure moved

  • SiteGround → Cloudways (DigitalOcean, Amsterdam)
  • Cloudflare for DNS, edge caching and SSL
  • Fixed an Error 526 SSL handshake issue in the process
  • Left email where it was, because there was no reason to move it
The order mattered. Migrating a slow site gives you a faster slow site.

The argument

This is a method, not a lucky result

No backlinks. No advertising. No social media. No team.

The visibility came from architecture, content quality, structured data, internal linking and speed — which means it’s reproducible. Nothing here depended on a budget or a lucky placement.

The technical work was never the point. Crawl, render, schema, performance, migration — those are mechanisms. The point was a small business in Rome taking substantially more bookings than it did last year.

And when ChatGPT, Claude and Google all started recommending it by name, that wasn’t a separate achievement. It was the same work, showing up somewhere new — in three places at once, because the site had been made legible rather than optimised for any one of them.

Next step

SEO helps people find you. Organic growth gives them a reason to choose you.

Working on a catalogue site — tours, products, listings — that’s invisible in AI answers? That’s the AI visibility audit →

I’m Shiva Emamverdy Malek, an organic growth and technical SEO consultant based in Porto, Portugal — currently open to senior organic growth, technical SEO and AI search roles across Europe, remote or hybrid, alongside consulting work. Get in touch or find me on LinkedIn.