May 2026AI Search Studies

AI Search for Bike Shops in Amsterdam (2026):When local businesses actually own the web

TL;DR: Amsterdam bike shops are the cleanest entity-consensus case in the series. Unlike Marseille coffee, where the engines lean on Reddit, Instagram and local blogs, Amsterdam bike-shop answers mostly resolve to the shops’ own websites. Copilot behaves like a phone-book engine: 97% of its citations go to shop domains. Gemini and Perplexity cite shop websites heavily too, at 72% and 71%. ChatGPT is the exception — Reddit is its backbone, the most-cited external domain in the study at 198 citations. Google AI Mode cites google.com back to itself 82% of the time. The result is unusually stable: 12 bike-shop brands appear across all five engines. (27 prompt templates × EN/NL × 2 proxies × 5 engines; 378 captures, against 372 verified shops, 228 with websites.)

5
AI engines
27
Prompt templates
372
shops · 228 w/ sites
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 here the engines cite shops’ own sites more, and the top tier wins everywhere. This is the anti-Marseille: where a café scene runs on social and local guides, a bike-shop scene runs on owned, canonical domains.

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. The full matrix is 540 runs (27 templates × 2 languages × 2 proxies × 5 engines); we retained 378 captures and 3,010 citations after dropped runs (ChatGPT ran the full 108; thinner engine×language×proxy cells lost runs to blocked or empty responses). Shops each answer named were pulled out with a named-entity-recognition pass and matched to a 372-row Apify Google Maps seed (228 of them with a website).

The headline result of the yoga study generalises — but it generalises sharper. Copilot is the pure entity engine at 97% shop-website citations (a phone-book engine); Gemini (72%) and Perplexity (71%) are entity-heavy too — all higher than their yoga equivalents. Gemini is the surprise: in other verticals it often finds one editorial vein, but here the owned-site layer is strong enough that it behaves like an entity engine. ChatGPT learns Amsterdam cycling from Reddit (34% social, with reddit.com alone contributing 198 citations — the most-cited external domain in the study). And Google AI Mode cites google.com 82% of the time, the highest self-referential share measured in this series. The Paris-yoga “Modo problem” — where a top-ranked studio vanished from two engines, showing cross-engine visibility could be brittle — does not recur here: Amsterdam’s top tier wins on every engine.

A Dutch-language ChatGPT answer to “beste racefiets winkels in Amsterdam”: a Google-Maps panel listing Gregario Cycling Services, Meesterknecht BV, Kaptein Tweewielers, RIH Sport and Cor Mantel, then a written shortlist led by Kaptein Tweewielers and Gregario Cycling Services.
A real Dutch-language answer for “beste racefiets winkels in Amsterdam” (best road-bike shops). Ride Out — the study’s cross-engine #1 — and Kaptein both appear, but a Dutch, road-bike-specific prompt pulls a more specialised set: exactly the EN/NL divergence this study measures. Captured June 2026.
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 most-cited external 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 each shop’s resolved citations across all five engines (chain locations merged), these are the most-cited Amsterdam bike shops. Score is that cross-engine citation total — resolved citations pointing to the shop’s own domain and pages, summed across the five engines; it is not a raw mention count. Engines is how many of the five 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 most-cited external 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 most-cited external 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?

Perplexity exposes the likely mechanism most clearly. 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
Perplexity exposes the likely mechanism: language preservation. 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. At least for Perplexity, it’s not merely a ranking difference — it’s a different search entirely. ChatGPT’s EN/NL divergence points the same way, but it doesn’t expose its search string, so we can’t confirm the identical mechanism there.
Section 5

TLD bias: Dutch changes the shops, not the domains

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.
The map is useful; the district accuracy test is not. The Apify seed stores city-level data but no neighborhood field, so a returned shop cannot match “Jordaan,” “De Pijp” or “Oost” by construction. We treat district-targeting as unmeasured for Amsterdam — not a 0% AI-accuracy result. (Cities with real ward data, like Tokyo’s 23 special wards, 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 372-shop seed is the resolution universe a named shop can match; the 228 with websites are the subset eligible for domain-based citation matching. The seed 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.
Conclusion

The clean control case

Amsterdam is the cleanest entity-consensus case in the series because the local web gives the engines something clean to agree on. Bike shops here have stronger owned domains than the yoga studios, cafés and bookstores in the other studies — so Copilot turns that into near-pure shop-website citation, and Gemini and Perplexity follow the same direction. The top shops aren’t platform-specific accidents: twelve brands appear across all five engines.

But the consensus has one exception: ChatGPT still learns Amsterdam cycling through Reddit. So even in the cleanest owned-web case, the playbook isn’t “website only.” It’s canonical website first, social proof second.

The language result adds the final wrinkle. Dutch prompts don’t simply rerank the English answer — they return different shop sets. The domains stay similar; the entities change.

Set against Marseille coffee, the pair sketches a small taxonomy of local internet ecosystems — AI visibility tracks the shape of the local web. Marseille coffee runs on Instagram and local blogs; Amsterdam bikes run on owned, canonical domains. Part of the reason is structural: a bike shop sells and services bikes on its site, so the website does real work and gets built, linked and crawled; a café has no such transaction. In Marseille, AI search smelled like Instagram and local blogs. In Amsterdam, it looks more like a well-indexed shopfront. Less romantic — much easier to optimise.

FAQ

Frequently Asked Questions

Summarize with AI

ChatGPTPerplexityClaudeGeminiGrok

Continue Reading

More on how AI search surfaces local businesses.

All Research