devsnack
Documentation

Trovo documentation

Run it, point it at your own accounts, ship it under your own brand. Written against version 1.3 of the download you get on CodeCanyon.

$10 on CodeCanyon
  • Version v1.3
  • Updated Aug 2026
  • Platform Next.js
  • Stack Next.js · Stripe
On this page
01

Overview

Discover. Plan. Go. — an AI-powered travel planning & booking SaaS: AI itinerary generator, multi-vendor tour marketplace, subscription billing, and a full admin panel in one Next.js app.

Trovo is a production-ready travel platform. It combines an AI itinerary generator, a multi-vendor tour marketplace, subscription billing (Stripe + PayPal), and a full admin panel — all in a single Next.js 16 app.

Buyers deploy it three ways (or all at once):

Consumer trip planner
AI day-by-day itineraries; Maps, weather, packing lists, PDF export
Tour marketplace
Multi-vendor listings + bookings; Provider portal, reviews, payouts
White-label travel SaaS
Subscription plans + branding; Embed widget, admin control

What you get: full TypeScript source, this documentation + a quick-start guide, an admin panel, a provider portal, a marketing landing page, realistic demo content, and a Vercel deployment guide.

Live demo: trovo.devsnack.dev

02

Features

AI Trip Planning
Streaming day-by-day itineraries; From destination, dates, budget, interests; Per-day refinement + packing lists; Weather (Open-Meteo) + Google Maps stops; PDF export
Tour Marketplace
Multi-vendor listings w/ photos & availability; Reviews, search, wishlist; Per-destination AI guide pages
Provider Portal
Listings, bookings, payouts; Traveler messages; Profile & review management
Booking & Payments
Stripe + PayPal checkout; Platform commission split; Stripe Connect payouts (optional)
Messaging
Traveler ↔ provider threads; Start from any tour page or booking; Unread badges + email notifications
Subscriptions & Billing
Free / Pro / Business plans; Plan feature gates; Per-user AI rate limiting
Trip Collaboration
Real-time presence (SSE); Activity comments + edit-notify emails; Viewer / Editor roles
Admin Panel
Users, listings, bookings, billing; Settings, content, encrypted AI keys; Role-based access
Branding / White-label
Runtime brand override from admin; Logo, name, colors; Light / dark / system theme toggle
SEO & Content
Blog + destination guides; Affiliate links (Booking.com / Skyscanner / GetYourGuide); Embeddable trip widget; Newsletter w/ open & click tracking
03

Architecture

Framework
Next.js 16 (App Router, SSR)
UI
React 19, TypeScript (strict), Tailwind CSS v4, shadcn/ui
ORM / DB
Prisma ORM + Neon PostgreSQL
Auth
NextAuth v5 (credentials + Google OAuth)
AI
Vercel AI SDK → OpenAI GPT-4o + Google Gemini 1.5 Pro
Maps / Weather
Google Maps (@vis.gl/react-google-maps) + Open-Meteo
Payments
Stripe + PayPal
Email
Resend + React Email
Images
Cloudflare R2 + sharp (WebP variants)
PDF / Rich text
Puppeteer + Tiptap
Realtime / Charts
SSE (trip collaboration) + Recharts
Deploy
Vercel · package manager pnpm

Project structure

