Bengaluru, India
What RCS Is
Onboarding
Building a Bot
The Bot Dashboard
Campaigns and Billing
The Review Console
The System Underneath
Platform Evolution
Lessons
FAQ
Try it live
Work
/Case study: RCS Portal
UX Case StudyProduct DesignB2B SaaSDesign System

Gupshup RCS Portal: A Self-Serve Console for Launching Brand Messaging Across Carriers

Mohammed Zabeeh·September 12, 2022·19 min read
Gupshup RCS Portal: A Self-Serve Console for Launching Brand Messaging Across Carriers

An end-to-end product design for Gupshup's RCS platform: the developer console where a brand signs up, builds a verified bot, tests it on real devices, launches it across carriers in 37 countries and runs campaigns, plus the internal review console that verifies, approves, and governs every one of those bots.

120+
Screens designed
2
Consoles
37 countries
Coverage
4
Bot lifecycle stages
Client
Gupshup
Role
Product Designer
Timeline
2022
Type
Dashboard
Tools
Figma, Auto Layout, Design System, WCAG AA +1

What RCS Is

RCS is the upgrade to SMS. Instead of 160 grey characters from an unknown number, a verified brand sends rich cards, carousels, buttons and images from a name and logo the carrier has vouched for. It is the channel behind the branded, blue-checkmark business messages in your default messaging app. The catch is everything that has to happen before that first message goes out. A bot has to be created, branded, submitted for verification, validated against a carrier's technical signature, approved, then launched on each carrier individually, in each country, each with its own pricing and rules. Google's RBM and the GSMA's RBM are different API signatures. A bot live in India is not automatically live on AT&T in the United States. Gupshup sits in the middle of that complexity, and the brief was to turn it into something a developer could drive alone: sign up, build the bot, test it, launch it, watch the campaign land. That means making a genuinely multi-stage, multi-party, regulated workflow feel like a product. The spine is a four-stage bot lifecycle. Every RCS bot moves through four states, in order, and they never reorder: Bot Creation, Development, Verification, Launch. That sequence became the stepper at the top of the bot dashboard, the reason "My Bots" needed a Status column rather than a live/offline toggle, and the reason there are six dashboard layouts, one per in-between state, so a bot that is "Verification in process" reads differently from one at "Launch Complete." Anchoring the design to a lifecycle instead of a sitemap is the single decision that shaped everything downstream. Navigation, empty states, status badges, what is editable and what is locked: all of it keys off where the bot sits on that line.
The My Bots console listing bots with status, brand verification, ratings and reviews.

Onboarding

Getting a developer from curious to set up is its own small funnel, and every extra field is a place to lose them. The onboarding splits in two: a near-frictionless front door, and a heavier details step that arrives only once the user is already invested. The signup screen tells a developer what they are signing up for in a single breath. The headline does the lifting: "Get access to RBM APIs to send and receive RCS messages to and from users in over 37 countries." The form is deliberately small: email, a terms checkbox, create account. Asking for a company address and a timezone on the first screen is how you lose a developer who just wanted to see if the thing is real.
The signup screen with a clear value proposition and a minimal account creation form.
The heavier ask arrives only after email verification, and it is framed honestly. Personal details, then business details, split into clearly labelled groups. Phone number carries an inline Verify action and a sensibly defaulted country code. Country, state, city and timezone are dependent dropdowns. None of it is fun to fill in, so the design keeps the "why" visible at the top and makes it feel like a short, structured form rather than a wall.
The Complete your details form, grouped into Personal Details and Business Details.

Building a Bot

