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.
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.
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.
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.
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.
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.
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.
Claude names the site as its source
Google AI Mode, on both target commercial queries
And the blog owns the research query that feeds them
Measured in Google’s own reporting — with a caveat worth stating
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
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.
- 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
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.
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.
// One entity, one node — referenced, never redeclared
{
"@type": "TouristTrip",
"provider": { "@id": "#organization" },
"offers": { "@type": "Offer", … }
}
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.
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.
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.
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:
— 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:
| Crawler | What it does | On this site | Block 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.
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.
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
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 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
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.