Ivorie
Backend for a three-sided wedding marketplace: real-time chat, milestone payments, vendor payouts.

- Backend owner
- Pure Billion Technologies
TL;DR
- Designed and owned the backend of a wedding-planning marketplace serving 5k+ users.
- Real-time chat and notifications handling 10k+ messages a day over Socket.IO, with Redis-backed presence and push for offline users.
- Stripe Connect payments: milestone installments, scheduled invoices, and vendor payouts released after funds settle.
- 5k+
- 10k+
Follow a message, follow the money
Couple’s app
Expo · Socket.IO
Chat gateway
PostgreSQL
Redis
Vendor
A couple messages a vendor
The mobile app sends the message over its Socket.IO connection.
The problem
Ivorie is a three-sided marketplace. Couples planning a wedding look for vendors; recently married couples recommend the vendors they used and earn rewards; vendors get booked and paid.
That makes the backend three products at once: a real-time messaging system between all three sides, a payments system that moves money between couples, the platform and vendors, and a fast-moving product that has to keep shipping safely across a mobile app, a web admin and a vendor portal.
Designed and owned the backend architecture across NestJS APIs, an Expo React Native app and a Next.js admin dashboard.
How it works
One monorepo, three apps
A Turborepo holds the NestJS API, the Expo app and the Next.js admin and vendor portal, sharing one Prisma database package and zod-typed contracts, so a schema change is type-checked everywhere at once.
Real-time chat over Socket.IO
The gateway authenticates each socket with a JWT. Redis maps every user session to its live sockets and tracks presence, so delivery works across devices and outside any single process.
Persist, then deliver
A message is written to PostgreSQL first. Online sessions receive it instantly; anyone offline gets an Expo push notification instead, and scheduled jobs send digest emails for messages left unread. Typing indicators and read receipts ride the same socket.
Milestone payments on a schedule
Bookings are paid in milestones. Scheduled, timezone-aware jobs generate Stripe invoices ahead of due dates and send reminder and overdue emails, so nobody chases payments by hand.
Payouts after settlement
Once ACH funds settle, scheduled transfers send each vendor's share to their Stripe Connect account, linked to the original charge, while the platform fee stays with the platform. Recommendation commissions are credited to recently married couples as in-app rewards they can cash out.
The boring infrastructure
Auth0 with role guards for couples, vendors and admins; secrets loaded from AWS SSM; media uploaded straight to S3 through presigned URLs; templated email through SES and SMS through Twilio; and an automated multi-tenant migration system for safe schema and feature rollouts.
Key decisions
Persist the message before delivering it
The database is the conversation's source of truth, so every device and every offline user sees the same history.
Presence and session mapping in Redis
Who is online, and on which sockets, lives outside any one server process, which is what makes push-or-deliver decisions reliable.
Pay vendors from settled funds, linked to the source charge
Bank (ACH) payments take time to settle; transferring only after settlement, and against the original charge, keeps payouts from outrunning the money.
Scheduled jobs for invoices and reminders
Installments, reminders and overdue notices run on the couple's timezone without anyone tracking dates by hand.
Outcomes
- 5k+ users on the marketplace.
- 10k+ messages a day through real-time chat and notifications.
- Three apps (mobile, admin, vendor portal) shipping from one typed monorepo.
- Live: the iOS app is on the App Store, with the web experience and vendor sign-up at planwithivorie.com.
Stack and links
Stack
- NestJS
- Socket.IO
- Redis
- PostgreSQL
- Prisma
- Stripe Connect
- Expo React Native
- Next.js
- AWS