Inspiration
Finance and ops teams lose money every year not because they lack data—but because renewals are scattered across spreadsheets, inboxes, and calendars. A missed SaaS auto-renewal, an overlooked insurance policy, or a vendor contract that slips through can cost thousands overnight.
I built RenewalRadar after seeing how small and mid-size teams manage contracts reactively: chasing dates in Excel, relying on one person’s memory, and discovering problems only after a charge hits. I wanted a system that treats renewals as a first-class workflow—not an afterthought—and I wanted to prove that a serious B2B product can be shipped on Vercel’s zero stack without sacrificing security or scalability.
What it does
RenewalRadar is a multi-tenant B2B platform for tracking contract renewals end to end.
Teams can:
- Manage contracts & vendors — rich CRUD, templates, versioning, custom fields, and vendor directories
- Stay ahead of deadlines — renewal reminders, tasks, Kanban boards, and approval workflows
- Collaborate securely — org-based workspaces, team invites, role-based access, and custom roles
- Operate at enterprise depth — org-wide MFA, SSO (Google & GitHub OIDC), SCIM provisioning, IP allowlists, session policies, device fingerprinting, and audit logs
- Integrate & extend — REST API, webhooks, Google integrations, exports, reports, and e-signature flows
- Run the business — Stripe billing, usage tracking, branding, email templates, and a platform admin console
The bigger the contract and the closer the renewal date, the more urgent it is to act. A $50,000 SaaS renewal due in 7 days deserves more attention than a $500 renewal due in 90 days. RenewalRadar surfaces that priority on the dashboard so finance and ops teams act early—not after the invoice hits.
How I built it
RenewalRadar is a production-oriented app on the Vercel ecosystem:
| Layer | Technology |
|---|---|
| Frontend | Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS |
| Backend | Server Actions, Route Handlers, modular service layer |
| Database | Amazon Aurora PostgreSQL (multi-tenant by org_id) |
| ORM | Drizzle ORM + SQL migrations |
| Auth | Database-backed sessions, bcrypt, TOTP/SMS MFA, OIDC SSO |
| Storage | Vercel Blob for documents and attachments |
| Deploy | Vercel (serverless, edge OG images, cron jobs) |
| Payments | Stripe Checkout & billing portal |
| Email / SMS | SMTP (Nodemailer) + Twilio for MFA and notifications |
Architecture highlights:
- Organization-first tenancy — every business table is scoped by
org_id; RBAC is enforced in the service layer, not only in the UI - Audit-first design — sensitive mutations write immutable audit events with metadata
- Security by default — password policies, lockouts, session expiry, concurrent session controls, and encrypted MFA secrets
- Extensible foundation — contracts, workflows, compliance, and integrations are modular so future features can grow without rewrites
I used vercel dev locally against Aurora IAM auth, deployed to Vercel production, and wired environment-driven config for SSO callbacks, Stripe webhooks, and cron-based reminder processing.
Challenges I ran into
Enterprise auth is harder than it looks
Org-wide MFA, SSO (Google/GitHub), and SCIM each have different edge cases—pending login cookies, encryption key mismatches for TOTP secrets, and making sure MFA cannot be bypassed via trusted-device shortcuts.Session security vs. usability
Device fingerprinting, single-session policies, and inactivity timeouts had to work together without confusing users. I separated storage (fingerprint on sign-in) from enforcement (revoke on browser mismatch) and aligned session listing with inactivity rules.Aurora + Vercel locally and in production
IAM database auth, SSL, and matchingFIELD_ENCRYPTION_KEY/APP_URLacross local and deployed environments caused subtle bugs until I standardized env pulls and documented the full auth flow.RBAC + custom roles across the whole app
Custom roles overlay base roles (admin, manager, editor, viewer). Wiring permissions consistently across server actions, pages, and team management took careful refactoring—not a one-checkbox fix.Real B2B scope vs. hackathon time
I chose depth over a thin demo: billing, compliance retention, platform admin, observability, and SEO—all while keeping the codebase maintainable with Drizzle migrations and typed server actions.
Accomplishments that I'm proud of
- Shipped a deployable B2B SaaS on Vercel—not a static mockup
- Built enterprise-grade security (MFA, SSO, SCIM, IP allowlist, session binding) in a hackathon-scale codebase
- Designed a normalized multi-tenant schema with audit trails, soft deletes, and org-scoped uniqueness
- Delivered end-to-end workflows: contracts → reminders → tasks → approvals → reports
- Implemented modern SEO (sitemap, robots, Open Graph, JSON-LD) for the public marketing funnel
- Kept the stack cohesive on Vercel: Next.js, Blob, cron, edge images, and serverless API routes
What I learned
- Security features need UX clarity — “device fingerprinting” sounds like biometric login; session binding needed clear product language and visible session management
- Server Actions + Drizzle is a strong combo for typed, org-scoped mutations without a separate API boilerplate layer
- Policy toggles must be enforced server-side — IP allowlists, MFA requirements, and session limits only matter when checked on every login and request
- Vercel’s zero stack can carry real products when you pair it with Aurora for transactional data and strict tenancy boundaries
- Documentation and migrations early save pain when the schema grows across auth, billing, compliance, and integrations
What's next for RenewalRadar
- AI-assisted renewal insights — summarize contract terms, flag auto-renew clauses, and recommend renegotiation windows
- Calendar & ERP integrations — deeper Google/Microsoft sync and accounting exports
- Renewal playbooks — templated checklists per contract type (SaaS, insurance, vendor MSAs)
- Mobile-friendly workflows — approvals and reminders on the go
- Analytics dashboard — spend forecasting and renewal risk scoring across the portfolio
- Public API & marketplace — partner integrations for CLM, e-sign, and procurement tools
M goal is simple: help every team answer “What’s renewing, when, for how much, and who owns it?”—before the renewal date, not after the invoice.
Built With
- amazon-aurora
- drizzle-orm
- google-auth
- next.js
- oauth
- postgresql
- react
- rest-api
- scim
- tailwind-css
- typescript
- vercel-blob

Log in or sign up for Devpost to join the conversation.