Cum am construit platforma Celindra pentru cursuri live de opțiuni trading
Celindra a venit la noi cu o problemă concretă: oferă cursuri live de opțiuni trading cu Cristian Sima, dar gestiona totul prin Excel, email-uri și Discord manual. Fiecare nou student însemna 2-3 ore de admin pentru un singur curs. Voiau o platformă care să automatizeze înscrierea, plățile, accesul la conținut și comunitatea — fără să-i lege de o platformă SaaS închisă.
Contextul de business
Celindra livrează două produse principale: cursuri intensive de două zile la București, plus retreat-uri de trei zile la Covasna. În jurul lor, o comunitate Discord activă cu materiale, sesiuni Q&A live și consultanță 1:1 cu Cristian Sima. Modelul funcționează — există cerere reală pe piața românească pentru educație financiară de calitate, predată de cineva cu credibilitate.
Problema nu era cererea. Era că procesul tehnic din spate era complet manual: Cristian primea email cu intenția de înscriere, răspundea cu IBAN, aștepta confirmare bancară (uneori 2-3 zile), trimitea manual invitație Discord, adăuga manual în spreadsheet. Pentru un singur curs cu 30 de oameni, asta însemna ~30 de ore de admin care răpeau timpul de pregătire materiale.
Decizii tehnice cheie
1. Stack ales pentru mentenanță, nu pentru fancy
Celindra avea nevoie de un produs care să funcționeze stabil cu 100-500 de utilizatori, fără să cheltuiască pe un cloud de €1,000/lună. Stack-ul ales:
Mainstream complet. Orice developer cu experiență Next.js poate prelua codul mâine. Costuri totale infrastructură: ~€35/lună (VPS Hetzner CPX31 + Cloudflare gratuit + storage). Comparativ, aceeași aplicație pe AWS ar fi rulat cu €300-€500/lună.
2. Plăți: Stripe Checkout în loc de integrare custom
Tentația de a construi propriul checkout era acolo. Am refuzat. Stripe Checkout pre-built rezolvă 95% din cazuri, e PCI-compliant out-of-box, suportă carduri europene, Apple Pay, Google Pay. Pentru un produs cu volume sub 1,000 tranzacții/lună, ROI-ul de a construi custom checkout e negativ — economia la fee-uri (1-2%) e mai mică decât costul de mentenanță.
3. Discord integration via webhook + bot dedicat
Provocarea reală era automatizarea accesului la Discord. Când cineva plătește un curs, trebuia adăugat automat în canalele potrivite, cu rolurile potrivite. Soluția:
- Stripe webhook → notifică backend-ul Celindra când plata e confirmată
- Backend creează în DB înregistrarea student + cursul
- Backend generează un link unic de invitație Discord (single-use, expires 24h)
- Resend trimite email cu credențiale + link Discord în <30 secunde după plată
- Bot Discord ascultă pe canal — când cineva intră cu link-ul, îl mută în canalele potrivite și îi atribuie rolurile
Provocări întâlnite
Provocarea 1: Plăți care «se pierd» între bancă și Stripe
În primele 2 săptămâni de live am avut 3 cazuri în care studenții plăteau, primeau confirmare Stripe, dar webhook-ul către backend-ul nostru nu ajungea (probleme rețea Hetzner). Studenții credeau că s-a furat banul lor. Am rezolvat cu retry logic exponential backoff + idempotency keys + reconciliere zilnică automată cu API-ul Stripe.
Provocarea 2: Discord rate limits
La un curs cu 50 de înscrieri într-o oră, Discord-ul ne-a banat temporar pentru rate limit. Soluția: queue cu BullMQ pentru toate operațiunile Discord, procesare cu delay 1.5s între acțiuni. La final tot durau ~75 secunde să adăugăm 50 de oameni, dar fără să fim banați.
Provocarea 3: Conținut video — unde îl stocăm?
Cursurile aveau 4-6 ore de video per ediție. Stocare pe S3-compatible (Hetzner Storage Box) + delivery prin Cloudflare Stream. Cost ~€8/lună pentru 200GB cumulat, fără surpriză la egress.
Rezultate măsurate la 6 luni post-lansare
Lecții pentru proiecte similare
- Idempotency e mandatory pentru orice integrare cu plăți. Webhook-uri care eșuează vor exista — întrebarea e doar dacă ai răspuns sau dacă pierzi banii.
- Discord are rate limits care nu sunt documentate clar. Plănuiește cu buffer — queue cu delay e mai sigur decât retry naiv.
- Hetzner + Cloudflare livrează 90% din ce dă AWS la 10% din cost pentru workload-uri stabile, EU-bound, sub 100k MAU. Asta nu e părere — sunt cifre din factură.
- Stripe Checkout pre-built > custom checkout pentru proiecte sub 10,000 tranzacții/lună. Construiești custom doar dacă ai justificare economică solidă.
- Code ownership de la primul commit e singura cale de a câștiga încrederea unui client. Nu e marketing — e business hygiene.
«În primele 6 luni am crescut numărul de cursuri lunare de la 1 la 3 fără să adăugăm o secundă de admin manual. Faintech a livrat exact ce am cerut, în timp, cu cod care arată curat când îl deschid în GitHub.» — Cristian Sima, founder Celindra