project root
app/          Next.js App Router — public, dashboard, admin, provider, API
components/   shadcn/ui-based UI components
lib/          Shared utilities & service clients (ai, plans, auth, paypal, …)
prisma/       schema.prisma + migrations
emails/       React Email templates
docs/         PRD, launch, Stripe & deploy playbooks
proxy.ts      Route protection (Next 16's renamed middleware)

Route protection (proxy.ts): /dashboard/* requires auth, /provider/* requires a verified provider, /admin/* requires admin/moderator (and /admin/settings|billing|languages require admin only).

04

Database setup

Trovo uses Neon PostgreSQL (serverless) with Prisma ORM — no extensions or pgvector required. The schema has 32 models grouped by domain:

Auth
User, UserRole, Account, Session, VerificationToken
Marketplace
Provider, Listing, Booking, Payout, Review
Messaging
MessageThread, Message
Trips
Trip, TripCollaborator, ActivityComment, PackingList, Wishlist
Billing
Subscription, UsageRecord, PromoCode
Content
BlogPost, BlogCategory, Subscriber, EmailCampaign, Announcement
Settings
AdminSetting, Currency, Language, Translation, PageSEO, Notification
terminal
cp .env.example .env.local   # then fill DATABASE_URL etc.
pnpm db:migrate              # create + apply schema (or db:push for prototyping)
pnpm db:studio               # browse the database
Note
The hosted demo database is fully populated — providers, listings, bookings, reviews, subscriptions, and promo codes — with no Lorem Ipsum or empty states.
05

AI provider setup

Trovo ships with two AI providers, admin-switchable at runtime via AdminSetting.ai_provider (factory in lib/ai.ts):

At least one of OPENAI_API_KEY / GOOGLE_AI_API_KEY is required. Free-plan users get gpt-4o-mini; Pro/Business get gpt-4o.

Note
Security: AI keys stored in AdminSetting are encrypted at rest with AES-256 (lib/encryption.ts). Every AI route is rate-limited to 10 requests/hour per user.
06

Google Maps setup

In the Google Cloud Console, enable both APIs:

  • Maps JavaScript API — client-side map render
  • Geocoding API — server-side place → lat/lng

Create two restricted keys (or reuse one):

  • GOOGLE_MAPS_API_KEY — server key, IP-restricted, Geocoding only
  • NEXT_PUBLIC_GOOGLE_MAPS_API_KEY — public key, HTTP-referrer-restricted, Maps JS only

Optional: create a custom Map Style and set NEXT_PUBLIC_GOOGLE_MAPS_MAP_ID for a branded dark map (required for Advanced Markers; falls back to legacy markers when empty).

07

Authentication setup

Auth is NextAuth v5 with email/password credentials and optional Google OAuth.

  • Set AUTH_SECRET (openssl rand -base64 32) and AUTH_URL.
  • Google sign-in: set GOOGLE_CLIENT_ID + GOOGLE_CLIENT_SECRET and add redirect URI <url>/api/auth/callback/google. Leave empty to hide the button.
  • Verify-email and password reset are delivered via Resend.
08

Payments setup

Stripe

  • Create products/prices: Pro $9/mo + $89/yr, Business $29/mo + $290/yr, Lifetime $199 (one-time). Set the five STRIPE_PRICE_* ids.
  • Create a webhook at /api/webhooks/stripe subscribed to these 8 events:
webhook events
checkout.session.completed     customer.subscription.created
charge.refunded                customer.subscription.updated
invoice.payment_failed         customer.subscription.deleted
account.updated                transfer.reversed

The last two are only used by Stripe Connect payouts — harmless to subscribe to either way, and required if you enable Connect.

Copy the signing secret into STRIPE_WEBHOOK_SECRET. Signatures are verified before any DB write. Local testing:

terminal
stripe listen --forward-to localhost:3000/api/webhooks/stripe

PayPal

PayPal supports bookings (Orders API) and recurring subscriptions (Billing Subscriptions API); Lifetime stays Stripe-only. There is no dashboard UI for subscription plans — run the bundled script:

terminal
pnpm paypal:setup     # creates the catalog product + 4 Plan IDs

Create a webhook at /api/webhooks/paypal (event list in .env.example) and set PAYPAL_WEBHOOK_ID. Set PAYPAL_ENV=live and re-run paypal:setup for production (sandbox Plan IDs don’t work live).

09

Provider payouts (Stripe Connect) — optional

You can skip this entirely. Without Connect, the platform works exactly as before: Admin → Payouts tracks what each vendor is owed and you tick Mark paid once you’ve sent the money yourself. Connect just automates the transfer.

No extra environment variables — Connect reuses STRIPE_SECRET_KEY.

  1. 01
    In the Stripe dashboard: Connect → Get started, choose Platform or marketplace, and complete the platform profile.
  2. 02
    Under Connect → Settings, make sure Express accounts are enabled.
  3. 03
    Add account.updated and transfer.reversed to your existing Stripe webhook.

Providers then onboard themselves from Provider → Payouts, which shows their status:

Not set up
No payout account yet — “Set up payouts” starts Stripe’s hosted onboarding.
Onboarding incomplete
They started but didn’t finish; the button resumes where they left off.
Pending verification
Details submitted, Stripe still reviewing.
Ready for payouts
Stripe has enabled payouts — you can now transfer.

Once a provider is Ready, their rows in Admin → Payouts gain a Pay via Stripe button. Trovo re-checks the account with Stripe before every transfer, so a provider whose account became restricted is caught rather than failing silently. If Stripe rejects a transfer, the reason is saved and shown on the row so you can retry.

Note
How the money moves: travelers always pay your platform account at checkout, and the vendor’s share is transferred later — not split at checkout. That’s deliberate: it preserves the 7-day hold after trip completion that covers cancellations and refunds. Releasing a payout stays a manual click; there is no automatic schedule.
Warning
PayPal-funded bookings: these have no Stripe charge to draw from, so their transfers come out of your Stripe balance instead. Keep a balance if you sell through both processors.
10

Image uploads (Cloudflare R2)

Listing photos upload to Cloudflare R2; the server generates WebP variants with sharp.

  • Create a bucket, enable the R2.dev public subdomain, copy the public URL into R2_PUBLIC_URL.
  • Create an Object Read & Write API token; set R2_ACCOUNT_ID, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_BUCKET_NAME.
Note
R2’s free tier includes 10 GB storage, 1M writes, 10M reads, and zero egress fees.
11

Email setup

Transactional + campaign email is sent via Resend (React Email templates). Used for booking confirmations, verify-email, password reset, newsletter campaigns, and trip-edit notifications.

  • Set RESEND_API_KEY and EMAIL_FROM. Without a key, email stub-logs to the console.
  • Optional: set RESEND_WEBHOOK_SECRET + endpoint /api/webhooks/resend for newsletter open/click tracking.
12

Environment variables

All env vars are declared and validated with Zod in lib/env.ts; .env.example mirrors it with inline setup notes.

Warning
Required — the app won’t boot without these: DATABASE_URL, AUTH_SECRET (≥16 chars), ENCRYPTION_KEY (exactly 64 hex chars), plus at least one of OPENAI_API_KEY / GOOGLE_AI_API_KEY.
NEXT_PUBLIC_APP_URL
Public base URL (baked at build time)
NEXT_PUBLIC_APP_NAME
App name shown in UI (default Trovo)
DATABASE_URL
Neon PostgreSQL connection string — required
AUTH_SECRET
NextAuth session secret — required
AUTH_URL
NextAuth base URL (match the deploy domain)
ENCRYPTION_KEY
AES-256 key, 64 hex chars — required
OPENAI_API_KEY
OpenAI key (one AI key required)
GOOGLE_AI_API_KEY
Google Gemini key (alternative)
GOOGLE_MAPS_API_KEY
Server key — Geocoding API
NEXT_PUBLIC_GOOGLE_MAPS_API_KEY
Public key — Maps JavaScript API
NEXT_PUBLIC_GOOGLE_MAPS_MAP_ID
Optional branded map style id
STRIPE_SECRET_KEY / NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
Stripe API keys
STRIPE_WEBHOOK_SECRET
Stripe webhook signing secret
STRIPE_PRICE_PRO_MONTHLY|PRO_YEARLY|BUSINESS_MONTHLY|BUSINESS_YEARLY|LIFETIME
The 5 Stripe price ids
PAYPAL_ENV
sandbox (default) or live
PAYPAL_CLIENT_ID / PAYPAL_CLIENT_SECRET
PayPal app credentials
NEXT_PUBLIC_PAYPAL_CLIENT_ID
PayPal client id (browser SDK)
PAYPAL_WEBHOOK_ID
PayPal webhook id (signature verification)
PAYPAL_PLAN_PRO_MONTHLY|PRO_YEARLY|BUSINESS_MONTHLY|BUSINESS_YEARLY
The 4 PayPal Plan ids (pnpm paypal:setup)
R2_ACCOUNT_ID / R2_ACCESS_KEY_ID / R2_SECRET_ACCESS_KEY
Cloudflare R2 credentials
R2_BUCKET_NAME / R2_PUBLIC_URL
R2 bucket + public URL
RESEND_API_KEY / EMAIL_FROM
Resend key + from-address
RESEND_WEBHOOK_SECRET
Optional — newsletter open/click tracking
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET
Google OAuth (optional)
PUPPETEER_EXECUTABLE_PATH
Optional — serverless Chromium for PDF export
Note
Build-time note: all NEXT_PUBLIC_* vars are baked into the bundle at build time — set them in your host before building.
13

Costs and third-party services

Warning
Your purchase covers the Trovo source code only. Trovo is self-hosted software that connects to your own third-party accounts. Any usage, subscription, or per-transaction fees those services charge are billed to you and are not included in the purchase price. Most have a free tier to start; cost scales with usage.

At minimum Trovo needs three services — a PostgreSQL database, one AI provider key, and a Google Maps key. Everything else is optional and can be left disabled.

ServicePowersRequired?Cost model
OpenAI or Google Gemini
AI itineraries, refinement, packing lists
One of
Pay-as-you-go per request (your API key)
Google Maps
Maps + geocoding
Yes
Free monthly tier, then usage-based
PostgreSQL (Neon)
Application database
Yes
Free tier, paid for scale
Hosting (Vercel)
Running the app
Yes
Free tier, paid for production scale
Stripe & PayPal
Payments & subscriptions
Optional
Per-transaction processing fees
Cloudflare R2
Image storage / uploads
Optional
Free tier, usage-based beyond
Resend
Transactional & campaign email
Optional
Free tier, usage-based beyond
Open-Meteo
Weather forecasts
Optional
Free — no key required
Note
AI, payments, image uploads, and email can each be disabled independently — Trovo degrades gracefully when an optional integration isn’t configured. See the FAQ.
14

Customization guide

Most of Trovo can be rebranded and managed without touching code, from the admin panel. Sign in with an admin account and open Admin → Settings or Admin → Branding. Changes apply at runtime — no redeploy needed.

1 · Site name, tagline and support email

  1. 01
    Go to Admin → Settings.
  2. 02
    Set your Site name and Tagline.
  3. 03
    Set the Support email shown to customers, then Save.

2 · Logos and favicon

  1. 01
    Go to Admin → Branding.
  2. 02
    Upload your light logo (for dark backgrounds), dark logo (for light backgrounds), favicon, footer logo, and PDF logo.
  3. 03
    Each upload instantly replaces the Trovo default across the site, emails, and exported PDFs.

3 · Brand colors

  1. 01
    Go to Admin → Settings → Branding.
  2. 02
    Pick your Primary color (buttons, links, accents) and Accent color (highlights) as hex values.
  3. 03
    Save — the whole interface re-themes immediately.
Note
Defaults are Trovo teal #17cfb6 and amber #faa52e. The same design tokens also live in app/globals.css as --primary / --accent if you prefer to bake brand colors in at build time.

4 · Social links and footer

  1. 01
    In Admin → Branding, add your X/Twitter, Instagram, Facebook, LinkedIn, and YouTube handles or URLs (blank ones are hidden).
  2. 02
    Set the Footer brand text (e.g. your copyright line).

5 · Content — all editable in the admin panel

  • Blog — write posts in Admin → Blog with a rich-text editor.
  • Legal pages — edit Terms & Privacy in Admin → Legal.
  • Announcements — show a site-wide banner from Admin → Announcements.
  • Plans, pricing & commission — see Managing your platform below.
Warning
Needs code: only fonts and structural page layout are set in code (app/globals.css and the app/ routes). Everything above — name, logos, colors, socials, and content — is admin-configurable at runtime.
15

Managing your platform

The admin panel at /admin is where you run the business day to day. Sign in with an Admin account. Here’s each area and what it’s for:

Dashboard
At-a-glance revenue, users, bookings, and growth charts.
Users
View, search, change roles, and suspend accounts.
Providers
Review and approve / verify vendors who apply to sell tours.
Listings
Moderate marketplace tour listings (approve, hide, remove).
Bookings
See every booking and its status; handle cancellations / refunds.
Reviews
Moderate customer reviews and provider replies.
Revenue
Analytics dashboard with CSV export.
Payouts
Track what each provider is owed after your platform commission.
Promo codes
Create and manage discount codes.
Blog
Publish SEO content with a rich-text editor.
Newsletter
Compose and send email campaigns to subscribers.
Announcements
Site-wide banners for promos or notices.
Legal
Edit the Terms of Service and Privacy Policy pages.
Currencies
Enable currencies and set exchange rates / the default.
SEO
Per-page meta overrides; clear cached AI destination guides.
Branding
Logos, social links, footer (see the Customization guide).
Settings
AI provider + encrypted API keys, marketplace commission %, maintenance mode, site identity & colors.

Common tasks

  • Choose your AI provider & add keys: Admin → Settings → pick OpenAI or Gemini and paste your key (stored encrypted at rest).
  • Approve a provider: Admin → Providers → open the application → Verify.
  • Set your commission: Admin → Settings → marketplace commission (default 15%).
  • Take the site offline for maintenance: Admin → Settings → toggle maintenance mode.

Roles at a glance

Admin
Everything, including the restricted Settings area (API keys, commission, maintenance).
Moderator
Day-to-day moderation — users, listings, bookings, reviews, content — but not platform Settings.
Provider
Their own listings, bookings, payouts, and profile, in a separate /provider portal.
User
Plan trips, book tours, and manage their own account.
16

Deployment

Trovo is built for Vercel.

  1. 01
    Import the repo at vercel.com/new (Next.js auto-detected; build pnpm build).
  2. 02
    Set all env vars (including NEXT_PUBLIC_* before the build).
  3. 03
    Apply the schema against the production DB: prisma migrate deploy.
  4. 04
    Deploy.
Warning
PDF export on serverless: Puppeteer needs @sparticuz/chromium installed and PUPPETEER_EXECUTABLE_PATH pointed at its binary. See the full playbook in docs/DEPLOY.md.
17

Production checklist

1
Set all environment variables in the host
2
Apply migrations (prisma migrate deploy)
3
Configure the Stripe webhook (8 events) + STRIPE_WEBHOOK_SECRET
4
Set PAYPAL_ENV=live, run pnpm paypal:setup, set the PayPal webhook + PAYPAL_WEBHOOK_ID
5
Set AUTH_URL + NEXT_PUBLIC_APP_URL to the real domain
6
Add the production Google OAuth redirect URI
7
Add the production domain to the Google Maps referrer restriction
8
Verify the Resend sending domain
18

Subscription plans

PlanPriceHighlights
Free
$0
3 AI itineraries/mo, GPT-4o-mini, weather + Google Maps, wishlist up to 10, browse & book marketplace tours
Pro
$9/mo · $89/yr · $199 lifetime
Unlimited AI itineraries, GPT-4o, PDF + packing-list export, up to 5 trip collaborators, embed widget, unlimited wishlist
Business
$29/mo · $290/yr
Everything in Pro + 20 collaborators + white-label branding + priority support
19

Frequently asked questions

Does the purchase price include API and service costs?

No. You’re buying the Trovo source code. AI (OpenAI / Gemini), Google Maps, payment processing, hosting, storage, and email run on your own accounts and are billed to you — see Costs and third-party services. Most offer a free tier to start.

Can I turn off the AI features?

Yes. AI itineraries are optional. Without an AI key the planner is hidden and the rest of the platform — marketplace, bookings, content — works normally.

Can I run Trovo without Stripe / PayPal?

Yes. Leave the payment keys blank and checkout and subscriptions stay disabled. You can run Trovo as a pure trip planner or a free tour directory.

How do providers (vendors) get paid?

Two ways, and you choose. Trovo always tracks each provider’s earnings minus your commission in Admin → Payouts. From there you can either mark a payout paid manually after settling out-of-band, or — if you enable Stripe Connect — click Pay via Stripe and the money transfers to the provider’s own bank account. Providers connect their payout account themselves from Provider → Payouts; see Provider payouts.

Releasing a payout is always a deliberate action, not a schedule — the 7-day hold after trip completion covers the cancellation and dispute window.

What’s the difference between Admin and Moderator?

Admins have full access including the restricted Settings area (API keys, commission, maintenance mode). Moderators handle day-to-day moderation — users, listings, bookings, reviews, content — but can’t change platform settings.

How many users, listings, or providers can it handle?

There’s no built-in cap — it scales with your database and hosting plan. The Free / Pro / Business plans only gate end-user features (AI usage, collaborators, and so on), not platform totals.

Is white-label / rebranding included?

Yes. Change the name, logos, colors, social links, and footer from the admin panel with no code — see the Customization guide.

Can I change subscription prices and plan limits?

Yes. Prices and the marketing copy for each tier live in lib/plan-catalog.ts, feature gates in lib/plans.ts, and the Stripe/PayPal price ids in lib/subscription-plans.ts. Editing lib/plan-catalog.ts updates the pricing page, the landing page, and the billing page together. The payment products themselves are configured in your Stripe / PayPal dashboards.

Does it run on Windows?

You can develop on Windows, macOS, or Linux (Node 20+ and pnpm). Production runs on any Node host; Vercel is the documented target.

What support is included?

Setup help and bug fixes by email — devsnack26@gmail.com. Custom feature development isn’t included.

20

Changelog

Every version published so far. Updates are free for the life of the item.

v1.3 · Aug 2026
Automatic provider payouts via Stripe Connect, traveller-to-provider messaging with unread badges, theme toggle, pricing and FAQ pages.
v1.2.1 · Aug 2026
Fixed a production server-rendering error affecting tour, blog and legal pages.
v1.2 · Aug 2026
Header and footer on marketplace tour pages, auth rate limiting, security patches, expanded docs.
v1.1 · Aug 2026
PayPal recurring subscriptions, trip collaboration over SSE, embed widget, destination guides, affiliate links.
v1.0 · Aug 2026
Initial release — AI itinerary generator, tour marketplace, Stripe checkout and subscriptions, admin and provider portals.

Release notes

v1.3
Stripe Connect provider payouts (optional — vendors onboard once, released payouts transfer automatically; manual payouts still supported), traveler ↔ provider messaging (threads, unread badges, email notifications), light/dark/system theme toggle, dedicated Pricing & FAQ pages, site header & footer on the blog, legal and provider-signup pages
v1.2.1
Bug fix — resolved a production server-rendering error that could break tour, blog & legal pages (the rich-text sanitizer no longer depends on jsdom)
v1.2
Site header & footer on marketplace tour pages (nav + sign-in for logged-out visitors), auth rate limiting on register / password reset / resend-verification, security patches (form-data, ws), expanded documentation (customization & admin guides, FAQ, third-party cost disclosure)
v1.1
PayPal recurring subscriptions (Pro/Business monthly + yearly), trip collaboration (SSE presence + comments), embed widget, destination guides, affiliate links
v1.0
Initial release — AI itinerary generator, tour marketplace, Stripe checkout + subscriptions, admin + provider portals, landing page, demo content
21

Support

Questions, setup help, or bug reports? We’re happy to help.

What support covers

  • Six months of support from purchase, extendable at checkout
  • Support covers bugs in the template and questions about how it is put together
  • It does not cover custom feature work, third-party API changes or store review outcomes
  • The Regular licence covers one free end product. Charging users for the app itself needs the Extended licence