Inquiry-to-quote software for owner-led service businesses.
Requo helps service businesses capture inquiries, qualify leads, send quotes, and follow up from one place.
Requo is a multi-business SaaS app for owner-led service businesses that manage inbound inquiries and custom quotes.
It is built around one shared workflow:
- capture inquiries from public forms, referrals, ads, socials, and directories
- qualify leads before pricing
- send clear, professional quotes faster
- follow up consistently without losing context
The product supports multiple business types through guided starter templates, while keeping the core experience focused on this workflow rather than generic configurability.
- Public inquiry intake with editable forms, supporting cards, optional showcase images, and file uploads
- Guided onboarding with 4 starter templates:
Agency / Studio,Consultant / Professional Services,Contractor / Home Service, andGeneral Service Business - Owner dashboard for inquiries, lead qualification, quotes, follow-up, and business settings
- Quote workflow with draft, sent, accepted, rejected, expired, and follow-up states
- Starter defaults for inquiry fields, reply snippets, and quote notes that stay editable later
- Knowledge and FAQ management for business-specific reference material
- AI-assisted response drafting through OpenRouter
- Transactional email flows through Resend
- Subscription billing with PayMongo (QRPh for Philippines) and Lemon Squeezy (cards for international)
- Analytics and notification foundations for operational visibility
- Next.js 16 App Router
- React 19
- TypeScript
- Tailwind CSS v4
- shadcn/ui
- Better Auth for authentication and sessions
- Drizzle ORM with PostgreSQL
- Supabase for storage and realtime-backed notification plumbing
- Resend for transactional email
- OpenRouter for AI features
- PayMongo for QRPh payments (Philippines)
- Lemon Squeezy for card/global payments
- Node.js 22 or newer
- npm
- PostgreSQL
- A
.envfile based on.env.example
-
Install dependencies.
npm install
-
Create a local env file.
macOS or Linux:
cp .env.example .env
PowerShell:
Copy-Item .env.example .env -
Run database migrations.
npm run db:migrate
-
Seed demo data.
npm run db:seed-demo
-
Start the app.
npm run dev
-
Open the app at the same origin configured in
BETTER_AUTH_URL.
- Owner name:
Morgan Lee - Owner email:
demo@requo.local - Owner password:
ChangeMe123456! - Business name:
BrightSide Print Studio - Business slug:
brightside-print-studio
The demo seed also creates two additional sample businesses, three inquiry forms per business, and several hundred seeded inquiries and quotes for dashboard browsing.
DATABASE_URLBETTER_AUTH_SECRETBETTER_AUTH_URLNEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEYSUPABASE_JWT_SECRET
DATABASE_MIGRATION_URL
GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRETMICROSOFT_CLIENT_IDMICROSOFT_CLIENT_SECRETMICROSOFT_TENANT_IDRESEND_API_KEYRESEND_FROM_EMAILRESEND_REPLY_TO_EMAILOPENROUTER_API_KEYOPENROUTER_DEFAULT_MODEL
NEXT_PUBLIC_BETTER_AUTH_URLVERCEL_URLDEMO_OWNER_NAMEDEMO_OWNER_EMAILDEMO_OWNER_PASSWORDDEMO_BUSINESS_NAMEDEMO_BUSINESS_SLUGDEMO_QUOTE_PUBLIC_TOKENDEMO_EXPIRED_QUOTE_PUBLIC_TOKEN
PAYMONGO_SECRET_KEYPAYMONGO_PUBLIC_KEYPAYMONGO_WEBHOOK_SECRETLEMONSQUEEZY_API_KEYLEMONSQUEEZY_STORE_IDLEMONSQUEEZY_WEBHOOK_SECRETLEMONSQUEEZY_PRO_VARIANT_IDLEMONSQUEEZY_BUSINESS_VARIANT_ID
For full setup expectations, read:
For Supabase-backed setups:
- use
DATABASE_URLwith the pooler host on port6543for app/runtime traffic - use
DATABASE_MIGRATION_URLwith the same pooler host on port5432for Drizzle migrations
Example:
DATABASE_URL=postgresql://postgres.<project-ref>:<db-password>@aws-<region>.pooler.supabase.com:6543/postgres
DATABASE_MIGRATION_URL=postgresql://postgres.<project-ref>:<db-password>@aws-<region>.pooler.supabase.com:5432/postgres| Command | Purpose |
|---|---|
npm run dev |
Start the local development server |
npm run build |
Build the production app |
npm run start |
Run the production build locally |
npm run lint |
Run ESLint |
npm run typecheck |
Run TypeScript checks |
npm run check |
Run lint and typecheck together |
npm run test |
Run unit and component tests with Vitest |
npm run test:integration |
Run integration tests with Vitest |
npm run test:e2e |
Run Playwright end-to-end tests |
npm run test:all |
Run all tests (unit + integration + e2e) |
npm run test:coverage |
Run tests with coverage report |
npm run db:generate |
Generate Drizzle artifacts |
npm run db:migrate |
Apply Drizzle migrations |
npm run db:push |
Push schema changes directly |
npm run db:studio |
Open Drizzle Studio |
npm run db:seed-demo |
Seed the demo workspace |
app/route groups, layouts, pages, and route handlerscomponents/shared UI primitives, shell UI, and marketing componentsfeatures/product slices such as account, auth, businesses, inquiries, quotes, knowledge, AI, analytics, notifications, onboarding, settings, and themelib/auth, database, provider clients, env validation, and shared utilitiesemails/templates/transactional email renderingdocs/setup and architecture documentationtests/unit/Vitest unit tests for utilities and logictests/components/Vitest component tests for React componentstests/integration/Vitest integration tests for database actionstests/e2e/Playwright end-to-end tests
lib/billing/billing domain types, plan pricing, region detection, subscription service, webhook processing, and provider clients (PayMongo, Lemon Squeezy)lib/billing/providers/PayMongo and Lemon Squeezy REST clients with webhook signature verificationlib/db/schema/subscriptions.tsworkspace_subscriptions, billing_events, and payment_attempts tablesfeatures/billing/checkout dialog, billing status card, upgrade button, server actions, and queriesapp/api/billing/webhook route handlers for PayMongo and Lemon Squeezy
- Better Auth is the only authentication system in this app
- Initial signup creates the user and profile; onboarding creates the first business and later business creation stays explicit in business flows
- Business ownership is enforced through business-aware server helpers and scoped queries
- Supabase is used for storage and notification plumbing, not Supabase Auth
DESIGN.mdis the canonical UI system, with semantic tokens and shared wrappers implemented inapp/globals.cssandcomponents/shared/*- Private assets stay behind authenticated route handlers
- AI drafting stays server-side and uses business context plus uploaded knowledge
- Marketing, onboarding, starter templates, and in-app copy are aligned around the inquiry -> qualification -> quote -> follow-up workflow
- Starter templates are opinionated defaults, not rigid vertical product modes
- Subscriptions are workspace-scoped with PayMongo for QRPh and Lemon Squeezy for cards
- The
workspaces.plancolumn is a denormalized read cache; the authoritative state lives inworkspace_subscriptions - Billing mutations go through
lib/billing/subscription-service.ts; webhooks go throughlib/billing/webhook-processor.ts - See docs/setup/billing.md for provider setup instructions
Detailed architecture guidance lives in docs/architecture/requo-architecture.md.
The baseline health checks for this repository are:
npm run check
npm run test
npm run build
npm run test:e2eRequo is intentionally scoped for owner-led service businesses that handle inbound inquiries and custom quotes. It does not try to become an enterprise CRM, field-service dispatch tool, scheduling suite, payroll tool, invoicing platform, marketplace, or mobile-first collaboration app.
