Skip to main content

Volca Review 2026: Multi-Tenant SaaS Starter with TypeScript Focus

·StarterPick Team
volcamulti-tenanttypescriptreview2026

TL;DR

Volca is a solid multi-tenant TypeScript boilerplate with a focus on production infrastructure. AWS Cognito for auth (unusual choice), Stripe billing, and a clean separation between frontend and backend. At ~$99-$149, it's cheaper than Supastarter for multi-tenancy. Trade-off: AWS lock-in and less polish than Supastarter.

What You Get

Price: ~$99-$149 (check volca.dev for current pricing)

Core features:

  • React (Vite) + TypeScript (SPA, not SSR)
  • Node.js/Express backend
  • Multi-tenancy: Teams + roles
  • Auth: AWS Cognito
  • Payments: Stripe
  • Database: PostgreSQL via Knex
  • UI: Tailwind + custom components
  • Infrastructure: Terraform for AWS

The Architecture Decision: SPA + API

Volca makes an unusual choice: React SPA (Vite) + Express API, rather than Next.js:

apps/
├── client/   ← React SPA (Vite)
├── api/      ← Express + TypeScript
└── infra/    ← Terraform (AWS)

This decoupled approach is appropriate for products that will have multiple clients (web + mobile + third-party) or teams that want strict separation between frontend and backend.

// apps/api/src/modules/projects/project.router.ts
import { Router } from 'express';
import { requireAuth } from '../auth/auth.middleware';
import { requireTeamAccess } from '../teams/team.middleware';

const router = Router();

router.get('/teams/:teamId/projects',
  requireAuth,
  requireTeamAccess('member'),
  async (req, res) => {
    const projects = await projectService.findByTeam(req.params.teamId);
    return res.json(projects);
  }
);

router.post('/teams/:teamId/projects',
  requireAuth,
  requireTeamAccess('admin'),
  async (req, res) => {
    const project = await projectService.create({
      ...req.body,
      teamId: req.params.teamId,
    });
    return res.json(project);
  }
);

export default router;

This is more REST-like than tRPC — useful for teams building public APIs or needing OpenAPI documentation.


AWS Cognito Auth

Volca uses AWS Cognito for authentication — unusual in the boilerplate space:

// AWS Cognito user pool setup
import { CognitoIdentityProviderClient, SignUpCommand } from '@aws-sdk/client-cognito-identity-provider';

const cognitoClient = new CognitoIdentityProviderClient({ region: 'us-east-1' });

export async function signUp(email: string, password: string) {
  const command = new SignUpCommand({
    ClientId: process.env.COGNITO_CLIENT_ID!,
    Username: email,
    Password: password,
    UserAttributes: [{ Name: 'email', Value: email }],
  });

  return cognitoClient.send(command);
}

Why Cognito? It scales infinitely, handles MFA natively, and integrates with AWS IAM. The downside: AWS vendor lock-in and more complexity than Clerk or Supabase Auth.


Multi-Tenancy with Team Roles

// Team role enforcement
const requireTeamAccess = (minimumRole: 'member' | 'admin' | 'owner') =>
  async (req: Request, res: Response, next: NextFunction) => {
    const { teamId } = req.params;
    const { userId } = req.auth!;

    const membership = await db('team_memberships')
      .where({ team_id: teamId, user_id: userId })
      .first();

    if (!membership) return res.status(403).json({ error: 'Not a team member' });

    const roleHierarchy = { member: 0, admin: 1, owner: 2 };
    if (roleHierarchy[membership.role] < roleHierarchy[minimumRole]) {
      return res.status(403).json({ error: 'Insufficient permissions' });
    }

    req.teamMembership = membership;
    next();
  };

Terraform Infrastructure

Volca includes Terraform for AWS infrastructure:

# infrastructure/main.tf — AWS setup
module "api" {
  source = "./modules/api"

  environment = var.environment
  api_version = var.api_version
  database_url = module.database.connection_string
  cognito_user_pool_id = module.auth.user_pool_id
}

module "database" {
  source = "./modules/rds"

  environment = var.environment
  instance_class = "db.t3.micro"  # Dev
  # instance_class = "db.t3.medium"  # Production
}

This is valuable for teams deploying to AWS who want infrastructure-as-code from day one.


Volca vs Supastarter

FeatureVolcaSupastarter
Price~$99-149$299
Multi-tenancy
AuthAWS CognitoSupabase Auth
StackSPA + APINext.js
InfrastructureTerraform/AWSVercel
i18n
Admin panel✅ Basic
Lock-inAWSSupabase

Volca is cheaper; Supastarter has more features and better documentation.


Who Should Buy Volca

Good fit:

  • Teams deploying to AWS (uses Cognito, can use RDS)
  • Products needing a REST API (not tRPC or server components)
  • Teams who want Terraform infrastructure from the start
  • Budget-conscious teams needing multi-tenancy

Bad fit:

  • Vercel/Next.js teams (architecture mismatch)
  • Teams wanting simpler auth than Cognito
  • Founders needing the fastest time-to-market
  • Teams who want Supabase ecosystem

Final Verdict

Rating: 3/5

Volca fills a niche: multi-tenant SaaS for AWS-native teams at a lower price than Supastarter. The architecture decisions (Cognito, SPA+API, Terraform) are defensible but create lock-in and complexity. For the right team (AWS shop, REST API preference, IaC requirement), it's a good fit.


Compare Volca with other multi-tenant boilerplates on StarterPick.

Check out this boilerplate

View Volca on StarterPick →

Comments