Blacklist Partner: Collaborative Fraud-Screening Platform
A two-sided screening platform for Chilean businesses: members reported fraud incidents into a shared database, then screened prospective customers and got a traffic-light verdict, through the web or a documented REST API. I built the entire product; the venture closed when the partners responsible for sales and marketing didn't deliver their side.
Role: Sole technical founder; built backend, frontend, and API
The idea
Small businesses in Chile absorb repeated fraud from the same actors because each company only knows what happened to itself. The bet: pool incident reports across member businesses, and let any member screen an ID document in seconds before closing a sale, signing a lease, or handing over a vehicle.
What I built
flowchart LR M1["Member businesses
incident reports"] --> DB[("Shared screening DB
PostgreSQL")] XLS["Bulk Excel ingestion
per-row validation"] --> DB DB --> MATCH["Fuzzy identity matching
names · documents · phones · emails"] MATCH --> WEB["Web screening UI"] MATCH --> API["REST API
rate-limited"] WEB --> TL["Traffic-light verdict
0 · 1 · 2"] API --> TL
Reports flow in from members and bulk imports; screening flows out through the web UI or the API as a simple traffic-light verdict.
- Fuzzy identity matching: a screening query unions exact document matches with per-word name matching, diacritic and punctuation normalization (so "Muñoz" and "MUNOZ" resolve to the same person), and partial matches on phone, passport, and email, then maps the matched incident categories to a severity verdict.
- Traffic-light API:
GET /api/v1/search_by_documentreturning{"traffic_light": 0|1|2}, designed so a partner could wire screening into a checkout or onboarding flow with one HTTP call. Rate-limited with Rack::Attack; documented end to end in the repo. - Two report channels: a consent-gated web form for individual incident reports, and a super-admin bulk Excel ingestion with transactional, per-row validation, used to load the founding dataset.
- Membership system: email-confirmed signup, role hierarchy (member, admin, super-admin), and trial expiration dates, with the full public site (landing with live database counters, FAQ, terms) in Spanish.
Rails 7 with Hotwire, PostgreSQL, Bootstrap 5, no build pipeline: a deliberately boring stack for a product whose risk was commercial, not technical.
Outcome, honestly
The product was functionally complete: reporting, screening, the API, membership, and admin tooling all worked. What never arrived was the other half of the company. The partners who owned sales and marketing didn't execute, the member base never grew past the founding dataset, and pricing pages I had scaffolded stayed commented out. We closed it down in 2024.
I keep it on this page because it taught me the most expensive product lesson cheaply: a complete MVP with no distribution is a prototype. It directly shaped how I approach Bills, where I validate demand against a live beta instead of building ahead of it.