Inquiry Forms Specification
Status: Canonical Last Updated: 2026-05-11 Source:
apps/frontend/app/[locale]/(landing)/inquiry/
Related specs
- Tech Stack — Forms use React Hook Form + Zod
- Data Model — formSessions, inquirySessions tables
- Public Pages — Inquiry pages are part of public pages
- Admin Dashboard — Kanban view in admin for managing inquiries
- Notifications — Admin alerts when new inquiry submitted
- User Stories — US-G04 covers inquiry submission
Form Types
| Form | Route | Purpose | Storage |
|---|---|---|---|
| Contact | /inquiry/contact | General inquiries | formSessions |
| Venue Rental | /inquiry/venue-rental | Private venue booking | formSessions |
| Workshops | /inquiry/workshops | Workshop inquiries | formSessions |
| Private Events | /inquiry/private-events | Private event bookings | formSessions |
| Artist Proposal | /inquiry/artist-proposal | Performer applications | formSessions |
| Host an Event | /inquiry/host-an-event | Corporate/event hosting | formSessions |
Form Architecture
Frontend
Each inquiry page is a self-contained form:
- Hero section with page title
- Form fields (React Hook Form + Zod validation)
- Submit button with loading state
- Success/error messages
Backend Storage
All form submissions stored in two tables:
formSessions — Raw submission
- sessionId: UUID
- formType: enum
- data: JSON stringified fields
- submitted: boolean
- expiresAt: 7 days
inquirySessions — Admin overlay
- formSessionId: FK
- formType: enum
- status: NEW | READ | REPLIED | ARCHIVED
- adminNotes: optional
- reviewedBy: Clerk user ID
- reviewedAt: timestamp
Form Fields by Type
Contact
- name (required)
- email (required, validated)
- subject (required)
- message (required)
Venue Rental
- name (required)
- email (required)
- phone (required)
- eventType (required)
- date (required)
- guestCount (required)
- message (optional)
Workshops
- name (required)
- email (required)
- phone (required)
- workshopType (required)
- message (optional)
Private Events
- name (required)
- email (required)
- phone (required)
- eventType (required)
- date (required)
- guestCount (required)
- message (optional)
Artist Proposal
- name (required)
- email (required)
- phone (required)
- performanceType (required)
- description (required)
- links (optional)
Host an Event
- name (required)
- email (required)
- phone (required)
- eventType (required)
- date (required)
- guestCount (required)
- message (optional)
Submission Flow
1. User fills form → React Hook Form validates
2. Submit → useMutation(api.domains.forms.submitInquiry)
3. Convex stores in formSessions
4. Convex creates inquirySession with status=NEW
5. Convex creates notification for admin
6. Frontend shows success messageAdmin Management
Kanban Board (/dashboard/inquiries)
- Columns: NEW | READ | REPLIED | ARCHIVED
- Drag cards between columns to update status
- Click card to expand details
Card Display
- Form type badge
- Submitter name
- Submitter email
- Date submitted
- Message preview (first 100 chars)
Detail View
- All form fields
- Submission timestamp
- Current status
- Admin notes (add/edit)
- Follow-up history
Follow-ups
Admin can add follow-up notes visible in inquiry detail.