All projects
BrandLocator cover
📍

BrandLocator

brandlocator.co
pSEONext.jsPostgreSQL

BrandLocator is a Dutch platform that helps people find which stores carry their favorite brands, anywhere in the Netherlands. Users pick a brand, pick a city, and instantly see every retailer that stocks it, with addresses, phone numbers, and a map. The platform currently covers 400+ brands across 50+ Dutch cities.

Programmatic SEO

The core idea behind BrandLocator is programmatic SEO. Every brand-city combination gets its own pre-rendered landing page — think /amsterdam/tommy-hilfiger or /rotterdam/calvin-klein. These pages are built statically at deploy time and are fully indexed by Google, so the site generates organic search traffic at scale without any paid acquisition.

The URL structure is designed around how people actually search: "[brand] kopen in [stad]" ("buy [brand] in [city]"). Each page has unique meta titles, descriptions, and Schema.org structured data (LocalBusiness + ItemList), which helps capture featured snippets and local search results.

The sitemap is generated dynamically from the database, so new brand-city combinations get picked up and indexed automatically as data grows. High-value search result pages get priority 0.9 in the sitemap; brands and cities get 0.7. Currently the sitemap contains thousands of URLs.

Data collection

The database was populated using AI-powered web scraping, crawling retailer websites and brand directories to extract which stores carry which brands, then structuring and deduplicating the results into a clean relational schema. The data model is intentionally simple: brands and stores are many-to-many through locations, and each location belongs to exactly one city. This keeps queries fast and the SEO page generation straightforward.

How it was built

The frontend is built with Next.js 15 (App Router). Every dynamic route (brands, cities, stores, and search results) uses generateStaticParams() to pre-render all pages at build time. This means zero server-side computation per request: pages are served as static HTML, which keeps load times fast and hosting costs low.

The data layer runs on Supabase (PostgreSQL). The frontend queries Supabase directly from server components so that no separate API layer needed. The schema has four core tables: brand, city, store, location, and a store_brands join table for the many-to-many relationship between stores and brands.

The UI is styled with Tailwind CSS and designed with glassmorphic surfaces, reveal animations, and a bold pink accent color. Typography uses Bricolage Grotesque for headings and DM Sans for body text. The home page shows popular brands and cities derived from actual store-count data, and remembers your recent searches in localStorage.

Other details: contact form delivery via Resend, cookie consent with conditional Google Analytics, and a robots.txt + sitemap wired up for SEO from day one.