Sari la conținut
Case study · proiect propriuFacturare electronică · RO e-Factura

Emitera: aplicație SaaS pentru facturare electronică și RO e-Factura

Un site de prezentare se judecă după câte telefoane produce. O aplicație se judecă după cât de mult din munca unui om preia. Sunt două meserii diferite, iar asta e a doua.

Aplicație SaaS — produs propriu

emitera.ro
Website Emitera pe desktop
Website Emitera pe telefon

01 /Contextul proiectului

Ce e Emitera și de ce am construit-o

Emitera e produsul meu, nu o lucrare plătită de un client. O scriu de la început, ca să nu existe confuzie: tot ce urmează e despre ce am construit pentru mine, nu despre un rezultat livrat altcuiva.

E o platformă de facturare pentru firme din România, cu facturi, clienți, cheltuieli și rapoarte financiare într-un singur produs, plus comunicare OAuth cu sistemul RO e-Factura al ANAF. Nișa e dictată de lege, nu de gust: firmele nu aleg dacă trimit facturile electronic, ci doar cu ce unealtă o fac. Asta schimbă complet regulile — o eroare de integrare nu e un bug de UI, e o factură care nu ajunge la ANAF.

02 /Constrângeri

Ce dicta, de fapt, forma site-ului

Fiecare decizie de mai jos vine dintr-una din constrângerile astea. Fără ele, ar fi rămas doar preferințe de design.

Integrarea cu ANAF nu iartă aproximări

RO e-Factura are format impus, autentificare OAuth și un sistem care răspunde cu erori pe care utilizatorul final nu are cum să le descifreze. Aplicația trebuie să gestioneze token-uri, retrimiteri și stări intermediare — o factură poate fi trimisă, în așteptare sau respinsă, iar utilizatorul trebuie să înțeleagă în ce stare e fără să citească documentație tehnică.

Datele financiare cer alt nivel de securitate

Într-un site de prezentare, cel mai rău lucru care se poate întâmpla e un formular de spam. Aici vorbim de facturi, coduri fiscale și date de firmă. Nivelul de protecție nu e opțional, iar decizia asta se ia la început, în arhitectură, nu la final, cu un plugin.

Un produs cu abonament are nevoie de infrastructură de produs

Nu doar aplicația: pagini legale, politică de anulare și rambursare, termeni, cookies, contact. Fără ele nu poți încasa abonamente și nu treci de verificările procesatorilor de plăți. E partea de care nimeni nu vorbește, dar fără care produsul nu există comercial.

03 /Abordarea

Deciziile luate și motivul din spatele fiecăreia

Un site nu e o listă de secțiuni. E o serie de decizii care fie duc vizitatorul la contact, fie îl pierd pe drum.

  1. 01

    Aplicație, nu site — și asumat ca atare

    Frontend-ul e o aplicație pe o singură pagină, servită de nginx: browserul primește un schelet HTML de 4,5 KB și construiește interfața din JavaScript. E alegerea corectă pentru o unealtă în care omul stă și lucrează, cu ecrane de facturi și tabele care se actualizează fără reîncărcare. Costul e real și îl scriu pe față: pagina publică nu are conținut pentru motoarele de căutare, așa că Emitera nu se promovează prin SEO organic pe pagina principală. Pentru un produs care se vinde prin campanii și recomandări, e un compromis acceptat, nu o scăpare.

  2. 02

    API-ul e separat și închis by default

    Interfața și API-ul sunt două lucruri distincte. Orice cerere către rutele de date primește 401 fără sesiune validă — se poate verifica din exterior, oricine poate încerca. Separarea asta e ce permite ca mâine să existe o aplicație de mobil peste același API, fără să rescriu logica de business.

  3. 03

    Politici de securitate scrise, nu presupuse

    Content-Security-Policy cu surse enumerate una câte una și hash-uri pentru scripturile inline, HSTS pe un an cu subdomenii, Cross-Origin-Opener-Policy, Referrer-Policy „no-referrer”, permisiuni de cameră și microfon revocate explicit. Aplicația refuză să fie încărcată în iframe de pe alt domeniu. Sunt lucruri care nu se văd în interfață și pe care nu ți le cere niciun client, dar care fac diferența într-un produs care ține date financiare.

  4. 04

    Autentificare cu Google, pe lângă cea clasică

    Politica de securitate a paginii permite explicit doar biblioteca de sign-in Google, nimic altceva. Un cont nou se face în câteva secunde, fără încă o parolă de ținut minte — la un produs cu abonament, frecarea de la înregistrare e primul loc unde pierzi utilizatori.

  5. 05

    Shell-ul nu se cache-uiește niciodată

    Scheletul aplicației e servit cu „no-store”, în timp ce fișierele de JavaScript și CSS au hash în nume. Efectul: la fiecare versiune nouă utilizatorii primesc imediat codul nou, fără să rămână blocați pe o versiune veche din cache-ul browserului — problema clasică a aplicațiilor pe o singură pagină, care produce erori imposibil de reprodus.

  6. 06

    Partea comercială, tratată ca parte din produs

    Sitemap-ul public are 6 rute și patru dintre ele sunt legale: termeni, confidențialitate, cookies, anulare și rambursare. Plus contact. Un SaaS pe abonament fără paginile astea nu e un SaaS, e un demo.

