Case Study · CARIAD · Volkswagen Group · 2022 to 2023

B2B App-Store Portals

Sole designer · B2B web portals · 3 portals · 8 brands

The governance layer for CARIAD’s in-car App Store, across three internal portals and eight VW Group brands. As the sole designer, I rebuilt the information architecture, five stakeholder journeys, a component system, and a hi-fi OEM Admin Portal. The approval pipeline ran about seven days, most of it manual handoffs, and shared state visibility removed them.

Enterprise UX Information Architecture Design System Multi-stakeholder Governance
Developer entry point: the My Apps empty state with an add-new-app call to action and a light and dark toggle
Developer entry point

Before any app reaches a car screen, three internal portals decide what happens to it. None of them had been properly designed. I rebuilt the governance layer end-to-end: information architecture, user journeys for five stakeholder types, a component system, and a hi-fi OEM Admin Portal covering app discovery, lifecycle management, and brand-level approval.

CARIAD, Volkswagen Group’s software subsidiary, was building an in-car App Store on Android Automotive OS. Getting a third-party app onto a driver’s screen meant passing through three internal web portals, across the eight Group brands (Volkswagen, Audi, Porsche, Škoda, SEAT, and more), with no shared tooling. I joined the Group App Store team as the sole designer on the portal redesign.

3
Internal portals
8
Vehicle brands
5
Stakeholder journeys

Three portals, none properly designed

For an app to reach a driver’s screen, it had to pass through three internal web portals: one where third-party developers upload their APK, one where the central team reviews it, and one where each vehicle brand makes the final call. None of those portals had been designed with users in mind.

The QA team tracked apps in Excel sheets. There was no shared view of where an app sat in its lifecycle. Reviewers couldn’t see what was in the pipeline. Brand approvers had no analytics. The legal complexity, GDPR consent, geo-blocking, automotive compliance, was buried in code with no UI affordance. Internally everyone called it the API admin tool. The brief was to turn a backend into a system three teams could use.

No official Figma access. The organisation was Axure-locked, and Axure couldn’t support the component library and dark-mode work the team needed. I negotiated a workaround in week one. Every design decision had to be defensible without industry-standard tooling.

Sole designer on the portal redesign

I joined as a UX design intern in the Group App Store team. After the first month I was the only designer on the portal redesign work. I led discovery, research synthesis, lo-fi, hi-fi, the component library, and the documentation handed to engineering.

What I owned

  • Discovery interviews and heuristic audit
  • Information architecture (3 portals)
  • User journey mapping (5 stakeholder types)
  • Lo-fi and hi-fi screen design
  • Dual-mode component library
  • Engineering handoff documentation

Who I worked with

  • Supervisor (design feedback, prioritisation)
  • Developers and architects (1:1 discovery, technical constraints)
  • QA team (test report workflow, lifecycle states)
  • Legal and compliance (consent, geo-blocking, GDPR)

Three teams, three jobs to be done

The three portals serve three distinct stakeholder groups with conflicting needs. One UI couldn’t serve all of them, so each portal had to be designed around its specific user.

DEV
Third-party developer
Portal
Developer Portal. Uploads APK, metadata, icons, categories, and legal docs. Waits for approval, then monitors install and uninstall stats.
Model
Familiar with mobile app stores. Expects similar tooling, and is surprised when fields like "Vehicle Install" appear without explanation.
Need
Visibility into where their submission is, what reviewers asked, and what to fix to get unblocked.
Failure
Submits incomplete metadata, waits weeks for a vague rejection, then emails the team for clarification.
REV
Central reviewer
Portal
Domain Approval. Reviews third-party submissions after automated tests pass. Approves, rejects, or sends back. Gates everything that reaches the brands.
Model
A QA mindset. Knows the technical pipeline deeply. Tracks state across many apps at once in Excel.
Need
Pipeline-wide visibility. Bulk operations. Test reports as first-class artefacts, not buried files in shared drives.
Failure
Loses track of which app is in which state and who handed it back, then reconstructs context every morning.
OEM
Brand admin
Portal
OEM Admin Portal. Final approval for their specific vehicle brand. Can approve, reject, delist published apps, or force-uninstall from vehicles.
Model
A brand and legal lens. Less interested in technical APK details; cares about compliance, market fit, and a curated brand experience.
Need
Confidence that central QA happened. Per-country legal toggles. Campaign tooling for brand-specific promotion.
Failure
Approves apps without reviewing because the portal gives no signal of what to look at. Misses geo-blocking gaps.

