Case study
Adoptly — Plataforma de Adopción Animal Adoptly — Animal Adoption Platform
Una plataforma fullstack para organizaciones de rescate animal de Paraná, deployada y usada por 4 ONGs reales. A fullstack platform for animal rescue organizations in Paraná, deployed and used by 4 real NGOs.
Contexto Context
Adoptly nació como mi Trabajo Final Integrador en la UTN FR Paraná, pero con una premisa clara: que lo usaran organizaciones reales. Hice trabajo de campo con 4 ONGs de rescate animal de la ciudad para entender cómo gestionaban las adopciones. Adoptly started as my final project at UTN FR Paraná, but with a clear premise: that real organizations would use it. I did fieldwork with 4 animal rescue NGOs in the city to understand how they managed adoptions.
Problema Problem
Las ONGs gestionaban las adopciones por redes sociales y WhatsApp, sin una plataforma central. Era difícil mostrar a los animales de forma ordenada, recibir y seguir solicitudes, y dar visibilidad a los casos de éxito y las donaciones. The NGOs managed adoptions through social media and WhatsApp, with no central platform. It was hard to showcase animals in an organized way, receive and track applications, and give visibility to success stories and donations.
Solución y decisiones técnicas Solution and technical decisions
- Frontend en React con Clean Architecture (domain, application, infrastructure, presentation, shared). Separé el dominio del framework para que la lógica fuera testeable y la base mantenible más allá del TFI.
- API REST con Node.js y Express, Prisma como ORM y PostgreSQL (Supabase). Modelos para organizaciones, administradores, animales y casos de éxito.
- Autenticación con JWT y bcrypt, validación de formularios con React Hook Form + Zod, e imágenes en Cloudinary.
- Documentación de la API con Swagger.
- Testing serio: Jest + Supertest, pruebas de carga con k6 y una auditoría de seguridad.
Multi-tenant desde el día uno Multi-tenant from day one
La decisión de arquitectura que más condicionó el resto fue no construir una plataforma para una ONG sino para varias. Cada organización tiene sus propios animales, sus propios administradores y sus propias solicitudes, aisladas de las demás, y por encima hay un rol de super administrador para la gestión global. Eso obliga a validar la pertenencia a la organización en cada ruta protegida, no solo el token: tener sesión válida no alcanza, hay que probar que ese usuario pertenece a esa organización. Es más trabajo al principio, y es lo que hizo que sumar la cuarta ONG no fuera un despliegue nuevo. The architectural decision that shaped everything else was building the platform not for one NGO but for several. Each organization has its own animals, its own admins and its own requests, isolated from the rest, with a super-admin role above them for global management. That forces organization membership to be checked on every protected route, not just the token: a valid session is not enough, the user has to be proven to belong to that organization. It is more work up front, and it is why adding the fourth NGO was not a new deployment.
Seguridad y calidad Security and quality
- Autenticación con tokens firmados y expiración acotada; contraseñas con hash y sal, nunca en claro.
- Validación de entrada en todas las rutas del backend, además de la del cliente. La del cliente es usabilidad; la que cuenta es la del servidor.
- Consultas parametrizadas por el ORM, que cierra la puerta a la inyección de SQL por construcción.
- API documentada con Swagger, para que frontend y backend no se pongan de acuerdo por WhatsApp.
- Tests unitarios y pruebas de carga, para saber cómo se comporta antes de que lo usen personas de verdad.
Mi rol My role
Trabajé fullstack: relevamiento con las ONGs, frontend con Clean Architecture y la API REST completa. El frente y el back se deployaron por separado (Vercel y Render). I worked fullstack: requirements gathering with the NGOs, the Clean Architecture frontend, and the full REST API. Frontend and backend were deployed separately (Vercel and Render).
Resultado Result
La plataforma quedó deployada y en uso por 4 organizaciones de rescate reales de Paraná, con un flujo ordenado para publicar animales y gestionar solicitudes de adopción. The platform ended up deployed and in use by 4 real rescue organizations in Paraná, with an organized flow to publish animals and manage adoption requests.
Aprendizajes Learnings
- Aplicar Clean Architecture en un frontend real y ver el pago en mantenibilidad y tests.
- Construir con usuarios reales obliga a priorizar lo que de verdad importa.
- Testing de carga y auditoría de seguridad como parte del proceso, no como un extra.