Site currently under development
Servio

Servio

saasVisit Site

Servio is a multi-tenant marketplace platform for local service and product businesses. Every business gets its own branded storefront with a subdomain in production, an isolated catalog, its own Stripe Connect account, and its own admin. Customers experience a single front door: the apex domain runs a ZIP-based marketplace that searches products, services, and stores across every published tenant at once. Result cards link straight into the relevant tenant storefront, where booking, cart, and checkout stay scoped to that one business and that one Stripe payout. The platform ships with a 5-step vendor onboarding wizard (account, business type, store setup, Stripe Connect, subscription), 20 tenant-admin pages covering appointments, availability, products, services, payments, analytics, coupons, customers, orders, QR codes, Amazon affiliate imports, route planning, and service areas, plus 11 platform-admin pages for organization management, impersonation, plan definitions, and revenue tracking. Geographic discovery is powered by Postgres trigram GIN indexes on store, product, and service names, latitude and longitude geocoding, and ZIP-radius service-area matching.

The Challenge

Local-services SaaS usually forces a choice. You can build a per-tenant storefront product that is isolated and branded but hard to discover, or you can build a marketplace with great discovery but no brand ownership for the seller. Servio had to deliver both at once without breaking tenant isolation. Carts, payouts, refunds, and admin scopes had to stay strictly single-store. A customer cannot have a haircut from Store A and a candle from Store B land in one cart or one PaymentIntent. At the same time, the apex domain still had to feel like one searchable marketplace covering every published tenant.

Our Solution

A two-layer architecture. The apex domain renders a marketplace landing with a ZIP and keyword hero plus a /discover results page powered by /api/discover/search. Those queries deliberately omit the organizationId filter and instead gate on isPublished, stripeConnectChargesEnabled, and active platform status, using Postgres trigram GIN indexes for fuzzy matching, lat/lng geocoding, and ServiceArea coverage for ZIP-radius proximity. Result cards deep-link into per-tenant storefronts via buildStoreUrl(), which resolves to a subdomain in production and to /store/{slug}/ in dev. Once inside a storefront, every Prisma query, cart item, order, and Stripe Connect PaymentIntent re-applies organizationId. Read-only cross-store endpoints (/api/account/carts, /wishlist, /orders) group by organizationId so the apex account hub at /me shows a unified view without ever merging tenants. Vendor onboarding is a guarded 5-step wizard, and platform-admin gets organization and store publishing controls, impersonation, plan management, and revenue tracking.

Results

Apex marketplace search returns ranked services, products, and stores across every published tenant with ZIP-radius and trigram fuzzy matching
Tenant isolation preserved: 27 storefront pages, cart, checkout, wishlist, and Stripe Connect payouts stay strictly single-store
5-step vendor onboarding (account, business type, store setup, Stripe Connect, subscription) with a 14-day trial
20 tenant-admin pages and 11 platform-admin pages covering appointments, travel fees, QR codes, route planning, and revenue
Postgres trigram GIN indexes plus geocoded coordinates enable cross-tenant discovery without sacrificing per-tenant performance
Pre-push gate enforces ESLint, tsc, 1,712 Vitest tests, and an 80% coverage floor, plus Playwright E2E for signup, checkout, booking, and admin journeys

Tech Stack

Next.js 16React 19TypeScriptPostgreSQL 16Prisma 7pg_trgm GIN indexesAuth.js v5Stripe Connect ExpressStripe BillingResendRedisTailwind CSS v4shadcn/uiZustandDockerCoolifyCloudflareLokiGrafanaVitestPlaywright

Want Similar Results?

Let's discuss how we can build something great for your business.