Enterprise SaaS

POSNext: Inventory Management for Internal Tooling

Duration: 4 Months Role: Lead Product Designer 2024 Data Visualization Internal Tooling IA
POSNext inventory and pricing workspace showing the redesigned inventory table across multiple events on a desktop display
POSNext Mercury Checkout, the guided three-step purchase flow with a live order summary, on a desktop display

TL;DR

Background
Cloud-based inventory and order management platform for professional ticket brokers, who live in dense data tables all day to price and fulfill inventory across marketplaces.
Problem
A legacy platform that stored inventory well but surfaced nothing. Priorities, pricing health, and the state of the business were all buried in the data.
Approach
As the lead Product Designer, I rebuilt the highest-revenue workflow around the decisions brokers actually make, then systematized it into shared patterns across the product.
Outcome
Triage moved from the broker to the interface, pricing competitiveness became readable at a glance, and manual reporting gave way to a live overview.
3
Core user roles
1
Unified system
1000s
Records made scannable

The platform where ticket brokers
run their entire operation

POSNext is a cloud-based inventory and order management platform used by professional ticket brokers to manage inventory, pricing, fulfillment, marketplace distribution, and the day-to-day operations of running a business in the secondary ticketing industry. Brokers and their operations teams live inside it for most of the working day: listing tickets, pricing them against fast-moving marketplaces, and fulfilling orders across multiple sales channels.

The project was a ground-up rethink of a legacy platform that had become a bottleneck for the exact users it was built for. As the lead Product Designer, I drove the initiative end to end: framing the core problem with Product, pressure-testing what was buildable with Engineering, and owning the decisions about what the interface should surface, what it should quiet down, and where every action should live. Because inventory and pricing decisions map straight to revenue, the goal was never just a cleaner screen. It was a platform that helped brokers make faster, more confident calls at scale.

A volume problem on the surface,
a decision problem underneath

A typical broker manages thousands of inventory records across dozens of events, venues, and marketplaces. The hardest part of the job is not entering data, it is deciding what to act on next: which listings are mispriced, which are at risk, which are quietly leaving money on the table. On the legacy platform, that decision was slow because the signal a broker needed was buried under the very data they were there to manage.

Every pricing decision moves revenue, so even small usability wins compounded across thousands of records a day. Speed here was not a nice-to-have. It was money.

🔍 Key insight: the data was not missing. It was undifferentiated. Rather than add more information to the screen, the opportunity was to let the interface do the triage, so brokers could spend their attention on decisions instead of on discovery.
🧭

Priorities were buried

Inventory needing attention looked identical to everything else. Identifying what to act on first meant scanning hundreds of rows rather than being shown.

💰

Pricing opportunities hidden

There was no clear way to read pricing competitiveness or inventory health, so revenue opportunities were easy to miss in the density.

🗂️

Datasets that fought the user

Navigating thousands of records across events, venues, and marketplaces was slow, and frequently used actions interrupted the flow rather than supporting it.

📉

No view of the business

Without an at-a-glance performance picture, teams leaned on manual reporting just to understand where things stood before any real work began.

I mapped a broker's entire day,
end to end

Before proposing a single screen, I audited the legacy platform the way a broker actually uses it: opening cold, hunting for priorities, and reconstructing the state of the business by hand. Here is what that audit surfaced, and the brief it produced.

What I needed to understand first

To get my head around a workflow this dense, I refused to trust any single source and triangulated four. I sat shoulder-to-shoulder with the brokers and ops teams who live in the tool, interviewed the stakeholders who owned the business goals, audited the legacy product screen by painful screen, and dug into the usage and support signals that showed where people actually got stuck. Then I affinity-mapped it all and traced a broker's day from login to pricing call. A messy pile of complaints turned into a tidy set of structural problems.

