Inspiration
Every year, businesses lose thousands of dollars to auto-renewed contracts they forgot about. A missed cancellation window on a $50K SaaS license can blow an entire quarter's budget. We saw this happen repeatedly in B2B teams juggling dozens of vendor relationships — and realized there was no simple, intelligent tool to solve it.
ContractPulse was born from a simple question: What if your contracts could tell you when they need attention?
What it does
ContractPulse is a contract renewal intelligence platform that:
- Parses contracts with AI — Upload a PDF and Amazon Textract automatically extracts key terms (renewal dates, notice periods, payment terms, liability clauses)
- Scores risk automatically — Contracts are flagged as high/medium/low risk based on value, auto-renewal status, and time remaining
- Sends smart alerts — A daily cron job checks for contracts expiring in 30, 60, or 90 days and notifies the right people
- Visualizes spend — Dashboard with vendor spend analytics to identify cost-saving opportunities
- Supports multi-tenancy — Org-scoped data with role-based access for teams
How we built it
We chose a production-grade stack from day one:
- Frontend: Next.js 14 with App Router, React Server Components, Tailwind CSS, and shadcn/ui for a polished, accessible UI
- Database: Amazon Aurora PostgreSQL (Serverless v2) — scales to near-zero during inactivity while providing enterprise reliability
- ORM: Prisma for type-safe database access and easy migrations
- AI: Amazon Textract's AnalyzeDocument API to extract structured data from contract PDFs
- File Storage: Vercel Blob for contract document storage
- Auth: NextAuth.js with JWT sessions and middleware-based route protection
- Deployment: Vercel with automatic CI/CD from GitHub
- Alerts: Vercel Cron Jobs running daily to check renewal windows
The architecture follows a clear separation: Vercel handles compute and edge delivery, AWS handles data persistence and AI processing.
Challenges we faced
- Prisma on Vercel — Vercel's dependency caching meant Prisma Client wasn't regenerated on deploy. Solved by adding
prisma generateto the build script. - Special characters in database URLs — Aurora's generated passwords contain characters that break URL parsing. Had to URL-encode the connection string.
- Multi-tenancy scoping — Ensuring every query is scoped to the user's organization required threading session context through server components and API routes.
- Textract term extraction — Raw Textract output is unstructured blocks of text. We built a keyword-matching parser to identify relevant contract clauses with confidence scores.
What we learned
- Aurora Serverless v2 is genuinely impressive for startups — you get enterprise PostgreSQL that costs almost nothing at low traffic
- Next.js App Router with Server Components eliminates most of the client/server data-fetching complexity
- Prisma + Aurora is a powerful combination for rapid prototyping that doesn't sacrifice production readiness
- Building for multi-tenancy from day one saves massive refactoring later
What's next
- Email delivery via Amazon SES for real alert notifications
- Slack integration for team notifications
- Contract comparison (diff two versions)
- Bulk upload and batch Textract processing
- Team collaboration features (comments, approvals, workflows)
Built With
- amazon-aurora-postgresql
- amazon-textract
- next.js
- nextauth.js
- prisma
- react
- shadcn/ui
- tailwind-css
- typescript
- vercel
- vercel-blob
Log in or sign up for Devpost to join the conversation.