import Stripe from 'stripe';
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, {
apiVersion: '2023-10-16',
});
// Creare sesiune Stripe Checkout optimizată pentru B2B din România
export async function createBillingSession(customerId: string, priceId: string) {
return await stripe.checkout.sessions.create({
customer: customerId,
mode: 'subscription',
payment_method_types: ['card'],
line_items: [{ price: priceId, quantity: 1 }],
automatic_tax: { enabled: true },
tax_id_collection: { enabled: true }, // Colectează CUI/CIF pentru e-Factura
success_url: `${process.env.APP_URL}/dashboard?session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `${process.env.APP_URL}/pricing`,
});
}Anul trecut am refăcut integrarea de plăți pentru un SaaS B2B românesc cu vreo 1.200 de abonați activi. Ne-am bătut capul trei săptămâni cu Stripe Elements doar ca să ne întoarcem, într-un final, la Stripe Checkout. Dacă ești pe cale să alegi între ele pentru un proiect local sau internațional, lasă-mă să-ți scurtezi drumul și să-ți zic unde se rupe filmul.
De ce am picat în capcana Stripe Elements
Avem tentația asta ca dev seniors: vrem control total. Vrem ca formularul de card să arate fix ca designul din Figma, cu fonturile noastre, direct pe domeniul nostru, fără nicio redirecționare dubioasă. Am scris componente în React, am legat @stripe/react-stripe-js și am configurat theme-ul custom până arăta impecabil.
Arăta grozav în localhost, dar problemele au apărut în producție. La Checkout-ul găzduit de Stripe, dacă un client din Olanda vrea să plătească prin iDEAL sau cineva din Germania preferă Sofort, Stripe le afișează automat în funcție de IP și țară. Cu Elements, gestionarea tuturor acestor metode de plată din frontend devine un coșmar de stare și re-renderings. La un rulaj de 8.000€ MRR, ne-am dat seama că pierdusem peste 40 de ore de dev doar ajustând tratarea erorilor de 3D Secure 2 (SCA), în loc să livrăm feature-uri pentru clienți.
Unde câștigă Stripe Checkout pe piața din RO
Stripe Checkout gestionează totul pe serverele lor. Compliance-ul PCI este minim (completezi doar un chestionar SAQ A de două pagini pe an), iar experiența e optimizată pe milioane de tranzacții zilnice.
Pentru un SaaS lansat în România, avantajele reale sunt altundeva:
- Autentificarea 3D Secure 2: Băncile românești (ING, BT, BCR) au adesea rateuri la push notifications în aplicațiile mobile. Stripe Checkout gestionează retry-urile și erorile de autentificare infinit mai bine decât un modal customizat.
- Colectarea automată de CIF/CUI: Când folosești Checkout cu opțiunea
tax_id_collectionactivată, utilizatorii din România își pot trece CUI-ul direct în form. Webhook-ul îți trimitecustomer_details.tax_idscurat, gata de pasat mai departe în SmartBill sau FGO pentru generarea e-Facturii. - Lansare în 2 ore: Ai un endpoint de backend care creează o sesiune și faci redirect. Atât.
Când merită totuși Stripe Elements?
Trade-off-ul e clar: cu Checkout redirecționezi userul pe checkout.stripe.com (sau folosești varianta lor de modal încorporat). Pentru un SaaS B2C cu micro-tranzacții de 5-10$, o redirecționare externă poate scădea conversia cu 2-4% din cauza utilizatorilor sceptici.
Dacă construiești un configurator complex cu checkout în mai mulți pași (ex: alegi numărul de locuri, adaugi add-on-uri și introduci cardul în același pas vizual), Elements este singura opțiune reală. Însă fii pregătit să aloci cel puțin dublu ca timp pentru mentenanță și tratarea cazurilor de eroare.
Costuri și concluzie
Mulți presupun greșit că Elements ar fi mai ieftin. Comisioanele Stripe sunt identice: 1.2% + 0.25€ pentru carduri europene de consum și 2.9% + 0.25€ pentru carduri business sau non-EU. Costul ascuns e timpul tău de dezvoltare.
Dacă ești un SaaS RO sub 50k€ MRR, recomandarea mea fermă e să începi cu Stripe Checkout. Câștigi timp, scapi de dureri de cap cu e-Factura și 3DS2, iar userii sunt deja obișnuiți cu interfața Stripe. Tu ce folosești în producție acum?