4
Research inputs triangulated
3
Power-user roles studied
1
Legacy platform audited end to end
1000s
Inventory records each broker juggles
Discovery approach: Four inputs, triangulated into a brief
Discovery approach: four research inputs synthesized into outputs INPUTS SYNTHESIS OUTPUTS Stakeholder interviews Broker shadowing & interviews Legacy product audit Usage & support signals Affinity mapping Journey & workflow mapping Problem themes User roles Design requirements
Workflow audit: A broker's day, before the redesign
POSNext broker workflow, before the redesign Flow showing where the legacy platform slows a broker down from opening the app through making a pricing decision. Open platform Find priorities Read the data Price & act Log in No at-a-glance view Manual reporting Dense table 1000s of records Pricing call Slow, low confidence Day starts blind Scan fatigue Revenue at stake Brokers spent the day managing data instead of acting on it The signal that should drive a pricing decision was buried in the noise of the inventory itself Friction / effort Revenue-critical moment Broker entry point

Mapping the day end to end, the pattern was consistent: the platform was excellent at storing inventory and poor at surfacing what mattered. Brokers opened to no clear picture of performance, then reconstructed by hand the priorities the system already had the data to show them. That framing, storing versus surfacing, became the thesis for the entire redesign.

Observed pattern: Where a broker's attention went
Where a broker's attention went before the redesign: most on discovery, little on the decision A day spent managing data, not acting on it Finding & reconstructing what to act on Deciding MOST OF THE DAY A SLIVER The signal that should have driven the pricing call was buried in the work of finding it.

Three power users, each asking the interface for something different

These are power users who live inside the platform for most of a shift, which made efficiency and speed the metrics that mattered most. Each role leans on the same screens for different reasons, so any decision about defaults or density had to hold up for all three at once.

Ticket brokers

Need to quickly evaluate inventory performance and make confident pricing decisions at scale.

Inventory managers

Monitor listings across events and marketplaces while keeping inventory levels accurate.

Operations teams

Require visibility into account activity, performance metrics, and system notifications.

From problems to constraints to a brief

Before touching a single screen, I translated each finding into a job the interface had to do, then framed the constraints we were designing inside. Technically, the redesign had to sit on the existing data model and ship in phases rather than as a single big-bang release. On the business side, it could not disrupt brokers mid-workflow, since any downtime is lost revenue. For users, the bar was high: these are experts who would reject anything that slowed them down. That mapping became the brief, and it gave me the three principles I measured every later decision against.

Synthesis: What discovery surfaced → what the design had to do
Each discovery finding mapped to a design requirement WHAT DISCOVERY SURFACED WHAT THE DESIGN HAD TO DO Priorities were buried Pricing health was unreadable Frequent actions broke the flow No at-a-glance view of the business Surface what needs attention Make pricing legible at a glance Keep actions inside the workflow Replace reporting with a live overview

Three principles to keep
complexity from winning

Every decision got held against the same three principles. When a tradeoff got genuinely thorny, what to show by default, how loud a status should be, where an action ought to live, these were the tiebreakers Product, Engineering, and I used to settle it without relitigating taste every time.

Clarity

Complex inventory data should be easy to understand. If a broker has to interpret the screen, the screen hasn't finished its job.

Efficiency

Power users should accomplish frequent tasks with minimal effort, without their workflow being interrupted.

Scalability

The interface had to hold its nerve as inventory volume climbed, staying perfectly legible at hundreds or thousands of records.

1
Step 01
Start with the workflow that moves revenue
Rather than redesign screens in the order they appeared, I started with the single workflow that moved the most revenue and caused the most pain: reviewing and pricing inventory at scale. I rebuilt the information architecture around the decisions brokers actually make, not around the order records happened to be stored in the database.
UX strategy Information architecture User flows
2
Step 02
Restructure the inventory table
The core table is where brokers spend their day, so it earned the most scrutiny. I rebuilt the row to lead with what is actionable, sharpened the pricing indicators, and turned a dataset you had to decode into one you can scan. The tradeoff was showing fewer columns by default, which I validated against the three power-user roles before committing.
Interaction design Data presentation
3
Step 03
Explore how status should look
Pricing health had to be legible in a glance without becoming exhausting over an eight-hour shift. I prototyped competing status systems and weighed instant recognition against the reality of all-day use, rather than defaulting to the loudest option that tested well in a five-minute demo.
Data visualization Iteration
4
Step 04
Extend patterns across the platform
Once the core workflow was solid, I extended the same language and components outward to the dashboard, filtering, navigation, and notifications. Building the design system in parallel meant consistency scaled with the product instead of being retrofitted later, and it lowered the cost for Engineering to ship each new surface.
Design systems Shared components Prototyping

