May 2026AI Search Studies

AI Search for Bike Shops in Amsterdam (2026):The cleanest entity-consensus case in the study

TL;DR: Same playbook, new city. 27 prompts, 5 AI engines, English and Dutch, matched against 228 verified Amsterdam bike shops. The three engine personalities from the Paris yoga study recur identically — but bike shops push more traffic to their own sites: Copilot is 97% shop websites (yoga: 96%), Gemini 72% and Perplexity 71% (yoga: 41% and 52%). Google AI Mode cites google.com URLs back to itself 82% of the time, the highest self-referential share we have measured anywhere. Reddit is ChatGPT’s backbone — 198 citations, the single most-cited domain across the entire study. And unlike Paris yoga, where the #4 studio vanished on two engines, the top tier of Amsterdam bike shops wins on every engine: 12 brands appear on all five.

5
AI engines
27
Prompt templates
228
Shops
EN + NL
Both languages
Read the Report

Executive Summary

The three citation strategies from the Paris yoga study survive the switch to Amsterdam bike shops intact — but the engines push more traffic to shops’ own sites here, and the top tier wins everywhere.

The setup is deliberately identical to the yoga study: one fixed set of prompts, five engines, two languages, two proxy countries, all in a single week — except this time the question was where to buy or fix a bike in Amsterdam. Across 27 prompt templates we collected 378 captures and 3,010 citations, pulled out the shops each answer named with a named-entity-recognition pass, and matched them to a 372-row Apify Google Maps seed (228 with websites).

The headline result of the yoga study generalises — but it generalises sharper. Copilot is 97% shop-website citations (a phone-book engine), Gemini 72%, Perplexity 71% — all higher than their yoga equivalents. ChatGPT learns Amsterdam cycling from Reddit (34% social, with reddit.com alone contributing 198 citations — the single most-cited domain in the entire study). And Google AI Mode cites google.com 82% of the time, the highest self-referential share we have ever measured. The Paris-yoga “Modo problem” — a top studio invisible on two engines — does not recur: Amsterdam’s top tier wins on every engine.

Section 1

Three source strategies, sharper than yoga

For every cited URL we bucketed the source — the shop’s own website, social posts, editorial, a marketplace, a Google SERP, or other. The mix is wildly different per engine, and maps to the same three citation strategies we found in Paris yoga — only here, the entity engines are even more entity-heavy.

source-mix-by-platform-amsterdam-bike-shops

Entity engine

Copilot, Gemini, Perplexity. Cite the shop’s own website directly. Copilot is the extreme — 97% pure shop-domain citations. Gemini and Perplexity sit just behind at 72% and 71%. To win these engines, your own site has to be the canonical answer for your shop name.

Social engine

ChatGPT. 34% of cited URLs are social — overwhelmingly Reddit. Across the four platforms that cite it, reddit.com contributes 198 citations, making it the single most-cited domain in the entire study. ChatGPT learns Amsterdam cycling from r/Amsterdam threads, not trade press.

Self-referential engine

Google AI Mode. 82% of its citations are google.com URLs — the highest self-referential share in the study, higher even than Paris yoga’s 52%. Real source diversity is minimal; the answer is essentially a re-presented Google SERP.

Bike shops have cleaner, more resolvable .nl domains than yoga studios — and the entity engines reward that. Perplexity’s shop-website share jumps from 52% (yoga) to 71% here, and Gemini from 41% to 72%. Whatever “canonical entity” means inside these models, an Amsterdam bike shop with its own .nl is closer to it than a Paris yoga studio with a .com.
Section 2

The Amsterdam bike-shop AI leaderboard

Aggregating mentions across all five engines (chain locations merged), these are the most-cited Amsterdam bike shops. The “Engines” column is the number of the 5 engines that surfaced the shop at all — the breadth signal.

ai-favourite-amsterdam-bike-shops-2026

The bike shops AI recommends most for Amsterdam — scored across ChatGPT, Perplexity, Gemini, Copilot and Google AI Mode combined.

Top 12 Amsterdam bike shops by cross-platform citation score (brand-aggregated).
RankShopScoreEngines
#1Ride Out Amsterdam865 / 5
#2Het Zwarte Fietsenplan825 / 5
#3Wheelrunner705 / 5
#4Kaptein Tweewielers695 / 5
#5020 Amsterdam Bicycles634 / 5
#6Amsterdamse Fietswinkel545 / 5
Cleanest entity consensus in the study. Twelve brands appear on all five engines (Ride Out, Het Zwarte Fietsenplan, Wheelrunner, Kaptein, Amsterdamse Fietswinkel, Echelon Cycle Sport, Damskø, Gregario Cycling Services, BikeFlip, DrBeyk Online, FietsJeroen, Trompton Amsterdam), and the top four all score 5/5. The Paris-yoga Modo blind spot — a #4 studio invisible on two engines — does not recur. Amsterdam’s winners win everywhere.
Section 3