The "Submit Your Bot Details" flow is the densest screen in the product, and it had to stay legible while carrying regulated weight. This is where a brand's public identity gets defined, so almost every field has downstream consequences. The bot name has a 40-character ceiling because that is the width of a phone's conversation header, and the helper text says so, turning a limit into context. Brand colour is validated for contrast, not just picked: choosing a colour computes its contrast ratio against white and warns in line when it falls below 4.5:1, because once the brand launches that colour is on every message header. Accessibility is a gate at the moment of the decision, not a bolt-on. The form speaks the platform's real vocabulary: Transactional versus Promotional, the GSMA RBM API versus the Google RBM API, a webhook that "needs to be active and should respond with a 200 OK to POST requests." Helper text teaches a first-timer without slowing an expert.
The Submit Your Bot Details form with branding assets, contrast-validated colour and API selection.
Universal RCS gets a live preview. RCS does not reach iPhones and older Android devices, so URCS is an SMS fallback that gives non-RCS users an RCS-like experience. Enabling it reveals an SMS content field beside a phone mockup that previews exactly what the fallback recipient will see. For a brand that is the difference between reaching 80% of a list and reaching all of it. The flow is a two-step stepper, RCS Bot Details then Carrier Selection, so the load is chunked rather than dumped on one page. Carrier Selection is its own interface problem: a bot can launch on dozens of carriers across dozens of countries, so the picker is a two-pane filter, countries with flags on the left, a searchable, alphabetised list of carriers on the right, selected ones as removable chips with a running count. Helper text removes the pressure: "you can always add more to this list at the time of launch."
The Carrier Selection step: a country filter beside a searchable carrier list, with selected carriers as chips.
Templates are what the bot actually says. The editor pairs a form with a live phone preview so the author always sees the message taking shape as a real RCS card. A template can be a single rich card or a carousel, so cards live behind tabs and the preview renders them side by side exactly as a recipient would swipe through them. Text fields offer +Add Variable so a template is personalised per recipient rather than rewritten per send. Below the cards sit suggestion buttons, the interactive heart of RCS: each has a Type of Action and the form reshapes to match it, an Open URL asks for a URL, a Dial asks for a number, a Simple Reply just needs its reply text. The same fallback discipline reappears with a "Do you want fallback SMS?" toggle.
The Add Template editor: a rich-card carousel form beside a live phone preview.
Verification is where RCS stops being normal SaaS and becomes a compliance process. The "Submit Bot for Verification" flow is a four-step stepper: Bot Details and Experience, Brand Details, Business Verification, Payment. The first step alone shows how much carriers demand before letting a brand into the channel: screenshots and a demo video, a first-message URL conforming to a strict opt-in pattern, a tester-invite URL, and plain-language questions that are really policy gates, how you obtain opt-in, what triggers messages, what the bot sends when a user texts STOP. Every field carries helper text explaining why the carrier needs it, because a developer who understands the requirement passes review first time far more often than one guessing. Listing a launched bot in the public store is a separate, lighter submission, kept distinct so the heavy compliance step is not confused with the marketing one.
The four-step Submit Bot for Verification flow asking for screenshots, demo video and opt-in handling.

The Bot Dashboard

A single dashboard layout had to represent a bot at any point on the lifecycle, from "creation in process" to fully launched and listed in the bot store. The lifecycle stepper sits up top so state is the first thing you read. Below it, status cards each answer one question. API Information gives the Bot ID and Client ID with a direct link into documentation. Verification Status carries a hard truth in soft language: to change a verified bot's brand or launch information, you contact support, and the screen says so rather than letting a user discover it through a failed edit. Launch Status reports the concrete fact that matters, "launched with 2 carriers," with Suspend and Delete kept present but quieter. Bot Store Listing turns the last mile into a single call to action. Beneath the status row sit an RCS Message Templates table and a Test Devices table with a real "No Test Devices" empty state, a better first experience than an empty grid that looks broken.
The per-bot dashboard with the lifecycle stepper, API info, verification and launch status, templates and test devices.
The Change-Under-Request model keeps a live bot both editable and governed. A live, verified bot is a regulated public identity, so you cannot let someone quietly change its brand name or launch settings, but you cannot freeze it forever either. When a user edits a live bot, the change does not take effect immediately. It becomes a request with its own status, Pending or Rejected, and its own submitted date, sitting in a second "Change Under Request" table on My Bots alongside the current live version. The live bot keeps running on its approved configuration while the proposed change moves through approval separately. What is live is live, and what I have asked to change is tracked over here, with a status I can watch. Testing makes the on-device check the natural step, not the skippable one. A user registers test devices, picks a template and sends it. The interesting work is in variables: the flow handles a template with no variables, one with variables filled in by hand, and one driven by an uploaded sheet for bulk testing, with a downloadable table to structure the sheet and a preview of the filled result before anything sends. It is the same discipline as the contrast check: catch the problem at the cheapest possible moment, before a message reaches a single real person.
The test flow sending a template to a registered device with variable substitution.

Campaigns and Billing

