How we built Coin Shop Finder so crawlers (and people) can actually trust the listings

Most "near me" results for coin shops are a mess. You get pawn counters, gold-buying kiosks, Maps pins with no phone number, and paid placements mixed in with real dealers. We built Coin Shop Finder (coinshopfinder.com/) because collectors and estate sellers need a narrower answer: who actually buys coins, who does appraisals, and who is NGC-authorized, before anyone wastes a drive across town.

This post is the build story, not a pitch deck. If you are shipping a vertical directory, SaaS marketplace, or local data product, the same constraints apply: incomplete third-party data, AI-generated filler that pollutes trust, and pages that look fine in a browser but collapse for crawlers.

The problem we refused to paper over

Numismatics already has strong authority sites. NGC and PCGS run dealer locators. ANA has a member directory. APMEX and JM Bullion publish local guides. Yelp and BBB cover reviews. Those properties win broad head terms for a reason.

  • What they do not solve well is the messy middle:
  • "coin appraisal [city]"
  • "sell inherited coin collection [city]"
  • "NGC authorized dealer near me"
  • "is this shop a real coin dealer or a scrap gold buyer?"
  • On those queries, the SERP is a scramble of dealer sites, Facebook groups, Reddit threads, and thin city pages. People inherit boxes of coins with zero context. They search once, get noise, and either take a bad offer or freeze.
  • Coin Shop Finder is a neutral local trust layer for U.S. dealers. Not a bullion storefront. Not a pay-to-rank yellow pages clone. A directory that only indexes shops that clear a verification gate.

Product rules that forced the architecture

