Chrisevolve
← back to work
PayCargo Platform · 2024–2026

Rebuilding the payment rails of global freight.

I led the end-to-end redesign of how freight forwarders discover vendors, settle payments, and confirm transactions on PayCargo. Higher conversion, faster activation, fewer payment tickets. All on a flow used daily across global logistics teams.

My role
Lead Product Designer End-to-end ownership
Team
Me — design lead PM · EM · Data · UR 3× FE · 2× BE
Timeline
2024 Q3 → 2026 Q1 15 months
at a glance
The setup
the problem
Customers were reporting friction across every step of the payment flow: vendor search, transaction creation, multi-vendor checkout. Support tickets had climbed 35% quarter-over-quarter, abandoned transactions meant delayed shipments and lost revenue, and the Angular UI underneath was hitting end-of-support. The forced React migration became the moment to fix the experience and the codebase at once.
The goal
Turn the payment flow from PayCargo's biggest source of drop-off into its fastest path to settlement, fixing vendor discovery, multi-vendor payment, and clearance confirmation in one continuous experience.
Success metrics
  • Users complete transactions in a single session
  • Users find the right vendor on the first search
  • Users pay multiple vendors in one continuous flow
Live · paycargo.com
01 · Transactions dashboard
PayCargo · Dashboard · new interface
In-product impact
+34%
Vendor search success rate
from 56% → 90%, post-redesign
3.2×
Multi-vendor settlements per session
1.0 → 3.2 invoices per checkout
−58%
Form errors per payment
from 2.1 → 0.9 per session, post-redesign
Business impact

What it meant for the business.

Payment conversion
+22%
Through a simplified payment flow and redesigned vendor discovery, payment conversion lifted by 22%.
Time to first payment (new customers)
−35%
New-customer activation: first successful payment dropped from ~14 min to ~9 min.
Payment-related support tickets
−38%
A clearer selection → details → payment flow cut payment-related support tickets by 38% in 90 days.
02 · Problem framing

Why we rebuilt the payment flow.

PayCargo is a B2B payments rail for the air and ocean cargo industry. Its users are AP teams at freight forwarders and customs brokers, people whose entire workday revolves around getting cargo released as fast as possible, because until the carrier (Maersk, MSC, major airlines) gets paid, the container sits at port racking up demurrage by the hour.

Years of organic feature growth had pushed the transaction flow into the company's biggest source of abandoned payments, with Sales losing deals at the final step of onboarding. The platform was also still running on Angular, a stack engineering was actively retiring, making the forced React migration the right moment to fix the UX and the codebase at once.

Before — legacyAfter — redesigned
100%
A more focused dashboard. The legacy view fired every column at once; the redesigned list surfaces the transactions users actually came for, getting them to what they're looking for, faster.
Research

Three angles on the same problem.

I ran three research tracks in parallel before any pixels moved: heuristic walkthrough, behavioral analytics, and customer interviews. Nothing made the roadmap unless all three pointed at the same friction. That's how we separated real problems from noise.

1Step 1

Heuristic walkthrough

Before involving external users, I ran an internal evaluation with PMs, engineers, and designers using Nielsen's 10 heuristics. The team walked the flow as users-with-a-job, tagging every friction point on stickies as it surfaced.

By the end of the session we had 21 documented issues ranked by severity. That backlog became the agenda for research, design priorities, and the success metrics that followed.

Figjam from the heuristic session
110%
Figjam from the heuristic session. Stickies organized by Nielsen heuristic and severity. 21 issues documented.
2Step 2

Quantitative validation in Amplitude + Hotjar

Every qualitative hypothesis needed a data correlate before we'd invest in a fix. I ran funnel analysis, heatmaps, scroll maps, and reviewed 30 session replays from users with open support tickets.

The patterns triangulated cleanly with the heuristic walkthrough: same screens, same drop-offs, same moments of hesitation.

Funnel + Vendor Selection heatmap, side by side
100%
Funnel + Vendor Selection heatmap, side by side. Where stickies said 'this feels confusing,' the data confirmed where users actually stalled.
Hotjar heatmap on the legacy vendor selection screen
100%
Hotjar heatmap on the legacy vendor selection screen. Clicks concentrated on the scrollbar and search input, not on the vendor rows themselves.
3Step 3

User interviews

With friction points mapped and validated quantitatively, I ran 8 user interviews with current customers and prospects to understand why they were stalling.

The walkthrough told us what was broken. The analytics showed where users dropped off. The interviews explained why. Once those three answers lined up on the same screens, we knew exactly which problems to fix first, and which to leave alone.

Vendor selection lived inside a tiny dropdown
100%
Vendor selection lived inside a tiny dropdown. Interviewees struggled to find their carrier before they could even get past step one.
Required fields hidden under the scroll area on the left side
100%
Required fields hidden under the scroll area on the left side. Interviewees missed them on the first pass and only found them after the form rejected their submission.
The findings