Top cited sources, cross-platform

Aggregating across engines, two patterns emerge. Reddit is the volume outlier — 198 citations, the single most-cited domain in the whole study — but it’s a single domain. The shop sites dominate the breadth ranking: 11 shop domains were cited by all 5 engines.

Most-cited domains across all 5 AI engines, with the bucket they belong to.
EnginesCitesBucketDomain
5 / 571shop websitehetzwartefietsenplan.com
5 / 560shop websiterideout.amsterdam
5 / 555shop websitewheelrunner.cc
5 / 545shop websitekaptein.cc
5 / 535shop websiteamsterdamsefietswinkel.nl
4 / 5198socialreddit.com

The five engines, side by side

Copilot

97% shop websites

The extreme entity engine. Almost every URL is a shop’s own .nl/.cc/.com domain. No Reddit, no editorial, no marketplace. Win Copilot by being the canonical entity for your shop name.

Perplexity

71% shop websites

Heavy entity bias too, with the most diverse long tail (~23% other). Lightly normalises the prompt into one fan-out search and preserves the prompt language.

Gemini

72% shop websites

Looks like Perplexity on paper — 72% entity-website — but cites fewer URLs and concentrates them on a small set of shop sites.

ChatGPT

34% social (Reddit-led)

The social engine. 34% of cited URLs are social, overwhelmingly Reddit — r/Amsterdam threads are how ChatGPT learns Amsterdam cycling.

Google AI Mode

82% google.com

The highest self-referential share in the entire study — even higher than Paris yoga’s 52%. The answer is mostly its own SERP, re-presented.

The Reddit split. Reddit is ChatGPT’s backbone — the single most-cited domain across the whole study — and it is overwhelmingly a ChatGPT phenomenon. Perplexity, Gemini and AI Mode cite it only sporadically; Copilot does not cite it at all. So “get talked about on Reddit” is real advice for Amsterdam bike shops — but it is ChatGPT-specific. For Copilot, Gemini or Perplexity, the answer is to be the canonical entity for your shop name on your own domain.
Section 4

Language & the search mechanism

Asking the same question in Dutch vs English does not just rerank the same shops — it returns a different shop set entirely for generic and use-case queries. Brand and tourist queries converge; everything else diverges. The mechanism is visible in Perplexity’s exposed search query.

EN vs NL top-5 shop overlap per prompt template, ChatGPT on NL proxy.
TemplateTop-5 overlap (EN vs NL)
brand_brompton75% — highest
persona_tourist67%
service_fitting67%
type_vintage50%
dist_jordaan43%
dist_oost43%

Brand and tourist queries have a single right answer regardless of language. But a Dutch fietsenmaker (repair), stadsfiets (Dutch city bike) or commuter query returns an almost entirely different shop set than its English equivalent — 0% top-5 overlap on four of the templates. What’s going on?

The mechanism is visible on Perplexity. Of all five engines, only Perplexity surfaces its internal search query — and it did so on 44 captures. In every one, fanout_count = 1: Perplexity does not expand a prompt into multiple sub-searches the way ChatGPT’s fan-out does. It lightly normalises the prompt — drops filler (“in”), pluralises, reorders — into a single search string, and crucially preserves the prompt language.
Perplexity preserves the prompt language when it fan-outs to a search (3 of 44 captures).
Original promptPerplexity’s actual search
beste traditionele Hollandse fietsenwinkel in Amsterdambeste traditionele Hollandse fietsenwinkels Amsterdam
beste kinderfiets winkels in Amsterdambeste kinderfiets winkels Amsterdam
beste fietsenwinkels voor woon-werkverkeer in Amsterdambeste fietsenwinkels woon-werkverkeer Amsterdam
This language preservation is the mechanism behind the EN/NL divergence above. A Dutch prompt produces a Dutch search; the engine then matches Dutch-language sources — which is why repair, commuter, road and traditional-Dutch queries return 0% overlap between languages. It is not a ranking difference. It is a different search entirely.
Section 5

TLD bias: not here

If language drives such a big EN/NL divergence in which shops appear, does it also drive which TLDs are cited? No.

.nl vs .com vs .cc vs .amsterdam citation balance by prompt language, ChatGPT.
TLDEntitiesEN citesNL citesEN / NL ratioReading
.nl3143420.98×neutral
.com615120.80×neutral
.cc3750.71×EN-biased
.amsterdam3551.00×neutral
Unlike Tokyo, which shows a strong .jp local-language bias, Amsterdam shows no meaningful TLD bias. .nl domains are cited at a near-perfect 0.98× ratio between English and Dutch prompts. Dutch and English AI users see the same domains — only the which-shops set differs, not the which-TLD preference. The cleanest split we’ve found between two language signals: language reshapes the entity set, but not the domain mix.
Section 6