We wrote the product rules before we wrote the stack.

  • No index without verification. Name, address, and phone have to check out against at least one independent source (NGC locator, the dealer's own site, or both). Incomplete records stay noindex.
  • No pay-to-rank. Sort order is verification status, data completeness, and public review signals, not money.
  • No AI filler about dealers. Services and specialties come from what the dealer publishes about themselves, or from verified attributes. If we cannot source a claim, we do not print it.
  • Ratings are attributed. Google ratings and review counts are labeled as Google's data. We do not invent editorial stars.
  • Ship density, not empty shells. A state only goes live when we have real verified dealers. Placeholder city pages do not help users or search engines.
  • Those rules kill a lot of "scrape everything and scale" shortcuts. They also make the site more useful for both people and AI systems that need clean facts.

Stack choices for crawlability and rebuild speed

Coin Shop Finder runs on:

  • Astro 5 for static-first HTML. Core content ships as HTML, not a blank shell waiting on client JS. That matters for search bots and for AI crawlers that still struggle with heavy client-side rendering.
  • Cloudflare Pages + D1 for hosting and runtime writes (claims, leads). Public pages build from a local SQLite snapshot so deploys stay fast and deterministic.
  • Drizzle for schema shared between local SQLite and D1.
  • Tailwind for styling without shipping a heavy SPA.
  • Why static-first for a directory? Dealer profiles and state pages change on a human schedule, not every request. Pre-rendering keeps TTFB low, keeps markup extractable, and makes sitemaps boring in the best way: only indexable URLs, only after the gate passes.
  • If you are building a similar product, ask whether your "dynamic" pages actually need per-request personalization. Most directory pages do not.

The data pipeline (where Firecrawl earns its keep)

Dealer discovery is not one API call. We treat it as a pipeline with explicit stages.

  • NGC discovery. Authorized dealers come from the NGC dealer locator. That gives NAP plus a certification we can cross-check, not invent.
  • Second-source density. Independent shops that NGC does not cover still matter. We pull additional candidates from local business sources (we moved off a flaky Google Maps actor onto a Firecrawl-based Yelp path) so cities get real coverage instead of three national chains.
  • Merge and dedupe. Same shop often appears twice with different names. Phone + name/city matching collapses duplicates before enrichment.
  • Site scrape. Firecrawl hits the dealer's own website for hours, services language, photos, and specialties. This is the difference between a Maps stub and a profile someone can act on.
  • Enrich and seed. Normalized JSON becomes seed SQL. is_indexable is computed by the gate, not by hope.
  • Remote sync. D1 gets the same snapshot the static build used.
  • Firecrawl is the single scrape vendor on purpose: one quota, one failure mode, one place to debug. Scrapes land in a gitignored cache so rebuilds do not re-burn credits for unchanged sites.
  • The unglamorous lesson: directories fail when enrichment is optional. NAP alone is not enough for service intent. Hours, appraisal flags, collection-buying flags, and NGC status are what turn a pin into a decision.

Indexing as a product feature

We treat "should this URL exist in the sitemap?" as a product question.

  • Dealer profiles only enter the index when verification clears.
  • State pages only publish when dealer count is real.
  • City pages stay noindex until they meet density and editorial rules (including a human-authored intro where required). That avoids thin city spam that tanks trust.
  • This is slower than blasting 50,000 AI city pages. It is also how you avoid becoming the kind of directory Google and AI systems learn to ignore.
  • Public stats on the live site (as of writing): roughly 990 verified dealers across four states, 380 cities, 142 NGC-authorized shops, 503 shops listing appraisals. Those numbers update as coverage grows. They are not marketing round numbers invented for a homepage.

Designing pages for people and for extractive systems

  • Search Engine Land's GEO framing is useful here even if you never say "GEO" out loud: AI answers assemble passages from sources they can crawl, understand, and attribute. Self-contained facts beat fluffy narrative. Entity clarity beats clever branding.
  • On Coin Shop Finder that means:
  • Clear H1s that match intent ("coin dealers in Texas", dealer name + city).
  • Service and specialty flags as structured fields, not buried paragraphs.
  • FAQ blocks that answer the questions estate sellers actually ask: don't clean coins, know the difference between bullion shops and numismatic dealers, what NGC authorization means.
  • Organization and page-level schema where it fits.
  • Canonical URLs and a sitemap that only lists pages we stand behind.
  • We also separate shop types in plain language:
  • Numismatic specialists care about grade, mintage, and premium.
  • Bullion shops price by metal.
  • General coin shops sit in the middle.
  • That taxonomy helps a human decide where to drive. It also gives AI systems cleaner category signals than a single "coin shop" label.

What we would tell another founder shipping a vertical directory

  • Start with the verification gate, not the design system. Pretty cards on garbage data make you look worse, not better.
  • Prefer server-rendered facts over client-fetched chrome. If the product name, description, and core attributes disappear with JavaScript disabled, you are invisible to a chunk of modern discovery systems.
  • Pick one scrape stack and own the pipeline. Multi-vendor scrapers feel flexible until you spend more time reconciling schemas than shipping states.
  • Ship fewer geographies with higher density. Five solid cities in one state beat thin coverage in twenty. Local search and local AI answers both punish empty shelves.
  • Keep third-party proof off your own scoreboard. Attribute ratings. Link certifications to source locators. Do not launder someone else's trust signal as yours.
  • Write for the hard jobs-to-be-done. For us that is inherited collections, appraisals, and "is this place real?" Those pages convert and they attract long-tail queries where big brands are less obsessed with owning every result.

Where Coin Shop Finder sits today

  • Live coverage: Texas, Florida, Pennsylvania, Ohio. More states only after the same gate. Browse starts at Coin Dealers by State | CoinShop Finder. The about page documents verification rules in public, which is intentional. If you hide how listings get in, nobody should trust what comes out.
  • We listed Coin Shop Finder on CrawlRabbit because reviewed, structured directories are part of the same idea we ship ourselves: human review, clear categories, crawlable metadata, and a permanent place for people and AI tools to find a product without guessing from a vague homepage.
  • If you are building something similar, steal the boring parts. Gates, static HTML, attributed proof, and a pipeline you can re-run without drama will outlast any launch-day spike.