Discovery and an audit of the existing portal

There was no research budget and no access to OEM employees outside the company, so discovery had to come from inside: 1:1 conversations with developers, architects, and QA, plus a structured audit of the existing Developer Portal. That audit was the primary evidence source for the redesign.

The work ran in parallel tracks. I started low-fidelity on the Domain Approval portal first, an easier entry point that built team buy-in, then benchmarked Google Play for cars and the Apple App Store to inform the in-car Store surface. Alongside the redesign I also ran app quality testing on the test bench, exercising General App Behaviour, UI, Login/Logout, and Video Playback.

Early journey and flow exploration: a wide multi-lane map of the app submission path with sticky notes capturing open questions across draft, beta, staging and production
Discovery artifact · The submission path mapped end-to-end, open questions logged inline before any screen was drawn

The portals exposed the database without exposing the decisions. The problem was systemic. The redesign had to invert that and surface state, ownership, and next action on every screen.

The approval pipeline as a system

App approval pipeline: Developer Portal upload, automated tests, Domain Approval, OEM Portfolio Management, per-brand OEM Admin approval, then published in the brand store

App approval pipeline · Developer upload through review and brand-level approval to publish

Before designing any screen, I mapped the full app lifecycle as a system: who touches an app at each stage, what decisions they make, and what state the app sits in between decisions. A swimlane across developer, supplier (smoke and manual testing, then an APK validator report), CARIAD reviewer, and brand admin put a rough number on it: around seven days end-to-end, most of it manual handoffs. That map became the spine for every IA decision that followed.

Five stakeholders mapped end-to-end

I built journey maps for each role: third-party developer, internal group developer, central reviewer, brand admin, and global admin. The internal group developer path diverged in one telling way: submitting for Beta auto-approved, where a third party had to wait. Each map surfaced the open questions engineering hadn’t answered yet. "What is Generating Delta?" "Do five lifecycle stages need to match between the reviewer and the brand portal?" "When a brand approves, what state does the app move to in the other two portals?" "When a brand force-uninstalls, does the app disappear from cars?" These questions drove the design decisions that followed.

OEM Admin journey map: the brand admin receives portal access, views applications by sub-stage, and can approve, reject, delist or force-uninstall an app, with open questions on cross-portal state and force-uninstall behaviour logged on stickies
Example journey · The OEM brand admin, from portal access through approve, reject, delist and force-uninstall · Open questions logged inline

Key design decisions

  • Kanban for state visibility: Excel-based tracking gave no shared view of pipeline state. A Kanban exposed bottlenecks per environment in one glance.
  • Two Kanban views, one source of truth: Environment columns (Beta, Staging, Production) for brand admins; status sub-columns (In review, Submitted, Approved, Published, Generating Delta) for central reviewers. Different jobs, different lenses.
  • Test report as a first-class object: QA results were buried in shared drives. Promoting them to their own tab with search, favourites, and per-app history removed Excel from the loop.
  • Rejection reasons on the record: Rejections used to vanish into email. A timestamped evaluation history on each app, with the reason attached, meant a developer could see exactly why a build was turned down and who turned it down.
  • Component system before screens: No Figma library existed. Building primitives first, a shared set of component groups, was the only way to iterate on three portals in nine months.
  • Dark mode by default: Reviewers work long sessions, and reduced eye strain was a stated team ask. I built the token system dual-mode from day one.
Kanban board wireframe: environment toggle (All, Beta, Staging, Production) above status columns (In review, Submitted, Approved, Published, Generating Delta), with a left rail of lifecycle stages
Kanban concept · Environment toggle over status columns · The two-view decision, sketched before the hi-fi

