Role
Individual Project - University Dissertation
Stack
Next.js · React · TypeScript · Tailwind CSS · HeroUI · MongoDB · Prisma · NextAuth.js · pdfme · QStash · Vercel Blob · Playwright
The problem
Companies send a lot of important messages to customers, such as bills, renewal notices and policy documents. Many older Customer Communications Management (CCM) platforms are powerful, but hard to use. Even a small template change can take weeks, because it needs a specialist technical team. This creates an IT bottleneck.
The idea
UniComm is a low-code CCM platform that gives business users control over their own communications, while keeping the security, governance and scale that larger organisations need. I built it solo, end to end, from a real industry Product Requirements Document.

Key features
- Drag-and-drop Template Builder - design PDF templates in the browser, with live preview.
- Customer variables - insert fields such as name or policy number straight into text.
- Reusable content blocks - build a header or footer once and reuse it everywhere.
- Versioning and approvals - every published template is kept, with an approval step.
- Customer data management - multiple customer lists, CSV import and bulk editing.
- Campaigns - a five-step wizard to send now or on a schedule.
- Analytics dashboard - documents generated, campaign funnels and items that need attention.



Technical highlights
- Database-per-tenant architecture - each business gets its own database. Every request is routed to the right one at runtime, with cached connections and a custom tool that updates all databases safely.
- Custom rich-text engine - styles are stored as character ranges, and an index map tracks where each placeholder lands after customer data is filled in.
- Custom pdfme plugins - for variable text, rich-text styling and nested blocks that scale proportionally to any size.
- SHA-256 template versioning - published templates are immutable, and each version is identified by a hash of its content.
- Chunked serverless batch engine - large campaigns are split into chunks of 250 customers and chained through QStash, then merged into one ZIP file.
- Scheduled runs - a one-minute heartbeat processes up to 10 businesses in parallel.
- Stack - Next.js, React, TypeScript, MongoDB, Prisma, NextAuth.js, pdfme, QStash and Vercel Blob.
Impact
- No IT bottleneck - business users can create and update documents themselves.
- Consistent, personal documents - formatting stays correct for every customer, and one block change updates every template.
- Reliable audit trail - old campaigns always point to the exact document they sent, and duplicate versions are never stored.
- Strong data isolation - one company can never see another company's data, even if a query has a bug.
- Scales to thousands of documents - per-document speed stayed steady from 50 to 5,000 customers.
| Result | Value |
|---|
| Single PDF, median time | 1.60 s |
| Batch, 50 to 5,000 customers | ~450-500 ms per document |
| Real Experience Score (desktop and mobile) | 100 / 100 |
| Tenant isolation (black-box security tests) | Passed |
Tested with white-box unit tests, black-box API security tests and Playwright end-to-end tests.
Possible Future works
- Email, SMS and push notifications, with fallback rules.
- A persistent job queue with retries.
- Deeper campaign analytics.
- AI assistance for writing templates and setting up campaigns.
Links