Skip to content

Rebuilding a quote system nobody wanted to touch

TL;DR

Diagnosis

You can’t make a custom-packaging quote simple. One order can hold many line-items, each in several variants (size, material, print, quantity), each priced from one of three sources, with a margin decision on top. The job wasn’t to remove that complexity — it can’t be removed. The job was to kill the friction around it: salespeople were re-typing the same order data into a second system and then waiting days for a number. So I kept the density (these are power users) and attacked the friction — collapsing the handoff between systems and sorting quotes into three clear tiers right where the offer is built.

flowchart TD
    subgraph Before["Before"]
        A1["Sales enters order<br/>into quoting system"] --> A2["Gets prices"]
        A2 --> A3["Manually re-types everything<br/>into offer system"]
        A3 --> A4["Customer waits days"]
    end
    subgraph After["After"]
        B1["Customer enters line-items<br/>and variants"] --> B2["Sales picks 1 of 3 quote paths<br/>right where the offer is built"]
        B2 --> B3["Offer ready<br/>same day"]
    end

    classDef good    fill:#e6f2ea,stroke:none,color:#1f4d33,rx:14,ry:14
    classDef bad     fill:#faeaea,stroke:none,color:#5f2626,rx:14,ry:14
    classDef accent  fill:#27272a,stroke:#3f3f46,stroke-width:1px,color:#fafafa,rx:14,ry:14
    class A1,A2,A3,A4 bad
    class B1,B2 good
    class B3 accent
    style Before fill:transparent,stroke:#a1a1aa,stroke-width:1px,rx:14,ry:14
    style After fill:transparent,stroke:#a1a1aa,stroke-width:1px,rx:14,ry:14
    linkStyle default stroke:#a8a8b3,stroke-width:1.5px

What I did

Results

The problem

What was broken about quoting custom packaging?

Custom (high-touch) orders — anything not off-the-shelf — needed a human quote. The sales manager entered the order into the quoting system, got prices, then manually re-entered everything into a separate offer system to build the customer’s quote. A custom quote took days; the salesperson sat blocked in the middle, and the customer could walk. Two systems, one manual copy-over, days of waiting.

Why not just simplify the screen?

Because the complexity is real and it belongs to the user. A custom order genuinely has line-items, each with variants, each priced from a different source, with a margin decision on top. “Simplify and add whitespace” would have hidden the things a sales manager needs visible to decide fast. The win was elsewhere — in the friction around the quote, not the quote itself.

My role / scope

Process

Key decisions & trade-offs

PathTimeWhen it’s used
Instant APIsecondsnear-standard customizations
Supplier platform (1-click)1–2 days, live statusmiddle-ground case
Manualdays, after negotiationtruly custom deals
flowchart LR
    A["Quoting system"] --> B["Offer system"]
    D["Supplier platform"] --> B
    C["Customer portal"] -->|"embedded element, dependency caught late"| D

    classDef info    fill:#e9eff8,stroke:none,color:#1e3a5f,rx:14,ry:14
    classDef bad     fill:#faeaea,stroke:none,color:#5f2626,rx:14,ry:14
    class A,B,D info
    class C bad
    linkStyle default stroke:#a8a8b3,stroke-width:1.5px

How it turned out

Quote time dropped from days to same-day. And the high-touch sales volume was held with a ~20% smaller sales-manager team, during a downturn where the default was contraction. The hardest part of the project wasn’t the screen — it was the cross-system coordination behind it (the supplier platform, the customer portal, several backend teams). That’s what stretched the timeline; the design itself was the straightforward part once the friction was clear.

What I took away