Doplax.Dev
← Volver a proyectos
MakerUp

Capacidades

  • Pasarela de pago
  • Facturación
  • Web, iOS y Android
  • Chat en tiempo real

Frontend

AngularAngular
TypeScriptTypeScript
IonicIonic
CapacitorCapacitor

Backend

NestJSNestJS
Node.jsNode.js
TypeScriptTypeScript
PostgreSQLPostgreSQL
StripeStripe

MakerUp

Completado

MakerUp 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.

Frontend