Caso de éxito · Hart College

Sistema de información estudiantil (SIS) a medida para un colegio profesional canadiense: catálogo de cursos, matrícula con múltiples admisiones, matrícula con Stripe y administración basada en cupones (Next.js + Django + PostgreSQL)

Cómo UnlockLive reemplazó tres herramientas desconectadas y una bandeja de entrada compartida por un único Sistema de Información Estudiantil a medida para una escuela de formación profesional canadiense — un catálogo público de cursos en Next.js, un portal de inscripción y matrícula con Stripe para estudiantes, y una consola de administración en Django para grupos, cursos, cupones, candidatos y documentos adjuntos. Resultado neto: 100% de la matrícula cobrada en línea, inscripción 5 veces más rápida y cero hojas de cálculo de conciliación.

  • SectorSaaS de educación superior / colegios profesionales
  • Año2024
  • PaísCanadá
  • Duración5 meses
Custom Student Information System (SIS) for a Canadian Career College — Course Catalog, Multi-Intake Enrolment, Stripe Tuition & Coupon-Driven Admin (Next.js + Django + PostgreSQL) hero screenshot

Resultados de un vistazo

  • 100%De los pagos de matrícula ahora se cobran en línea mediante Stripe (cero cheques / transferencias electrónicas)
  • 5xFlujo de matrícula más rápido frente a la referencia de hojas de cálculo + bandeja de entrada
  • 0Hojas de cálculo de conciliación a fin de mes (el SIS es la única fuente de verdad)
  • 5Meses desde el descubrimiento hasta la primera admisión en vivo en el nuevo SIS
“Their work is satisfactory on all counts.”
Office Manager, Hart College of Cardiac Sonography & Healthcare, Toronto, Ontario · Reseña de cliente en Clutch

El reto

Hart College gestionaba las admisiones en un sitio web de marketing público, el registro de cursos en una hoja de cálculo aparte, el cobro de matrículas por cheque y transferencia electrónica, y la comunicación con los estudiantes a través de una bandeja de entrada compartida. Nada cuadraba. Los administradores volvían a introducir cada nuevo estudiante en tres lugares, el registro académico no tenía una respuesta única a '¿quién está inscrito en esta convocatoria?', y finanzas gastaba una semana completa cada mes persiguiendo pagos pendientes y cotejándolos con nombres que no coincidían del todo entre sistemas.

El encargo era engañosamente simple: reemplazar todo con un único Sistema de Información Estudiantil (SIS) donde un prospecto pudiera descubrir un curso en una página de marketing pública, inscribirse en una convocatoria concreta, pagar la matrícula en línea y consultar su horario e historial de pagos en un portal de autoservicio — y donde un administrador pudiera crear grupos, cursos, cupones, candidatos y adjuntos desde un único panel, sin hojas de cálculo paralelas ni trabajo de conciliación a fin de mes.

Nuestra solución

Construimos un único SIS a medida en tres superficies coordinadas: un catálogo público de cursos en Next.js, un portal de inscripción y matrícula para estudiantes, y una consola de administración con Django + Django REST Framework — todo respaldado por PostgreSQL y una integración de Stripe Payments + Webhooks que mantiene al SIS como la única fuente de verdad de cada dólar.

El sitio público ofrece un catálogo en Next.js rápido y optimizado para SEO: cada curso tiene su propia página de detalle indexable, calendario de convocatorias, requisitos previos, desglose de matrícula y un CTA 'Inscribirse ahora' integrado — de modo que el sitio de marketing es también la parte superior del embudo de inscripción, no un folleto aparte. Cuando el prospecto hace clic, llega a una sesión de Stripe Checkout creada en el servidor con el importe, la moneda, el cupón y el ID de la convocatoria correctos incluidos en los metadatos.

Cuando el pago se realiza con éxito, un webhook de Stripe llega a la API de Django y, de forma idempotente, crea o actualiza al estudiante, lo vincula al grupo elegido, adjunta el recibo y envía el correo de confirmación — todo en una única transacción firmada. El portal del estudiante muestra entonces 'Mis cursos', 'Mi horario', 'Mi matrícula' (con historial completo de pagos y reembolsos) y una pestaña de documentos para expedientes, identificaciones y acuerdos firmados.

