AlertaCoches.es
Secondhand vehicle ads platform serving 38K monthly users with 11M+ total ads and 750K active. Drove architecture, backend stability, data flow, and scalability while staying close to implementation and product outcomes.
What it does
AlertaCoches is built for people who want to follow the Spanish second-hand and new car market without constantly refreshing listing sites. Instead of checking Milanuncios, Wallapop, Autoscout, and others by hand, you define filters—brand, model, year, price, province, fuel, mileage—and get automatic notifications when ads match. That saves time and reduces the chance of missing good offers, which often sell within hours.
It’s useful if you’re looking for a specific car and don’t want to miss any listing, if you want to save time and get ahead of buyers who still browse portals manually, or if you prefer a tool that narrows the search for you instead of scrolling through hundreds of irrelevant ads.
What we built
A single place to search across major Spanish marketplaces (Milanuncios, Wallapop, AutoHero, Autocasion, Clicars, Autoscout, Coches.com, Motor.es, Rattix and others), with one interface, advanced filters, and saved searches. Users create alerts and get notified by email or other channels when new matching ads appear. For businesses, we added a content manager and dashboard to manage listings and visibility across platforms.
System architecture: three repositories
The platform is split across three codebases, with RabbitMQ as the message spine and everything orchestrated on Rancher (Docker on 6 Hetzner VPS).
The web repo holds the Laravel API (MySQL for users and business data, MongoDB for ad search), the Vue 3 SPA, and a Laravel-based Content Manager. The Content Manager maintains the base data—sources, filter metadata, business listings—that the API uses to build the endpoints the workers call. Laravel queue consumers subscribe to RabbitMQ queues (alert.new-ad, ad.price-change, etc.). Those messages are published by the worker’s SaveAdSubscriber after it writes or updates ads; the Laravel consumers match user alerts and send email and in-app notifications. Metabase reads from MySQL and MongoDB for data analysis and dashboards.
The worker repo is Node.js/TypeScript: one importer per marketplace (Wallapop, Autoscout, Coches.com, AutoHero, Clicars, Motor.es, Rattix, etc.). Each importer fetches search config and source endpoints from the web API (data that ultimately comes from the Content Manager), pulls ads from the marketplace, and publishes a SaveAdMessage to the RabbitMQ queue ad.save. The SaveAdSubscriber consumes ad.save, writes or updates ads in MongoDB, and publishes NewAdAlertMessage, PriceChangeMessage, ReactivatedAdMessage, and NewImageMessage to RabbitMQ so the Laravel consumers can send notifications.
The Airflow repo runs scheduled pipelines on Rancher: daily migration of ads to MySQL and weekly vehicle price calculation. The results feed MySQL and the data that Metabase uses for analytics.
flowchart TB M[Marketplaces] --> W[Worker importers] CM[Content Manager] --> API[Laravel API] API --> W W --> RMQ[RabbitMQ ad.save] RMQ --> S[SaveAdSubscriber] S --> Mongo[(MongoDB)] S --> RMQ2[RabbitMQ alert/price] RMQ2 --> Cons[Laravel consumers] Cons --> API API --> Vue[Vue SPA] Mongo --> AF[Airflow] AF --> MySQL[(MySQL)] MySQL --> MB[Metabase]
Flow (mobile)
- Marketplaces → Worker importers (config from API / Content Manager).
- Worker → RabbitMQ
ad.save→ SaveAdSubscriber → MongoDB. - SaveAdSubscriber publishes
alert.new-ad/ad.price-change→ Laravel consumers → email. - Airflow: daily migration to MySQL, weekly price calculation.
- Metabase: analytics on MySQL and MongoDB. All orchestrated on Rancher.
Data and event flow
Ads flow from each marketplace into the corresponding worker importer, then into RabbitMQ’s ad.save queue. The SaveAdSubscriber consumes those messages, persists or updates ads in MongoDB, and publishes events for new ads, price changes, reactivations, and new images. Laravel consumers read those events from RabbitMQ, match them against user alerts, and trigger email and in-app notifications. Search and listing data are served by the Laravel API from MongoDB and MySQL. Airflow runs batch jobs for migration and pricing on a schedule, and Metabase uses the resulting data for reporting.
Scale and ownership
I led a team of four and owned the product roadmap and technical direction. The stack is polyglot by design: Laravel and MySQL for the CMS and business data, Node.js for the ingestion workers and their APIs, MongoDB for high-volume ad storage (order of millions of documents), RabbitMQ for decoupled processing and notification pipelines, and Airflow for scheduled data jobs. We use Matomo and Metabase for analytics, caching for listings and filters, and Docker on Rancher across six Hetzner VPS, with CI/CD via Bitbucket. The system is built for high availability, security, and performance.
Tech stack
Outcome
12M+ ads, 750K active listings, 38K monthly active users, 1.1K new registrations per month. The platform runs with high availability, security, and performance for vehicle ad search, alerts, and business management.