Étude de cas · Hart College

Système d'information étudiant (SIS) sur mesure pour un collège de formation professionnelle canadien : catalogue de cours, inscription multi-sessions, frais de scolarité Stripe et administration pilotée par coupons (Next.js + Django + PostgreSQL)

Comment UnlockLive a remplacé trois outils déconnectés et une boîte de réception partagée par un système d’information étudiant unique et sur mesure pour un collège professionnel canadien — un catalogue de cours public en Next.js, un portail étudiant d’inscription + frais de scolarité Stripe, et une console d’administration Django pour les cohortes, cours, coupons, candidats et pièces jointes. Résultat net : 100 % des frais de scolarité encaissés en ligne, des inscriptions 5 fois plus rapides et zéro feuille de calcul de rapprochement.

  • SecteurSaaS enseignement supérieur / collèges de formation professionnelle
  • Année2024
  • PaysCanada
  • Durée5 mois
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

Résultats en un coup d'œil

  • 100%Des paiements de frais de scolarité désormais encaissés en ligne via Stripe (zéro chèque / virement)
  • 5xWorkflow d'inscription plus rapide que la référence tableur + boîte de réception
  • 0Tableurs de rapprochement en fin de mois (le SIS est la source unique de vérité)
  • 5Mois entre la découverte et la première session en production sur le nouveau SIS
“Their work is satisfactory on all counts.”
Office Manager, Hart College of Cardiac Sonography & Healthcare, Toronto, Ontario · Avis client sur Clutch

Le défi

Hart College gérait les admissions sur un site marketing public, les inscriptions aux cours sur une feuille de calcul distincte, l’encaissement des frais de scolarité par chèque et virement Interac, et la communication avec les étudiants via une boîte de réception partagée. Rien ne se rapprochait. Les administrateurs ressaisissaient chaque nouvel étudiant à trois endroits, le registraire n’avait aucune réponse unique à « qui est inscrit à cette cohorte ? », et la finance passait une semaine entière chaque mois à relancer les paiements manquants et à les rapprocher de noms qui ne concordaient pas tout à fait d’un système à l’autre.

La demande semblait simple : tout remplacer par un seul système d’information étudiant (SIS) où un prospect pourrait découvrir un cours sur une page marketing publique, s’inscrire à une cohorte précise, payer ses frais de scolarité en ligne, consulter son horaire et son historique de paiements dans un portail en libre-service — et où un administrateur pourrait créer cohortes, cours, coupons, candidats et pièces jointes depuis un seul tableau de bord, sans feuilles de calcul parallèles ni travail de rapprochement en fin de mois.

Notre solution

Nous avons construit un SIS unique et sur mesure en trois volets coordonnés : un catalogue de cours public en Next.js, un portail étudiant d’inscription + frais de scolarité, et une console d’administration Django + Django REST Framework — le tout adossé à PostgreSQL et à une intégration Stripe Payments + Webhooks qui fait du SIS la source de vérité unique pour chaque dollar.

Le site public propose un catalogue Next.js rapide et optimisé pour le SEO : chaque cours a sa propre page de détail indexable, son calendrier de cohortes, ses prérequis, sa ventilation des frais de scolarité et un CTA « Enrol now » intégré — le site marketing est ainsi aussi le haut de l’entonnoir d’inscription, et non une brochure distincte. Dès qu’un prospect clique, il arrive dans une session Stripe Checkout créée côté serveur avec le bon montant, la bonne devise, le bon coupon et l’identifiant de cohorte intégrés aux métadonnées.

En cas de paiement réussi, un webhook Stripe arrive sur l’API Django et crée ou met à jour l’étudiant de façon idempotente, le rattache à la cohorte choisie, joint le reçu et envoie un e-mail de confirmation — le tout dans une seule transaction signée. Le portail de l’étudiant expose alors « My Courses », « My Schedule », « My Tuition » (avec l’historique complet des paiements et remboursements) et un onglet de documents pour les relevés de notes, pièces d’identité et ententes signées.