Let the interface do the triage, so the broker can decide

The heart of the redesign was the inventory table, the screen brokers effectively live in. We intentionally prioritized surfacing what is actionable and quieting what is not, so reviewing hundreds of listings feels like scanning a well-organized board instead of decoding a spreadsheet. Every decision below started from a problem, ran into a real constraint, and came down to a tradeoff I made deliberately with Product and Engineering.

Final design Inventory & pricing workspace
Redesigned POSNext inventory workspace: an event list on the left, a pricing-enabled inventory table in the center with MSRP, price, and suggested-price columns, and a contextual panel on the right with a seat map and net-income chart

The whole workspace in one glance: events on the left, the inventory table dead center, a contextual panel on the right. Flip Pricing Mode on and MSRP, current price, and a suggested price line up side by side. Directional indicators call out where a listing sits above or below the recommendation, so a broker can nudge one row or push every price to suggested in a single click.

Reworking the inventory table

Simplified row hierarchy

Each row leads with what matters and de-emphasizes the rest, so the eye lands on the listing, its status, and its price without competing for attention.

Built for visual scanning

Consistent alignment and rhythm let users move down hundreds of rows quickly, spotting outliers by shape rather than by reading every cell.

Clearer pricing indicators

Pricing competitiveness is shown, not implied. A number that used to need interpretation becomes a signal you read in a single glance.

Consistent data presentation

The same data reads the same way everywhere, so brokers build one mental model of the table and trust it across every event and marketplace.

Making pricing health legible at a glance

A central challenge was communicating inventory health and pricing competitiveness through color-coded status. The problem: the status is read thousands of times a day, so it had to register instantly and stay comfortable over a full shift. I explored two systems and let the realities of daily use, not the demo, decide between them.

Explored · Traffic-light model

Bold red / amber / green status

Instant recognition with bold, attention-grabbing signals. Perfect for urgent, time-sensitive inventory review when every second counts.

Rejected: at full saturation, hours of continuous use became visually fatiguing, and when everything urgent competed for attention, nothing did.
Adopted · Refined status model

Softer, calibrated palette

Same signal hierarchy, dialed down for the long haul. To balance user needs with business goals, I kept the meaning fully legible and removed the glare, so status supports sustained operational use instead of fighting it.

Reads instantly and stays comfortable across a full shift.

Then I scaled the pattern
across the platform

Once the core table was solid, I extended the same language outward. Rather than redesign each surface from scratch, I reused the row, alignment, and action patterns across orders, checkout, the dashboard, and filtering, so the product felt like one system instead of a pile of screens.

Final design Orders & data tables
Redesigned POSNext orders table showing hundreds of rows with consistent columns, inline actions, and clear alignment

The same table language carries across the product. On dense lists like orders, a steady column rhythm, consistent alignment, and inline actions on every row let users move through hundreds of records and spot outliers by shape rather than by reading each cell.

From the table into a single record

Click a row and the full order opens up in the exact same visual language as the table it came from. Order details, customer info, and the ticket group sit up top, and a clean pricing breakdown runs straight through to the payout, so the number that matters gets read, not recalculated. A running activity log keeps the order's whole history in one place.

POSNext single order detail view with order details, customer info, a pricing breakdown ending in payout, and an activity log
Final design Checkout
Redesigned POSNext checkout screen with a two-step purchase form and a live order summary

Completing a sale follows the same logic: a guided two-step form on the left, with a live order summary that keeps quantities, pricing, fees, and the running total visible as the broker works.

A dashboard to start the day with

