Primaresearch was distributing paid datasets by email — no version history, no audit trail, no way for clients to preview a file before downloading. We built a B2B data portal where admins publish, clients preview, and every action is logged.
100
Row preview before download
R7 /mo
Total infrastructure cost
∞
Nested category depth
TOTP
MFA on every account
The Problem
Primaresearch sells investment-grade market datasets — retail, financial services, mining, telecommunications — to paying clients in South Africa and beyond. The product is the data. The business is trust.
But distribution was manual. Email attachments. No version history. No audit log. Compliance was a spreadsheet exchanged over Slack. Clients had no way to preview a dataset before downloading it and calling back to say "wrong file."
The team needed a self-serve portal where authorised clients could browse the catalogue by category, preview a dataset before downloading, and pull the full file via a secure link. Admins needed to upload new versions without touching code, restructure the category tree without a developer, and answer audit questions with a searchable log — not a memory.
The infrastructure budget was ~R500/month at scale, single digits early on. That's not a nice-to-have. That's the brief.
Our Solution
Frontend: Next.js 14 on Vercel for the global CDN. Backend: NestJS on Railway in the Singapore region to sit close to the Mumbai Supabase instance. Latency stays under 40ms for the South African client base without paying for a dedicated region.
Database: Supabase Postgres via Prisma ORM. Storage: Supabase Storage, files served through presigned URLs. Auth: JWT with hashed refresh tokens and TOTP MFA on every account — no exceptions, no "we'll add it later."
The trick that made the product feel professional: SheetJS renders the first 100 rows of any XLSX or CSV inline. Clients confirm the file structure before spending a download. Full files come through Supabase Storage presigned URLs, valid for a few minutes.
The category tree started as a hardcoded enum. Round three of client feedback flipped it: an editable, unlimited-depth tree that admins manage themselves. Retail → Clothing → Premium → Q4 2025 Sales, six levels deep if needed. No developer required.
Every action — upload, edit, archive, download — audit-logged and searchable by client and dataset. Auditors get answers, not stories.
The Stack
What we built it with.
Frontend
Next.js 14
App Router for the portal, server components for landing pages.
Vercel
Free-tier CDN with edge caching — sub-second load times globally.
SheetJS
Client-side XLSX and CSV rendering for the 100-row preview.
Backend
NestJS
Structured API with dependency injection — clean separation of auth, files, and audit modules.
Railway (Singapore region)
Type-safe queries, migration control, no raw SQL sprawl.
Data & Auth
Supabase Postgres (Mumbai)
Managed Postgres with free tier and easy row-level auth.
Supabase Storage
Presigned URLs for full-file downloads. Files never touch our API.
JWT + TOTP MFA
Access tokens plus mandatory TOTP for every account.
Resend
Transactional email for invites and download receipts.
We went from sending files by email to running a real product. Clients see the catalogue, preview the data, download what they need. Our compliance officer stopped asking me questions — she just searches the audit log.
Trusted Worldwide — Long-Term Partnerships Built on Trust and Results
Take it from leading businesses around the world. Time and time again, our clients experience the quality, speed,
and reliability of our AI solutions and automation services, leading to long-term partnerships with AXCEL.
Ready to Automate and Scale Your Business?
We design and deploy AI solutions that streamline operations and accelerate growth.