Geography

The 372-row seed plotted geographically. Density follows the canal belt and Oost; sparse in Noord and the outer rings. These maps are the universe an AI answer can resolve to.

Geographic scatter plot of all 372 verified Amsterdam bike shops across the city, with density concentrated around the canal belt, De Pijp and Oost. Each dot represents a single shop.
All 372 bike shops in the Apify seed, plotted by latitude/longitude. The dense ring of dots traces the canal belt; Oost and De Pijp are the secondary clusters.
Bar chart of Amsterdam bike shops by recorded city field. 333 are labelled Amsterdam, 32 are labelled as adjacent locations, plus a handful in Amstelveen and Badhoevedorp.
Shops by recorded city field. Every Amsterdam shop is labelled simply “Amsterdam” — the seed has no neighborhood-level field.
Caveat: district-targeting is a null test here. The prompts targeting Centrum, De Pijp, Jordaan, Noord and Oost all returned 0% in-target accuracy. This is not the AI getting districts wrong — it is a measurement artifact. The Apify seed labels every Amsterdam shop with city = “Amsterdam” and carries no neighborhood field, so a returned shop can never “match” a Jordaan/Centrum target by construction. The district test is null for Amsterdam. (Cities with real ward data — Tokyo’s 23 special wards, for example — do produce meaningful district numbers in other studies.)
Section 7

AI search behavior

How do the engines actually fetch their answers? Two windows into the mechanism — ChatGPT’s web-search trigger and Perplexity’s exposed fan-out — show how much grounding is happening behind every answer.

100%
of ChatGPT bike-shop captures (108 / 108) triggered a live web search.

Even more search-dependent than Paris yoga (96%). Not one bike-shop prompt was answered from training memory alone.

fanout = 1
across all 44 Perplexity captures with a visible search query.

Perplexity does not multi-search a single prompt. It lightly normalises and runs one search, in the prompt’s language.

Important null result. The other four platforms (AI Mode, Copilot, Gemini and Perplexity itself outside fan-out) don’t expose a trigger flag through the capture pipeline. Their search behavior is unmeasured here — read this as “we cannot see it,” not as “they didn’t search.” Given how heavily Copilot, Gemini and Perplexity lean on live shop websites, they are almost certainly searching too.
Prompts

The prompt library

Everything in this article rests on the prompt set. 27 templates, each written once in English and once in Dutch, fired from both a US and an NL proxy on all 5 engines. The matrix probes the dimensions that matter for local discovery: bike type, persona, price, service, brand, district — plus two deliberate entity-bleed controls (scooter, general sports) to measure how cleanly the models separate adjacent verticals.

27
Templates
2
Languages (EN/NL)
2
Proxies (US/NL)
5
Engines
378
Captures
Control1 template
controlENbest bike shops in AmsterdamNLbeste fietsenwinkels in Amsterdam
Bike type8 templates
type_dutchENbest Dutch city bike shops in AmsterdamNLbeste stadsfietsen winkels in Amsterdam
type_ebikeENbest e-bike shops in AmsterdamNLbeste e-bike winkels in Amsterdam
type_roadENbest road bike shops in AmsterdamNLbeste racefiets winkels in Amsterdam
type_mtbENbest mountain bike shops in AmsterdamNLbeste mountainbike winkels in Amsterdam
type_gravelENbest gravel bike shops in AmsterdamNLbeste gravelbike winkels in Amsterdam
type_cargoENbest cargo bike shops in AmsterdamNLbeste bakfiets winkels in Amsterdam
type_kidsENbest kids bike shops in AmsterdamNLbeste kinderfiets winkels in Amsterdam
type_vintageENbest vintage bike shops in AmsterdamNLbeste vintage fietsen winkels in Amsterdam
Persona / use case2 templates
persona_commuterENbest bike shops for commuters in AmsterdamNLbeste fietsenwinkels voor woon-werkverkeer in Amsterdam
persona_touristENbest bike shops for tourists in AmsterdamNLbeste fietsenwinkels voor toeristen in Amsterdam
Price2 templates
price_cheapENcheap bike shops in AmsterdamNLgoedkope fietsenwinkels in Amsterdam
price_premiumENpremium bike shops in AmsterdamNLhigh-end fietsenwinkels in Amsterdam
Service3 templates
service_repairENbest bike repair shops in AmsterdamNLbeste fietsenmakers in Amsterdam
service_fittingENbest bike fitting in AmsterdamNLbeste bikefitting in Amsterdam
service_customENcustom bike builders in AmsterdamNLfietsenbouwers op maat in Amsterdam
Brand2 templates
brand_bromptonENBrompton dealer AmsterdamNLBrompton dealer Amsterdam
brand_specializedENSpecialized dealer AmsterdamNLSpecialized dealer Amsterdam
District5 templates
dist_centrumENbest bike shops in Centrum AmsterdamNLbeste fietsenwinkels in Centrum Amsterdam
dist_pijpENbest bike shops in De Pijp AmsterdamNLbeste fietsenwinkels in De Pijp Amsterdam
dist_jordaanENbest bike shops in Jordaan AmsterdamNLbeste fietsenwinkels in Jordaan Amsterdam
dist_noordENbest bike shops in Noord AmsterdamNLbeste fietsenwinkels in Noord Amsterdam
dist_oostENbest bike shops in Oost AmsterdamNLbeste fietsenwinkels in Oost Amsterdam
Other2 templates
secondhandENbest second hand bike shops in AmsterdamNLbeste tweedehands fietsenwinkels in Amsterdam
independentENbest independent bike shops in AmsterdamNLbeste onafhankelijke fietsenwinkels in Amsterdam
Entity-bleed control2 templates
bleed_scooterENbest scooter shops in AmsterdamNLbeste scooterwinkels in Amsterdam
bleed_generalistENbest sports shops in AmsterdamNLbeste sportwinkels in Amsterdam
The English and Dutch versions are intentionally faithful translations of the same intent — which is what makes the EN-vs-NL divergence in section 4 meaningful. Different shops surface not because the question changed, but because the language did.
Methodology

