Skip to content
MW.

05MarketplaceFrance · FR/ENPayments

Maries

A French-first wedding marketplace where couples discover providers by category, date, and distance; book schedule-aware slots; and vendors run memberships, reminders, and reviews on Stripe subscriptions.

Visit mariesenunclic.fr
Maries vendor workspace — profile-view analytics, membership plan badge and buyer contact requests
Vendor workspace — analytics, plan status, buyer contacts01 / 03

Overview

Maries connects engaged couples with wedding service providers across France. Couples browse a bilingual catalog, filter by category/date/distance, and book providers whose weekly availability matches; vendors manage bookings, request reminders, collect reviews, and subscribe to membership plans; admins curate categories, featured listings, articles, coupons, and subscriptions.

The problem

Wedding planning in France is fragmented across directories and Instagram DMs. Couples need trustworthy availability-aware discovery; vendors need lead management and predictable income through memberships rather than ad-hoc invoicing.

Context

A live French-market product (mariesenunclic.fr) built bilingual from day one — French default with full English parity — and monetized through vendor subscriptions with trials, referral discounts, and renewal-lifecycle automation.

My role

Full-stack engineer on the Next.js 15 App Router product (~85 pages/layouts) — authentication, payments, geo-search, booking flows, vendor dashboards, and admin tooling.

  • Implemented hybrid auth: custom credential flow issuing httpOnly JWT cookies (bcrypt + jose/jsonwebtoken) plus Google OAuth with Calendar scopes and offline refresh-token rotation
  • Built geo-aware provider discovery on MongoDB: 2dsphere-indexed locations queried via $geoNear combined with $elemMatch schedule filtering for requested weekdays/times
  • Engineered the booking experience — schedule-derived time-slot pickers that disable booked hours, deep-linked Brevo confirmations, status transitions with Pusher notifications
  • Delivered vendor membership billing: Stripe Checkout subscription sessions (monthly/yearly, trials, server-applied referral discounts) with signature-verified webhooks driving plan state, renewal reminders at 30/15/7 days, and payment-failure handling
  • Integrated Google Calendar — listing, adding confirmed events in Europe/Paris timezone, disconnect — behind a connect-on-demand modal
  • Built parallel-route modal gates (email-not-verified, account-disabled, location-missing) and dnd-kit-powered admin ordering for featured providers
  • Wired Brevo transactional templates and SMS, Pusher user-channel notifications, and presigned DigitalOcean Spaces uploads

Architecture & technical decisions

App structure
Next.js 15 App Router with [locale] segment routing (next-intl), route-grouped couple/provider/admin areas, Redux Toolkit with redux-persist, and Tailwind + MUI component systems.
Data layer
Prisma on MongoDB with 20 models (users, couples, providers with weekly schedule JSON, services, bookings, reviews, plans, payments, coupons, notifications) plus raw driver usage for geo-aggregations.
Availability model
Providers store a repeating weekly schedule template; search combines spatial ranking with weekday/time overlap matching, while booking forms compute hour-by-hour availability from existing PENDING/CONFIRMED bookings.
Money flow
Vendor memberships only — Stripe Checkout subscriptions with webhook-driven ServiceProviderPayment lifecycle, expiry states, and coupon credits to referring vendors.

Key features

  • Bilingual marketplace

    French-default UI with complete English catalogs; even taxonomy data (28 wedding categories) carries paired FR/EN labels.

  • Vendor workspace

    Dashboards with profile-view/contact/social-click analytics, buyer contact tables, reminder requests, review requests, and payment-plan management.

  • Couple journey

    Category-driven discovery, favorites, date/time-filtered search, schedule-aware booking modals, histories, and support tickets.

  • Admin curation

    User registration wizard with payment step, subscription oversight, review moderation, article publishing, recommended-provider ordering, coupon management, and third-party account monitoring.

Challenges & solutions

  1. Challenge 01

    Marketplace-grade location search on MongoDB required more than simple field equality — distance plus schedule constraints together.

    Solution — Combined a 2dsphere geospatial index with $geoNear pipelines and $elemMatch filters over the weekly schedule array, returning providers already ranked by proximity and available at the requested times.

  2. Challenge 02

    Subscription state lived partly in Stripe, partly in the app — drift would break member experiences.

    Solution — Made webhooks the source of truth: verified checkout.session.completed, subscription updated/deleted, and invoice.payment_failed events upsert payment records, flip trial states, schedule reminders, and expire lapsed vendors — with a success-page fallback sync.

  3. Challenge 03

    Google Calendar integration needed offline access without trapping users in reconnect loops.

    Solution — Requested calendar scopes at OAuth with refresh-token rotation persisted through the JWT callback, exposing connect/disconnect as first-class actions from booking confirmations.

Outcome & what makes it interesting

Operating marketplace for the French wedding industry with end-to-end vendor monetization, bilingual delivery, and geo-intelligent discovery.

  • Solving availability-aware discovery by pushing schedule logic into the database query itself
  • Subscription lifecycle engineering — trials, referral discounts, renewal nudges, failure recovery — as a first-class product surface
  • Shipping a genuinely bilingual product where even seed data respects the locale contract