← All work

Plivo · CX Platform

Making compliance legible: rebuilding Plivo's 10DLC, Campaigns, and Compliance console

A redesign of the surfaces that Uber, Zomato, and Meta , and the Plivo FDEs supporting them, use every day to get messaging campaigns approved. The goal: turn a regulatory black box into a console anyone could read.

Role
Product & Visual Designer
Company
Plivo
Surface
10DLC · Campaigns · Compliance
Status
Shipped to production
Plivo Compliance · 10DLC tab, brands on the left, Zomato's campaigns on the right with an inline rejection reason and Edit & Re-submit action.
The redesigned 10DLC surface.Brands on the left with status pills. Zomato's campaigns on the right. The rejected “Christmas” campaign exposes its rejection reason inline, with a single-click Edit & Re-submit right beneath it. No collapsibles, no API lookup, no support ping.

Context

Plivo's CX platform is the dashboard customers use to manage SMS compliance, registering brands, submitting campaigns, and tracking them through the 10DLC and TCR vetting pipeline.The people on these pages aren't designers or engineers. They're PMs, CTOs, and ops leadsat brands like Uber, Zomato, and Meta, plus Voice-AI and telephony API teams. They need to understand a regulatory landscape they didn't design, and they need to act on it.

I worked across this surface with senior designers, engineering managers, PMs, and the Product Head of Messaging. The brief was wide: three pages, 10DLC registration, Campaigns, and the Compliance hub, all overdue for a rethink.

The problem

The console buried the hardest parts of the regulation behind collapsibles.When a campaign was rejected, the reason wasn't visible by default. To find it, a customer (or, more often, the Plivo FDE supporting them) had to open the right section, parse internal vetting status, and frequently fall back to pinging the messaging team or hitting the API directly to figure out at what stage the rejection happened and why.

That cascade was the real cost. Every rejection turned into multiple internal handoffs: FDE → support → messaging team → API. The Drafts experience was thin. There was no edit-and-resubmit path. There was no archive at all, customers had no way to retire old campaigns from the list. And there was no progress system telling a customer where their campaign stood in the multi-step vetting pipeline.

“The rejection reason was the single most important piece of information on the screen, and it was buried three clicks deep.”
The insight that drove the redesign
“Every time a campaign got rejected, I had to ping the messaging team and dig through the API just to tell the customer what was wrong.”
A Plivo FDE, paraphrased

Why now

FDE pain was the trigger. Customer-support escalations were a parallel pressure. Plivo's customer base had grown into brands that expected enterprise-grade clarity, and the console wasn't meeting that bar.

Research & framing

I studied how Twilio, Bandwidth, and Sinch surface compliance state, and noticed they all design for developers managing customers, not for the customers themselves. Plivo's redesign moved the other way. Then I sat with the Product Head of Messaging and walked the full lifecycle: a customer registers a brand, submits a campaign under it, goes through internal vetting (info cross-check, brand volume), then carrier vetting, then lands in one of three terminal states , verified, rejected with a resubmit path, or rejected outright.

The biggest reframe came from auditing who actually lands on these pages. Not regulatory specialists. Not engineers. PMs and CTOs at brands who care about getting messaging shipped, not about TCR taxonomy. That shaped the language and the hierarchy on every screen.

May 2026|Reframing, who's actually here?

Old framing

  • Treat the console as an internal vetting pipeline
  • Hide complexity behind collapsibles so the page looks tidy
  • Surface speaks the language of TCR, vetting scores, carrier APIs
  • Customer should ping support when a campaign gets rejected

New framing

  • Treat the console as a customer-facing compliance posture
  • Surface state, especially the painful states, by default
  • Surface speaks the language of brands, campaigns, next actions
  • Customer should read the reason and resubmit on the same page

Design principles

  • Surface state, don't hide it. No collapsibles for things people came here to read.
  • Make the lifecycle visible. A customer should always know where their campaign stands and what happens next.
  • Respect the limits of trust. Some signals (like internal vetting scores) stay internal, by policy. But everything a customer needs to act, they can see.
  • One hub for compliance. Don't make people guess which page their problem lives on.

User flow

The diagram below shows the full campaign lifecycle , the path every customer travels from brand registration through to a verified or rejected outcome, and the recovery moves I introduced when the path turns bad. The dark nodes mark the four design additions that did the most work to remove internal handoffs.

CustomerPlivo internalCarrier (TCR)Introduced in redesign1 · Register Brand2 · Submit Campaign3 · Plivo Internal Vettinginfo cross-check · brand volumePass?4 · Carrier Vettingsubmitted via TCROutcomeLive / Approved5 · Inline Rejection Reasonshown directly below the campaign card6a · Edit & Resubmitfix what was flagged · resend6b · Archiveexplicit · irreversible

Hover or tap any node to see what it does.

Campaign lifecycle, brand registration through outcome and recovery. Dark nodes (5, 6a, 6b) are the additions that removed the FDE → support → messaging-team cascade. Hover or tap any node to focus it.

