South Africa · 2025 · Live

Investment research, delivered securely.

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

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.

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.

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.
Prisma migrations
Version-controlled schema, safe rollbacks, clean deploys.

The intelligence layer.

Claude Sonnet 4.6
Development pair — schema design, NestJS module scaffolding, and audit log query optimization
Cursor
In-editor AI for TypeScript refactoring across Next.js and NestJS codebases

From brief to production.

Week 1 Initial Deployment
Full stack live within days. Admin can upload, clients can download. Auth flow working end to end.
Week 2 Brand & UX Pass
Primaresearch red, real logo, help button, global search. Per-dataset access simplified.
Week 3 Categories & Audit
Replaced hardcoded enum with editable unlimited-depth tree. Audit log now shows client and dataset name, searchable.
Week 4 Preview + Edit Actions
SheetJS-powered 100-row preview added. Edit published datasets, republish archived ones from list or detail views.
Ongoing Domain & Acceptance Testing
Optional migration to portal.primaresearch.co.za pending. Client-side acceptance testing in progress.

What shipped.

R7/mo
Running cost
Domain only. Frontend, backend, database, and storage all on free tiers. Projected to ~R500/mo at scale.
Live
primaportal.dtmetrix.com
Deployed and serving Primaresearch clients through four rounds of feedback.
∞ depth
Dynamic categories
Admins restructure the catalogue without code changes. Six levels deep if they need it.
Auditable
Every action logged
Searchable by client and dataset name. Compliance answered by query, not memory.
"
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.
K
Kieron
Primaresearch

Building something similar?

If your problem lives at the intersection of AI, product, and real business constraints, let's talk.

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.

WhatsApp