Cookies

Only one thing is optional: usage statistics with PostHog, on servers in the EU. They start only if you accept. What gets stored and for how long: cookie policy.

Skip to content
Back to portfolio

Case study

B2B client portal for a vertical SaaS

A self-service portal with billing, support and API access for a Romanian legal-tech vertical SaaS.

A project from before Vanadium Systems SRL was founded (April 2026). Projects like this one led to the company.

Context

A legal-tech vertical SaaS (contract management and due diligence for law firms) with 280 client organizations at the time of the project. Before, onboarding, support, billing and API access ran through email and a shared Notion.

Support tickets grew in line with the number of clients, and onboarding a new client took on average 1.5 working days of a Customer Success person.

Challenges

  1. Manual onboarding: every new client needed an account created by hand, a custom demo, branding setup, an API key and 3 training sessions
  2. Repetitive tickets: 65% of support volume was about 8 recurring questions with no central documentation
  3. Opaque billing: invoices sent monthly by email, with no way for the client to see current usage
  4. Uncontrolled API access: keys shared over email, no per-client rate limiting, no audit trail
  5. Falling retention: clients with low usage were not spotted in time to step in

Approach

We built a full self-service portal integrated with the existing product.

Account module

  • Self-signup with email validation + an onboarding wizard
  • Branding setup (logo, colors, optional custom domain)
  • User invitations with roles (admin, manager, contributor, viewer)
  • Audit log per organization

Billing module

  • Real-time usage (active contracts, users, storage)
  • Invoice history with PDF download + e-Invoice XML
  • Self-service plan change (upgrade/downgrade)
  • Automatic retry on failed payments, with notices at 3, 7 and 14 days

API module

  • API key creation and revocation per organization
  • Rate limiting set per plan
  • Interactive documentation (OpenAPI 3 + try-it-now)
  • Webhook configurator with a test endpoint

Support module

  • Knowledge base with full-text search (300+ initial articles)
  • Ticketing connected to the support team's internal Slack channel
  • Public status page with incident history
  • Automatic escalation by the plan's SLA

Health monitoring per account

  • Automatic usage score per organization
  • Alert to Customer Success when the score drops below a threshold
  • Internal dashboard with the top 50 accounts at risk

Results

  • Support tickets per month: down 60% within 90 days of launching the knowledge base and the self-service flows
  • Time to onboard a new client: from 1.5 working days to 4 hours (30 minutes of it human input)
  • NPS after launch: 58, compared with 31 before
  • 6-month retention: 94%, up from 86%
  • Customer Success capacity: the same headcount supports 2.4x more clients

Tech stack

  • Backend: Python + FastAPI + PostgreSQL
  • Frontend: Next.js + Tailwind + shadcn/ui
  • Auth: Auth0 with custom RBAC mapping
  • Billing: Stripe Billing + ANAF e-Invoicing adapter
  • Documentation: Docusaurus with internal contributors
  • Status page: BetterStack
  • Hosting: Vercel (frontend) + AWS RDS (DB)

Status

In production for 11 months. Next steps: multi-region expansion (DACH) with GDPR data residency and enterprise SSO (SAML 2.0).

Next step

Have a similar flow?

We start from a call about your real process. The first one is free.