Marketplace · Web · Admin

Photography Booking Marketplace

A marketplace for booking verified photographers and videographers. Customers describe the event, get a suggested package and crew, and pay online; photographers get paid to a wallet.

Role
Full-stack engineering across customer app, photographer app, API and admin
Platforms
Customer web app · Photographer & studio app · Admin panel · REST API
Stack
React 19 · Vite · Next.js 16 · Node.js · Express 5 · TypeScript · Prisma · PostgreSQL · Razorpay & RazorpayX · Mapbox · Cloudflare R2 · Google Calendar API · ffmpeg
  • Marketplace logic
  • Geo matching
  • Payments & payouts
  • GST invoicing
  • Calendar sync
  • KYC flows
  • Video rendering
  • Cron jobs
Map-based crew discovery with auspicious dates, plus the photographer's calendar and event check-in

Product screens with sample data. Names and figures inside the screens are illustrative.

01

The problem

Booking a wedding crew usually means calling studios one by one. The platform had to match the right people to an event automatically, price it fairly with travel and tax, and pay every professional reliably afterwards.

81
Data models
~310
API endpoints
67
Admin pages
02

What I built

01

Discovery that understands Indian events

Customers search by event, city radius and dates on a clustered map, with venue autocomplete from Google Places. A Hindu calendar panel shows tithi, nakshatra and Rahu Kalam, so families can pick an auspicious date while they pick a crew.

  • Mapbox globe and city clusters
  • Only professionals free on every event day are shown
  • Venue types and service radius respected
Map with photographer clusters beside a list and an auspicious-dates panel
02

A crew assembled for your event

A six-step wizard suggests a package, then lets customers customise the crew. Matching runs in SQL: service-area radius, venue types, and a two-hour gap after existing bookings so nobody is double-booked.

  • Draft orders that expire on a schedule
  • Sort by best match or nearest, filter by rating
  • Preferred teammates stay together
Crew builder with available professionals and team total
03

Invitations rendered on the server

A card marketplace for weddings, haldi, mehendi and sangeet. Customers personalise names, date, venue, photo and music, and the server renders a vertical video with ffmpeg or a print-ready PDF, ready to share on WhatsApp.

Invitation studio with templates, a live video card and personalisation fields
04

Pricing that adds up

Price is built from day, half-day and hour windows, then a 15% commission, round-trip travel per city, referral discount and GST: CGST and SGST inside the state, IGST across states. Payment runs through Razorpay with signature-checked webhooks.

Booking review with editing package, add-ons and GST breakdown
05

Tools for the photographers

Availability syncs both ways with Google Calendar through push webhooks, so a personal event blocks bookings without revealing what it is. Check-in unlocks only near the venue, and earnings settle into a wallet that pays out through RazorpayX.

06

An admin built for operations

67 pages covering KYC pulled from DigiLocker with consent, package-price approvals that never touch live bookings, bank verification, disputes, payouts and refunds. Permissions go down to view, edit, delete and assign, and there are 17 Excel-exportable reports.

KYC review with masked DigiLocker identity and a package price change

03 Advanced engineering

The money and matching engine behind a booking

Every booking crosses the matching query, the pricing rules, two payment providers and a schedule of background jobs. Each step is built so that it can be retried or reconciled without anyone being paid twice.

  1. 01Event details and dates
  2. 02Crew matched in one SQL query
  3. 03Price: windows, commission, travel, GST
  4. 04Razorpay order
  5. 05Signed webhook confirms payment
  6. 06Wallet: pending settlement
  7. 07Automatic RazorpayX payout
Admin dashboard with collections, booking status and latest bookings

Operations dashboard with sample data.

Matching in the database

Radius, venue type, availability and the gap after other bookings are a single query, so results stay fast and consistent as the catalogue grows.

Two-way calendar sync

Google Calendar push notifications keep availability current in both directions. Imported events block dates but stay private from customers.

Identity without storing documents

Setu DigiLocker returns verified Aadhaar and PAN details with consent. Only masked values and a name-match score are kept.

Subscriptions and payouts

Studios pay through UPI autopay subscriptions; professionals are paid from a wallet that settles on schedule and pays out through RazorpayX.

Eight scheduled jobs

Draft cleanup, auto-completion, SMS reminders, wallet settlement and payout, studio billing, payment reconciliation, calendar sync, and a nightly backup to R2 with a Slack alert.

Hardened API

HMAC-signed requests, a 60-per-minute rate limit, device-bound refresh tokens and signature-checked payment webhooks.

Customer apps
React 19 · Vite
Admin
Next.js 16 · 67 pages
API
Express 5 · TypeScript · ~310 endpoints
Data
Prisma · PostgreSQL · 81 models · 49 enums
Payments
Razorpay · RazorpayX · UPI autopay
Integrations
Google Calendar · DigiLocker · Mapbox · Places
Media
ffmpeg video invites · PDF · Cloudflare R2
Reports
17 Excel exports
04

Key decisions

  1. Matching in the database

    Availability, radius and venue rules are one SQL query, so results stay fast and consistent as the catalogue grows.

  2. Money moves on schedules

    Settlement, payouts and reconciliation run as jobs with their own state, so a failed payout is retried, never duplicated.

  3. Prices change by approval

    A new package price waits for an admin and applies only to new bookings, so live orders never change under a customer.