Campaigns are the point, and templates and bots are the setup. The campaign list is a scannable table, name, run time, campaign ID, bot, template, status, with scheduling that supports both Run Now and Run Later, and confirmation dialogs that distinguish the two so an immediate send is never an accident.
The My Campaigns table listing campaigns with run time, IDs, bots, templates, status and report links.
The engagement report makes a dense pile of delivery telemetry tell a story. RCS analytics are genuinely complicated: messages split across RCS and the URCS fallback, then into sent, delivered and read, then responses split again by channel, then conversion on top. The report reads as a funnel top to bottom: total messages on a single stacked bar of RCS and URCS, then delivery and read rates per channel, then responses and button-level interactions, then conversion in a donut. Two details I insisted on. Failure is shown honestly and specifically: not a bare "Failed" but "Campaign reached 66% completion before Failure," naming the reason, "Error in Payment Processing," because a status with a cause is something a user can act on. And every percentage carries its absolute number, "Delivered 15,000 (75%)," which is the difference between a dashboard that looks good in a screenshot and one a user can reason about when a figure looks wrong. The report ships in three variants for the different delivery mixes, because the funnel genuinely differs.
The Campaign Engagement Dashboard showing delivery funnels across RCS and URCS, responses and conversion.
RCS pricing is a matrix, not one number: per carrier, per country, per message type, split between domestic and international rates, in local currency. Rather than bury it in a PDF, the Pricing screen presents carriers as a browsable grid of recognisable logos, and selecting one reveals its rate table, Rich OTP, Single Message, A2P Conversation, P2A Conversation, plus setup and annual fees, each with domestic and international columns. The user picks carriers in the same place they understand the cost, which is exactly where a launch decision gets made. Billing then mirrors that structure with a graphical view, so the spend maps directly to the carriers and message types chosen. The model stays consistent from pricing a launch to reading the invoice.
The Pricing screen showing carriers as cards with a per-carrier domestic and international rate table.

The Review Console

A second console behind the developer side makes its "Pending" and "Rejected" statuses mean something. This is the one Gupshup's reviewers and carrier-relations staff use, and designing both halves was the only way the governance model could actually work, because a status is only as honest as the workflow that sets it. The admin home is built around queues, not a single list: Submitted Bots, Pending for Approval by Carrier, Approved Bots and Rejected Bots, each its own table, so a reviewer always knows what needs their attention versus what is waiting on someone else.
The admin Bots review screen with Submitted, Pending, Approved and Rejected queues and an SLA due-date column.
The Due column puts the clock on the screen. Each pending bot shows how long until its review is due, counting down and turning red when it goes overdue. A review process without a clock quietly stalls while the brand on the other end has no idea why, so putting the SLA on the screen makes the wait a shared, visible problem. The same queue pattern repeats for Bot Launch, Bot Store Listing and Template Verification, so a reviewer learns one screen and works all four. Opening a submission gives the reviewer the entire bot read-only, exactly as the developer built it: bot type, branding, colour, contacts, the RCS API and webhook, the URCS preview, and the full carrier list, with logo and banner downloadable to check assets against carrier guidelines. The reviewer sees precisely what the developer sees, keeping the conversation grounded in one shared artefact rather than two divergent ones.
The Bot Verification Details screen showing the full submission read-only with Recommend and Reject actions.
The heart of the console is the conversation, not the Recommend and Reject buttons. A review is rarely a clean yes or no. Usually it is "fix the logo and resubmit." Each submission carries a ticketed comment thread with its own ID, where reviewer and developer talk in line, attach screenshots and resolve issues against the actual submission. This thread is the real mechanism behind the developer side's Change-Under-Request status: what looks like a quiet "Pending" on the customer's screen is this conversation happening on the reviewer's. Every decision is kept in history so the trail of who approved what, and why, never gets lost. Role-based access decides who is allowed to press Reject. Reviewers and customers are teams, so an admin invites users by email and assigns a permission level (View or Edit) and a role (Developer, Product Manager), with the whole invite lifecycle, pending, active, resend, edit, remove, designed out. It is the unglamorous plumbing the rest of the governance story needs to be safe.
The threaded comments modal on a submission, a ticketed conversation with an attachment.

The System Underneath