Pain points.

Once the three research tracks lined up, four frictions stood out. Each one was the same pain showing up in the heuristic walkthrough, the behavioral data, and the user interviews. These four became the agenda for everything that followed.

01

Buried navigation

5,000+ vendors in the system, but users could only see 5 at a time:
  • Tiny dropdown. A 200px scroll container showing only recently-paid vendors. No filters, no overview.
  • No way to browse. Couldn't filter by service, currency, or carrier: the three things users actually use to narrow down.
  • Catalog size invisible. Users couldn't tell how many vendors existed, so they scrolled blindly and often gave up at step one.
  • High cost of failure. In an industry where every minute = demurrage fees, dropping out at step one was real money.
Buried navigation
100%
1
200px scroll container. Hundreds of vendors. Zero overview.
02

Interruptive modals

Transaction creation lived inside a modal, and that modal was failing in four compounding ways:
  • No visible hierarchy. Fields scattered across two columns and a 'Secondary Details' section. Users couldn't tell what was required vs. optional.
  • No room to grow. Every field was locked into a fixed footprint. As the product added features, the screen kept getting more crowded.
  • Required fields below the fold. Double scrolling, inside the modal and on the page underneath, pushed mandatory inputs out of view.
  • Late validation. Errors only fired on submit, so mistakes piled up before users had any signal something was wrong.
Interruptive modals
100%
2
A form with double scrolling, hidden requirements, and validation that only fires on submit.
03

Cognitive overload

Some screens hit 18+ fields visible at once. More decisions per screen meant slower, less accurate work:
  • Backend-derivable fields. Many inputs the system could fill itself were left for users to enter manually.
  • Optional fields marked required. Mislabeled validation forced work that didn't need to exist.
  • Internal PayCargo terminology. Labels that made sense to ops meant nothing to a freight forwarder filling out a transaction.
  • Copy-paste workaround. Users padded fields with duplicate data from adjacent inputs just to get past validation, feeding the system info it already had.
Cognitive overload
100%
3
18 fields. Most derivable. Some not even required.
04

Batch payments missing

The payment modal could only handle one transaction at a time, but every interview confirmed AP teams were paying multiple invoices per session:
  • Browser-tab batching. Users juggled 5–10 windows to fake the workflow they actually needed.
  • Repetitive entry. Same vendor info typed per transaction, every time, for every invoice in the session.
  • Manual reconciliation. Totals added up by hand because the product couldn't surface a session-level summary.
  • Active mismatch. The product was fighting how its users actually worked: single-transaction UX in a multi-transaction job.
Batch payments missing
100%
4
One invoice per modal. Multiple invoices per session. The math didn't work.
Reframing

How might we…

We turned each friction into an opportunity statement. These four HMWs framed every design decision that followed.

FromBuried navigation
How might we make vendor selection feel as fast as picking from a familiar list?
FromInterruptive modals
How might we make the form linear, scannable, and recoverable?
FromCognitive overload
How might we ask only what the user can answer, in plain language?
FromBatch payments missing
How might we let AP teams pay multiple invoices in one flow?
Ideation

From frictions to candidate moves.

Divergent first, convergent next. We mapped candidate moves against every pain point, then clustered the winning ideas by surface: Navigation, Fields, Batch, Layouts, and Vendor selection.

Ideation board — candidate moves clustered by surface
100%
Ideation detail — close-up of sticky-note clusters
100%
Prioritization

MoSCoW: what ships first.

A quick way to align the team on priorities, separating must-haves from nice-to-haves so everyone agreed on what ships first and what can wait.

MoSCoW prioritization grid for PayCargo redesign scope
100%
User flow · before vs after

Rewiring the journey, not just the screens.

Before any high-fidelity work, I mapped the existing flow against where research said it broke. The old path was a six-step linear march that assumed one transaction at a time and forced users to start over for every additional invoice. The new flow makes vendor selection a real decision point, introduces a cart for batching, and only asks for payment method once at checkout.

Before · 2024
PayCargo legacy transaction flow — six linear steps with no batch support
100%
Linear, single-transaction. Every invoice was its own loop: search vendor, fill the same fields, pay, repeat.
After · 2026
PayCargo redesigned transaction flow — vendor selection branches into Suggest Vendor or Add to Cart with batch support
100%
Vendor selection becomes a real decision point. Add to Cart loops back for batch payments. One Pay Now → Payment Method at checkout closes the loop.
The flow change carried the redesign: every screen-level decision (search-first vendor directory, sticky-summary form, persistent cart) traces back to one of the new branches above.
03 · Process

Reframing the job, then designing for it.

