Variant Systems

Vue for B2B SaaS

The progressive framework that grows with your SaaS product instead of demanding everything upfront.

Variant Systems builds industry-specific software with the tools that fit the problem.

Why this combination

  • Vue's progressive adoption model lets you start with simple interactive components and scale to a full SPA when the product demands it.
  • The Composition API organizes complex feature logic into reusable composables that map cleanly to SaaS domain concepts.
  • Vue's reactivity system is intuitive. New team members understand the data flow on day one, not day thirty.
  • Single-file components keep template, logic, and styles together. One file per feature means less context switching.

Progressive Adoption for Growing Products

Early-stage SaaS products don’t need a full single-page application on day one. You need a few interactive components: a settings panel, a data table with filters, maybe a real-time notification dropdown. Vue lets you add these incrementally. Drop a Vue component into a server-rendered page and it just works. No build step required for simple cases.

As your product grows, Vue grows with it. Add Vue Router when you need client-side navigation. Add Pinia when shared state gets complex. Introduce TypeScript when the team scales. You’re never locked into architecture decisions you made in week one. This progressive approach means you ship features now and refactor later, which is exactly what early-stage SaaS products need. It also means your migration path is incremental rather than a risky big-bang rewrite. Teams that start with Vue sprinkled into a Rails or Laravel monolith can gradually shift to a full Vue SPA one route at a time, with both architectures running side by side in production during the transition.

Composition API for Complex Features

SaaS features have a lot of interconnected logic. A subscription management page needs to fetch plan data, validate payment methods, calculate prorated amounts, handle loading states, and show error messages. The Composition API lets you organize all of this into composables that group related logic together.

A useSubscription composable handles fetching and caching plan data. A useBilling composable manages payment method validation. Each composable is testable in isolation and reusable across components. When you build the upgrade flow and the billing settings page, they share the same composables. Your code stays DRY without the awkward mixins that Vue 2 relied on.

Embeddable Widgets for Your Customers

Some SaaS products need to live inside other products. A support chat widget, an analytics embed, a booking calendar. Vue compiles to standard web components through its custom elements API. Your customers drop a script tag into their site and your widget renders in its own shadow DOM, isolated from their styles.

This is harder than it sounds with most frameworks. Style encapsulation, bundle size, and initialization complexity all trip teams up. Vue’s single-file components bundle everything together. The compiled widget is a single JavaScript file with styles included. No external CSS to load, no global namespace pollution. Your customers’ developers integrate it in minutes, not days. You can also pass configuration through data attributes on the host element, letting your customers customize colors, default views, or API endpoints without touching JavaScript. Pair this with Vite’s library mode for tree-shaking and you keep the widget under 50KB gzipped, which matters when your embed loads on pages you don’t control.

Form-Heavy Interfaces Done Well

B2B SaaS products are full of forms. Account settings, team management, subscription configuration, API key generation, webhook URL setup. Each form has validation rules, error states, loading indicators, and success feedback. Getting this wrong frustrates users and generates support tickets.

Vue’s reactivity system makes forms predictable. Bind inputs to reactive state and validation runs automatically. VeeValidate handles complex rules like “required if another field is set” or “must be a valid webhook URL.” Combine this with Pinia for form state that persists across route changes, and your users never lose work when they accidentally navigate away. Small details like this are what separate SaaS products that retain customers from ones that churn them.

Compliance considerations

SOC 2 access control in the UI uses Vue's directive system for conditional rendering based on user roles and permissions.
GDPR consent banners integrate naturally with Vue's reactive state. Consent state drives which scripts load and what data is collected.
Accessibility is built into Vue's template syntax with native HTML attribute support and libraries like VueUse for focus management.
Content Security Policy headers work well with Vue's compilation model. No inline scripts means stricter CSP rules.

Common patterns we build

  • Admin dashboards with Pinia stores managing complex multi-step workflows like onboarding flows and settings pages.
  • Customer-facing portals with Vue Router guards for role-based page access and subscription tier gating.
  • Embeddable widgets using Vue's custom elements for injecting features into your customers' own websites.
  • Form-heavy interfaces using VeeValidate for complex validation rules on subscription management and configuration screens.

Other technologies

Services

Building in B2B SaaS?

We understand the unique challenges. Let's talk about your project.

Get in touch