Skip to content
← Work
ERP

Sportswear ERP

An ERP for a sportswear company: from supplier purchases to sales rep commissions.

  • JavaScript
  • Vite
  • Firebase
  • Chart.js

A web ERP for a company that buys and sells sportswear through several channels, with sales reps on commission. Nine modules — dashboard, inventory, purchasing, sales, customers, cash flow, sales reps, suppliers and settings — on Firebase, with no UI framework. When we came in, another developer had already started a first version, and they kept contributing alongside us. Our part is the full redesign, the commissions, the real net margin on every sale, lot splitting and the mobile version. The client is confidential: the screenshots come from a copy of the ERP loaded with a year of demo data. The teams on the shirts are real; the company, customers, sales reps, sales and amounts are made up.

The nine modules

  • Dashboard
  • Inventory
  • Purchasing
  • Sales
  • Customers
  • Cash flow
  • Sales reps
  • Suppliers
  • Settings

Confidential client

How a sale flows

  1. 01Purchase
  2. 02Lot in stock
  3. 03Sale with its margin
  4. 04Sales rep's commission

What we added

  • Full redesign
  • Commissions and settlement
  • Real net margin
  • Lot splitting
  • Mobile version

And you can try it, too

The client is confidential. The demo isn't.

A management dashboard with made-up data: search, filter, open a record and change its status. That's what it's like to work with something we've built.

Try the demo

What was already there and what we added

The basics of the flow were already there when we arrived: a purchase added the units to inventory, the sales search only offered what was in stock or reserved, and deleting a sale put the items back in stock. On top of that we added the “awaiting delivery” status, for stock that has been bought but hasn't arrived yet; editing a sale, which puts the items back in stock and takes them off again; and the channel commission, shipping costs and net margin, worked out live while the sale is being filled in. If the sale has a sales rep, it generates their commission, which is redone or disappears along with the sale. And when an item leaves “reserved”, the reservation details clear themselves.

Two commissions that don't get mixed up

There are two different commissions and the system keeps them apart on purpose. The channel's — the platform the item is sold through — comes from the percentage stored on that channel and does come off the sale's margin. The sales rep's comes from their own percentage and doesn't touch the margin: it's recorded separately, as a document with its own status. It's created as pending with the sale, redone if the sale is edited and removed if the sale is deleted. Settling it doesn't delete it: it's marked as paid and dated. Deactivating a sales rep takes them out of the sales picker without deleting their sales or their commissions.

Lots that split and sales that repair themselves

In the inventory, a row is a lot with a quantity, not a single item. Reserving or selling fewer units than it holds splits the lot in two: the original keeps what's left and a new one is created with only what moves, so a reserved item and one in stock never share a row. The sale stores the exact lot it touched, along with a copy of where it came from and its prices. That makes the second thing possible: if an old sale points to a lot that no longer exists — because the purchase it came from was deleted — editing or deleting it doesn't throw an error; the system recreates those units in stock from the data the sale itself kept. And when a purchase is entered, two identical lines merge by themselves, unless the price differs: the same product at another price is another lot.

Mobile, filters and the dashboard

The whole ERP works on a phone. Below 640 pixels the list tables turn into cards without a line of JavaScript: each cell carries its label and the CSS paints it in front of the value, so the lists have no sideways scrolling. The inventory combines eight multi-select filters and a search across sixteen fields, and each filter's dropdown sits above the table so the scroll doesn't cut it off. The home dashboard already flagged low stock and items with no price or no photo; we added a warning for items that haven't moved in over ninety days. And dark mode isn't a second stylesheet but thirty-five redefined variables, set before the interface loads.

Details

  • Real net margin on every sale

    The channel commission and shipping costs come off at the point of sale, and the margin is worked out live as the sale is filled in.

  • Commissions through to settlement

    Each commission is created as pending with its sale and redone if the sale changes; settling it marks it as paid and dated instead of deleting it.

  • Lots that split themselves

    Reserving or selling part of a lot creates another with those units, so two different statuses never share a row.

  • Old sales that don't break

    If a sale's lot no longer exists, editing or deleting it recreates those units in stock from the data the sale kept.

  • Lists that become cards on a phone

    Below 640 pixels each row in the lists becomes a card and each value carries its label, with no JavaScript and no sideways scrolling.

Working on something similar?

If you need something like this — a landing page, a website, an ERP or a tool you can't find off the shelf — tell us about it and we'll come back with how we'd do it, how long it would take and what it would cost.

Tell us about your project

Email copied

Keyboard shortcuts

H
Home
S
Services
W
Work
A
About us
C
Contact
E
Email us
?
This help
Esc
Close