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.
- Marketplace logic
- Geo matching
- Payments & payouts
- GST invoicing
- Calendar sync
- KYC flows
- Video rendering
- Cron jobs

Product screens with sample data. Names and figures inside the screens are illustrative.
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
What I built
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

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

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.

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.

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.


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.

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.
- 01Event details and dates
- 02Crew matched in one SQL query
- 03Price: windows, commission, travel, GST
- 04Razorpay order
- 05Signed webhook confirms payment
- 06Wallet: pending settlement
- 07Automatic RazorpayX payout

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
Key decisions
Matching in the database
Availability, radius and venue rules are one SQL query, so results stay fast and consistent as the catalogue grows.
Money moves on schedules
Settlement, payouts and reconciliation run as jobs with their own state, so a failed payout is retried, never duplicated.
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.
