westrow food group logo

One platform to run the whole brokerage

Westrow brokers perishable food into every major Canadian retailer. We rebuilt the system that connects their client, their retail customers, and every product spec in between, retiring a legacy database and a wall of spreadsheets for a single source of truth.

westrow-logo
Industry
Food Brokerage
Type
Internal Platform
ICP
Business Owner
Roles
Admin, Super Admin
Timeline
~3 Months
Stack
Next.js, NestJS, React, TypeScript, Tailwind, Shadcn, PostgreSQL, Docker, Nginx, Jenkins, Swagger, Zod
Tell us what you're building

One platform now connects 135 clients, 165 retail customers, and every product spec in between — entered once, accurate everywhere.

135Clients represented
165retail customers
Coast to coastnational coverage
~3 monthbuild + data migration
Westrow clients directory screen on a laptop standing on a concrete pedestal
The problem

Brokering perishables isn't a sales problem.It's a detail problem.

Westrow sits between food Clients and Canada's largest retailers. Every product carries dozens of moving details: case pack, package size, barcodes, compliance memberships, sales terms, lead times by province, ship to depots. That detail lived split across a legacy MySQL system and a wall of spreadsheets, re keyed by hand at every handoff. A stale or dropped detail isn't a typo here. It's a rejected order, a compliance gap, or margin quietly leaking.

Three pain points

[01]

Detail split

across a legacy DB and spreadsheets, re keyed at every handoff

[02]

No single source of truth

for any client, customer or item

[03]

Errors surface downstream

rejected orders, compliance gaps, margin leak

The design

The decision that shaped everything: model the relationship, not the paperwork

We didn't digitise the old forms. We modelled the business the way it actually runs. Three connected records: the Clients Westrow represents (clients), the retailers they sell into (customers), and the items that link the two, each carrying its own packaging, codes and ship to detail. Onboard a client once, and every customer, item and sales term hangs off that one record. Enter a detail once and it's right everywhere.

Development

Inside the build — what the demo doesn't show

A clean platform from scratch was the easy half. Built ground up on a new stack with no existing codebase to lean on. The real work was getting fifteen plus years of legacy data, much of it free typed and inconsistent, to land cleanly in a normalised system without losing a record.

Migration pipeline

  1. [01]

    Extract

    (pull from legacy MySQL)

  2. [02]

    Clean

    (normalise phones, postal codes, free text)

  3. [03]

    Transform

    (map to PostgreSQL schema)

  4. [04]

    Load

    (with exception capture)

  5. [05]

    Audit

    (exported exception reports)

  6. [06]

    Re runnable

    (safely reprocess failures)

The unforeseen challenge

Migrating MySQL to PostgreSQL was the hard part. Legacy data was inconsistent and free typed: invalid phone numbers and postal codes, mixed values in single fields, non standard quantities like "1 pail" or "6x2", missing or duplicate identifiers. We built a custom ETL and data cleaning layer plus an exception reporting system to track and fix every failed record. A production incident on the first deployment reshaped the migration strategy and made it far more robust.

What we said no to

We kept scope deliberately tight.

  • No EDI integration with retailers (just an "EDI capable" flag),
  • English only for now (no EN/FR), and
  • a single shared environment with role based access instead of full multi tenancy.

Where preserving the legacy mess fought clean data, we chose normalisation.

The hardest thing to validate (QA)

Migration correctness. Data this inconsistent broke automated checks, so we leaned on custom audit reports of exported exceptions, manual verification of edge cases, and re runnable scripts. The second front was safe production deployment of the migration steps: health checks and rollback readiness validated before every cut over.

Data Migration
Delivery

What Westrow can now do

Run the whole brokerage from one place. Every Client, retailer and item lives in a single record, entered once, accurate everywhere. New clients onboard through one structured flow instead of a spreadsheet relay. The legacy system and the side spreadsheets are retired.

Early signal

The legacy plus spreadsheet patchwork retired in a single migration. Onboarding, customer ship tos and item specs now live in one structured system the team works in daily. Outcome KPIs are still maturing. The signal so far is operational: one source of truth, in real use.

Image 2

Read more case studies

Two Sided Platform
IVY Estate Agency project wordmark, highlighted color card logo

Built for a business where discretion is the product

A high end household and estate staffing agency was running its pipeline across spreadsheets, email, and WhatsApp. We replaced it with a two sided, stage gated platform where each side sees only the view it needs.

Read Case Study
See All Case Studies

Still running your operation on a legacy system and spreadsheets?

Tell us what you're building