Case Study · Matrimony Platform

JainWeddings — matchmaking with the kundli built in.

A matrimony platform open to every Jain community, where each match carries a real 36-point Guna Milan score. We built the Vedic astrology engine ourselves — from ephemeris data, not a paid API — so compatibility is a search filter, not an afterthought.

JainWeddings platform — member web app and admin moderation console built by OET
Client
JainWeddings
Scope
Member PWA, API & admin console
Core build
Next.js 16 · Node · MySQL
Standout
In-house Vedic matching engine
The Brief

A Jain portal that parents could actually use.

General matrimony sites are broad by design, and community-specific ones are usually narrow to a single sect. JainWeddings sits between the two: open to every Jain community, with sect, sub-community and gotra recorded on every profile so families can filter the way they actually think — and with a kundli match included rather than sold as a paid add-on.

The second constraint shaped everything else. A large share of profiles are created by parents and relatives rather than the candidate — often people in their fifties and sixties who are not comfortable with dense web apps. The register form's first question is literally “Who is filling this profile?”

So the interface was built to a stricter accessibility bar than a typical consumer site: minimum 44px touch targets, 52–56px primary buttons, 16.5px form inputs, real labels bound to every field, and plain-language copy throughout.

The design rule: if a 55-year-old parent can't complete the profile wizard on a mid-range Android phone without help, the screen isn't finished.

The Hard Part

We wrote the astrology engine ourselves.

Kundli matching is usually outsourced to a third-party API billed per request. That makes it slow, costly at scale, and impossible to filter a search by. We computed it in-house instead.

36-point Ashtakoot Guna Milan

Full eight-koota scoring computed from planetary positions at birth, with the complete breakdown shown on every profile — not just a total out of 36.

Mangal Dosh detection

Manglik status derived from Mars placement, then exposed as a search filter defaulting to like-for-like — the way families actually shortlist.

Nadi Dosha, computed properly

A dedicated ephemeris layer resolves Moon, Mars, Venus and Jupiter positions and the ascendant, so Nadi and the related doshas are derived from the chart rather than looked up from a table.

Birth place, resolved properly

Worldwide geocoding with the IANA timezone resolved at the date of birth — because a 1968 birth in India needs 1968's offset, not today's.

Compatibility as a filter

Because scores are precomputed at profile-save time, members filter directly on minimum guna, Nadi dosha and Bhakoot dosha — live, in the search itself.

Two-stage search

SQL narrows the pool first, then scoring runs in memory over the shortlist — keeping an astrological search fast enough to feel instant.

“Not provided” is a real state

Members without a recorded birth time are never scored zero and never silently dropped from results. Unknown is displayed as unknown — the detail the whole feature rests on.

Trust By Construction

Nobody browses until they've cleared every gate.

Onboarding is deliberately linear. Each stage must complete before the next unlocks, and the API — not the browser — decides where a member currently stands.

Register

Account created, with the relationship of whoever is filling the profile recorded up front.

Build profile

A seven-step wizard: basics, birth details, community, education, career, family and photos.

Pay membership

A single lifetime fee via Razorpay — no tiers, no renewals, no recurring surprises.

Admin review

A human moderator approves the profile and each photo before anything becomes visible.

Browse & match

Only now do search, interests and shortlists unlock — enforced server-side on every call.

Privacy

Photos and phone numbers stay closed until both sides agree.

A member can upload up to six photos. Only the primary one is public — the rest stay locked until an interest has been sent and accepted. Contact details work the same way. Nothing is exchanged on one party's say-so.

Payment trust is enforced the same way. Razorpay signatures are verified server-side with HMAC and reconciled through an idempotent webhook, so a membership can never be unlocked by a tampered client-side callback or double-credited by a retried webhook.

Members can report or block any profile, and both actions land in the moderation queue rather than a mailbox.

Behind The Curtain

A 19-screen console, because moderation is the product.

On a community platform, the admin tooling isn't back-office overhead — it's what makes “every profile verified” a promise the operator can actually keep.

Approval & photo queues

Profiles and images reviewed separately, with soft delete and a restorable trash so a wrong call is never permanent.

Payments & coupons

Razorpay reconciliation, discount coupons, offline payment entry for members who pay in person, and CSV exports.

Multi-channel notifications

Email, SMS and WhatsApp campaigns with reusable templates — because this audience reads WhatsApp, not inboxes.

Scheduled background jobs

Membership expiry reminders, notification retries and trash purging run on a DB-claimed scheduler, safe to run on more than one instance.

Reports & monitoring

Revenue, growth, profile-completeness and anomaly reports, plus a live health view and a full audit log of admin actions.

Separated admin identity

Admins live in their own table with their own token audience and super-admin / moderator roles, so a member token can never reach an admin route.

The Biodata Problem

Every Jain family already has a biodata. Most of them are a Word file.

Before a profile ever reaches a matrimony site, families circulate a biodata — a one-page sheet with the candidate's details, family, gotra and horoscope, sent around on WhatsApp. They are almost always built by hand in Word, and it shows.

So the platform builds one for you. The details already on the profile are laid into a designed sheet — a choice of ornamented templates with borders, floral work and traditional motifs — with the kundli chart rendered from the same birth data that drives the matching engine.

The output is a shareable link and a print-ready page, so the sheet that goes round the family is the same record the site holds. A watermarked preview lets someone see the result before they commit.

Why it matters: the biodata is the artefact families actually pass around. Owning it means the profile travels with the platform rather than away from it.

Craft

The details nobody asks for, and everybody notices.

Autocomplete that knows your college. Education fields are backed by a dataset of roughly 80,000 institutions across 201 countries, matched through a multi-pass fuzzy and acronym search — so typing “MNIT” finds the right college instead of returning nothing.

Money as integers. Amounts are stored in paise, never floats. A membership fee should never drift by a rounding error.

Honest search results. When the candidate pool is truncated for performance, the API says so explicitly rather than quietly presenting a partial list as complete.

Installable on the home screen. The member app is a PWA with an offline fallback — members typically arrive through a WhatsApp link, and installing it means never having to find that link again.

One source of truth for state. Every auth response returns exactly where the member stands in onboarding, so the interface can never disagree with the server about what happens next.

The Stack

What it's built on

Member App

  • Next.js 16 (App Router)
  • React 19 · TypeScript
  • Tailwind CSS v4
  • TanStack Query
  • PWA + service worker
  • Biodata sheet renderer
  • Razorpay Checkout

API & Data

  • Node.js · Express
  • MySQL via Knex migrations
  • JWT + bcrypt auth
  • Zod validation
  • Helmet, CORS, rate limiting
  • Custom Vedic astronomy engine
  • Hindi / English interface

Admin & Infra

  • React + Vite SPA
  • React Router · React Hook Form
  • Razorpay orders & webhooks
  • Cloudflare R2 for video
  • Sharp image pipeline
  • SMTP, SMS & WhatsApp Cloud API
Next.js React TypeScript Node.js MySQL Razorpay Cloudflare R2 PWA

Building a platform for a community you know well?

Niche platforms live or die on the domain details — the ones a generic template can't hold. That's the part we like most.

Start a conversation → See more work