← All case studies

Case study

Alberta Food Banks

A Food Safe Handling learning platform for Alberta Food Banks - company access keys, a learner course with a final assessment, and admin tools to manage every partner organization.

Alberta Food Banks logo
Alberta Food Banks redesigned website

Project overview

One course, sold to companies, tracked per learner.

Alberta Food Banks sells Food Safe Handling training to partner organizations. Each company gets a readable access key; when a worker registers with that key, they're automatically attached to their company in the database for later reporting, with no manual account linking required.

The challenge

Selling training to companies, not individuals.

A standard course platform assumes learners sign up on their own. Alberta Food Banks needed the opposite: an admin issues one key per purchasing company, any number of that company's staff can register with it, and every account has to be traceable back to the company that paid for it, without the learner ever entering a company name by hand.

What we did

Company-scoped accounts, built around one key format.

We built a Next.js and Drizzle ORM app on Neon Postgres with a readable enrollment-key format (FBA-XXXX-XXXX, excluding easily-confused characters like 0/O and 1/I). Registration validates the key, checks it isn't revoked or past its use limit, and links the new account to that company in one transaction. Auth is self-built - email and password with a JWT session cookie - deliberately not Supabase Auth, so the database can be swapped without touching the login flow.

What shipped

Beyond the phase-1 plan.

01Full course, not a placeholder

The original scope planned a "coming soon" course card for phase one; the shipped product includes real course modules, a final test, and a post-course survey.

02Admin control over companies and keys

Admins generate and revoke access keys, set usage limits, rename companies, and manage every learner from dedicated admin screens.

03Built-in localization

UI copy runs through next-intl with English as the canonical source and bundled French and Spanish, plus an auto-translate route for additional languages when a translation API key is configured.

04Legacy data import

A dedicated import script and legacy-import report brought over existing learner records instead of starting the company's training history from zero.

The Results

A course platform, not just a landing page.

What launched goes well past the original phase-1 scope: a real course with assessment and survey, an admin analytics view, and a legacy-user import, on top of the original registration and company-key system. The auth and data layers stayed decoupled from any one vendor by design, so the project could move off Supabase onto Neon Postgres without a rewrite.

Discuss your own project