I facilitated a 3-day sprint with PM, Engineering, Customer Success and Sales. CS held the cold voice of the frustrated user; Sales knew the deals we were losing.

We mapped the Job-To-Be-Done out loud:

When I receive multiple invoices from carriers, I want to pay them as fast and as accurately as possible, so I can release my cargo without delay.

This reframe changed everything. We weren't designing a payment form. We were designing a cargo release accelerator. Suddenly batch payments wasn't a "nice to have"; it was the entire point.

From workshop output to mid-fi wireframes

Three iterations

Iteration 01
First-pass linear wireframes
see what went wrong

First pass at the rebuilt flow. Vendor search gets its own page, the transaction form gains a sticky vendor preview, and the legacy modal-inside-a-modal pattern is replaced with a single checkout + explicit success screen. Reviewed internally with PM, Engineering, and CS before round 1.

what went wrong
Mixed signals from round 1. Vendor search as a page landed well; testers read it as a real catalog instead of a buried dropdown. But the left nav sidebar didn't fit the flow: users didn't recognize it and clicked away. The vendor-details widget also ate space and repeated info already on screen, so we cut it.
Iteration 01 vendor search
Iteration 01 new transaction form
Iteration 01 checkout total
Iteration 01 payment successful
Iteration 02
Stepped flow with add-to-cart
see what went wrong

Biggest structural shift: break the single screen into a multi-step flow and add a cart pattern, so AP teams batch transactions instead of restarting the form per invoice. Vendor search moved to a card grid; Add to Cart built the batch before checkout.

what went wrong
Two issues from round 2. Vendor cards truncated longer vendor names and scanned slower than a list. The transaction form still felt endless; splitting it into a step relocated the problem, didn't reduce it. What did work: multi-step + Add to Cart matched exactly how AP teams already think about batch payments.
Iteration 02 vendor search
Iteration 02 new transaction form
Iteration 02 cart
Iteration 02 payment success
Iteration 03 · Final
Production-ready, locked
see what worked

Round-2 validated the structural bets. This iteration locks in the production layout: list-style vendor rows (replacing cards), a numbered step accordion for the form, the cart pattern carried through, and a confirmation that scales from one transaction to dozens.

what went well
Vendor search felt natural. List rows with filters and tags (service, currency, carrier) let users find the right vendor in seconds. The form finally felt finite. Amplitude usage data drove the cut: mandatory fields up top, optional behind progressive disclosure, unused removed. The flow now mirrors how AP teams actually work end-to-end.
Final vendor search — list view
Final payment details with stepped accordion
Final cart with payment summary
Final payment success screen

Click any iteration above to expand. The user-testing rounds that drove each pivot, plus the validation that greenlit the production version, are below in Validation.


Validation

User testing in Maze: two rounds before production.

Round 1
Round 1 (mid-fi, 8 participants)
surfaced the issues from Iteration 02: vendor cards too small for long names and a transaction form that still felt endless. Both became the focus of Iteration 03 before any pixels went to high-fi.
Round 2
Round 2 (high-fi, 14 participants)
validated Iteration 03. Vendor-search task success climbed 56% → 90% (+34 pts), the form felt finite for the first time, and the multi-vendor cart pattern landed for batch payments. Greenlit for production rollout.
Round-2 Maze run against the production candidate: task success, time-to-complete, and click heatmaps captured across every screen of the new flow.
Round-2 Maze run against the production candidate: task success, time-to-complete, and click heatmaps captured across every screen of the new flow.
Foundation

Design system foundation

Before going to high-fidelity, I paused to consolidate a design system foundation in Figma + Storybook: design tokens, atomized form components in every state, documented patterns. Subsequent screens were built faster.
Design system foundation
100%
Each component documented in Storybook with every state (props, variants, edge cases) so engineering could pull the spec directly without DM-ing me.
Design system foundation
100%
Design tokens + atomized form components + documented patterns: the source of truth for every screen that came after.
04 · Final design

What we shipped.

With Iteration 03 validated in user testing, we moved into MVP delivery and rolled it out behind a feature flag over 8 months: internal → 5% → 25% → 100%. The phased ramp let us catch regressions early and gave Sales, Support, and the engineering team time to absorb each cohort before the next opened up. Four core surfaces changed end-to-end:

01 · Vendor Search: full page, list-first

A scannable, filter-first vendor directory

List-style rows showing the full 5,000+ vendor catalog instead of 5 at a time. Search-first input with autocomplete, plus filters and tags for service, currency, and carrier: the three things users actually use to narrow down. Every row surfaces the signals users needed to cross-reference before (credit support, currency, service type) at a glance, replacing the card grid that fought with longer vendor names.

