FLOW LGX · PROBLEM SOLVED · JANUARY 2026
Flow LGX ended up with nine user roles, each with its own menu, pages and permissions. Building nine separate apps would have been slow and inconsistent; building one app risked users seeing screens they should not. This is how we kept one layout and still kept every role in its lane.
Month by month, how a logistics platform for a Toronto client went from a simple brief to a live, multi-company SaaS product.
Nine kinds of users share one product, but none of them can open pages meant for someone else. Access is checked at several levels, and the server always has the final say.
A super admin, an admin, warehouse staff, a dispatcher, a distributor, a direct customer, a customer, a vendor and a driver all sign in to the same product. Hiding menu items is not security: anyone can type an address into the browser. We needed every route to refuse the wrong user, without duplicating the layout or the navigation nine times.
Access is checked in layers, from broad to specific:
Every role has a code, a numeric id from the server, a display name and a home path. All four live in one file. Routes, menus, redirects after sign-in and permission checks all read from it. When new roles arrived during the move to SaaS, adding them was a matter of extending that file and the route table — not hunting through the codebase.
Nine roles share one consistent product. Typing a forbidden address leads to a clear unauthorised page, limited staff see only their tools, and design changes to the layout reach every role at once.
Hide what users cannot do, but enforce it somewhere they cannot reach. Menus are for convenience; routes and the API are for security.