Discovery showed teams were exporting data and rebuilding the same reports by hand just to know where things stood. Rather than optimize that export flow, I removed the need for it: a dashboard that hands users a clear read on the business before they touch a single listing. This approach allowed us to replace recurring manual reporting with a live overview that starts the day informed.

Revenue & performance trends

Headline metrics and trend visualizations show how the business is moving without a single export.

Inventory summaries

A roll-up of inventory health turns thousands of records into a picture you can read in seconds.

Operational alerts

Time-sensitive issues are pushed to the surface so they're handled, not discovered later.

Activity monitoring

Account activity stays visible, giving operations teams the situational awareness their role depends on.

Final design Reporting dashboard
POSNext reporting dashboard with date and attribute filters across the top and headline inventory metrics and aggregate totals below

Reporting reframed as a starting point: a row of date and attribute filters sits above headline metrics and aggregate totals, so teams read the state of the business at a glance instead of assembling it by hand.

Filtering & system patterns built to scale

Big datasets demand powerful, predictable tools, full stop. So I built reusable filtering components that let users carve down huge inventories in seconds and behave identically everywhere they show up. That speeds discovery, slashes search time, and keeps every table experience scalable. The same systems thinking spilled into the supporting interface too: a cleaner account menu that keeps frequent actions within easy reach, clearer notifications for system and operational updates, and a set of shared components that locked in consistency across the whole application.

One pattern,
one component library

This was not a visual cleanup. Every pattern I shipped went into a shared component library, so high-stakes moments behave the same way everywhere and each new surface inherits consistent behavior for free.

Modals & messaging for the platform's biggest moments

Bulk actions and errors are exactly where trust is won or lost, especially for power users moving inventory in batches. I built a consistent system of modals so these high-stakes moments behave the same way every time. The clearest example is bulk CSV upload, an edge-case-heavy flow I designed end to end: confirm, process, validate, and resolve. Because a partial import can corrupt live inventory, we intentionally validated every row before anything committed, and designed the error state to tell users exactly which rows to fix rather than failing the whole file silently.

Interactive prototype CSV upload: a guided, multi-state flow
app.posnext.io / CSV Upload
CSV upload preview: ticket groups and events plus a preview table of rows to be imported CSV upload: uploading in progress CSV upload: validation in progress CSV upload: validation failed, listing specific row-level problems CSV upload: upload successful, with counts and a link to the new inventory
1 Preview
2 Uploading
3 Validating
4 Result
Simulate result:

Click through the real flow: confirm the import, watch it upload and validate, then resolve the outcome. Flip Simulate result to follow either path. The error path serves up specific, row-level problems that tell the user exactly what to fix, and the success path drops them straight into freshly created inventory.

Built from shared components
Reusable card component showing job and broker details with a confirm action
Card. One container for jobs, confirmations, and summaries.
Primary button component
Button. A single primary action style, used everywhere.
Standard modal footer with cancel and primary action buttons
Footer. A standard action bar puts cancel and the primary action in the same spot in every dialog.

Every modal and message above is assembled from this little kit of shared components. The payoff: a brand-new dialog inherits consistent behavior and styling for free, instead of getting designed from scratch every time.

Beyond the redesign

Built

Reusable filtering components

Filtering turned into a consistent, documented pattern any large table in the product could pick up. Data discovery got faster everywhere, not just on one lucky screen.

Established

Shared component patterns

A growing library of shared components brought consistency across the application and reduced the cost of designing and shipping new surfaces.

Evolved

The design system

The work pushed the design system forward, giving the team a more mature foundation for visual and interaction consistency at scale.

Enabled

A foundation for growth

The redesign left behind a scalable base the product can keep building on, ready for more inventory, more workflows, and more users without starting over.

How I drove it,
end to end

I owned this initiative from problem framing through shipping. Rather than hand off static comps, I framed the problem with Product, prototyped the interactions, and pressure-tested them with Engineering against the real data model, then shipped in phases so brokers were never disrupted mid-workflow.

Discovery
audit the legacy day
Principles
the decision criteria
Design + prototype
hardest workflow first
Product + Eng alignment
pressure-test what ships
Ship in phases
no big-bang release

