const stripe = require('@stripe/stripe-js');
// Redirecționarea simplă cu Checkout - te scapă de durerile de cap cu SCA-ul din RO
async function redirectToCheckout(priceId, customerEmail) {
const stripeInstance = await stripe.loadStripe(process.env.STRIPE_PUBLIC_KEY);
const { error } = await stripeInstance.redirectToCheckout({
lineItems: [{ price: priceId, quantity: 1 }],
mode: 'subscription',
successUrl: 'https://saas.ro/payment-success?session_id={CHECKOUT_SESSION_ID}',
cancelUrl: 'https://saas.ro/billing',
customerEmail: customerEmail,
});
if (error) {
console.error('Eroare redirect:', error.message);
}
}Am tot văzut discuții pe grup despre cum e mai bine să integrezi plățile în România, mai ales de când cu normele stricte de SCA (Strong Customer Authentication). Am trecut prin ambele variante — și Checkout-ul lor găzduit, și Elements integrat direct în pagină — pe un SaaS românesc de facturare unde am gestionat peste 5.000 de tranzacții lunare.
Iată concluziile mele la rece, fără vrăjeală de marketing, ci bazate pe ce ne-am lovit în producție.
Stripe Checkout: Calea rapidă (și de ce o folosesc acum în 80% din cazuri)
Când am lansat primul MVP la un proiect, am vrut să fiu șmecher. Am zis că fac eu totul in-app cu Elements, ca să nu trimit userul în altă parte. Mare greșeală. Am pierdut vreo două săptămâni cu stările de eroare, validările de card și, cel mai rău, cu pop-up-urile de 3D Secure care pe mobil se încărcau aiurea în WebViews sau browsere in-app (cum e cel de Facebook sau Instagram).
Am trecut pe Stripe Checkout și am rezolvat totul într-o după-amiază. Stripe îți dă o pagină găzduită de ei, optimizată obsesiv pentru conversie.
Avantajul major în RO: Utilizatorul român e destul de sceptic când cumpără de la un site local de care n-a mai auzit. Când vede că e redirecționat pe checkout.stripe.com, brandul Stripe oferă o doză instantă de încredere. În plus, ai Apple Pay, Google Pay și chestii gen Link active din start, fără să configurezi manual domenii în dashboard-ul Apple Developer.
Dezavantajul: Utilizatorul părăsește site-ul tău. Dacă vinzi enterprise sau ai un flux de onboarding foarte strâns (unde plata e doar un pas intermediar), ruperea asta de UX poate să scadă conversia cu câteva procente. De asemenea, e mai greu să faci analytics precis pe funnel-ul de checkout.
Stripe Elements: Când vrei control absolut (și ai timp de pierdut)
Elements înseamnă că pui niște iframe-uri securizate direct în formularul tău din React, Vue sau ce mai folosești pe frontend. Utilizatorul nu pleacă nicăieri. Totul se întâmplă pe domeniul tău, app.saas.ro/billing.
Am implementat asta la un proiect cu peste 10.000 de useri activi, unde aveam nevoie de un flux de checkout extrem de personalizat, cu selecție de add-on-uri și calcul de discount-uri în timp real direct în pagina de plată.
Trade-off-ul sincer: Arată incredibil de profi, dar costul ascuns e mentenanța. Când băncile din România schimbă ceva la fluxul de 3D Secure sau când Stripe își updatează API-urile, tu ești cel care trebuie să testeze dacă modalul se închide corect și dacă webhook-urile de payment_intent.succeeded vin când trebuie. Dacă uiți să tratezi un caz de requires_action pe frontend, pur și simplu pierzi bani.
Costuri și birocrație românească
Din punct de vedere al comisioanelor Stripe, nu e nicio diferență: plătești aceiași 1.4% + 1.00 RON pentru cardurile europene, indiferent de metodă.
Dar apare o problemă specifică nouă: facturarea automată pentru firme (B2B). Un SaaS românesc are nevoie de datele fiscale (CUI, Registrul Comerțului) pentru a emite factura prin e-Factura. Dacă folosești Checkout, trebuie să capturezi datele de facturare ale firmei folosind câmpurile lor de "tax ID" și să le sincronizezi ulterior cu un serviciu local gen SmartBill sau Factual prin webhook.
Cu Elements, poți valida CUI-ul prin API-ul ANAF pe frontend-ul tău, în timp real, înainte ca userul să apese pe butonul de plată. E mult mai curat și salvezi timp cu stornările din cauza datelor greșite introduse de clienți.
Concluzia mea
Dacă ești la început, ai sub 50k € MRR și vrei doar să validezi produsul, folosește Stripe Checkout. Salvezi zeci de ore de development și scapi de durerile de cap cu conformitatea PCI. Treci la Stripe Elements doar atunci când un branding impecabil îți aduce destulă conversie în plus încât să merite salariul unui dev timp de două săptămâni.
Voi ce folosiți pentru produsele din RO? V-ați lovit de bănci care refuză tranzacțiile în Checkout din cauza 3DS-ului prost implementat?