Skip to content

Rebuilding a complex quote system for custom packaging

Shipping box - B2B packaging e-commerce

TL;DR

Diagnosis

Quoting custom packaging can’t be done simply. One order can have many line items, and each of them several variants (size, material, print, quantity). Each variant is priced from one of three sources, and at the end someone has to decide on the margin. That complexity couldn’t be removed. What could be removed was the unnecessary work around it. A sales rep retyped the same order data into a second system and waited several days for a price. So I kept the dense screen, because experienced people use it, and dealt with the retyping instead. I connected the two systems and organized quoting into three paths right where the rep builds the offer.

flowchart TD
    subgraph Before["Before"]
        A1["Sales rep enters the order<br/>into the quote system"] --> A2["Gets prices"]
        A2 --> A3["Retypes everything by hand<br/>into the offer system"]
        A3 --> A4["Customer waits several days"]
    end
    subgraph After["After"]
        B1["Customer enters line items<br/>and variants"] --> B2["Sales rep picks 1 of 3 quote paths<br/>where the offer is built"]
        B2 --> B3["Offer ready<br/>the 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:#fdf5f5,stroke:#e0c3c3,stroke-width:1px,color:#5f2626,rx:14,ry:14
    style After fill:#f2f8f3,stroke:#c2dcc8,stroke-width:1px,color:#1f4d33,rx:14,ry:14
    linkStyle default stroke:#a8a8b3,stroke-width:1.5px

What I did

Sketch of the quote table: line items with expandable variant rows and a separate quote-status column (⚡ instant / pending / n quotes)

A reconstructed sketch. Each row has a quote status (⚡ means an instant quote; otherwise a request goes out and 1 to n quotes come back). Nothing has to be retyped into a second system.

Results

The problem

What wasn’t working in quoting custom packaging?

Anything outside the standard catalog had to be priced by a person. A sales rep entered the order into the quote system, got prices, and then retyped everything by hand into a separate offer system to prepare the customer’s offer. A quote like that took several days. The rep was stuck, and the customer could walk away in the meantime.

Why not just simplify the screen?

Because this complexity is real and the sales rep needs it. A custom order really does have many line items with variants, each priced from a different source, and at the end someone has to decide on the margin. If I had “simplified” the screen and added white space, I would have hidden things the rep has to see to decide quickly. The most could be gained on the work around quoting.

My role / scope

Process

Key decisions & trade-offs

PathTimeWhen
Instant from APIsecondssmall changes to a standard product
Supplier platform (1 click)1–2 days, live statusmoderately complex orders
Manualseveral days, after negotiationtruly unusual orders
flowchart LR
    A["Quote system"] --> B["Offer system"]
    D["Supplier platform"] --> B
    C["Customer portal"] -->|"displayed element, dependency noticed 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

Sketch of the quote screen: on the left three quote sources (instant, requests, manual) with supplier price cards, on the right a price breakdown

A reconstructed sketch. Three quote sources on one screen, choice on the left and details on the right. Nothing has to be retyped into a separate offer system.

How it turned out

Quotes went from several days to one. The sales team was ~20% smaller and still kept sales at the same level during a slump in which sales usually dropped. The hardest part wasn’t the screen itself but coordinating the several systems behind it: the supplier platform, the customer portal and several backend teams. That’s what made the project longer. Once it was clear where the time was being lost, designing the screen was the easy part.

What I took away