La console d’administration Django donne au registraire un seul endroit pour piloter tout le programme : créer une cohorte, y associer cours et professeurs, définir des codes de coupon (en pourcentage ou montant fixe, limités à une cohorte ou à un cours), téléverser des dossiers de candidats et des pièces jointes, diffuser des annonces et extraire des rapports d’inscriptions et de revenus sans jamais ouvrir Excel. Les rôles séparent registraire, finance, professeurs et administrateurs afin que chacun ne voie que l’interface dont il a besoin.

Enfin, nous avons câblé les webhooks Stripe de façon idempotente, verrouillé les enregistrements de frais de scolarité par somme de contrôle afin que la finance puisse prouver que le SIS et Stripe concordent, instrumenté chaque point de terminaison avec Sentry + CloudWatch, et stocké chaque PDF signé / pièce d’identité téléversé dans S3 avec des URL signées à durée limitée (sans accès direct aux objets).

  • Catalogue de cours Next.js public et optimisé SEO avec une page indexable par cours, un calendrier de cohortes et un CTA « Enrol now » intégré
  • Sessions Stripe Checkout créées côté serveur avec l’identifiant de cohorte, le code de coupon, la devise et la ventilation des frais de scolarité intégrés aux métadonnées
  • Webhooks Stripe idempotents — étudiant, lien vers la cohorte, ligne de frais de scolarité et e-mail de reçu écrits en une seule transaction signée
  • Portail étudiant avec My Courses, My Schedule, My Tuition (historique complet des paiements et remboursements) et téléversement de documents
  • Console d’administration Django : cohortes, cours, coupons (en pourcentage ou montant fixe, limités à une cohorte ou à un cours), candidats, pièces jointes, annonces
  • Accès séparé par rôle pour le registraire, la finance, les professeurs et les administrateurs — chaque utilisateur ne voit que l’interface qu’il utilise réellement
  • Rapprochement des frais de scolarité par somme de contrôle pour que la finance puisse prouver à tout moment que le SIS et Stripe concordent, sans ouvrir Excel
  • S3 + URL signées à durée limitée pour chaque relevé de notes, pièce d’identité et entente signée — aucun accès direct aux objets

Comment nous l'avons construit

  1. 01

    Découverte, observation du registraire, modèle de données adapté aux admissions

    Nous sommes restés une semaine avec les équipes du registraire et de la finance pour cartographier chaque endroit où un dossier étudiant était créé, modifié ou payé : site marketing, tableur d’inscription, banque, boîte de réception e-mail et lecteur partagé. Il en est ressorti un modèle de données conscient des admissions, avec des concepts de premier plan que sont `Batch`, `Course`, `Coupon`, `Candidate` et `Tuition`, plutôt que de greffer l’état de l’étudiant sur un CRM générique.

  2. 02

    Catalogue public Next.js + portail étudiant + paiement axé Stripe

    Nous avons livré un catalogue public Next.js rapide et optimisé SEO, avec une page indexable par cours et des CTA « Inscrivez-vous » intégrés qui basculent vers une session Stripe Checkout créée côté serveur, avec les métadonnées d'admission et de coupon intégrées. Le portail étudiant affiche ensuite l'emploi du temps, l'historique des paiements, les reçus et les dépôts de documents. Le site marketing est l'entonnoir, pas une brochure.

  3. 03

    Console d'administration Django + webhooks Stripe idempotents

    Côté opérations, nous avons livré une administration Django + Django REST Framework : CRUD des sessions, cours, coupons, candidats et pièces jointes, séparation des rôles entre registraire, finance, corps enseignant et administrateur, et une section de rapports d’inscriptions et de revenus. Les webhooks Stripe arrivent de façon idempotente sur un seul endpoint Django qui crée ou met à jour l’étudiant, le rattache à la bonne session, écrit la ligne de frais de scolarité et envoie l’e-mail de confirmation dans une seule transaction signée.

  4. 04

    Rapprochement, S3, observabilité, passation

    Nous avons verrouillé les lignes de frais de scolarité par somme de contrôle afin que la finance puisse prouver à tout moment que le SIS et Stripe concordent, stocké chaque PDF signé et chaque pièce d'identité téléversée dans S3 avec des URL signées à durée limitée, et instrumenté chaque endpoint avec Sentry et CloudWatch. La scolarité a reçu un runbook pour ouvrir une nouvelle rentrée, émettre un coupon, rembourser un paiement de frais de scolarité et exporter un rapport d'inscriptions, et nous sommes restés sous contrat de suivi pour les évolutions.

