Every taxi company in the Netherlands faces the same problem: customers still call to book rides. It's slow, error-prone, and ties up staff who could be doing something more valuable. TaxiNL eliminates that friction entirely — customers book themselves, pay upfront, and everyone wins.
The result is a self-service booking platform that handles everything from route calculation to payment processing, without a single phone call.
The Problem Worth Solving
Traditional taxi booking is broken. Customers call, wait on hold, explain their pickup location, negotiate prices, and hope the driver shows up. Taxi companies lose potential customers who won't wait, deal with no-shows, and chase payments.
TaxiNL flips this model. Customers get instant quotes, see their route on a map, pay before the ride, and receive confirmation — all in under two minutes. For taxi companies, that means fewer missed calls, guaranteed payments, and a booking system that works while they sleep.
Built for Conversion
The homepage is designed around one goal: completed bookings. The hero section establishes credibility immediately — 2,500+ customers served, 150+ drivers, 24/7 availability. Below, a clean 4-step booking wizard guides users through the entire process without overwhelming them.
| Metric | Score |
|---|---|
| Performance | 90+ |
| Accessibility | 95+ |
| Best Practices | 100 |
| SEO | 100 |
These scores matter because every second of load time costs conversions. A taxi booking that doesn't load on a slow mobile connection is a taxi booking that doesn't happen.
Tech Stack
The Booking Experience
Most booking forms fail because they ask for everything at once. TaxiNL breaks the process into four digestible steps:
Step 1: Route — Enter pickup, destination, and optional stops. Dutch addresses autocomplete instantly via the PDOK Locatieserver API, eliminating typos and confusion.
Step 2: Luggage — Specify passenger count and luggage. This isn't just UI polish — it determines which vehicles can handle the booking.
Step 3: Vehicle — Choose from Standard, Electric (Tesla), Business (Mercedes E-Class), or Minivan (Mercedes V-Class). Prices update in real-time based on the actual route distance.
Step 4: Contact — Name, phone, email. That's it. No account creation, no password, no friction.
Form persistence saves everything to localStorage. Close the tab, come back tomorrow — your booking is still there. This single feature probably saves more abandoned bookings than anything else in the app.
Transparent Pricing
Hidden fees kill trust. TaxiNL shows exactly how the price is calculated:
- Base fare plus per-kilometer and per-minute rates
- Vehicle multipliers — Electric adds 10%, Business 35%, Minivan 50%
- Time surcharges — Night (25%), Weekend (15%), Holiday (30%)
- Extra fees — Airport pickup, excess luggage
The customer sees a single, clear price before they enter payment details. No surprises, no awkward conversations with drivers about what they owe.
Maps That Actually Help
Route visualization isn't a nice-to-have — it's essential for building confidence. When a customer sees their exact pickup point, route, and destination on a Leaflet-powered map, they trust that the system understood them correctly.
The map also handles multi-stop routes elegantly, displaying up to three intermediate stops with clear markers and the adjusted route path.
Payments That Work
Stripe Checkout handles the heavy lifting. Customers pay via credit card or iDEAL (essential for the Dutch market where bank transfers dominate). The hosted payment page means no PCI compliance headaches, no storing card numbers, no security nightmares.
Payment success redirects to a confirmation page with full booking details. Cancellation returns users to the form with a clear notification — no lost data, easy to retry.
All booking details are stored in Stripe metadata, which means you have a complete record of every transaction even before connecting a database.
Speaking Both Languages
The Netherlands is international. TaxiNL serves Dutch locals with native-language UI and English-speaking visitors with a single toggle switch. All text — labels, errors, confirmations, even the FAQ — switches instantly without page reload.
This isn't just convenient. It's the difference between serving tourists at Schiphol and losing them to competitors with English support.
What's Included vs. What You'd Add
TaxiNL is feature-complete for the customer-facing booking flow. Here's the honest breakdown:
Fully functional:
- Multi-step booking wizard with validation
- Dutch address autocomplete
- Real-time route calculation and mapping
- Dynamic pricing with all surcharges
- Stripe payment processing (card + iDEAL)
- Bilingual support (NL/EN)
- Mobile-responsive design
- Form persistence across sessions
You'd add for production:
- Database to store bookings (Stripe metadata captures everything, just needs persistence)
- Webhook to confirm successful payments
- Email/SMS notifications to customers
- Admin dashboard for managing bookings
- Driver notification system
The Business Case
For taxi companies, the math is simple:
- 70%+ reduction in phone calls — customers book themselves
- Zero no-shows — payment happens before the ride
- 24/7 availability — bookings come in while you sleep
- International reach — English support captures tourist market
- Trust through transparency — upfront pricing eliminates disputes
What I Learned
Building TaxiNL reinforced something I keep rediscovering: the best UX often means doing less. The 4-step wizard works because each step has a single purpose. The pricing display works because it shows one number, not a spreadsheet. The language toggle works because it doesn't require a page reload.
The technical stack (Next.js 16, React 19, Stripe, Leaflet) enabled rapid iteration, but the real work was in the details — making sure the PDOK autocomplete felt instant, ensuring form state survived every edge case, getting the pricing calculations exactly right.
Every feature in this app exists because it either helps customers book faster or helps taxi companies get paid. Nothing else made the cut.