UX DESIGN CASE STUDY

The Interaction Behind the Upload

My Role: Lead UX Designer - sole contributor across research, design, and deployment
Company: The Home Depot
Project: Pro Quoting Tool - Bulk Upload Feature
Timeline: 10 weeks, discover through deployment
Methods: Contextual inquiry, job shadowing, iterative design, UAT, GitHub validation
Deliverables: Figma prototype, dev handoff, production validation in sandbox environment

The Challenge

The Home Depot's complex quoting team builds large, multi-line quotes for professional contractors - jobs that could run 50, 60, sometimes 80 line items. To manage the volume, the team relied on am automation bot that handled line item entry by taking over the user's machine. A single mouse movement during the process would crash it entirely.

Two weeks of direct shadowing revealed that the team had stopped raising the issue. The frustration was real, but it had been absorbed as a normal part of the job. The better path wasn't to patch a tool tied to a platform being sunset - it was to build the feature properly in the new application.

How do we replace a fragile workaround with something fast, reliable, and built to last?

The Quoting Environment

The complex quoting team was eight specialists, each responsible for a specific product category. The wire and electrical quoter ran a second computer just to manage the load - his category carried a 24-hour pricing expiration, making bot instability a direct business risk.

80+

Line items on the largest quotes

24 hrs

Pricing expiration on commodity goods

45-60 min

Average quote time before bulk upload

The Design Work

Because the team worked primarily in spreadsheets, CSV was the natural format choice. The feature used a strict required template - users downloaded it, populated it, and uploaded it back. No open column mapping, no guesswork on either end.

Spreadsheet

Wire & Electrical — Voltex Supply Co.
Flooring — Halton Flooring Co.
Lumber — Ridgeline Lumber
# Vendor Department Category Product Description Vendor Part / Model Qty Unit Vendor Cost Lead Time (days)
1 Voltex Supply Co. Electrical Wire 12/2 Romex NM-B Wire 250ft WG12250 10 Roll $68.47 5
2 Voltex Supply Co. Electrical Wire 14/2 Romex NM-B Wire 250ft WG14250 8 Roll $52.18 7
3 Voltex Supply Co. Electrical Wire 10/3 Romex NM-B Wire 100ft WG10100-3 5 Roll $74.92 6
4 Halton Flooring Co. Flooring Flooring LifeProof Vinyl Plank 8mm Oak LP-VP-OAK-8747 120 Sq Ft $3.29 5
5 Halton Flooring Co. Flooring Flooring TrafficMASTER Peel & Stick Tile TM-PST-GY-12 200 Sq Ft $1.18 7
6 Halton Flooring Co. Flooring Flooring LifeProof Vinyl Plank 8mm Oak LP-VP-OAK-8747 60 Sq Ft $3.29 5
7 Halton Flooring Co. Flooring Flooring MSI Carrara White 12x24 Porcelain MSI-CW-1224 180 Sq Ft $4.79 6
8 Ridgeline Lumber Lumber Lumber 2x4x8 ft. Kiln Dried Whitewood LB-248-KD 240 Each $5.68 7
9 Ridgeline Lumber Lumber Lumber 2x4x8 ft. Kiln Dried Whitewood LB-248-KD 240 Each $5.68 7
10 Ridgeline Lumber Lumber Lumber 4x8 ft. 3/4 in. T&G Plywood PLY-48-34-TG 60 Sheet $54.97 6

The full interaction design covered every state a user could encounter - successful upload, partial success, full rejection, and edge cases identified during UAT. Before shipping, every interaction was validated against the live build in a sandbox environment to confirm the feature matched the Figma prototype.

How do we tell someone their data is wrong without sending them back to square one?

Phase 1 — Full rejection

Upload failed

Flooring_Quote_Oct.csv

Flooring_Quote_Oct.csv

10 rows · uploaded just now

10 rows rejected

Your file could not be processed. One or more rows do not match the required template format. Please review your file and try again.

Phase 2 — Inline errors

Upload incomplete

Flooring_Quote_Oct.csv

Flooring_Quote_Oct.csv

10 rows · uploaded just now

7 rows processed   3 rows failed
Row 4

LP-VP-OAK-8747 — duplicate part number detected

Row 6

LP-VP-OAK-8747 — duplicate part number detected

Row 9

LB-248-KD — duplicate part number detected

Phase 3 — Error report download

Upload incomplete

Flooring_Quote_Oct.csv

Flooring_Quote_Oct.csv

10 rows · uploaded just now

7 rows processed   3 rows failed

3 rows contain errors. Download the report below, correct the highlighted cells, and re-upload your file.

Flooring_Quote_Oct_Errors.xlsx

Excel · 3 errors flagged

The full interaction design covered every state a user could encounter - successful upload, partial success, full rejection, and edge cases identified during UAT. Before shipping, every interaction was validated against the live build in a sandbox environment to confirm the feature matched the Figma prototype.

Bulk upload end-to-end system diagram Swim lane diagram showing two user entry paths converging at upload, through validation, to either a populated project list or an error report with re-upload loop User System Output Path A Path B Download CSV template Fill out Line items in CSV Upload Via modal Use own CSV Map to template Validation engine Checks rows on upload Return error report Excel · cells highlighted Populate project list Line items write to quote Valid? No Yes User corrects and re-uploads

Impact and Reflection

Bulk upload shipped and the team adopted it immediately. The RPA bot went untouched from day one and was formally decommissioned within a month. A quote that had taken 45 minutes to an hour now took 30 to 45 seconds. Quote-to-order conversion increased by 35%.

What I'm most proud of is the decision that shaped everything downstream - recognizing that the right move was to build the feature properly in the new platform rather than extend the life of a fragile workaround.

The best design doesn't add something new. It removes what was quietly getting in the way.

Bulk Upload Items — All States
Default
Drag hover
File selected
Uploading
Success
Total rejection
Partial — few errors
Partial — many errors
Partial — majority failed