A product this size only holds together if it is built from shared parts. The console runs on a component library: one input with its label, helper and error states, one dropdown, one table with sortable headers, status pills, row actions and pagination, one stepper, one set of confirmation and success dialogs, one status-badge vocabulary used identically on every screen. That consistency is what lets the product carry so much complexity without feeling heavy, and it is what lets the developer console and the admin console feel like one product rather than two. A status pill means the same thing on My Bots, on the bot dashboard, on the campaign list and in the reviewer's queue. Once a user learns one surface, they have learned them all.
The Manage Users screen with role-based View or Edit permissions and Developer or Product Manager roles.

Platform Evolution

Lifecycle
The four-stage spine
Naming the bot lifecycle, Creation, Development, Verification, Launch, before any screen. It became the backbone for navigation, status, locking, and the six dashboard states.
Onboarding
Self-serve front door
A near-frictionless signup, with the heavier personal and business details deferred until the developer is already invested.
Build
Bot creation, templates, testing
The dense bot-creation form with contrast-gated branding and a Universal RCS preview, the rich-card and carousel template editor, and on-device testing before a rupee is spent.
Governance
Verification and Change-Under-Request
The four-step carrier-verification submission, plus the model that keeps a live bot both editable and governed by tracking proposed changes alongside the approved version.
Campaigns
Scheduling, reporting, billing
Run-now/run-later campaigns, the top-to-bottom engagement funnel across RCS and URCS with absolutes beside every percentage, and the carrier pricing and billing matrix.
Admin
The internal review console
The second console behind it: reviewer queues with SLA due-date clocks, read-only submissions, ticketed comment threads, and role-based access that make the developer-side statuses real.

Lessons

  1. Design the lifecycle before the screens. Naming the four bot states up front gave every later screen a backbone. Navigation, status, locking and empty states all fall out of "where is this bot on the line." Starting from a sitemap instead would have produced a pile of pages with no spine.
  2. Surface the hard truths, do not hide them. Webhooks needing a 200 OK, verified bots being locked, the GSMA-versus-Google API choice. These are real and unavoidable. Helper text turns each one from a trap into a lesson.
  3. Catch problems at the cheapest moment. Contrast validated at colour-pick time. Templates tested on real devices before a campaign. A confirmation that distinguishes Run Now from Run Later. Every one moves an error to where it costs the least.
  4. "Editable" and "governed" are not opposites. The Change-Under-Request model let live bots be both, backed by a reviewer with a queue, an SLA clock and a comment thread. The trick was making the live version and the proposed change visibly separate, each with its own status.

FAQ

Rich Communication Services is the upgrade to SMS: verified brands send rich cards, carousels, buttons, and images from a named, logo'd, carrier-approved sender, with delivery and read receipts. It is the channel behind branded business messages in your default messaging app.

An RCS bot is a regulated public identity. It has to be created, branded, verified, validated against a carrier's API signature, approved, and then launched on each carrier and in each country individually. The console's job was to make that real multi-stage, multi-party process feel like a single coherent product rather than a paperwork maze.

RCS does not reach every device, iPhones and older Android phones do not have it. URCS is an SMS-based fallback that gives those users an RCS-like experience, so a brand reaches its whole list instead of only the RCS-capable slice. In the design it is a first-class option with its own live preview on the create screen and its own line in every engagement report.

The Submit Your Bot Details form. It defines a brand's public identity, so it carries branding assets, a contrast-validated colour, API and webhook configuration, multiple contact methods, and the URCS fallback, all on one surface. Keeping it legible while it stayed honest about its technical weight was the core challenge.

Through the Change-Under-Request model. Editing a live, verified bot creates a tracked request with its own status rather than changing the running bot immediately. The approved configuration keeps serving while the proposed change moves through approval separately, shown side by side on the My Bots screen.

Yes, and it is half the work. Behind the developer console is an internal review console for Gupshup's own reviewers: bot, brand, launch, listing and template queues with SLA due-dates, a read-only view of each submission, a ticketed comment thread with attachments where reviewer and developer resolve issues, Recommend / Reject / history actions, and role-based user management. It is the engine that makes the developer side's Pending and Rejected statuses real.

A shared component library, one input, one dropdown, one table pattern, one stepper, one set of dialogs, and a single status-badge vocabulary used identically everywhere, across both the developer and admin consoles. Learn one surface and you have learned them all, which is what lets the product carry this much complexity without feeling heavy.

Design Skills

Information ArchitectureUser FlowsInteraction DesignData VisualisationDesign SystemsAccessibility (WCAG)Prototyping

Tech Stack

FigmaAuto LayoutDesign SystemWCAG AAPrototyping