B2B Marketplace · FinTech

e-furnizori.ro — B2B marketplace with e-Factura integrations, multi-gateway payments, and search across 177 data models

e-furnizori.ro connects verified suppliers with business buyers in Romania. Buyers send RFQs, compare catalogs, and order with escrow, credit, or BNPL. Suppliers manage products, inventory, warehouses, AWBs, and invoices through e-Factura/e-Transport. 177 Prisma models, ~100 API domains, 2FA authentication, fully self-hosted.

IndustryB2B Marketplace / FinTech
Duration8 months (phase 1)
StatusLive · ongoing iterations
Team3 developers
CountryRomania

Business context

The B2B market in Romania is fragmented: business buyers find suppliers on Google, compare offers manually in Excel, negotiate prices by phone, and wait for emailed invoices. The process takes 2-3 weeks per non-trivial purchase. e-furnizori needed to compress this cycle: verified catalog, structured RFQ, price comparison on specifications, protected payments (escrow), and electronic invoicing per ANAF requirements.

The major technical constraint: integration with the Romanian fiscal system. e-Factura (SPV ANAF) and e-Transport are mandatory for B2B above set thresholds. Without them, the marketplace doesn't solve the real problem — the supplier still invoices manually and declares transport separately. Plus payments: no single gateway covers the entire Romanian market (Netopia for cards, EuPlătești/PlatiOnline for local alternatives, PayPal for international).

Tech stack & key decisions

Next.js 16 App Router with Prisma 7 on PostgreSQL

The schema contains 177 models across 5,700 lines, with 37 migrations. Key models: Supplier, Buyer, Product, CatalogEntry, Rfq, Order, Invoice, Warehouse, Shipment. Prisma client generated to src/generated/prisma. PostgreSQL chosen for ACID transactions on payments and referential integrity across 177 models with complex relationships.

Meilisearch 0.60 for B2B catalog search

B2B catalog search differs from B2C: buyers search by SKU, technical specs (CAP, EAN, manufacturer code), not natural words. Meilisearch 0.60 index synced from PostgreSQL, with custom fields for faceted filters (brand, category, certifications). Under 50ms latency on 100K+ products per supplier.

e-Factura + e-Transport integration (SPV ANAF)

Electronic invoicing through SPV ANAF is mandatory for B2B above set thresholds. We integrated the full flow: UBL 2.1 XML generation, qualified-certificate signing, SPV API upload, validation response download. e-Transport similarly: UAET declaration for transport above threshold. Without these integrations, the marketplace doesn't eliminate the supplier's manual work.

Multi-gateway payments: Netopia, EuPlătești, PlatiOnline, PayPal, Stripe

No gateway covers the entire Romanian market. We built an abstraction layer in src/lib/payments/romania exposing a single interface for all. The buyer picks the method; the system routes to the right gateway. Stripe Connect for marketplace/supplier splits (marketplace commission auto-deducted at payment).

NextAuth 4 with TOTP 2FA

Business accounts require hardened authentication. NextAuth 4 with Credentials provider, JWT sessions, and mandatory 2FA for suppliers (TOTP via otplib). Prisma adapter for session persistence. Rate limiting via Upstash Ratelimit on auth endpoints (prevents brute-force).

Next.js 16 React 19 TypeScript Prisma 7 PostgreSQL NextAuth 4 Meilisearch Upstash Redis Stripe Connect Netopia e-Factura (SPV ANAF) Cloudinary Vitest Playwright Cloudflare

Measured outcomes

177Data models (5.7K-line Prisma schema)
~100API route-handler domains
5Integrated payment gateways (RO + international)
<50msCatalog search latency (Meilisearch)
22%RFQ → order conversion (vs 8% manual email)
37Incremental DB migrations, 0 data loss

Key takeaways

  1. e-Factura is NOT optional for B2B in Romania. A marketplace that doesn't integrate electronic invoicing doesn't eliminate manual work — it just relocates it.
  2. Multi-gateway payments need abstraction, not hardcoding. The Romanian market is fragmented: Netopia for cards, EuPlătești for alternatives. The src/lib/payments layer saves months of refactor.
  3. A Prisma schema over 100 models requires discipline. Incremental migrations, pre-flight on a cloned DB, mandatory review. A big-bang migration on 177 models is a catastrophe waiting.
  4. Meilisearch beats PostgreSQL full-text for B2B catalogs. Faceted search on SKU, EAN, specs — under 50ms with no index tuning.
  5. CSRF/CSP/rate-limit composed in proxy.ts is the only way to keep consistency across 100 endpoints. Per-handler security becomes chaos.

«e-furnizori compressed the B2B purchasing cycle from 3 weeks to 48 hours. The e-Factura integration eliminated manual invoicing entirely. Faintech picked the stack that handles 177 data models without compromising speed.» — Eduard Gridan, founder e-furnizori.ro

Have a similar project?

Written discovery in 48h with detailed technical specification.

Request a technical assessment