Wedding Management App
A multi-tenant SaaS platform for professional wedding planners in the Spanish market, streamlining RSVP management, guest tracking, and gift coordination.
Overview
The Wedding Management App enables wedding planners to manage multiple weddings simultaneously while providing couples with real-time guest tracking and friction-free RSVP experiences through persistent magic links.
Key Features
- Multi-tenant platform with complete data isolation between weddings
- Magic link authentication for guests (no passwords required)
- Family-based RSVP system optimized for Spanish weddings
- Excel import/export for guest list management
- Payment tracking with automated bank transfer matching
- Multi-language support (Spanish, English, French, Italian, German)
- Mobile-first design optimized for WhatsApp in-app browsers
- Custom theme system for wedding branding
- Quotes & Finances — full income management for wedding planners (quotes, contracts, eSignature, invoices)
- Alert system — async multi-channel alerts (email/SMS/WhatsApp) to admins, planners, the couple, or specific guests; configurable rules with retry logic and full delivery tracking
Tech Stack
- Frontend: Next.js 15+ (App Router), React 19+, Tailwind CSS
- Backend: Next.js API Routes, NextAuth.js (OAuth)
- Database: PostgreSQL 15+ with Prisma ORM
- Observability: HyperDX.io (OpenTelemetry), Vercel Analytics
- Deployment: Docker containers, GitHub Actions CI/CD
- Languages: TypeScript, multi-language i18n support
- PDF generation:
@react-pdf/renderer (server-side)
- Real-time collaboration: TipTap rich-text editor + Liveblocks YJS (hosted WebSocket backend)
- eSignature: DocuSeal API (self-hosted or cloud)
Getting Started
Prerequisites
- Node.js 18+ (LTS)
- Docker and docker-compose
- PostgreSQL 15+
Installation
# Clone the repository
git clone https://github.com/your-username/wedding.git
cd wedding
# Install dependencies
npm install
# Set up environment variables
cp .env.example .env
# Edit .env and configure DATABASE_URL
# Create database
createdb wedding_db
# Start development server
npm run dev
That's it! The application will automatically:
- Detect that no migrations exist
- Create the initial migration from the Prisma schema
- Apply all migrations to set up database tables
- Start the server
Visit http://localhost:3000 to view the application.
Development
# Run tests
npm test
# Run linter
npm run lint
# Format code
npm run format
# Build for production
npm run build
Quotes & Finances
The /planner/quotes-finances section gives wedding planners a complete income management workflow:
Quotes
Create lightweight quote records (separate from weddings) with line items, discounts, and tax. Generate a branded PDF and send it to prospective clients. Track status through its lifecycle:
DRAFT → SENT → ACCEPTED / REJECTED / EXPIRED
Once a quote is accepted, convert it directly into a contract with one click.
Routes
GET/POST /api/planner/quotes — list / create quotes
GET/PATCH/DELETE /api/planner/quotes/[id]
POST /api/planner/quotes/[id]/generate-pdf — renders QuotePDF via @react-pdf/renderer, stores in Vercel Blob
POST /api/planner/quotes/[id]/contract — creates a Contract (optionally from a template)
Contract Templates
Reusable rich-text templates authored with a TipTap editor. Templates are stored as ProseMirror JSON and can be applied when creating a contract from a quote.
Routes
GET/POST /api/planner/contract-templates
GET/PATCH/DELETE /api/planner/contract-templates/[id]
Collaborative Contracts
Once a contract is created, the planner shares a unique link with the client. Both parties can edit the document simultaneously using a real-time collaborative TipTap editor backed by Liveblocks (hosted YJS):
- Live presence cursors showing who else is editing
- Full formatting toolbar (Bold, Italic, Underline, H1–H3, lists, text align)
- Client access via share token — no account required
After finalisation the planner generates a PDF and sends it for electronic signing via DocuSeal. DocuSeal automatically emails the client a signing link; once signed, DocuSeal fires a webhook that marks the contract SIGNED and stores the signed PDF URL.
Contract status lifecycle:
DRAFT → SHARED → SIGNING → SIGNED / CANCELLED