Extraction
Playwright scrapers for bank promotions (BCI, Tenpo, Banco Security), plus a Compute Engine VM in Chile for a provider that only responds to a local IP.
A two-sided offers marketplace, designed and built solo: nine services on Google Cloud serving a web portal, an iOS app, and a conversational assistant — plus a publisher side where brands pay to reach users with verified attribution.
FROM SIDE PROJECT TO MARKETPLACE
PortalBeneficios.cl started as a way to aggregate bank and retail promotions scattered across dozens of Chilean providers into one place. Scrapers and a geo-locked extractor pull raw offers; a normalization pipeline turns inconsistent brand names into a clean catalog; and that catalog is served through a web portal, an iOS app, and a chat assistant.
The second half of the platform is what turns it into a business: a publisher portal where each brand gets an account scoped to its own catalog entry, buys credits, and publishes its own offers — justified by verified proof of purchase (click tracking online, QR scans in physical stores) rather than just impressions.
Designed, built, and operated solo — architecture, backend, frontend, mobile, and infrastructure.
SYSTEM DESIGN
Scheduled extraction feeds Cloud Storage; a normalization service cleans the catalog into Firestore; a set of Cloud Run APIs serve it to three different client surfaces.
Not shown: publisher-service also calls admin-service's review-queue machinery to moderate brand-submitted edits, reusing the same moderation pattern built for catalog normalization.
WHAT EACH PIECE DOES
Playwright scrapers for bank promotions (BCI, Tenpo, Banco Security), plus a Compute Engine VM in Chile for a provider that only responds to a local IP.
admin-service resolves brand names through exact, accent-folded, and fuzzy matching, routes uncertain matches to a human review queue, and applies brand-level metadata overrides.
backend-api serves the processed catalog; auth-service issues JWTs and manages roles (admin / publisher / pro_user / user) against MongoDB.
Hexagonal architecture; a tool-calling loop against backend-api so the LLM never invents an offer. Hybrid cosine + lexical semantic search, cached in GCS by catalog content hash.
Brand accounts scoped to their catalog entry, credit purchases via MercadoPago, custom offer publishing, and QR-code proof-of-purchase for in-store attribution.
A Next.js 15 web portal and an Expo/React Native iOS app, sharing the same backend, auth, and agent APIs.
WHY IT'S BUILT THIS WAY