On the in-car Store

In parallel, I contributed to the design of the in-car Store itself, the surface where drivers browse apps. I benchmarked Google Play for cars and the Apple App Store, then prototyped a low-fi concept screen. The portals exist to feed this surface, so understanding it shaped what the admin tools had to expose.

What I found, and the moves it drove

The findings came from two streams that ran the whole time: a structured audit of the existing portals, and the workshops and walkthroughs I ran with central reviewers and brand admins as the designs took shape. Each finding paired with a concrete move and the lifecycle state it touched.

No pipeline state visibility
Critical
Trigger
Reviewers and brand admins had no shared view of where an app was across Beta, Staging, Production, or Delisted. State lived in per-reviewer Excel sheets.
State
Excel as a substitute for UI: QA tracked state manually. Brand admins phoned reviewers to ask if an app had been approved.
Move
Kanban board with two views (environment columns, status sub-columns). The All Releases list became the second-tier deep dive once state was visible at the top.
Opaque field labels
High
Trigger
"Vehicle Install", "Garage Mode", and "Enable Service IDs" appeared with no explanation. A recurring 1:1 theme: developers asked QA what to enter.
State
The portal exposed internal jargon: Field labels reflected backend variable names, not user concepts.
Move
Hover-state info pattern (eye icon) for non-obvious fields. Clearer labels where a rename was possible. Margin notes on the design file flagged labels needing a product-side rewrite.
Search detached from results
Medium
Trigger
The search field sat far from the list it filtered. Users scrolled past results to reach it, then scrolled back to verify the filter took effect.
State
Search felt broken: No confirmation it had filtered, so users re-ran queries to be sure.
Move
Search anchored as a persistent header on the list view. Filter chips below show active filters with a one-click clear.
Dead nav items
Medium
Trigger
"Manage API Clients" appeared in the nav but did nothing. No one on the team owned it.
State
Trust erosion: If one nav item is dead, users start checking whether the others work.
Move
Audited the full nav with the team. Removed dead items, deferred ownership-unclear features behind a Coming Soon state with an explicit timeline.
Invisible language gaps
Medium
Trigger
When app metadata was missing for one of five languages, the portal didn’t indicate which language was incomplete.
State
Half-localised apps shipped without anyone realising: Brand admins received apps with English metadata in Spanish markets.
Move
A per-language completeness indicator on the app detail tab. The submit button blocks when required languages are incomplete, with an explicit "Missing: French, Portuguese" callout.
Approval ownership unclear
High
Trigger
Three teams in the chain (central reviewer, OEM portfolio, brand admin) but no visible signal of who currently owned the decision.
State
Apps stalled with no clear owner: "Whose turn is it?" was a recurring question.
Move
4-eye approval pattern with explicit ownership: each card shows Approved by, Pending from, and Rejected by. Reviewers always see who is currently blocking.

Validated with the people who would use it

Two of the three user groups sat inside the company, so I could test the work with them directly. Central reviewers and brand admins walked the flows in small workshops and internal sessions, and what they flagged fed straight back into the designs. The group I couldn’t reach was third-party developers, who sit outside CARIAD; validating with them is the gap I never closed.

What the sessions surfaced

  • Reviewers and brand admins reviewed the flows in workshops and internal meetings; I worked their feedback straight into the proposals.
  • No rework was requested at the structural level through the full handoff. The information architecture and lifecycle model held up under review.
  • The in-car Store concept work, running in parallel, used the component library as its source of truth.

A component system before screens

No Figma library existed inside the organisation when I started. Three portals, nine months, and a single designer meant I couldn’t build screens linearly. I built the primitives first, a set of reusable component groups, then composed screens from them. I built every dark-mode token, state variant, and dropdown once and reused it across all three portals.

What the library covers

  • Navigation primitives: Menu, Item from Menu (5 states), Dropdown Menu item, Header item (4 hover and selected states), Header.
  • List and data display: Item listing (2 states), Card – Board (2 states), Tabs – App page (6 tab variants), Searchbar (2 states), Tag.
  • Approval and state UI: 4-eye approval (Approved, Pending, Rejected), Checkbox (2 states), Number of subitems (6 counts).
  • Form and filter primitives: Input field, Icon List (4 types), Icon Hover (2 states), Category Filter (4 highlight states).

