Recent Work

ngrok Usage & Limits

When ngrok launched usage-based pricing, our Usage page needed to keep up. At the same time, customers were complaining about hitting limits they never knew existed. I designed an experience that makes usage and limits clear at a glance, so there are no surprises.

Company ngrok
My role Design lead, visual and UX
My team Myself, 1 PM / tech lead, multiple engineers
Design tools Figma, Figjam, Claude
The Usage & Limits overview and Limits detail screens in the ngrok dashboard

Nobody likes a surprise bill or data throttle.

One of the first projects at ngrok was to finish a redesign of the Usage page that had already been through a few explorations before I arrived. As the team and I dug in, we realized that we also needed a way to communicate when usage was about to hit a limit, so customers wouldn’t end up with either a surprise bill or a costly service interruption. Easy, right? Well, no, not really...

There were 2 major challenges the team and I had to design around. First, our billing platform, Orb, had some extreme limitations on what data reporting we could get back from it. Second, the kinds of limits customers could hit with their usage were extremely varied. Some, like IP Policies, could be upgraded by request, but would cause service interruption in the meantime. Others could cause an immediate billing increase for any overage. A third type could not be upgraded, didn’t contribute to the bill cost, but did throttle data. And a fourth type, like Secrets Per Vault, had an X per Y limit: Users could have 500 vaults, each with 500 secrets. Yikes.

A table of all the possible limits a user could hit with their usage and endpoint traffic
This is a screenshot of all the possible limits a user could hit with their usage and endpoint traffic (endpoint is a basic building block of the ngrok platform).

Usage & Limits is like electricity: you only care about it when you get a big bill, or when you don’t have it.*

Once I was onboarded to the team and we made the decision to add Limits to the Usage project, I started working on a way to combine the two into one seamless experience. I proposed a Usage & Limits “hub,” which included an Endpoint Activity breakdown page, for even more granularity into usage and limits.

A diagram of the overall user flow of the Usage & Limits experience
The overall user flow of the Usage & Limits experience

After creating some rough sketches in Whimsical (which I no longer have, I’m sooooo sorry), I started mapping out flows and screens with our actual component library in Figma. Below is just one example of several iterations. Don’t worry, you don’t need to zoom in on your browser to 7000%. I’ll show all the gory details in just a bit. Want to know more about ideas and explorations that didn’t make the final cut? I’ll be happy to walk through them in a 1:1 setting.

One of the early iterations of Usage & Limits flows and screens in Figma
One of the early iterations of flows and screens

My design process for Usage & Limits had me mostly in Figma working out details, flows, and states. I met with the project’s tech lead / pm on a daily basis at the beginning to iterate rapidly. Once we got things to a more cohesive state, we started getting design feedback from a handful of customers via Slack and Zoom. When we were confident with the feedback, I started working directly with front and back end engineers to make sure my ideas were communicated clearly, and to solve any design problems that inevitably came up when testing with real data.

As shown above in the Process section, I designed a Usage and Limits hub consisting of:

  • A Usage & Limits Overview page
  • A Usage detail page
  • A Limits detail page
  • An Endpoint Activity detail page (not shown for brevity, you ain’t got all day.)

Usage & Limits Overview

This is the first screen of the hub, and where users land if they click “Usage & Limits” in the primary nav. It’s meant to show the highest level information of all the 3 sub pages.

The Usage & Limits Overview page with annotated design details
In this case, there are multiple limits the user is either hitting, or has already hit. If there are no limits needing attention, then there’s a basic “thumbs up, all good” message.

Usage Detail

This is the screen that shows anything directly related to the cost of a users’ monthly “pay-as-you-go” bill, and are not considered a limit.

The Usage Detail page with annotated design details
To anyone who’s looked at a breakdown of their phone or computer’s memory allocation, this should look familiar.

Limits Detail

With Limits having a lot more complexity than Usage, I wanted to design a table that clearly communicated what the current limit status was, what the range of the limit was, and what could be done to mitigate a limit issue. More details on the table row design below.

The Limits Detail page with annotated design details
Limits follows the same basic layout as Usage: Overview at the top, and a detailed breakdown by category for the rest of the page.

To account for the added complexity of Limits, I created this mini design system of all the possible states that a limit could be in.

A mini design system showing all the possible states a limit row could be in

*While most users don’t care about usage and limits unless they’re a problem, some users really like to dig into the technical details of limits. Like is it possible to actually hit MAX_SAFE_INTEGER number of HTTP Connections per Month? Challenge accepted! For those users, we have all the info they need in Docs.

What impact did my design have?