Work · 04 of 9

CampusCritique

College discovery platform I co-founded. I own payments, notifications and admissions automation

Role
Co-founder; Connect payments and infra, notification layer, admissions automation, initial UI
Team
Nimit Jain, Ved Kumar Singh
Period
Apr 2026 to present
Status
production
Stack
  • Next.js 16
  • React 19
  • Supabase
  • PostgreSQL
  • Row-Level Security
  • Cashfree
  • QStash
  • Resend
  • Firebase
  • Vercel
Links
www.campuscritique.in
campuscritique.in, home, captured 2026-09-15
campuscritique.in, home. Captured from the live site on 2026-09-15.

Measured

MetricValueWindowSource
Users since launch, 18K events, launch June 20261.1KJun to Sep 2026Google Analytics 4, 14 Sep 2026
Paid sessions completed, 0 refunds needed, 2 reschedules handled15 of 15lifetimeconnect_sessions, Supabase, 14 Sep 2026
Organic search share, 46 organic vs 12 direct sessions53%last 7 daysGoogle Analytics 4, 14 Sep 2026
Mentors onboarded13lifetimementor_profiles, Supabase, 14 Sep 2026

Problem

Students choosing one of India’s new-age tech colleges get marketing from the college and rumours from YouTube. CampusCritique puts verified student reviews, structured college data, side-by-side compare and a community in one place, and Connect lets a prospective student book a paid one-to-one video call with a verified senior. Three of us co-founded it in April 2026; I am “Founder C” in the team’s docs, which meant payments, notifications, admissions automation and the initial UI.

Connect: a booking that has to survive the real world

gatewayBooking pageslot hold, 1 h cutoffcreate-orderCashfree orderpayment-webhooksignature, idempotencySupabaseconnect_sessions, RLSNotifybooked, reminder, refundQStash crons2 schedules, 576 runs aday
Every side effect leaves the request path. The webhook does the minimum and returns.

A booking holds a slot, creates a gateway order, and confirms only when the webhook arrives. Webhooks arrive twice, out of order, and sometimes for refunds rather than payments, so the route verifies the signature, derives an idempotency key from the gateway’s event id (falling back to a hash of the body), and guards refund updates with an already-processed check. Reschedules are a one-time, one-hour-rule flow with their own table. Reminders fire once, two hours before, after the 24-hour and 10-minute variants proved noisy. All of it emits events to Notify rather than sending anything itself.

Before and after

BeforeAfter
GatewayRazorpay, refund policy did not fit their complianceCashfree, with a reschedule-first refund policy the gateway accepts
15 June incidentA refund guard routed every payment webhook to the refund handlerOne-line fix, then three follow-ups the same day: phone fallback, refund-guard race, confirmation atomicity
CronsSeveral Vercel schedules, some overlappingTwo QStash schedules, 576 runs a day, idempotent
NotificationsEmail calls inside API routesEvents to Notify: 1,346 jobs delivered at 98.1%
Privileged writesBrowser calling SECURITY DEFINER functionsAuthenticated API routes calling a private schema through a least-privilege role

Numbers, honestly

Thirteen verified mentors, 43 sessions created, 15 paid and all 15 completed, two reschedules handled, zero refunds needed. 1.1K users and 18K events since the June launch, with organic search now the largest channel at 53% of sessions. Small, real, and every paid session completed. Gross merchandise value is tiny at test-phase pricing and is not a number worth headlining.

Also mine

Admission-date automation and alerts, compare data and college alerts, the initial UI and first pages, the migration of every runtime image to Supabase Storage, and the Connect end-to-end audit and release QA checklists.

Learned: Idempotent webhooks or nothing: gateways retry, out of order, at 2am.

keysKeyboard
j / k
next / previous row
Enter
open the focused row
⌘K or /
search, or ask this site
g then h w a c
go home, work, about, contact
t
toggle light and dark
Esc
close the palette or this map
?
this map