Design solution

The redesign moved through three acts: 10DLC registration, the Campaigns surface, and the systemic move, a unified Compliance hub.

Act 1 · 10DLC

Mapping the vetting flow end-to-end

I mapped the full vetting flow end to end: brand registration → campaign registration under the brand → internal vetting → carrier vetting → outcome state. Each outcome, verified, rejected, resubmit, got its own treatment with the right next action surfaced.

Where company policy permitted, I exposed both internal and carrier-level status. Where it didn't, I designed around the gap so the customer still understood what was happening to their submission, even if they couldn't see every signal feeding into it.

Act 2 · Campaigns

Killing the collapsibles

This was the heaviest lift. I reframed the page as a two-pane layout: brands on the left, their campaigns on the right. Inside each campaign card I killed the collapsibles. Rejection reasons now sit inline, directly below the campaign they apply to, viable because each brand caps at three or four campaigns, so the screen stays scannable rather than turning into a wall of text.

  • A progress system spanning the campaign lifecycle, so customers can see where each submission sits.
  • Archive, a new action entirely. Customers previously had no way to retire old campaigns. I introduced archive as the missing terminal step, with explicit irreversibility messaging.
  • Drafts page redesign , cleaner hierarchy, clearer affordances for “in progress vs. ready to submit.”
  • Edit-and-resubmit for rejected campaigns. Previously customers were forced to start over; now they can fix exactly what was flagged.

The debate: how much to expose

Two trade-offs took the longest to resolve. First: should customers see internal vetting scores? Company policy said no, that data stays internal. I couldn't change the policy, but I redesigned around it so the absence didn't feel like a black box. Second: should the campaign use case be exposed to the customer? I argued yes , the use case is the most direct context a customer has for understanding the verdict on their submission. That one landed.

Plivo Compliance · Drafts tab, 10DLC campaigns with status pills and inline rejection reasons.
Drafts surface. Status pills tell a customer at a glance which campaigns need work, which are ready to submit, and which were rejected. The detailed rejection reason sits inline beneath the row, and the action column on the right resolves to Complete, Edit, or Submitdepending on state, so there's exactly one next move per campaign.
Act 3 · Compliance hub

One page for the entire regulatory posture

The systemic move. I unified 10DLC, Drafts, Toll-Free, and the new brand/campaign regulations under a single Compliance page. Customers no longer needed to know which regulatory framework their issue lived under, the hub held all of it, with consistent state language across each section.

This is the page I'd point to first if asked “what changed at the system level.” It's the difference between a console that reflects Plivo's internal org chart and one that reflects how a customer actually thinks about their compliance posture.

Drafts
Drafts
10DLC
10DLC
Toll-free
Toll-free

Process & iteration

Three to four iteration rounds per surface with design and PM feedback before the work settled. The Figma file ended up split by surface, 10DLC, Draft Page Updates, Archive Popup, Research Addons, so each surface had its own tracked exploration history rather than getting buried in a single sprawling page.

Figma canvas with multiple labeled iterations of the 10DLC compliance surface.
Iteration breadth on 10DLC. Each labeled artboard is a discrete decision being explored, search layout, add-button placement, brand-rejected state, campaign-rejected state. Keeping iterations parallel (not stacked) made it possible to compare options side-by-side in design review.
Three iteration stages of the Drafts page: First → Rejected → Rejected Update with Action.
The Drafts iteration trail: First → Rejected → Rejected Update with Action. The third pass introduced the explicit recovery action, with an A/B between “With Buttons” and “Without Action Button”, the version with surfaced actions won because it removed a click and made the next step obvious.
Archive confirm modal
Archive confirm modal
Figma file pages
Figma file pages

Once the visuals were locked, I prototyped the final flows in code (working with Claude) so the handoff to engineering was a buildable spec, not a static file.That meant fewer rounds of “what did you mean here?” with dev, and the build closed faster than the previous campaigns redesigns had.

Impact

  • Support tickets dropped. Customers stopped opening tickets just to ask why a campaign was rejected, the answer was on the screen.
  • FDE cascade collapsed. FDEs stopped routing rejection questions through the messaging team.
  • Positive direct feedback from brands , they said the console finally made the regulatory landscape legible.
  • All three surfaces shipped. 10DLC, Campaigns, and Compliance are live in production.

Reflection

If I did this again, I'd spend more time estimating the problem before exploring solutions. The first two iterations on Campaigns were spent narrowing what the problem actually was, and in hindsight, a sharper framing up front would have gotten me to the two-pane layout in one round, not three. The lesson generalized for me: in regulated, multi-stakeholder products, time invested in problem framing compounds. Time spent iterating on the wrong frame doesn't.

Role: Led design across all three surfaces, flows, screens, and the systemic unification under the Compliance page. Prototyped final designs in code for engineering handoff.
Collaborators: Senior designers, engineering managers, product managers, and the Product Head of Messaging.
Stack: Figma, Claude for code prototyping.