How I Built a Full-Stack Car Rental Platform in Moldova with Node.js, Supabase & Vercel

javascript dev.to

Hey DEV community! I want to share how I built a web platform for a small car rental business in Chișinău, Moldova. I'll cover the tech stack, multilingual SEO challenges, and lessons learned.

The Problem

I needed a platform to manage a car fleet: vehicle catalog with dynamic pricing, booking system, cost calculator, multilingual UI (Romanian, Russian, English), and an admin panel. Budget was tight — no $200/month SaaS solutions.

Tech Stack

After evaluating options, I went with:

  • Frontend: Vanilla JS + Bootstrap + i18next for internationalization
  • Backend: Node.js + Express
  • Database: Supabase (PostgreSQL)
  • Hosting: Vercel (frontend) + separate server for API
  • CDN: Cloudflare

Why not React? For a landing page with a booking form, it's overkill. Vanilla JS renders faster, which is critical for Core Web Vitals and SEO.

Project Structure

├── public/
│ ├── index.html
│ ├── cars.html
│ ├── sofer-treaz.html # Sober driver service
│ ├── css/
│ ├── js/
│ │ ├── i18n-init.js
│ │ ├── dynamic-cars-loader.js
│ │ └── validation-booking.js
│ └── locales/
│ ├── ro.json
│ ├── ru.json
│ └── en.json
├── server/
│ ├── api/
│ │ ├── cars.js
│ │ ├── bookings.js
│ │ └── fee-settings.js
│ └── supabase.js

Multilingual SEO: The Tricky Part

Moldova is multilingual: Romanian, Russian, and English for tourists. I used i18next with JSON files for each language.

The main problem: Google renders pages without JavaScript about 30% of the time. This means data-i18n attributes don't get translated and Google only sees Romanian fallback text.

Solution: for critical SEO blocks, I added static HTML in all three languages directly in the page. data-i18n is only used for UI elements (buttons, menus, forms).

<!-- Static SEO block — Google can see all languages -->
<p>Închirieri auto Chișinău — text in Romanian...</p>
<p>Аренда авто Кишинёв — text in Russian...</p>
<p>Car rental Chisinau — text in English...</p>
Enter fullscreen mode Exit fullscreen mode

I also added hreflang tags even though the URL is the same for all languages:

<link rel="alternate" hreflang="ro" href="https://plusrent.md/" />
<link rel="alternate" hreflang="ru" href="https://plusrent.md/" />
<link rel="alternate" hreflang="en" href="https://plusrent.md/" />
Enter fullscreen mode Exit fullscreen mode

Dynamic Pricing

Rental prices depend on duration: 1-3 days = one price, 4-7 = another, 8+ = third. I implemented this with a JSON price policy in the database:

{"1-3":"35","4-7":"30","8-14":"25","15+":"20"}
Enter fullscreen mode Exit fullscreen mode

The frontend calculator parses this structure and computes cost including additional fees (night delivery, airport). Rates are loaded from the server via /api/fee-settings/tariffs — so managers can change prices from the admin panel without redeploying.

Structured Data for Local Business

Google Rich Snippets are a free way to stand out in search. I added multiple schema blocks:

  • AutoRental — company info
  • Service — service descriptions
  • FAQPage — Q&A in two languages (for Featured Snippets)
  • BreadcrumbList — navigation
  • Organization — organization data

FAQ Schema in two languages gave an interesting result: Google shows FAQ blocks for both Romanian and Russian queries from a single page.

Competing Against Exact-Match Domains

The hardest challenge was organic ranking. Competitors with domains like chirieauto.md rank at the top by default. Google historically gives advantages to exact-match domains.

My approach: maximum technical optimization (structured data, Core Web Vitals, multilingual content) + backlinks from platforms (Crunchbase, LinkedIn, TripAdvisor, GitHub). Within 3 months, I reached top 2-5 for "sofer treaz chisinau" competing against an exact-match domain.

Key Takeaways

  1. Skip React for simple sites — Vanilla JS + good CSS is faster and cheaper
  2. Multilingual SEO needs static HTML — don't rely only on JS translations
  3. Structured Data is a must for local business SEO
  4. Supabase is an excellent free Firebase alternative for MVPs
  5. Vercel's free tier handles up to 10K visitors/month easily

Links

Thanks for reading! Happy to answer any questions in the comments.

Source: dev.to

arrow_back Back to Tutorials