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.
- Version v1.3
- Updated Aug 2026
- Platform Next.js
- Stack Next.js · Stripe
On this page
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):
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
Features
Architecture
Project structure
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).
Database setup
Trovo uses Neon PostgreSQL (serverless) with Prisma ORM — no extensions or pgvector required. The schema has 32 models grouped by domain:
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 databaseAI provider setup
Trovo ships with two AI providers, admin-switchable at runtime via AdminSetting.ai_provider (factory in lib/ai.ts):
- OpenAI GPT-4o — default. Get a key at platform.openai.com.
- Google Gemini 1.5 Pro — alternate. Get a key at aistudio.google.com.
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.
AdminSetting are encrypted at rest with AES-256 (lib/encryption.ts). Every AI route is rate-limited to 10 requests/hour per user.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 onlyNEXT_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).
Authentication setup
Auth is NextAuth v5 with email/password credentials and optional Google OAuth.
- Set
AUTH_SECRET(openssl rand -base64 32) andAUTH_URL. - Google sign-in: set
GOOGLE_CLIENT_ID+GOOGLE_CLIENT_SECRETand add redirect URI<url>/api/auth/callback/google. Leave empty to hide the button. - Verify-email and password reset are delivered via Resend.
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/stripesubscribed to these 8 events:
checkout.session.completed customer.subscription.created
charge.refunded customer.subscription.updated
invoice.payment_failed customer.subscription.deleted
account.updated transfer.reversedThe 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:
stripe listen --forward-to localhost:3000/api/webhooks/stripePayPal
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:
pnpm paypal:setup # creates the catalog product + 4 Plan IDsCreate 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).
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.
- 01In the Stripe dashboard: Connect → Get started, choose Platform or marketplace, and complete the platform profile.
- 02Under Connect → Settings, make sure Express accounts are enabled.
- 03Add
account.updatedandtransfer.reversedto your existing Stripe webhook.
Providers then onboard themselves from Provider → Payouts, which shows their status:
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.
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.
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_KEYandEMAIL_FROM. Without a key, email stub-logs to the console. - Optional: set
RESEND_WEBHOOK_SECRET+ endpoint/api/webhooks/resendfor newsletter open/click tracking.
Environment variables
All env vars are declared and validated with Zod in lib/env.ts; .env.example mirrors it with inline setup notes.
DATABASE_URL, AUTH_SECRET (≥16 chars), ENCRYPTION_KEY (exactly 64 hex chars), plus at least one of OPENAI_API_KEY / GOOGLE_AI_API_KEY.sandbox (default) or livepnpm paypal:setup)NEXT_PUBLIC_* vars are baked into the bundle at build time — set them in your host before building.Costs and third-party services
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.
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
- 01Go to Admin → Settings.
- 02Set your Site name and Tagline.
- 03Set the Support email shown to customers, then Save.
2 · Logos and favicon
- 01Go to Admin → Branding.
- 02Upload your light logo (for dark backgrounds), dark logo (for light backgrounds), favicon, footer logo, and PDF logo.
- 03Each upload instantly replaces the Trovo default across the site, emails, and exported PDFs.
3 · Brand colors
- 01Go to Admin → Settings → Branding.
- 02Pick your Primary color (buttons, links, accents) and Accent color (highlights) as hex values.
- 03Save — the whole interface re-themes immediately.
#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
- 01In Admin → Branding, add your X/Twitter, Instagram, Facebook, LinkedIn, and YouTube handles or URLs (blank ones are hidden).
- 02Set 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.
app/globals.css and the app/ routes). Everything above — name, logos, colors, socials, and content — is admin-configurable at runtime.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:
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
/provider portal.Deployment
Trovo is built for Vercel.
- 01Import the repo at vercel.com/new (Next.js auto-detected; build
pnpm build). - 02Set all env vars (including
NEXT_PUBLIC_*before the build). - 03Apply the schema against the production DB:
prisma migrate deploy. - 04Deploy.
@sparticuz/chromium installed and PUPPETEER_EXECUTABLE_PATH pointed at its binary. See the full playbook in docs/DEPLOY.md.Production checklist
prisma migrate deploy)STRIPE_WEBHOOK_SECRETPAYPAL_ENV=live, run pnpm paypal:setup, set the PayPal webhook + PAYPAL_WEBHOOK_IDAUTH_URL + NEXT_PUBLIC_APP_URL to the real domainSubscription plans
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.
Changelog
Every version published so far. Updates are free for the life of the item.
Release notes
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