← Prashant Anand

Venue Manager: a live multi-tenant SaaS, built end to end

The only product in this portfolio that is actually running in production. I built it alone — product definition, architecture, implementation, tests, deployment — to prove I could take a multi-tenant AI product the whole way.

Live: venuemanager.pro · Code: samisen-io/venue-assistant-saas

What it is

Software for people who run event venues — hotels, banquet halls, conference centres. Three things, in the order a venue manager actually needs them:

  1. Run the operation. Events, spaces, vendors, clients, budgets, proposals and quotes, on a multi-venue model with per-tenant data isolation.
  2. Pick and manage vendors. A weighted matching engine (reliability 40%, cost fit 30%, experience 20%, on-time history 10%) with post-event reviews feeding the scores back.
  3. Win the business. A public venue page builder — SEO-friendly pages with galleries, spaces, pricing and an availability calendar — with an embedded AI assistant that answers visitor questions and turns them into tracked leads.
The third part is the one I would defend hardest: it is where the product stops being an internal tool and starts producing demand for the customer.

Stack, and why

LayerChoiceReasoning
AppNext.js 16 (App Router), TypeScript strict Server components for the public pages (SEO, speed); client components only where interaction demands it
Data / authSupabase (Postgres, RLS, Auth) Tenant isolation enforced at the database, not in application code
PaymentsStripe subscriptions + customer portal Plan limits and usage metering enforced in one place
Background workInngest + 3 Vercel cron jobs Agent runs, outreach, webhook processing, trial expiry
AIClaude SDK (vendor agent), a cheap model (public-page chat) Split by job: reasoning-heavy outreach on Claude, high-volume visitor chat on the inexpensive model
Documentspdf-lib Proposals generated server-side, accepted through public token URLs
TestsPlaywright, 167 tests across 28 spec files Includes multi-tenant isolation checks, not just happy paths

The three decisions worth talking about

1. Tenant isolation at the database layer

Every table carries row-level security policies. The browser client can only ever see its own rows, and the service-role key never leaves the server. Application code cannot accidentally leak another venue's data because it does not hold the authority to do so. That is the difference between “we remembered to filter by user_id” and “the database refuses.”

2. The vendor agent is a state machine, not a prompt

Outreach moves through explicit states per vendor. Every execution writes an agent_runs row, every message a vendor_communications row, every reply a vendor_quotes row — so a stalled or wrong decision is inspectable afterwards instead of invisible. An Inngest monitor plus a six-hourly cron check agent health. I deliberately did not build one large prompt that does everything.

3. Public pages are first-class citizens of the render path

They live at the site root, with their own dynamic metadata, JSON-LD (EventVenue + LocalBusiness), a dynamic sitemap and explicit robots rules. Demonstration workspaces are detected, banner-labelled and excluded from indexing — so sample data can never be mistaken for a real business in search results. Getting that boundary right was part of shipping the feature, not an afterthought.

What is actually shipped

What I did not build — and would say so in an interview

The 90-second version

“I run an event-tech company, and I wanted to prove to myself that I could design, build, deploy and test a multi-tenant AI product alone. So I built Venue Manager: Next.js with Postgres row-level security for tenant isolation, Stripe for the subscription lifecycle, an Inngest-backed vendor-outreach agent on Claude with a queryable state machine, and public venue pages with an embedded AI assistant that captures leads on the cheap model. 167 Playwright end-to-end tests across 28 spec files, including tenant-isolation checks. It has no customers — that was never the point; the point is that every layer, from the RLS policy to the agent's state transitions, is something I have personally built and operated.”