La consola de administración de Django ofrece al registro académico un único lugar desde el que gestionar todo el programa: crear un grupo, asociar cursos y profesorado, definir códigos de cupón (porcentuales o fijos, por convocatoria o por curso), cargar registros de candidatos y adjuntos, publicar anuncios y obtener informes de inscripción e ingresos sin abrir nunca Excel. Los roles separan registro, finanzas, profesorado y administración, de modo que cada usuario solo ve la superficie que necesita.

Por último, conectamos los webhooks de Stripe de forma idempotente, bloqueamos los registros de matrícula con una suma de verificación para que finanzas pueda demostrar que el SIS y Stripe coinciden, instrumentamos cada endpoint con Sentry + CloudWatch y almacenamos cada PDF firmado y cada identificación subida en S3 con URL firmadas de duración limitada (sin acceso directo a los objetos).

  • Catálogo público de cursos en Next.js optimizado para SEO, con una página indexable por curso, calendario de convocatorias y CTA 'Inscribirse ahora' integrado
  • Sesiones de Stripe Checkout creadas en el servidor con el ID de convocatoria, el código de cupón, la moneda y el desglose de matrícula incluidos en los metadatos
  • Webhooks de Stripe idempotentes — estudiante, vínculo con el grupo, fila de matrícula y correo del recibo, todo escrito en una única transacción firmada
  • Portal del estudiante con Mis cursos, Mi horario, Mi matrícula (historial completo de pagos y reembolsos) y carga de documentos
  • Consola de administración de Django: grupos, cursos, cupones (porcentuales o fijos, por convocatoria o curso), candidatos, adjuntos, anuncios
  • Acceso por roles para registro, finanzas, profesorado y administración — cada usuario solo ve la superficie que realmente usa
  • Conciliación de matrículas con suma de verificación para que finanzas pueda demostrar en cualquier momento que el SIS y Stripe coinciden, sin abrir Excel
  • S3 + URL firmadas de duración limitada para cada expediente, identificación y acuerdo firmado — sin acceso directo a los objetos

Cómo lo construimos

  1. 01

    Descubrimiento, seguimiento del registro académico, modelo de datos adaptado a las admisiones

    Pasamos una semana con los equipos de registro académico y finanzas, mapeando cada lugar donde se creaba, editaba o pagaba un registro de estudiante: el sitio de marketing, la hoja de cálculo de inscripción, el banco, la bandeja de correo y la unidad compartida. De ahí surgió un modelo de datos orientado a la admisión, con conceptos de primer nivel como `Batch`, `Course`, `Coupon`, `Candidate` y `Tuition`, en lugar de añadir el estado del estudiante a un CRM genérico.

  2. 02

    Catálogo público en Next.js + portal del estudiante + checkout centrado en Stripe

    Entregamos un catálogo público en Next.js rápido y optimizado para SEO, con una página indexable por curso y CTA 'Enrol now' integrados que pasan a una sesión de Stripe Checkout creada en el servidor, con metadatos de admisión y cupones incorporados. El portal para estudiantes muestra después el horario, el historial de pagos, los recibos y la carga de documentos. El sitio de marketing es el embudo, no un folleto.

  3. 03

    Consola de administración en Django + webhooks de Stripe idempotentes

    Del lado operativo, entregamos un panel de administración con Django + Django REST Framework: CRUD de lotes, cursos, cupones, candidatos y adjuntos, separación de roles entre registro académico, finanzas, docentes y administración, y una sección de informes de matrícula e ingresos. Los webhooks de Stripe llegan de forma idempotente a un único endpoint de Django que crea o actualiza al estudiante, lo vincula al lote correcto, registra la fila de matrícula y envía el correo de confirmación en una sola transacción firmada.

  4. 04

    Conciliación, S3, observabilidad, traspaso

    Bloqueamos las filas de matrícula con una suma de verificación para que finanzas pueda demostrar en cualquier momento que el SIS y Stripe coinciden, almacenamos cada PDF firmado y cada carga de identificación en S3 con URL firmadas de duración limitada, e instrumentamos cada endpoint con Sentry + CloudWatch. El registro académico recibió un runbook para abrir una nueva convocatoria, emitir un cupón, reembolsar un pago de matrícula y exportar un reporte de inscripciones, y seguimos con un contrato de soporte para mejoras.

