specs
Inquiry Forms

Inquiry Forms Specification

Status: Canonical Last Updated: 2026-05-11 Source: apps/frontend/app/[locale]/(landing)/inquiry/


Related specs


Form Types

FormRoutePurposeStorage
Contact/inquiry/contactGeneral inquiriesformSessions
Venue Rental/inquiry/venue-rentalPrivate venue bookingformSessions
Workshops/inquiry/workshopsWorkshop inquiriesformSessions
Private Events/inquiry/private-eventsPrivate event bookingsformSessions
Artist Proposal/inquiry/artist-proposalPerformer applicationsformSessions
Host an Event/inquiry/host-an-eventCorporate/event hostingformSessions

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 message

Admin 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.