Yachtxchange: One Role-Gated App, Five AI Features and a Near-Zero-Idle Stack for Yacht Brokerages
A build log from Yachtxchange— SEYSO's B2B SaaS for yacht brokerages. Think YachtWorld-class browsing for buyers, but sold to brokerages as tiered software: one mobile app on both stores, a broker portal that drafts listings from photos in three minutes, and an infrastructure bill that rounds to zero while a brokerage sleeps.
1 app
Both stores, role-gated
5
Roles, one codebase
30→3
Minutes per listing
~$0
Idle infra per tenant
The wedge: brokerages buy software, buyers get a marketplace
Yacht marketplaces monetize listings; the brokerages doing the actual work still run on spreadsheets, photo folders and copy-pasted Word descriptions. Writing one good listing — title, buyer-facing copy, equipment inventory, condition notes — takes a broker about thirty minutes per boat, and it shows in the inconsistency across any brokerage's page.
Yachtxchange flips the model: the brokerage is the customer. They subscribe to a tier, get a portal that does the tedious work, and their inventory powers a buyer experience that feels like a first-class marketplace — web and native mobile — without the brokerage building anything.
Four tiers, enforced in code — not in a PDF
Solo at $99/mo (5 listings, 1 seat), Pro at $299 (25 listings, 3 seats, lead scoring), Brokerage at $799 (100 listings, 10 seats, price intelligence) and a custom Enterprise tier with API access and white-label. The interesting part is where the limits live: ensureCanCreateListing, ensureCanAddSeat and ensureAiCreditsAvailable are guards called inside Server Actions and API routes, with Stripe as the source of truth and a webhook mirroring subscription status locally. No honor-system limits, no nightly reconciliation job.
AI usage is metered the same way — every copilot call writes a row to a usage_events table, so tier credits are countable, billable and audit-friendly from day one.
Five roles, one codebase — and self-organizing brokerages
There is exactly one mobile app in both stores and one web app on one domain. What you see depends on who you are:
buyerSelf-signup. Browse, save searches, contact brokers.
broker_leadFirst signup from a brokerage's email domain. Full broker permissions plus billing and team management.
broker_backupSecond signup from the same domain. Full permissions — and auto-promotes to lead if the lead departs. Succession is a provisioning rule, not a support ticket.
broker_agentInvited by lead or backup. Listings and leads, configurable per user.
adminYachtxchange staff. Full platform administration.
Brokerages map to Clerk Organizations, and the lead/backup/agent choreography lives in one provisioning module. A small guard with outsized importance: free-email domains — gmail and friends — never auto-match an existing brokerage, so a stranger with a Gmail address can never walk into someone else's tenant.
The monorepo: Zod schemas are the contract
Two apps — apps/web (Next.js 16 App Router, route groups for marketing, buyer, broker and admin) and apps/mobile (Expo + EAS) — sit on six shared packages: db (Drizzle ORM on Neon), auth (Clerk wrappers + provisioning), ai, billing, ui and types. The types package is the keystone: Zod schemas are the single contract shared by web Server Actions, API routes, the mobile API client and the AI tools. One schema change propagates everywhere the compiler can see.
A data model that reaches past the listing
The schema directory tells the real product story: listings, leads, offers, appointments, surveyors and a document vault. Yachtxchange is quietly building the deal room, not just the storefront.
Multi-tenant by discipline
Every tenant-owned row carries a brokerage_id and every query filters by it or sits behind an admin guard. Money is stored in cents as bigint — never float.
The AI layer: five features, zero provider lock-in
Everything routes through Vercel AI Gateway with plain "provider/model" strings — no provider SDK baked into the codebase, so swapping or A/B-ing models is a string change with observability and fallbacks for free.
Listing copilot — the 30-to-3 feature
The broker uploads photos and bullet specs; a vision model returns a structured draft via generateObject against a Zod schema: SEO title, 3–5 paragraph buyer-facing description, above-the-fold highlights, an equipment list inferred from the photos, a condition grade and auto-tags. Two design choices matter most. The prompt forbids fabricated specs — only what is provided or visibly inferable. And the schema includes a warnings array surfacing contradictions and claims needing verification, so the broker reviews flags instead of proofreading prose. Listing creation drops from ~30 minutes to ~3.
Semantic search
pgvector cosine over listing embeddings — “stable trawler for the Loop under 400k” works, not just make/model filters.
Lead scoring
Inquiries ranked 0–100 with a recommended next action — Pro-tier brokers stop triaging their inbox by gut feel.
Survey extraction
Structured data out of marine survey PDFs — the document every deal hinges on, finally machine-readable.
Surveyor vetting
Background signals on the surveyor registry feeding the appointments flow — trust, encoded.
Scaffolded next: price intelligence, photo enhancement and auto-tagging, image-based search, translation, and duplicate-photo fraud detection.
The economics: a stack that idles at zero
B2B SaaS margins are made in infrastructure choices. A brokerage is active maybe eight hours a day — the stack is picked so the other sixteen cost nothing:
Vercel Active CPU pricing — pay for CPU during actual work — not while a function waits on the database or an AI call.
Neon scale-to-zero — Postgres compute drops to $0 when idle. A brokerage active 8h/day pays for 8h.
One multi-tenant deployment — every brokerage shares one project and one database, isolated by brokerage_id — no per-tenant infrastructure to babysit.
Fluid Compute instance reuse — concurrent requests share warm instances; cold starts are the exception, not the rule.
The honest cost ceiling is photo and video storage — yacht listings are heavy. Mitigations are in place (resize and AVIF at upload, aggressive caching) with a pre-agreed trigger: if egress bills clear ~$500/mo, storage moves to R2. Deciding the exit criteria before the bill arrives is the cheapest architecture review you'll ever run.
Where it stands
Web and mobile run against the live schema today — buyer browse, the broker portal with the listing copilot, tier billing and the role-gated mobile app are functional in private development. EAS build profiles are wired for store submission. The deal-room surface (offers, appointments, surveyor scheduling, document vault) ships on the schema already in place.
If you run a brokerage and the 30-to-3 listing claim sounds worth testing on your own inventory, we're opening a small number of pilot conversations.
Talk to us about a pilot
Yachtxchange is built by the team behind LiftCrew AI, Sentinel and Liftline — and the same subscription model powers our Mobile Apps as a Service practice.