Allá por 2021, un cliente se acercó a mí con lo que parecía un brief directo: "Necesitamos un sitio de subastas. Como eBay, pero de nicho -- repuestos de motocicletas clásicas". Tres meses, dos prototipos abandonados y una caída en producción genuinamente vergonzosa después, tenía opiniones. Opiniones fuertes. Lo logramos al final, pero no lo construiría de la misma manera ahora. Para nada.
Punto clave: una plataforma de subastas para 2026 es Next.js, Supabase con canales en tiempo real para pujas en vivo, y Stripe; la parte difícil es mantener la integridad del estado de pujas bajo concurrencia, no el stack.A 2026 auction platform is Next.js, Supabase with realtime channels for live bidding, and Stripe; the hard part is bid-state integrity under concurrency, not the stack.
Las plataformas de subastas son engañosamente difíciles. En la superficie es solo listados, pujas y un temporizador. Pero en el momento en que dos usuarios pujan dentro de milisegundos uno del otro, o tu conexión WebSocket se cae justo cuando la cuenta atrás llega a cero, o tu procesador de pagos agota el tiempo a mitad de la captura -- de repente estás explicándole a un vendedor muy molesto por qué su BSA Lightning de 1967 se vendió por £12. Así que déjame caminar contigo por lo que realmente construiría en 2026, herramienta por herramienta, decisión por decisión.
---
La Decisión de Arquitectura Central: ¿Monolito o Servicios?
No dejes que nadie te venda microservicios para una primera versión. Lo digo en serio.
He visto este error repetidamente -- un fundador contrata a un consultor, el consultor diagrama ocho servicios separados en una pizarra, todos asienten, y seis meses después nada se lanza porque el equipo está debuggeando la latencia inter-servicio en una plataforma con 40 usuarios. Para un MVP de subastas o incluso un producto moderadamente escalado (digamos, menos de 50,000 usuarios activos mensuales), un monolito modular es la llamada correcta.modular monolith is the right call.
A lo que recurriría: Next.js en la capa frontend y API, con un backend Node.js. No porque sea tendencia. Porque el modelo de server components en Next.js 14+ genuinamente reduce la complejidad de páginas de listado de subastas donde SEO realmente importa -- quieres que esas descripciones de lotes se indexen. Las rutas de API manejan lo más ligero; lo pesado en tiempo real vive en otro lado (más sobre eso en un momento).Next.js on the frontend and API layer, with a Node.js backend. Not because it's trendy. Because the server components model in Next.js 14+ genuinely reduces the complexity of auction listing pages where SEO actually matters -- you want those lot descriptions indexed. The API routes handle lighter lifting; the heavy real-time stuff lives elsewhere (more on that in a moment).
¿Base de datos? PostgreSQL. Siempre PostgreSQL para cualquier cosa transaccional. Las subastas son profundamente relacionales -- usuarios, lotes, pujas, reservas, facturas -- y quieres que las restricciones de clave externa hagan trabajo real, no lógica basada en vibras de la aplicación. Lo ejecutaría en Supabase en 2026 porque obtienes Postgres, seguridad a nivel de fila, y una capa de suscripción en tiempo real incorporada, lo que colapsa lo que solía ser tres preocupaciones de infraestructura separadas en una sola factura.Supabase in 2026 because you get Postgres, row-level security, and a real-time subscription layer baked in, which collapses what used to be three separate infrastructure concerns into one bill.
---
Ofertas en Tiempo Real: La Parte Que Te Romperá
Aquí es donde la mayoría de plataformas de subastas mueren. O al menos cojean.
El problema fundamental: las pujas tienen que sentirse instantáneas, tienen que ser consistentes, y tienen que manejar condiciones de carrera correctamente. Si dos usuarios envían una puja en el mismo milisegundo, uno de ellos gana. La base de datos decide quién. No el frontend, no el balanceador de carga -- la base de datos, a través de una transacción escrita correctamente con SELECT FOR UPDATE.SELECT FOR UPDATE.
Para la capa en tiempo real en sí, usaría Ably en 2026 en lugar de enrollar WebSockets crudos. Intenté el enfoque crudo en un proyecto de subasta de propiedades en Seahawk allá por 2022 -- socket.io auto-alojado, Redis pub/sub, todo. Estuvo bien hasta que no. Ably te da garantía de orden de mensajes, recuperación de estado de conexión (así que si el teléfono de un pujador cambia de WiFi a 4G en mitad de una subasta, no se pierden silenciosamente la puja ganadora), y un dashboard sensato. El precio a escala es real, pero para la mayoría de operadores de subastas es ruido comparado con la complejidad de infraestructura.Ably in 2026 rather than rolling raw WebSockets. I tried the raw approach on a property auction project at Seahawk back in 2022 -- self-hosted socket.io, Redis pub/sub, the works. It was fine until it wasn't. Ably gives you guaranteed message ordering, connection state recovery (so if a bidder's phone switches from WiFi to 4G mid-auction, they don't silently miss the winning bid), and a sensible dashboard. The pricing at scale is real, but for most auction operators it's noise compared to infrastructure complexity.
Manejando el Problema de "Bid Sniping"
El sniping de subastas -- colocar una puja en los últimos segundos -- es o una característica o un bug dependiendo de tu cliente. eBay famosamente lo permite. Muchas casas de subastas especializadas extienden el temporizador 30-60 segundos si una puja llega en el último minuto. Esto se llama "cierre suave" o lógica "anti-sniping". Constrúyelo desde el día uno. La regla es simple:
- La oferta llega con menos de N segundos restantes
- La transacción confirma que la oferta es válida y la más alta
- El tiempo de finalización de la subasta se extiende N segundos
- La nueva hora de finalización se transmite a todos los clientes conectados a través de Ably
Son quizás 40 líneas de lógica de servidor. Saltarse esto e implementarlo después es un dolor de cabeza que no quieres tener.
---
Pagos: No te Compliques
He visto que la gente recurra a configuraciones de pago exóticas en sitios de subastas porque las subastas tienen requisitos peculiares -- captura los datos de pago por adelantado, solo cobra cuando se cierra el lote, puede que necesites retener un depósito, puede que necesites reembolsar inmediatamente si se supera la oferta. Todo cierto. Todo solucionable con Stripe sin salir de la documentación de Stripe.
Stripe en 2026 sigue siendo la respuesta correcta para la gran mayoría de operadores de subastas. Específicamente: in 2026 is still the right answer for the vast majority of auction operators. Specifically:
- Stripe Payment Intents para el flujo estándar de puja-a-cargo for the standard bid-to-charge flow
capture_method: manual para autorizar una tarjeta sin cobrarla (esencial para retenciones de depósito)to authorise a card without charging it (essential for deposit holds)- Stripe Connect si estás construyendo un marketplace donde múltiples vendedores reciben pagos
Lo que sí marcaría: no autorices tarjetas por el valor total del lote por adelantado a menos que tengas asesoría legal que diga que debes hacerlo. Autoriza un depósito (10-25% es común en el mundo de las subastas), luego captura o anula una vez que se cierre el lote. Tus tasas de rechazo de tarjetas te lo agradecerán.
Para casas de subastas de mayor valor -- autos clásicos, bellas artes, ese tipo de cosas -- querrás acomodar transferencia bancaria. Stripe ahora maneja esto razonablemente bien a través de sus productos de enlace de pago e invoices, pero aún necesitarás a una persona en el proceso para la reconciliación. Construye una cola de administración simple; no automatices lo que no necesita automatización.
---
Search and Filtering: Typesense, Not Elasticsearch
Honestamente, la pregunta de búsqueda en plataformas de subastas está subestimada. Los usuarios necesitan filtrar por categoría, precio actual, tiempo restante, condición, ubicación. Lo necesitan rápido.
Elasticsearch es excesivo para la mayoría de sitios de subastas y un dolor genuino de operar. Typesense es lo que usaría. Es código abierto, puedes autohospedarlo en un droplet de DigitalOcean de $6 o usar Typesense Cloud, y la calidad de búsqueda es excelente para datos de estilo catálogo. Sincroniza tu tabla de lotes PostgreSQL con Typesense a través de un gancho simple de cambio-captura-de-datos o un trabajo cron cada 30 segundos (la sincronización en tiempo real de precios de lotes de subasta es bonita pero raramente necesaria para búsqueda).Typesense is what I'd use. It's open source, you can self-host on a $6 DigitalOcean droplet or use Typesense Cloud, and the search quality is excellent for catalogue-style data. Sync your PostgreSQL lots table to Typesense via a simple change-data-capture hook or a cron job every 30 seconds (real-time sync of auction lot prices is nice but rarely necessary for search).
Lo que Typesense no maneja bien out of the box: geosearch para artículos de recogida solamente. Tiene geo filtering, pero si tu sitio de subastas tiene inventario pesado de "recogida local solamente", dedica media jornada a esa configuración temprano. Yo no lo hice, en un sitio de subastas de maquinaria de jardín en 2023, y lo retro-equipamos después con el doble de esfuerzo.
---
Infraestructura y Hosting
Aquí está mi configuración predeterminada para 2026:
- Vercel para el frontend de Next.js y rutas de API -- deployments sin configuración, URLs de previsualización por rama, funciones edge donde sea necesario for the Next.js frontend and API routes -- zero config deployments, preview URLs per branch, edge functions where needed
- Supabase para PostgreSQL y autenticación for PostgreSQL and auth
- Ably para WebSockets for WebSockets
- Typesense Cloud para búsqueda for search
- Cloudflare frente a todo -- el tier gratuito maneja DDoS, optimización de imágenes y caché sin complicaciones in front of everything -- free tier handles DDoS, image optimisation, and caching without fuss
- Uploadcare o Cloudinary para imágenes de lotes subidas por vendedores (nunca almacenes cargas de usuarios en tu propio servidor en 2026, por favor) or Cloudinary for seller-uploaded lot images (never store user uploads on your own server in 2026, please)
Ese stack no tiene Kubernetes, no tiene cluster Redis autogestionado, no requiere contratar a un DevOps. Un desarrollador en solitario o un equipo pequeño puede operarlo. Y críticamente -- escala sin necesidad de rediseñar. Vercel y Supabase manejarán el pico de tráfico cuando aparezcan en una publicación especializada y 8,000 personas accedan a tu sitio en una hora.Vercel and Supabase will handle the traffic spike when you get featured in a trade publication and 8,000 people hit your site in an hour.
Un Error de Infraestructura que Sigo Viendo
La gente olvida los trabajos en segundo plano. Los eventos de cierre de subastas no son disparados por el usuario -- suceden en un timestamp específico, del lado del servidor. Necesitas un programador de tareas confiable. Usaría Inngest para esto en 2026. Maneja disparadores basados en tiempo, reintentos, y te da un registro de eventos que es realmente útil cuando estás debuggeando "por qué se cerró el lote 447 sin enviar el email al ganador". No uses un cron simple en tu servidor. Cuando tu servidor se reinicia, tu estado de cron se pierde.Inngest for this in 2026. It handles time-based triggers, retries, and gives you an event log that's actually useful when you're debugging "why did lot 447 close without sending the winner email". Don't use a simple cron on your server. When your server restarts, your cron state is gone.
---
Herramientas de Administrador y Vendedor
Los vendedores necesitan crear listados, subir imágenes, establecer precios de reserva, y ver historiales de pujas. Los compradores necesitan listas de vigilancia, alertas de pujas, y descargas de facturas. Estas no son características glamorosas. Son las que los clientes te llaman a las 9pm un jueves.
Para el panel de administración, construiría algo ligero sobre Retool o un dashboard personalizado en Next.js dependiendo del presupuesto. Retool es genuinamente rápido de implementar y maneja el 80% de las tareas administrativas de subastas -- aprobar listados, gestionar usuarios, anular ofertas -- sin escribir mucho código. Para cualquier cosa orientada al cliente construiría correctamente en Next.js, porque Retool embebido en un iframe no es una buena experiencia de usuario.Retool or a custom Next.js dashboard depending on budget. Retool is genuinely fast to stand up and handles the 80% of auction admin tasks -- approving listings, managing users, voiding bids -- without writing much code. For anything client-facing I'd build properly in Next.js, because Retool embedded in an iframe is not a good user experience.
Las notificaciones por email -- alertas de superación de oferta, lote cerrándose pronto, invoice lista -- van a través de Resend en 2026. Reemplazó a SendGrid en mi stack hace unos 18 meses y no he mirado atrás. La experiencia del desarrollador es notablemente mejor y la entregabilidad ha sido sólida.Resend in 2026. It replaced SendGrid in my stack about 18 months ago and I haven't looked back. The developer experience is notably better and the deliverability has been solid.
---
Consideraciones de Seguridad Específicas para Subastas
Las plataformas de subastas atraen intentos de manipulación de pujas. Las pujas fraudulentas (un vendedor aumentando el precio de su propio lote usando cuentas falsas), apropiaciones de cuenta para colocar pujas ganadoras fraudulentas, y fraude de pago son todos reales y desproporcionadamente comunes comparados con el comercio electrónico típico.
Algunas cosas que yo integraría desde el inicio:
- Rate limiting en envío de ofertas -- máximo N ofertas por usuario por minuto por lote, ejecutado en la capa de API. Upstash Redis es bueno para esto; tiene una librería con propósito específico para rate limiting. -- max N bids per user per minute per lot, enforced at the API layer. Upstash Redis is good for this; it has a purpose-built rate limiting library.
- La verificación de email antes de pujar está permitida — suena obvio, pero detiene una cantidad sorprendente de abusos -- sounds obvious, stops a surprising amount of abuse
- Puntuación de fraude mediante Stripe Radar — ya viene incluida en Stripe, solo úsala -- already included in Stripe, just use it
- Fingerprinting de IP y dispositivo para detectar clusters de cuentas sospechosas — FingerprintJS Pro vale la pena si operás a cualquier escala significativa -- FingerprintJS Pro is worth the cost if you're operating at any meaningful scale
Honestamente, lo más importante es el logging. Registra cada intento de puja, cada pago fallido, cada acción de cuenta. Cuando algo falla — y va a falir — querés un registro de auditoría completo. El logging integrado de Supabase más una configuración ligera en Axiom cubre esto sin mucho esfuerzo.Axiom covers this without much effort.
---
FAQ
¿Cuál es el stack mínimo viable para un sitio de subastas pequeño y local?
Si estás construyendo para una casa de subastas local con tal vez 200 usuarios y ventas semanales, no necesitás Ably ni Typesense. WordPress con un plugin como Auctions for WooCommerce te lleva sorprendentemente lejos. He configurado tres de estos para casas de subastas regionales — antigüedades, equipos agrícolas, ese tipo de cosas. En el momento en que necesitás pujas competitivas en tiempo real bajo carga, te quedás corto rápido.WordPress with a plugin like Auctions for WooCommerce gets you surprisingly far. I've set up three of these for regional auction houses -- antiques, farm equipment, that sort of thing. The moment you need real-time competitive bidding under load, outgrow it fast.
¿Puedo usar Firebase en lugar de Supabase?
Podés. Firestore de Firebase es en realidad una opción razonable para el estado de pujas en tiempo real. La razón por la que prefiero Supabase en 2026 es SQL — los datos de subastas tienen mucha estructura relacional (los lotes pertenecen a ventas, las pujas pertenecen a lotes y usuarios, las facturas hacen referencia a pujas), y consultar una base de datos de documentos para eso se pone complicado. Pero si tu equipo ya conoce Firebase profundamente, no cambies solo porque sí.
¿Cómo manejo las zonas horarias para las horas de cierre de la subasta?
Almacena todo en UTC. Siempre. Muestra la zona horaria local del usuario a través del navegador. Esto suena obvio y aún lo veo hecho mal en aproximadamente uno de cada cinco proyectos. La API Intl.DateTimeFormat en navegadores modernos maneja el lado de la visualización sin necesidad de ninguna librería.Intl.DateTimeFormat API in modern browsers handles the display side without any library.
¿Necesito una aplicación móvil?
No para un MVP. Una progressive web app bien construida con notificaciones push (mediante la Web Push API) cubre el 90% de lo que los postores realmente necesitan en mobile. Las aplicaciones nativas vienen después, si el negocio lo justifica. Usaría Expo y React Native cuando llegue ese día — codebase compartida entre iOS y Android, y el equipo ya conoce React.Expo and React Native when that day arrives -- shared codebase across iOS and Android, and the team already knows React.
---
Ejecutar subastas online es un desafío de ingeniería legítimo disfrazado en una interfaz deceptivamente simple. La interfaz de pujas son tres botones y un número. Todo lo que hay debajo — consistencia, equidad, estado en tiempo real, prevención de fraude — es donde vive el trabajo real. Armá bien el stack desde el principio y el resto es solo features. Armálo mal y sos vos la persona explicándole al vendedor por qué su lote se vendió por £12.
Construye infraestructura aburrida. Construye productos interesantes sobre ella.