Study design

Data collection

  • 27 prompt templates × 2 languages (EN/NL) × 2 proxy countries (US/NL) × 5 AI engines
  • Engines: ChatGPT, Perplexity, Gemini, Copilot, Google AI Mode
  • 378 captures, 3,010 citations, captured 2026-05-23 → 2026-05-24
  • For each answer we logged both the rendered text and every cited URL

What we measured

  • Shops named per answer (brand-aggregated leaderboard + per-engine breadth)
  • Cited URLs, bucketed into a source taxonomy
  • EN/NL top-5 overlap per template (Jaccard)
  • .nl vs .com vs .cc citation balance by prompt language
  • ChatGPT web-search trigger rate; Perplexity fan-out search query

How we turned answers into shops: the NER pipeline

AI answers are free text — “You could try Wheelrunner in De Pijp, or Het Zwarte Fietsenplan for second-hand bikes…” — not a clean list of businesses. To count anything, we ran each answer (and each citation’s anchor text) through a named-entity-recognition (NER) pass that works in four steps:

  1. Span detection. A transformer NER model tags candidate spans in the text — organisation/business names and the location phrases attached to them (district names, street addresses). Cycling-specific gazetteer terms (“fietsenwinkel,” “tweewielers,” “bakfiets,” “cycles”) boost recall on names the base model would otherwise miss.
  2. Normalisation. Each candidate is lower-cased and stripped of boilerplate — “Amsterdam,” district suffixes, trademark glyphs and punctuation — so “Het Zwarte Fietsenplan B.V.” and “Het Zwarte Fietsenplan” collapse toward the same key.
  3. Entity resolution. Normalised mentions are matched to a 372-row Apify Google Maps seed (228 with websites) using fuzzy string similarity plus a domain match when the answer cited the shop’s own website. A mention only counts if it resolves above a confidence threshold; ambiguous spans are dropped rather than guessed.
  4. Brand aggregation. Resolved entities that belong to the same brand are merged so a multi-location shop is not double-counted, while per-location coordinates are retained for the maps.

The seed of 228 websitised shops is the universe an answer can resolve to; it is not a list fed to the models. Everything in the leaderboard is a shop an engine surfaced on its own and that the NER pipeline could confidently identify.

Caveats

  • The seed is the 372-row Apify Google Maps pull of Amsterdam bicycle shops, repair shops and used / e-bike specialists. Rental services, tour operators and pure e-commerce stores are filtered out (is_real = false). 228 of the 372 have a website and so are eligible for domain-based citation resolution.
  • NER resolution is high-precision by design: a mention the pipeline cannot confidently map to the seed is dropped, so counts are conservative lower bounds rather than exhaustive.
  • The district-targeting test (Centrum, De Pijp, Jordaan, Noord, Oost) returned 0% across all neighborhoods. This is a measurement artifact, not an AI failure: the seed has no neighborhood-level field, so a returned shop cannot match a Jordaan/Centrum target by construction. The test is null for Amsterdam.
  • Only ChatGPT exposes a web-search trigger flag through the capture pipeline; only Perplexity exposes its internal search query. The other engines’ behaviour is unmeasured, not absent.
  • Google AI Mode’s 82% self-citation may inflate its raw citation count relative to other engines.
  • Grok is excluded from this study; the crawler returned a wait-element timeout for the bike-shop prompt set.
FAQ

Frequently Asked Questions

Summarize with AI

ChatGPTPerplexityClaudeGeminiGrok

Continue Reading

More on how AI search surfaces local businesses.

All Research