Vendor selection
Before — legacyAfter — redesigned
100%
+34 pts
vendor search success rate
Resolves: buried navigation. Users went from a 200px dropdown showing 5 recently-paid vendors to a filterable directory of the full catalog. Vendor-search task success climbed 56% → 90%.
02 · Transaction form: finite, finally

Only what the user can answer

Pulled from Amplitude usage data, every field was ranked by actual use. Mandatory fields surface above the fold, optional fields collapse behind progressive disclosure, and fields nobody used were removed entirely (parked for a future customization layer). Single-column layout with inline validation and a sticky summary panel showing what's already entered. The double-scroll trap, the modal-inside-a-modal failure, and the late-validation trap all disappear in this pattern.

Transaction form
Before — legacyAfter — redesigned
100%
+24 pts
task completion rate
Resolves: interruptive modals + cognitive overload. End-to-end task completion climbed 64% → 88% as the form went from 18+ ungrouped inputs to a focused, prioritized set the user actually needs to answer.
03 · Batch payment cart: multi-vendor in one flow

A multi-vendor cart for batch payments

A persistent side-panel acts as a running cart. Users add invoices vendor by vendor, then settle the whole batch in one checkout, instead of restarting the form for each transaction. The Add to Cart pattern made batch payments feel native to AP teams and replaced the browser-tab juggling they were doing before.

Cart & payment
Before — legacyAfter — redesigned
100%
1.0 → 3.2
batch payments per session
Resolves: missing batch capability. AP teams went from one invoice per session to averaging 3.2: same volume of payments, far fewer sessions, dramatically less friction per transaction.
04 · Confirmation: with cargo release ETA

A receipt that closes the loop

Full breakdown by vendor, expected cargo release date per shipment, and a secondary CTA: "Create new transaction." Closes the JTBD loop: the user came to release cargo, the confirmation tells them when.

A receipt that closes the loop
100%
The new payment-successful screen. Per-vendor breakdown, ETA per shipment, and a one-click path back to start a new transaction.
05 · Results & feedback

The numbers, post-launch.

Eight months after the phased rollout closed, the redesigned flow now handles every payment on the platform. Below: the production numbers, the things I'd do differently next time, and the patterns I'd reuse (or skip) on the next project.

+22%
Payment conversion
More started payments turned into completed ones, on the back of a simpler payment flow and clearer vendor discovery.
64→88%
Task completion rate
+24 pts. The hardest step in the funnel became the most reliable.
−57%
Median time per transaction (all users)
Median per transaction across the platform: 7m 20s → 3m 10s. In an industry priced by the minute, that is real money.
56→90%
Vendor search success rate
+34 pts. The first step stopped being a wall.
1.0 → 3.2
Batch payments per session
Power users finally had the workflow they'd been faking with browser tabs.
−38%
Payment-related support tickets
Freed CS to focus on exceptions instead of repeat questions about the form.
Reflections

Key learnings.

Two columns of muscle memory: the patterns that fought us in this project (and would in any other), and the ones that compounded enough to bring forward.

What went wrong
  • 1New component library mid-flight cost velocity. Rolling in Material UI while the redesign was already underway meant negotiating new patterns and new components on every screen.
  • 2Scope kept expanding. Without a hard line on 'done', stakeholder asks grew the brief faster than we could close it.
  • 3Thin user-testing access. AP teams are time-poor; every round was a recruiting battle, so we leaned harder on internal review than I'd have liked.
What actually worked
  • Data-driven design. Amplitude + interviews pointed at the same screens. Numbers and voices in agreement.
  • Iterate, then validate, repeat. Three design rounds + two testing rounds was the only way to find what actually fit AP teams.
  • Around the user's mental model. Patterns mirroring how users already think about batch payments clicked instantly. No onboarding needed.
  • Triangulate before designing. Heuristic walkthrough + analytics + interviews aligning on the same friction was the cheapest insurance against chasing noise.
Retrospective

What I'd do differently

  • Lock the component library decision before the redesign starts. Adopting Material UI mid-flight meant solving two problems at once. Next time, I'd freeze the system foundation in week one, even if it slows the start. It pays back across every screen.
  • Hard-line the scope on day one. Without a clear definition of 'done', stakeholder asks expanded the brief mid-sprint. I'd write an explicit out-of-scope list the team agrees to before kickoff.
  • Build a recurring user-testing panel with calendar holds. Recruiting AP teams ad-hoc was a battle every round. A standing panel of 10–15 users with pre-booked calendar slots would have unblocked testing instead of slowing it.
  • WCAG AA guardrails baked in from day one. We hit AA on most components but a few legacy ones still owe remediation. Should have been wired into tokens and base components from the very first sprint.
Live · paycargo.com
The shipped flow: vendor discovery to payment confirmation.
Next case study ↓
PayCargo Mobile · 2024
Mobile app, 0 → 1. →