Three Eras of Sourcing
A buyer had to re-quote parts they had just quoted, because nothing in the platform connected what a BOM contained to what it had already cost. Sourcing is the module we built to close that gap, and then spent two more years teaching to hold still.
- CLIENT
- Supplyframe · DSI
- YEAR
- 2023–present
- ROLE
- Design Lead, Sourcing
- DURATION
- Three eras, ongoing
- TEAM
- Directed designers on parallel tracks
- STACK
- Figma · Fragments DS · DSI Platform
The Situation We Walked Into
DSI (Design-to-Source Intelligence) is Supplyframe's enterprise platform for taking a product from design through to procurement. It had strong BOM (Bill of Materials) tools. It had a robust RFQ (Request for Quote) flow that suppliers actually used. It had nothing that connected them.
So buyers ran a fresh RFQ for every new project, even when the same supplier had quoted the same part a month earlier. Suppliers got fatigued. Response rates dropped. Buyers got worse pricing on the quotes that did come back.
Three signals landed on the same gap at once. Customer interviews kept surfacing the same sentence: “I just quoted this part, why am I quoting it again.” Sales calls were closing slower against incumbents whose pitch was continuity. And support tickets showed buyers exporting BOMs to Excel so they could hand-layer last year's contract price in before sending anything out.
A PM gave it the framing that made it actionable: suppliers were fatiguing. Every project triggered a fresh round of requests even when nothing about the part or the relationship had changed. DSI already held the data to prevent that. It just had no workflow that put the data in front of a buyer at the moment they were about to ask for it again.
Every project triggered a fresh RFQ. The same supplier kept getting hit.
Result: supplier fatigue. Slower responses. Lower-quality quotes. Buyers spent more time chasing replies than making decisions.
The Box We Had to Work Inside
- 01ONE PRODUCT, IN A NAV NO TWO CUSTOMERS SHARE
DSI's navigation is licence-composed. Every module is gated per organization, so one customer sees BOM Insight, Sourcing and Quoting, and another sees Sourcing and almost nothing else. Whatever we shipped had to make sense as the second item in a full suite and as the front door for a customer who bought only this. No bespoke chrome, no parallel information architecture, no assumption about what sits beside it.
- 02RFQ STAYS ITS OWN APPLICATION
The hardest one to hold. The original concept folded RFQ into a general-purpose project shell, which flattened exactly the things that make RFQ good: supplier-side workflow, response handling, awarding, negotiation. RFQ keeps all of it. Sourcing does not replace it and does not wrap it.
- 03TWO CUSTOMER TYPES, ONE PRODUCT
OEM procurement teams cost parts to make internal buying decisions. EMS customers cost the same parts in order to quote those costs back to their own customers and win the build. Same surface, opposite direction of travel: one is deciding what to pay, the other is deciding what to charge. The design had to serve both without forking.
- 04HOLD THE SPINE ACROSS THREE ERAS
Scope moved repeatedly: an early narrowing from “new shell for DSI” to “the costing module”, a mid-flight expansion to serve EMS customers, and then a long third phase about making the module's answers stay put. Each shift moved what we built. None of them were allowed to move the four-tab structure, the ranked price sources, or the RFQ boundary.
Overview. What needs attention.
The first of the four tabs that never moved. Drawn from the shipping screen with the data taken out: the layout is the real one. The other three tabs follow below, each beside the decision it carries.
The Calls We Made, with Rationale
- 01Ranked price sources, set once and overridable everywhere
A Sourcing project pulls pricing from seven source types: Contract Pricing (now generalized into typed Cost Sets), Purchase History, Quote Responses, Quote History, Specific Price, Web Price and Manual Price. The buyer ranks them. The project then applies the highest-ranked source that actually has data for that part at that volume, and falls down the stack only when it has to.
Three things make it a design decision rather than a settings screen. Ranking is layered, so a shipped default can be overridden per organization and again per project, and a buyer working on one project never has to touch a global. Each source carries its own tie-break chain, so “which contract price” is answerable as well as “which source”, and Lowest Price is permanently welded into every chain: you can reorder around it, you cannot remove it. And the per-line override is as important as the default, because clicking a price opens the full comparison and lets judgment beat the ranking on any single line.
- THE PRICE STACK · HOW ONE LINE GETS ITS PRICEDIAGRAM · 03
Ranking is not a preference. It is the costing engine.
Fallback is the whole point: the project reaches for the best thing it already knows before it asks anyone for anything new.
- 02An RFQ is a price source, not the next step
This is the decision I would defend hardest, and it is the one that took longest to say out loud. The obvious model is a pipeline: BOM, then Sourcing, then RFQ. It is wrong. A Sourcing project is the object. An RFQ is what that project does when it has a gap, which is to say a part with no usable price or a price that has gone stale.
So the answer has to come home. Quote Responses is this project's own live RFQ. Quote History is every other project's past RFQs. Same underlying data, different scope, both sitting in the same ranked stack as contract price and web price. Going to market is an operation the project performs on itself, and it competes for the line on the same terms as everything else.
The consequences fall out cleanly. Only lines that genuinely need a quote get sent, so the send is partial and repeatable rather than a handoff. Anything already sent is excluded automatically. And when responses come back changed, they arrive as a diff the buyer reviews and applies, not as a silent write.
- THE BOUNDARY · SOURCING AND RFQDIAGRAM · 04
Not a pipeline. The answer comes home.
The project sends out only what it cannot answer, and the supplier's answer re-enters as one ranked source among seven. RFQ keeps everything that makes it good and gains a caller that knows what it already has.
- 03Freeze, refresh and sync: three loops that look identical and are not
Once a module picks prices for you, it will eventually pick a different one. That is correct behavior and it is also how you lose a buyer's trust, because the real negotiation happens on a call the software never sees. A buyer settles a price offline, comes back, and the line has moved.
So there are three separate loops, and keeping them separate was most of the work. Refresh is upstream staleness: go and re-read the sources. Sync with RFQ is downstream drift: quantities and parts changed here, show me the diff before suppliers see it. Lock is the human one: this line is settled, stop touching it.
Lock is the interesting one because it is mostly implicit. Overriding a price locks the line, because overriding a price is the buyer saying they know something the data does not. Rather than hide that, the interface names it: the refresh control on a locked line relabels itself to “Unlock to Refresh Line”, and the line carries a Refresh Locked state where the buyer is already looking. Moving which alternate part costs the BOM opens a two-branch dialog that spells out both consequences in plain language, with a remember-my-choice escape. Small surfaces. They are where the module stopped feeling like a spreadsheet that changes its mind.
- 04Four cells, not forty columns
These users live in Excel and will ask you for more columns forever. The Part List gives them four: internal part number, manufacturer part number, one per quantity tier, and status. Each one is a dossier rather than a field, stacking whatever the project needs to see inside a single cell, with the two identity columns pinned. Twenty-eight optional sub-fields live inside those four cells, from lifecycle and years-to-end-of-life to excess cost and package type. Density without horizontal panning.
The second half of that decision matters more. Which sub-fields appear is not a personal preference, it is a named view authored at the organization level and attached to the project, and the same view governs what renders, what can be sorted, and what comes out in the export. One artifact, three surfaces, so a team's definition of a part travels with the work instead of being rebuilt per user.
- THE FOUR TABS · 02 PART LISTDIAGRAM · 05
Part List. Every line, in four cells.
Density without horizontal panning. Two identity columns stay pinned, each quantity tier gets one cell, and status closes the row.
- 05Rolling up a real BOM, and the two settings people confuse
Costed BOMs consolidates a multi-level BOM with subassemblies, Make and Buy distinctions and reporting-only lines into one rollup, with volume tiers selectable per assembly. A Sourcing project carries up to six simultaneous quantity tiers, so a buyer can see 100, 1,000 and 10,000 units of the same assembly side by side. The RFQ side carries twelve, which is a real seam between the two modules rather than a bug.
The rollup problem is that parents and children get their numbers from different places: children are priced from sources, parents are summed from children. Rather than build a second rendering path for assemblies, an assembly is given a synthesized price entry of its own, so it sorts, renders and exports exactly like a purchased part and its unit cost is simply its rolled total divided by its volume.
And the setting people conflate: Consolidate By decides which rows merge and sum their quantities, so the same resistor in five subassemblies can become one larger buy. Group By decides which lines share a single cost decision. They are not the same question, and the winning line is recomputed per quantity tier, so a project can be costed from one supplier at 1,000 units and a different one at 10,000.
- THE FOUR TABS · 03 COSTED BOMSDIAGRAM · 06
Costed BOMs. The rollup, per quantity tier.
Parents are summed, children are priced. The table treats both the same, so a costed BOM reads as one list.
Artifacts and the Path
- 01THREE ERAS, ONE SET OF DECISIONS
Sourcing did not ship once. It shipped continuously across three phases with distinctly different jobs, and my role changed in each one: building the object, then widening it to a second kind of customer, then directing designers on parallel tracks while the module learned to stop moving.
- 02THE PIVOT
The first version was bigger than what shipped. I wanted Sourcing to reframe DSI itself, to make a project the central object that any capability could compose inside. We started building toward that. As the work progressed a clearer truth surfaced, and it was smaller and truer: this is a costing problem. Sourcing became the place where BOM data meets every price signal the company already owns, and it reaches out for a new quote only when nothing it holds is good enough.
- 03ERA I · BUILD THE OBJECT
From a shell to a costing module. Sourcing became its own module with its own data, its own ranked price configuration and a link to RFQ. This is where the pivot happened: the general-purpose project shell was killed and the costing module shipped in its place. The four-tab structure and the price stack were set here and never moved again.
Shipped: module gated per organization · own price-source ranking · own schema, own line items · the RFQ link, both directions · tags, statuses, assignment.
- 04ERA II · WIDEN IT
Multi-level, versions, and a sell side. Real BOMs are not flat and real projects are not one-shot. Multi-level assemblies, project versioning as a tree with selective copy scope, and then the EMS-facing capability: markup and sell price, sitting per line and per quantity tier directly on top of whichever source won. The features did not multiply. Their meanings did.
Shipped: multi-level BOM costing · version trees, selective copy · markup and sell price per tier · contract price becomes typed cost sets · end-customer attribution.
- 05ERA III · MAKE IT HOLD STILL
Freeze, lock, and provenance. The phase nobody plans for. Buyers negotiate offline and need the result to survive the next refresh. Finished lines should not be re-priced just because everything else was. Line locking, manual prices, and frozen snapshots of internal price data mean a costed BOM stays the costed BOM you agreed to.
Shipped: line locking, with recorded reason · manual price override, per tier · snapshots of contract, quote, PO data · manual-edit tracking · sync-with-RFQ as a reviewed diff.
- 06WHAT I HELD THE LINE ON
Across every shift: the four-tab structure even under pressure to flatten it, ranked price sources as a first-class concept and never buried in settings, and RFQ staying its own application. Those three survived a pivot, a customer-type expansion, an organizational change, and two years of feature pressure.
- 07WHAT CHANGED ABOUT LEADING IT
Era one I designed most of it. By era three I was directing designers on parallel tracks, which meant the load-bearing decisions had to be written down and defensible rather than held in my head. The four tabs and the price stack became the thing everyone designed against, which is the actual test of whether a structural decision was any good: other people can extend it without asking you.
DSI users are conditioned to spreadsheet exports and enormous tables, so pushback is constant and structural. Going deep on the why with decision-makers, rather than bending on structure and adding another column, is what kept the module coherent.
Analysis. Where the cost sits.
The same project, read as money and risk. The price-source panel is the ranked stack from Diagram 03, measured in cost.
What Shipped and What It Moved.
- FIG. 01RANKED · TIE-BREAK CHAIN
- 1
- 2
- 3
- 4
- 5
- 6
- 7
FIRSTTIE-BREAK7ranked price sources with per-line override, per-source tie-break chains, and Lowest Price welded into every chain
- FIG. 02QUANTITY TIERSSourcing6RFQ126
simultaneous quantity tiers per Sourcing project; the RFQ side carries twelve, a real seam between the modules
- FIG. 03ERAS, IN ORDER
- 1Build the object
- 2Widen it
- 3Make it hold still
3eras shipped: build the object, widen it to a second customer type, make it hold still
- FIG. 04STATEACTIVE ROLLOUTSeveral enterprise accounts onboardingActive
enterprise rollout, several accounts onboarding; now the most actively developed area of the platform
A Sourcing module with a four-tab project view, seven ranked price sources with per-line override, multi-level BOM costing with per-assembly volume tiers and cross-assembly consolidation, project versioning, per-tier markup and sell price, and an RFQ integration that only sends what genuinely needs quoting.
On adoption I am going to be careful, because I would rather be believed than impressive. Sourcing is rolling out to enterprise accounts and several are onboarding now. The signal we cared about most, whether buyers reach for Sourcing before jumping straight to RFQ for routine costing, is going our way in the accounts we can watch closely. I do not have published numbers on supplier response rates yet, and the supplier-fatigue thesis remains the thing I am watching as adoption matures.
There is one piece of evidence I do trust, and it is the shape of the work itself. Nobody builds price freezing, line locking and provenance snapshots for a product people are evaluating. You build those when real buyers are running real negotiations through it and the cost of the software changing its mind has become concrete. Era three is the adoption metric.
Sourcing is now the most actively developed area of the platform, ahead of both of the modules it was originally described as sitting between.
I keep a running set of these because a case study written mid-build goes stale, and a portfolio piece with wrong numbers in it is worse than no portfolio piece.
- Five price sourcesSeven, and Quote Responses is a distinct source from Quote History. Buyers can also configure duplicate instances, up to ten rows.
- Twelve simultaneous quantity tiersSix in a Sourcing project. Twelve is the RFQ side. Organizations set their own maximum.
- Statuses: New, In Process, AwardedNew, In Progress, Complete, and fully configurable per organization. Awarded belongs to RFQ. Line items carry their own separate set.
- Per-supplier due dates with a multiple-dates badgeThat lives on the RFQ side. A Sourcing project carries one required due date. The two modules keep their own dates, sources, tiers and statuses, and only converge when a project has an RFQ attached.
- Sourcing sits between BOM Insight and RFQ in a five-module suiteTrue as a story, understated as a fact. The navigation is licence-composed per customer, and Sourcing is a first-class module rather than a connector.
What I'd Do Again, What I Wouldn't
- The vision was half right, and I was slow about the half that was wrong
I used to write this reflection as a clean lesson: I held the “project as central object” idea too long, customers had been telling us it was a costing problem from the start, and I should have killed it a quarter or two sooner. That is still true about the timing.
But the ending changed the lesson. Sourcing did become the platform's center of gravity. It out-develops the modules it was supposed to sit between, it is the object other capabilities attach to, and a project really did turn out to be the thing the product organizes around. The vision was not wrong about where this was going. It was wrong about the sequence, and it wanted the destination without doing the work that earns it. Trusting a small provable insight is not the opposite of having a vision. It is how you get one built.
- Design for prices that move, from day one
The real regret is era three. The moment you decide the software will pick a price for someone, you have taken on an obligation to let them stop it, see why it changed, and prove later what it was. We shipped the picking first and the stopping second, and the gap between them was paid for in buyer trust. Freezing, locking and provenance were not polish. They were part of the original decision and I did not see it at the time.
- Get the model in front of buyers before engineering commits
We did some of this on price-source prioritization and not enough. The concept was strong enough that I wish I had pushed harder to have buyers see and react to the ranking model in research before the data model was settled. What shipped is good. The version where research and engineering converged earlier would have been better.
- Era one, revised in era three
A strong product insight is worth more than a strong product vision, and it is usually how you end up with one.
- The next chapter
The next chapter is agents: the module became the surface an automation layer operates on, with rules that tag, assign, status and send lines to RFQ on their own. That is its own case study, and it only exists because the decisions in this one held.