Velos von Fahrern, nicht von Händlern

A Swiss marketplace for performance bikes, built in-house. Private sales mean no dealer margin but also no protection, so the product is really one thing: a way for two strangers to trade an expensive bike without either of them going first.

Veloscout — Swiss performance bike marketplace

The brief

A used road or triathlon bike is a four-figure purchase settled between two people who have never met. Buy from a dealer and the margin is the price of that safety; buy privately and the buyer wires money to a stranger, or the seller hands over the frame and hopes. Veloscout takes the dealer out without taking the safety with it — free to list, verified sellers, and the money held in escrow until the buyer has actually seen the bike.

What I built

Listing and search

A sell flow, listing detail pages, and search filtered by category — Rennvelo, MTB, TT/Tri, Gravel, Parts. Listings and seller profiles live in Postgres behind row-level security, so a seller can only ever edit their own inventory.

Escrow with a 48-hour window

The buyer pays into a held Stripe payment intent. Once handover is confirmed a 48-hour inspection window opens, and a cron running every fifteen minutes releases the transfer to the seller only if no dispute was filed. Failed payouts retry rather than stranding money mid-transaction.

Messaging and trust

Buyer and seller negotiate inside the product — conversations and messages tied to the listing, reviews once a transaction closes, and a safety page that explains the escrow in plain German before anyone is asked to trust it.

Transactional email

Every state change a user cannot see in the app gets an email — the payment-released notice fires from the same cron that moves the money. Templates are React components, so the mail is reviewed in the same pull request as the flow that sends it.

Where it stands

The transactional spine is finished: auth, listings, search, messaging, checkout, escrow release and the dispute hold all run end to end, on a dedicated Stripe account with the Swiss legal pages in place. It is deliberately still behind a coming-soon page — a marketplace with no listings on day one is a worse first impression than no marketplace, so launch waits on supply rather than on code. The interesting part of this one is not the redesign; it is that the money movement is real.

Stack

Next.js App Router · Supabase Postgres + auth with row-level security · Stripe payment intents held and released by transfer · Vercel Cron on a 15-minute cadence · Resend with react-email templates · Radix primitives · Tailwind · German-only, single locale

Need somethingthat moves money?

Start a project