Stack technique

  • Next.js (React)
  • Django
  • Django REST Framework
  • PostgreSQL
  • Stripe Payments + Webhooks
  • AWS S3 (stockage de documents)
  • Sentry + CloudWatch
  • Docker
  • Développement de logiciels sur mesure
  • Ingénierie SaaS pour l’enseignement supérieur
  • Intégration de paiement Stripe
  • Design UI/UX
  • DevOps et observabilité

Questions fréquentes

Comment rapprochez-vous les paiements de frais de scolarité lorsqu'un webhook Stripe arrive deux fois ou dans le désordre ?

Deux garde-fous. (1) Le gestionnaire de webhooks est idempotent : chaque `event.id` Stripe est vérifié dans une table `processed_webhooks` avant toute écriture, de sorte qu’une nouvelle tentative n’a aucun effet. (2) Chaque ligne de frais de scolarité stocke une somme de contrôle dérivée de `(student_id, batch_id, amount, currency, coupon_code, stripe_payment_intent)`. La finance peut exécuter à tout moment une requête de rapprochement d’une ligne pour prouver que les lignes du SIS et les paiements Stripe concordent : pas d’Excel, pas d’appariement manuel, pas de panique de fin de mois.

Comment les admissions multiples sont-elles modélisées dans le SIS ?

Nous traitons `Batch` comme une entité à part entière, et non comme une étiquette sur un étudiant. Une promotion porte sa propre date de début, sa capacité, ses cours et ses affectations de professeurs. Un étudiant appartient à une ou plusieurs promotions ; un coupon peut être limité à une rentrée ou à un cours ; les rapports se filtrent par promotion en un clic. C'est la différence entre « un CRM avec un champ de rentrée » et un véritable SIS, et c'est pourquoi le service de la scolarité ne tient plus de tableur parallèle.

La plateforme est-elle extensible à d'autres collèges de formation professionnelle ou organismes de formation ?

Oui. Le modèle de données est indépendant de l’établissement : `Batch`, `Course`, `Coupon`, `Candidate`, `Attachment` et `Tuition` ne sont pas propres à Hart. Un second établissement peut être intégré en rhabillant le front-end Next.js et en provisionnant un nouveau compte Stripe ; l’administration Django et le schéma sous-jacent sont réutilisables. Nous l’avons conçu pour que l’extension aux programmes K-12, à la formation professionnelle et à la formation continue relève de la configuration, et non d’une reconstruction.

Combien de temps a pris la construction du SIS de Hart College, et comment l'équipe était-elle structurée ?

Cinq mois de bout en bout avec une équipe de quatre personnes (1 produit/chef de projet, 2 ingénieurs full-stack, 1 designer). En gros : 3 semaines de découverte et d'observation du service de la scolarité ; 12 semaines pour l'API Django REST + le catalogue public Next.js + le portail étudiant + la console d'administration ; 3 semaines de renforcement des webhooks Stripe, de travail sur les pièces jointes S3, d'observabilité et de formation du service de la scolarité ; 2 semaines d'admission pilote avant d'ouvrir la prochaine admission réelle sur le nouveau SIS.

Quelle pile technologique alimente le système d’information étudiant de Hart College ?

Un site public et des portails étudiant/administrateur Next.js (React), une API Django + Django REST Framework, PostgreSQL pour les données transactionnelles, Stripe Payments + Webhooks pour les frais de scolarité, AWS S3 pour les pièces jointes et Sentry + CloudWatch pour l’observabilité, le tout conteneurisé avec Docker et déployé via l’infrastructure en tant que code.

Envie d'un résultat comme celui-ci ?

Parlez à l'équipe qui a construit Système d'information étudiant (SIS) sur mesure pour un collège de formation professionnelle canadien : catalogue de cours, inscription multi-sessions, frais de scolarité Stripe et administration pilotée par coupons (Next.js + Django + PostgreSQL). Nous définirons le périmètre de votre projet, vous remettrons une proposition à prix fixe et vous présenterons l'exemple le plus proche de notre portfolio.

Réserver un appel stratégique