Quick Start

Welcome to Photography — a production-ready photography booking marketplace built with Next.js 16 (App Router), React 19, TypeScript, PostgreSQL and Tailwind CSS. This page gets you from a fresh download to a running site in about 15 minutes.

Photography ships as a vertical pack product: the engine is generic, and a pack supplies the vocabulary, fields, filters, master data and demo content for one business. The pack included is Photography — photographers publish weekly availability and a session length, and clients book a shoot time and pay. Switching the pack changes every noun on the site (session → consultation, photographer → practitioner, client → patient) without touching engine code.

New here? Read Product Overview for the big picture, then come back to install.

What you need

  • Node.js 20+ and npm
  • A PostgreSQL database (we recommend Neon — Photography uses the @neondatabase/serverless driver)
  • About 15 minutes

Install in 4 steps

Terminal
# 1. Install dependencies
npm install

# 2. Create your environment file
#    Create .env.local with at least DATABASE_URL (JWT_SECRET / SECRET_KEY
#    are auto-generated by the install wizard's database step if unset).

# 3. Initialise the database (schema + seed)
npm run db:init

# 4. Start the dev server
npm run dev

Open http://localhost:3000. The first run launches the install wizard at /install — it walks you through the database check, admin account, and store settings.

Load the demo

Terminal
# Apply the vertical pack: master data, categories, fields, filters, copy
npx tsx scripts/apply-vertical.ts photography --yes

# Seed demo photographers, sessions, availability, bookings and reviews.
# Imagery comes from Pexels — set PEXELS_API_KEY in .env for real photos,
# otherwise deterministic placeholders are used.
npm run vertical:demo

# Subscription plans for the demo hosts (cascades off hosts, so re-run after a re-seed)
npx tsx scripts/seed-plans.ts --hosts

# Storefront pages (privacy, cookies, terms, refunds, about)
npx tsx scripts/seed-site-pages.ts

# Account emails, plus booking/waitlist templates for Email, WhatsApp, SMS and Push
npx tsx scripts/seed-message-templates.ts

Demo logins — password Password@1:

Role Email
Photographer (host) host1@photographydemo.comhost5@photographydemo.com
Client (customer) guest1@photographydemo.comguest5@photographydemo.com

The two booking mechanics

Mode How availability works Used by
seat The host publishes dated sittings (experience_sessions) with a place count. Classes, tours, events
slot The host sets weekly hours (availability_rules); slots are expanded on read and only become a row when booked. Appointment businesses — clinics, salons, photographers

The active pack declares which one it uses; the booking engine, calendar and checkout follow. Photography runs in slot mode: photographers publish weekly availability and a session length, and clients book a shoot time.

What the Photography pack gives you

Six categories — Weddings, Portraits, Family & Newborn, Events, Commercial & Product and Real Estate — covering session types like Wedding, Engagement, Portrait, Family, Newborn, Maternity, Headshot, Product, Real Estate, Event, Fashion and Boudoir, shot in styles from Editorial and Candid/Documentary to Fine Art, Cinematic, Moody & Dark, Bright & Airy and Black & White, at a Studio, on location, at the client's home, at a venue or as travel/destination work. The pack's vocabulary maps listing → Session, host → Photographer, guest → Client, unit → session, and one bookable occurrence → shoot time. Master data is admin-editable under Master Data, and it drives the listing editor, the browse facets and the photographer profile.

Sessions, packages and waitlists

Two things a photography marketplace needs that a plain slot-booking engine does not have:

  • Courses (session_series) — one purchase covering a block of shoot times: a wedding-day package with an engagement shoot bundled in, a multi-part newborn-and-milestone series, a recurring content-shoot retainer. A series owns no seat counter of its own; booking claims a place in every shoot time in the block, so a package and a single-session booking compete for the same photographer and can never oversell each other.
  • Waitlists (session_waitlist) — a fully booked shoot time is no longer a dead end. Clients queue for a slot, and when a booking is cancelled the front of the queue is notified automatically. An offer is a head start, not a hold: the client still checks out normally.

Notifications

Four channels, all template-driven from Settings → Notifications and all silent until their provider is connected under Settings → Channels:

Channel Transport Fired on
Email Configured email add-on, SMTP fallback Booking, reminder, cancellation, payment, waitlist
WhatsApp Connected WhatsApp add-on Booking, reminder, cancellation, payment, waitlist
SMS Connected SMS add-on Booking, reminder, cancellation, payment, waitlist
Push Firebase Cloud Messaging → the mobile app Booking, cancellation, waitlist

Push additionally needs a Firebase service account under Settings → Push. The mobile app registers each device with POST /api/v1/customer/fcm/token; tokens are pruned automatically when FCM reports them unregistered, and every send respects the client's notify_push preference.

Core environment variables

Variable Purpose
DATABASE_URL PostgreSQL connection string
JWT_SECRET Signs admin/customer session tokens
SECRET_KEY AES-256-GCM key that encrypts stored integration secrets
PEXELS_API_KEY Optional — real demo imagery instead of placeholders
LICENSE_SERVER_URL License server (defaults to https://creative-cape.com)

See the Installation Guide for the full list and the License Guide for activation.

Where to go next


© CreativeCape Solutions · creative-cape.com · support@creative-cape.com