# European skateboard market — open data

Prices, shops and catalogue composition of the European skateboard retail market,
compiled monthly from the public catalogue pages of independent skate shops.

Published by [Skateboard Personalizado](https://skateboardpersonalizado.com).
Licensed **CC BY 4.0** — use it, quote it, chart it; credit
`Skateboard Personalizado` with a link.

## Files

| File | What it is |
|---|---|
| `european-skate-market-YYYY-MM.json` | Aggregates: deck price by country, price by category, deck price by brand, a country price index, and market composition |

Regenerate with `node scripts/skate-market-dataset.mjs` (no dependencies).

## Method

Prices are read from each shop's own public catalogue pages — not from feeds,
affiliate networks or press releases. Every figure is a **median**, because a
handful of pro-model or reissue decks drags a mean somewhere no shopper has ever
been.

- **Every price is in euros.** Shops that charge in another currency are
  converted when the price is read, at that day's reference rate; where no rate
  is available the shop is skipped rather than stored unconverted. The rate is
  the one from the day each price was read, not a single rate for the whole
  file, and your bank will apply its own. Shops outside Europe are excluded from
  the price figures.
- Deck prices are filtered to €20–300, wider categories to €3–600, to drop
  mis-categorised bundles and scraping errors.
- The **comparable basket** uses only products the source matched across at least
  3 shops. A shop needs 15 of them to receive a price index, where `100` is the
  typical price of that basket. This compares prices; comparing whole catalogues
  would only compare assortments.
- A country row marked `"indicative": true` comes from fewer than 5 shops. It
  describes those shops' pricing, not a national market — please don't turn it
  into "the most expensive country in Europe". The country index carries the
  same warning as `"robust": false`.

### Is the same gear cheaper in one country than another?

That question needs the same product, not a national average — countries stock
different brands, so comparing catalogue medians compares assortments. The
`prices.countryIndex` block takes the products found in at least 3 European
countries (a basket of a few hundred), prices each one per country as the median
across that country's shops, and divides by the median across countries. `100`
is the typical European price of that same product.

One trap, written down so nobody rediscovers it: **on the median, every country
reads exactly 100.** The manufacturer's recommended price is identical across
borders, so half the observations sit on it. The variation is in the tails —
discounts, clearance, margin — which is why the index reports the mean, and why
`sameProductGap` (cheapest to dearest country for the *same* item) is the figure
that actually answers the question.

## What is deliberately not here

**No shop is named.** Not the directory, not the per-shop catalogue sizes, not a
per-shop price index. Those exist, and they stay in-house — partly because that
list of shops, geocoded and classified by platform, is weeks of our work and one
click of anyone else's, and partly because a public file saying which named
business is the dearest is not ours to publish.

**The product rows.** They are the catalogue of third-party shops; publishing
them wholesale would touch the EU database right (Directive 96/9/EC) and those
shops' own terms. A median is nobody's catalogue.

**Shipping cost.** It is not included in any price, and it is documented for a
minority of shops only. A cheap deck from three countries away is not cheap.

## Citing it

> Skateboard Personalizado, *European skateboard market* (2026).
> https://skateboardpersonalizado.com/data — CC BY 4.0

Corrections are welcome: if a shop's figures look wrong, they probably are, and
we would rather fix them than defend them.