Why this mattered

  • Iteration speed: Once primitives existed, screens took a fraction of the time. The OEM Admin hi-fi came together in roughly five weeks because the library underneath was already done.
  • Consistency across portals: The Developer Portal and Domain Approval prototypes shared the same library. Three portals, one visual system, half the maintenance cost.
  • Engineering handoff: Engineers got a one-to-one component map. Variants in Figma matched the prop API we proposed for the front end, which cut handoff back-and-forth.

One system behind every screen

The OEM Admin Portal hi-fi, composed from the component library. The whole portal was designed iteratively, in a continuous back-and-forth with developers and stakeholders, so the decisions and the system evolved together. What follows is a representative sample of that work, not the full set; each screen is annotated with the decision it represents, not what it looks like.

OEM Admin Portal login screen with SSO entry and loading state
SSO entry · Loading state designed to avoid blank screens during the auth handshake
My Apps empty state: developer dashboard with an add-new-app call to action and light/dark toggle
Developer entry point · Empty state with one clear next action
All Releases list view: sortable table of apps with icon, publisher, version, and lifecycle state
Replaces the Excel sheet · Sortable table · Light and dark mode from one component set
App detail submission screen for a single app, split into tabs: technical info, metadata, release, media, legal, licensing, rollout, additional and review, with APK upload and cluster targeting
One app, tabbed submission · Technical, legal, licensing, rollout split into stages · APK upload and cluster targeting
Campaigns calendar view for scheduling brand-specific app promotion
Calendar view · Brand campaign scheduling · Pattern borrowed from CMS tooling
Approve and reject flow showing the 4-eye approval pattern with sign-off ownership
4-eye approval surfaced explicitly · Reviewer sees who has signed off and what is blocking

What I delivered, and what it changed

  • OEM Admin Portal hi-fi: Login, my apps, all releases, app detail, campaigns and the approval flow among the screens, in light and dark mode, fully composed from the component library.
  • A dual-mode component library: Reused across all three portals. The first shared design system the Group App Store team had access to.
  • IA and approval pipeline maps: One canonical diagram answering "where does this app go next?", adopted as the shared reference by every team touching the pipeline.
  • Five end-to-end journey maps: One per stakeholder type, with open questions surfaced so product could close them.
  • Audit findings and redesign moves: A working document mapping each usability problem to a specific redesign decision and lifecycle state.
  • Atomic UX Research synthesis of legal and product findings: Consent, geo-blocking, payment, and update policy organised as design opportunities.

The approval pipeline ran about seven days end to end, most of it manual handoffs. The redesign gave every team shared visibility of pipeline state, removing those handoffs.

What I’d do differently

Find a way to talk to real users

The biggest gap in this work was that I never sat with a third-party developer, a central reviewer, or a brand admin while they tried to do their job. I told myself this was an access constraint, but in retrospect there were routes I could have negotiated: shadowing QA during test bench runs, a screen-share session with one developer team, even a remote walkthrough with a brand approver. I would push harder on that today, and I’d push earlier.

Push back on the five-stage lifecycle

I designed around Beta, Staging, Production, Deleted, and Delisted because that’s what engineering described as the existing pipeline. Looking back at my own journey maps, the open question "are five stages necessary?" sits on a sticky and is never resolved. A designer in a system this complex shouldn’t only render the existing model; the job is to challenge it. I rendered when I should have challenged.

Resolve the vocabulary, not just the screens

My audit caught the system using Delete, Revoke, Cancel Submission, and Delist almost interchangeably, four words for overlapping destructive actions, and a sticky note asking which meant what. I flagged the confusion but never delivered a resolved vocabulary the three portals could share. In a multi-stakeholder system, naming is interface: a content and state model that pinned each term to one action would have removed a whole class of user error. I’d treat that terminology as a deliverable next time, not a footnote.