
My client, AGS, is a company that produces gaming equipment used in casinos worldwide. The marketing materials and other documents related to their machines was previously scattered across several sites like Wordpress and Dropbox which lacked unison and ease of navigation for their customers. Their ask was a customer portal with a managed user database that centralized these resources while keeping them restricted to the general public. I designed and built the application from scratch to meet their feature requests.
My solution leverages the Auth.js library to configure two separate identity providers: Auth0 for customers and Microsoft Entra ID for employees. User accounts are stored in a Postgres database managed by a Prisma ORM to provide an object-oriented programming layer for interacting with the data.


Registration flow
Customers must register for an account and receive AGS approval before gaining access. The registration flow guides the user through a series of forms to collect their personal and company information.







Portal
The portal’s design is simple and lightweight allowing AGS’s graphics and brand identity to stand out. The page layout utilizes a tile-based grid system which is reused in subsequent pages allowing for reusable components in the frontend. This modular approach creates consistency across the platform and allows for navigation items to be easily added, removed, and reordered to the client’s requests.


Admin
These views show only for internal AGS employees and allow them to manage their customer user base. Customers that register for an account using an allowlisted email are granted immediate access without requiring explicit AGS admin approval.

![A webpage displaying a registration management interface with a black background. The AGS logo appears in the top-left corner, with "[username]" and "Log out" options in the top-right. The page shows "Admin" above the main "Registrations" heading. The interface is divided into three sections: "Pending", "Approved", and "Denied".   Under "Pending" is one registration (with an ID) with an email address and "Deny"/"Approve" buttons. The "Approved" section shows three registrations with different IDs, including an entry with the user's name, all with corresponding email addresses and "Delete account" buttons. The "Denied" section shows "No data found".](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2F8vo2xd83%2Fproduction%2Fe7cf3230fa4388d4ee6a0f0687eb686f014beac2-3024x1890.png&w=3840&q=100)