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>
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/" />
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"}
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
- Skip React for simple sites — Vanilla JS + good CSS is faster and cheaper
- Multilingual SEO needs static HTML — don't rely only on JS translations
- Structured Data is a must for local business SEO
- Supabase is an excellent free Firebase alternative for MVPs
- Vercel's free tier handles up to 10K visitors/month easily
Links
- 🌐 plusrent.md — the live platform
- 🚗 Sober Driver Service — unique designated driver feature
Thanks for reading! Happy to answer any questions in the comments.