Stack tecnológico

  • Next.js (React)
  • Django
  • Django REST Framework
  • PostgreSQL
  • Stripe Payments + Webhooks
  • AWS S3 (almacenamiento de documentos)
  • Sentry + CloudWatch
  • Docker
  • Desarrollo de software a medida
  • Ingeniería SaaS para educación superior
  • Integración de pagos con Stripe
  • Diseño UI/UX
  • DevOps y observabilidad

Preguntas frecuentes

¿Cómo se concilian los pagos de matrícula cuando un webhook de Stripe llega dos veces o fuera de orden?

Dos salvaguardas. (1) El manejador de webhooks es idempotente: cada `event.id` de Stripe se compara con una tabla `processed_webhooks` antes de cualquier escritura, de modo que un reintento no tiene efecto. (2) Cada fila de matrícula almacena un checksum derivado de `(student_id, batch_id, amount, currency, coupon_code, stripe_payment_intent)`. Finanzas puede ejecutar en cualquier momento una consulta de conciliación de una línea para demostrar que las filas del SIS y los cargos de Stripe coinciden: sin Excel, sin cotejo manual, sin pánico de fin de mes.

¿Cómo se modela en el SIS la matrícula con múltiples ingresos?

Tratamos `Batch` como una entidad de primer nivel, no como una etiqueta en un estudiante. Un grupo (batch) tiene su propia fecha de inicio, cupo, cursos y asignaciones docentes. Un estudiante pertenece a uno o más grupos; un cupón puede limitarse por convocatoria o por curso; los reportes se filtran por grupo con un solo clic. Esta es la diferencia entre «un CRM con un campo de ingreso» y un verdadero SIS, y es la razón por la que el registro académico ya no mantiene una hoja de cálculo paralela.

¿Es extensible la plataforma a otras universidades profesionales o proveedores de formación?

Sí. El modelo de datos es independiente de la institución: `Batch`, `Course`, `Coupon`, `Candidate`, `Attachment` y `Tuition` no son específicos de Hart. Se puede incorporar una segunda institución cambiando el diseño del front-end en Next.js y aprovisionando una nueva cuenta de Stripe; el panel de administración de Django y el esquema subyacente son reutilizables. Lo diseñamos para que extenderlo a educación K-12, formación profesional y programas de educación continua sea un cambio de configuración, no una reconstrucción.

¿Cuánto tiempo tomó construir el SIS de Hart College y cómo se estructuró el equipo?

Cinco meses de principio a fin con un equipo de cuatro personas (1 producto/PM, 2 ingenieros full-stack, 1 diseñador). Aproximadamente: 3 semanas de descubrimiento y acompañamiento al registro académico; 12 semanas de API REST de Django + catálogo público en Next.js + portal del estudiante + consola de administración; 3 semanas de refuerzo de webhooks de Stripe, trabajo con adjuntos en S3, observabilidad y capacitación del registro; 2 semanas de admisión piloto antes de abrir la siguiente admisión real en el nuevo SIS.

¿Qué stack impulsa el Sistema de Información Estudiantil de Hart College?

Un sitio público en Next.js (React) y portales de estudiantes y administración, una API con Django + Django REST Framework, PostgreSQL para los datos transaccionales, Stripe Payments + Webhooks para la matrícula, AWS S3 para los documentos adjuntos y Sentry + CloudWatch para la observabilidad, todo contenerizado con Docker y desplegado mediante infraestructura como código.

¿Quiere un resultado como este?

Hable con el mismo equipo que construyó Sistema de información estudiantil (SIS) a medida para un colegio profesional canadiense: catálogo de cursos, matrícula con múltiples admisiones, matrícula con Stripe y administración basada en cupones (Next.js + Django + PostgreSQL). Definiremos el alcance de su proyecto, le daremos una propuesta a precio fijo y le mostraremos el caso más parecido de nuestro portafolio.

Reservar una llamada estratégica