The sequence mattered as much as the craft. Solving the highest-revenue workflow first gave Product and Engineering a concrete pattern to react to instead of a deck of abstractions, and shipping in phases meant each change could be validated in production before the next one built on it.

With Product

We aligned on which workflow to solve first and what "done" looked like, so scope stayed tied to revenue impact rather than screen count.

With Engineering

I pressure-tested every interaction against the real data model and shipping constraints early, so what I designed was buildable and could roll out safely.

Phased rollout

The core table shipped first and proved the pattern in production. Extending it to other surfaces then became low-risk reuse instead of a rewrite.

A complex operation,
made legible

POSNext turned a notoriously dense inventory experience into a modern, data-driven platform. Because the interface now surfaces what matters, brokers spend far less time reconstructing the state of the business and far more time acting on it. The outcomes below are directional, framed the way the redesign was scoped to move them rather than as headline metrics.

↑
Sharper inventory visibility. What needs attention is shown, not hunted for.
Triage moved from the user to the interface
↑
Faster pricing evaluation, with competitiveness readable at a glance.
↓
Less reliance on manual reporting, thanks to at-a-glance operational visibility.
The day starts informed
📊 The takeaway I carried out of this: thoughtful information design can untangle genuinely complex operations while directly powering revenue-critical decisions. Clarity was not an aesthetic here. It was an operational advantage.

What I'd carry
into every project

→
Surfacing beats storing
The legacy platform had all the right data. It just never differentiated any of it. The biggest wins didn't come from new information at all. They came from letting the interface decide what deserved the user's attention first.
→
Match the signal to the duration of use
The traffic-light model aced every quick test and then lost the only one that counted: an eight-hour shift. Lesson learned. Designing for how long people actually stare at a thing matters every bit as much as designing for what they see.
→
Solve the workflow, then systematize it
Nailing the core inventory workflow first gave me patterns worth reusing. Extending those into shared components and filtering meant the whole platform got more consistent as a byproduct of solving one screen well.
→
What I would improve next time
The redesign shipped on directional wins and qualitative outcomes. If I ran it again, I would instrument the core workflow from day one, so time-to-price and error rates on locking and bulk upload became hard numbers instead of informed inference. I would also validate the status palette with a longer, in-context test, since the trait that mattered most, comfort over a full shift, is the hardest one to catch in a short usability session.

Try it: locking a row
is irreversible, by design

The clearest example of a deliberate product decision is also the most interactive. Step through the flow below to feel how the design prevents a costly misclick without slowing brokers down.

Guardrails for an irreversible action

Locking a row commits its quantity and price. Because that action cannot be undone, the design problem was to prevent a costly misclick without slowing down brokers who lock rows all day. Rather than remove the friction entirely or bury the action behind a settings screen, we added a single deliberate confirmation. Working with Engineering, I constrained the quantity field to only the legal combinations, so an invalid lock is impossible before the user ever reaches the confirm step. The tradeoff was one extra click on a frequent action, which we judged worth it against the cost of an accidental commit.

The purchase flow has one job above all else: keep brokers from making costly, unrecoverable mistakes. Each row's quantity is locked to the legal combinations a ticket group actually allows, and locking a row freezes its quantity and price so the order can be committed safely. Since locking can't be undone, it sits behind a deliberate confirmation rather than a twitchy single click.

Interactive prototype Locking a row: set a legal quantity, then commit it
app.posnext.io / Mercury Checkout · Purchase
Mercury Checkout purchase table: each row's quantity constrained to the legal combinations in the Allowed column, with active Lock buttons Lock Tickets confirmation modal warning that quantity and sale price cannot be modified once locked Mercury Checkout with a row locked, the order total now calculated, and Confirm Purchase enabled
1 Set quantity
2 Confirm
3 Locked

Step through it: set a quantity within the allowed combinations, hit Lock, and the confirmation makes the consequence explicit before you proceed. Once locked, the row's quantity and price freeze, the order total resolves from “TBD,” and Confirm Purchase becomes available.