
Capacidades
- Pasarela de pago
- Facturación
- Web, iOS y Android
- Chat en tiempo real
Frontend
Backend
MakerUp
CompletadoMakerUp es un marketplace donde los makers publican sus proyectos de impresión 3D, gestionan sus impresoras y filamentos, y venden cobrando con Stripe. La plataforma se lleva una comisión de cada venta. Es una app multiplataforma (Angular 20 + Ionic 8) sobre un backend NestJS con TypeORM y PostgreSQL.
El reto
El reto no era publicar productos, era cerrar el círculo del dinero: cobrar en nombre de terceros, quedarse una comisión, no duplicar jamás una venta aunque Stripe reintente el webhook, y emitir facturas legales con numeración correlativa que aguanten una revisión.
Implementación
Stripe Connect de punta a punta
Onboarding de cuentas Express del maker, PaymentIntent con comisión de plataforma (application_fee) y transfer_data al vendedor, y Payment Element en el front con confirmación 3DS. Comprar solo se habilita si el maker completó el KYC y tiene los cobros activos.
El importe se calcula en el servidor
El PaymentIntent deriva importe, moneda y destinatario del proyecto en base de datos; nunca se confía en lo que manda el cliente. Fue una decisión deliberada tras detectar que confiar en la moneda del navegador descuadraba importe y divisa.
Webhook idempotente como fuente de verdad
La venta solo se registra desde el webhook de Stripe, con firma verificada y clave única por paymentIntentId: una reentrega no duplica la compra ni reenvía emails. También cubre reembolsos, disputas y pagos cancelados.
Facturación legal separada de presupuestos
Dos caminos que no se mezclan: la factura real solo se emite desde una venta cerrada, con numeración correlativa por maker y año, IVA incluido y PDF persistido; el presupuesto es un PDF de cliente que no numera ni persiste nada.
Sesión por cookie httpOnly, también en el chat
No hay token en localStorage: la sesión vive en una cookie httpOnly y esa misma cookie autentica el WebSocket del chat 1:1 entre comprador y maker. El emisor de cada mensaje se fija en servidor, así que no es suplantable.
Catálogos con importación masiva
Filamentos, impresoras y marcas con import desde Excel en modo upsert no destructivo, normalización de marcas por slug y alias, y fusión de duplicados desde el panel de administración.
App multiplataforma real
Misma base Angular 20 con componentes standalone, detección de cambios zoneless y estado en signals, empaquetada con Ionic + Capacitor para web, iOS y Android, y con PWA.
Testing donde duele
Suites Jest (backend) y Karma (frontend) obligatorias en los flujos críticos —subida de ficheros, registro/login, pagos y facturas— más smoke E2E con Puppeteer contra entorno local y Stripe en modo test.