The Problem
Horizon Lab, a testing laboratory with 30+ years of analytical expertise, needed a self-service portal so customers could track their own samples, results, and paperwork instead of chasing status updates by phone or email. Test progress, pricing across multiple testing categories (drinking water, environmental water, agriculture, livestock, pools/spas, hay & forage), support requests, and account management all needed one secure, branded place — with no separate admin call needed just to check whether a sample had come back positive or negative.
The Solution
I built the Horizon Lab customer portal end-to-end on Next.js, TypeScript, and React on the frontend, backed by an ASP.NET Core REST API. Every customer signs in with email/password plus an emailed 6-digit OTP code (with a dedicated first-time-login flow for new accounts), and lands on a dashboard built around their own real data — sample counts, in-progress vs. completed testing, due payments, and result trends — with full light/dark theme support throughout.
Key Features
Results dashboard — live counts (samples, in-progress, completed, new reports, due payments) plus a negative/positive results chart by month and a rolling "monthly breakup" donut, so a customer can see their testing pipeline at a glance without calling in.
Secure two-step login — email/password plus an emailed 6-digit verification code, with a separate first-time-login path for new customer accounts and a forgot-password flow.
Category-based pricing — a searchable pricing page broken out by testing category (drinking water, environmental water, agriculture water, livestock water, pools/spas/hot tubs, hay & forage), each with its own lab code, analysis, sample container, and price table.
Support ticketing — customers can raise, search, and track their own tickets (total/pending/open/closed counts) instead of emailing support directly.
Samples & forms — a dedicated samples section and downloadable forms library alongside account settings, so the whole customer relationship — from submitting a sample to paying an invoice — lives in one portal.
Technical Highlights
The frontend is a Next.js/TypeScript/React app talking to an ASP.NET Core REST API, with the two-factor email-OTP login flow and full dark-mode theming built in from the start rather than retrofitted. Dashboards and pricing tables are data-driven off the same API that powers the lab's own sample-tracking systems, so a result status shown to the customer reflects what the lab's internal system actually has on record.
Results
Horizon Lab customers can now check sample status, results trends, pricing, and support tickets themselves, 24/7, instead of relying on phone or email — cutting the "where's my result" back-and-forth that a testing lab with a 30+ year client base otherwise has to handle manually.
FAQ
How does a customer log into the Horizon Lab portal securely?
Login uses email and password plus a 6-digit one-time code emailed at sign-in, with a separate guided flow for a customer's very first login and a standard forgot-password path if they get locked out.
Can customers see pricing before submitting a sample?
Yes — the portal has a searchable pricing page broken out by testing category (drinking water, environmental water, agriculture, livestock, pools/spas, hay & forage), each showing its own lab code, analysis type, required sample container, and price.
How do customers know when their results are ready, instead of calling the lab?
The dashboard shows live counts of samples in progress vs. completed, plus new reports and due payments, along with a results trend chart — so a customer checks the portal instead of phoning in to ask whether a sample has come back yet.
What happens if a customer has a question that isn't answered on the dashboard?
They can raise a support ticket directly through the portal and track its status (pending, open, closed) themselves, rather than relying on email back-and-forth with no visibility into where their request stands.
Does the portal reflect the lab's actual internal testing status, or just a copy of it?
The dashboards and results are driven by the same backend data the lab's own internal sample-tracking system uses, so what a customer sees in the portal reflects the lab's real, current record — not a delayed or separately maintained copy.