04 /Ce s-a livrat

Inventarul paginii live, nu o listă de promisiuni

Tot ce urmează există acum pe emitera.ro și se poate verifica deschizând site-ul sau sursa paginii.

Aplicația

  • Rute de aplicație pentru autentificare, înregistrare, panou, facturi, clienți, cheltuieli, rapoarte și setări
  • Frontend construit pe Angular, livrat ca aplicație pe o singură pagină
  • API separat, care răspunde 401 la cereri neautentificate
  • Conexiune WebSocket permisă în politica de securitate, pentru actualizări în timp real

Integrări

  • Comunicare OAuth cu RO e-Factura (ANAF)
  • Autentificare cu Google, singura sursă externă de script permisă
  • Fără servicii terțe de analiză: politica de securitate nu permite conexiuni de date în afara domeniului propriu

Securitate și livrare

  • Content-Security-Policy cu surse enumerate și hash-uri pentru scripturi inline
  • HSTS 1 an cu includeSubDomains, HTTP/2 cu HTTP/3 anunțat
  • Cross-Origin-Opener-Policy, Referrer-Policy „no-referrer”, X-Content-Type-Options
  • Permissions-Policy: microfon, geolocație, plăți și USB revocate explicit

Partea publică

  • Date structurate SoftwareApplication cu categoria BusinessApplication și prețul afișat
  • Meta description, canonical și 9 tag-uri Open Graph
  • Manifest PWA, set complet de favicon-uri și temă de culoare
  • sitemap.xml cu 6 rute și robots.txt, ambele răspund 200

05 /Fapte măsurate

Cifre de pe site-ul live, cu metoda alături

Nu scriu creșteri de trafic sau număr de lead-uri: nu sunt date publice, deci nu le poți verifica. Astea se pot verifica, iar dacă între timp s-au schimbat, măsoară din nou.

Schelet HTML livrat

1,6 KB

4,5 KB necomprimat

Cod de aplicație la prima vizită

≈202 KB

comprimat; 733 KB necomprimat

Răspuns API fără sesiune

401

pe /invoices, /clients, /reports

Rute publice în sitemap

6

Mod de livrare

no-store

shell-ul nu rămâne blocat în cache

Timp până la primul byte

nemăsurabil corect

vezi nota de mai jos

Cum am măsurat · 6 august 2026

Aici lipsește intenționat cifra pe care ai găsi-o pe celelalte case study-uri: timpul de răspuns. Emitera e găzduită pe același server de pe care rulez măsurătorile, așa că orice valoare aș scrie ar fi între 13 și 27 ms — un număr care arată spectaculos și care nu înseamnă nimic, fiindcă pachetele nu ies în internet. L-aș fi putut publica fără să observe nimeni; nu se potrivea cu regula restului paginii. Ce vezi mai sus sunt mărimi și coduri de răspuns, identice indiferent de unde măsori. Pentru timpi reali, deschide raportul PageSpeed de mai jos: rulează de pe infrastructura Google.

Următorul pas

Ai nevoie de o aplicație, nu de un site de prezentare?

Dacă lucrezi acum în fișiere Excel sau într-un program care nu mai ține pasul, spune-mi ce proces vrei automatizat. Îți răspund cu o direcție tehnică și cu un interval de preț, fără obligații.

  • Răspuns în aceeași zi lucrătoare, direct de la cel care construiește
  • O direcție concretă + interval de preț, nu un „vă contactăm noi”
  • Fără obligații și fără insistențe după

Fără spam, fără abonamente. Datele rămân între noi.

Cere estimare gratuită