Client Quotation Portal
Sending quotations as email attachments makes it hard to know which version a client saw and whether they accepted it. For VITE SEO Digital Advertising, the agency I founded and have since closed, I built a private portal where clients sign in with a one-time code to view, accept or reject quotations and download them as PDFs, with an admin side for clients, quotes, access codes and sessions. It shipped with audit logs and 174 automated tests.
- When
- February 2026
- Role
- Built the portal
- Status
- Private client portal (the agency has closed)
- Stack
- Next.js, Prisma, PostgreSQL, Redis, Playwright
The problem
Quotations need to reach the right person, stay private, and leave a clear record of what was accepted or rejected. Email attachments do none of that well.
[Uriel to add: what the quotation process looked like before the portal]
What we built
- Client side: clients sign in with a one-time code, then view, accept or reject quotations and download them as PDFs.
- Admin side: management of clients, quotes, access codes and sessions, with Clerk for admin sign-in.
- Security: access codes hashed with Argon2, Redis rate limiting, and audit logs.
- PDFs: quotations rendered to PDF with Playwright.
Stack and why
- Application: Next.js 14.
- Data: Prisma on PostgreSQL.
- Admin sign-in: Clerk.
- Rate limiting: Redis.
- PDF rendering: Playwright.
[Uriel to add: why this stack]
Results
- 174 automated tests.
- One private place for clients to review, accept or reject quotations.
- Audit logs that record what happened to each quotation.
Want to work together? Get in touch.