Skip to main content

Case Study

Headless Commerce
at B2B Scale

Under Armour global headquarters in Baltimore, lit red at dusk
Role
  • Software Engineer
  • Component API Lead
  • Mentor
Stack
  • React
  • TypeScript
  • Apollo
  • GraphQL
  • Redux
  • Ramda
  • Scala
  • PostgreSQL
  • Kubernetes
  • Terraform

When Commerce Is Too Slow For Support

B2B support tooling on a polyglot platform

Under Armour's B2B arm runs on a serious platform — Scala services, Kubernetes clusters, Terraform everything. When support teams needed to manage orders, process returns, and handle escalations, the legacy tooling made them tab between systems while a customer waited on the line. Support reps were waiting on pages the business couldn't wait for.

I joined the React side of the fix: a headless, Apollo/GraphQL-powered portal where the real work was cutting the clicks and steps out of every support workflow. Along the way I built a localization system serving translated content across 20+ languages, and a component architecture that outlived my tenure.

B2B e-commerce platform features — volume discounts, customer segmentation, access restriction, and the other surfaces a support team touches every day

The Backbone

One Graph, Fewer Tabs

Architecture diagram — shoppers and support reps reach the Commerce Platform through GraphQL, while B2B vendors pull data through REST

The commerce graph had everything — orders, inventory, customers, returns, shipments — but support tools were stitched together against legacy REST endpoints that assumed a shopper, not an agent. Latency was fine for a product page and brutal for a ticket queue.

Reps needed the full order context — the order, its line items, shipment status, return history, the customer record — and they were assembling it by hand, tabbing between systems mid-call. The headless Apollo/GraphQL layer put that data within reach; my job on the React side was cutting the number of steps it took to surface it. No grand architecture story — just the order context, on one screen, in fewer moves.

  • Apollo + GraphQL as the read-path for all B2B tooling
  • Tens of thousands of concurrent requests at 99.9% uptime on the B2B support surface
  • Redux for local UI state that shouldn't round-trip the server

The polyglot stack underneath — Scala services, PostgreSQL, Kubernetes, Terraform — didn't need to change. The GraphQL layer was the translation.

The Portal

What Support Reps Actually Used

React component library ecosystem — the vocabulary the portal was built on

The portal itself was deliberately boring. Support teams don't want cleverness; they want the right data in the right place, and they want it now. We mapped the three workflows that ate most of their day, and my job in each one was the same discipline: count the clicks, cut the clicks.

  • Order management
  • Returns processing
  • Escalations

The win we could measure was ticket resolution time: 35% faster, driven by fewer tab switches and fewer round trips. The win we couldn't measure was morale. Reps who'd been apologizing to customers for software stopped apologizing.

Standards That Outlived Me

Component APIs And The People Using Them

Multiple Storybooks composed into a main Storybook — the pattern UA's component library followed

I was at UA for eleven months. The goal was never to ship my components — it was to ship the patterns the next engineer would copy. Two things carried the most weight:

  • Component API standards — prop shapes, event names, accessibility defaults, documented in one place and enforced with prop validation on every component API
  • A Figma-to-Storybook design-to-code workflow, built with the design team — so handoff started from one shared source instead of two drifting versions
  • TypeScript-first patterns — junior engineers pairing on real tickets, not on toy examples, with a specific focus on making 'strict mode' feel like a productivity gain rather than a tax

When I left, feature rollouts were faster because the next person didn't have to relitigate how a form behaves or what a modal header looks like. That's the part of the job that's invisible until you miss it.

Takeaways

What Transferred

Two lessons from UA that I've carried into every role since.

  • The cheapest performance win is subtraction. The 35% didn't come from new architecture — it came from counting the clicks a workflow costs and deleting the ones that don't earn their place.
  • A component library is social infrastructure. The APIs matter because they determine what future engineers feel safe shipping. Standards are faster than style guides.