Information Architecture · RBAC · E-commerce Development

ART
Role-based membership platform.

Designing a dual-audience platform for Associazione Ristoratori Torino: one website, two completely separate experiences, a membership system built on role-based access control.

ART project hero

Role

Product Designer
Designed and built the entire membership experience: access logic, technical implementation and troubleshooting.

Team

Team of 3.
Collaborated with the team on early research, sitemap, and wireframes.

Duration

3 weeks

Tools

Figma · WordPress · Stripe · WooCommerce · Simple Membership

Key challenge

Two opposing user types, one coherent system

Year

2025

The brief in one sentence

"ART needed a platform that sells restaurant discount packages to tourists and sells membership plans to restaurateurs: two audiences with opposite goals, sharing the same domain."

The real challenge was designing a navigation system that doesn't confuse a tourist looking for a weekend deal with a restaurateur trying to manage their membership, without forcing either to wade through content meant for the other.

A single navigation or homepage would have created cognitive overload and a broken conversion funnel for both targets. Tourists don't need to know about membership tiers. Restaurateurs don't need to see weekend deals. The IA had to make the split invisible while keeping the whole system navigable from either side.

Problem statement

How might we serve two audiences with conflicting needs on the same platform without making either feel like they've landed in the wrong place?

Before touching the IA, we mapped what each user actually needed to do, and how different those jobs were.

Consumer — Tourist

Weekend visitor to Turin

Arrives from Google or a friend's recommendation. Wants to browse restaurants, buy a discount package, get in and out fast. Has zero interest in ART as an organization.

Browse affiliated restaurants by type or area

Purchase a "Weekend Sapori Torino" package

Complete checkout without creating an account first

Find events and book a table

Business — Restaurateur

Turin restaurant owner

Arrives with a specific goal: join ART, get visibility, access consulting services. Evaluates membership tiers on cost versus benefit. Needs to upload restaurant data and manage their profile after subscribing.

Compare membership tiers (Free / Base / Premium)

Subscribe and pay securely via Stripe

Upload restaurant data to generate their public listing

Access tier-gated services (consulting for Premium only)

The IA decision that defined the entire project was treating the two audiences as two separate sites sharing one domain with a single, low-friction switch between them.

The consumer homepage is the default entry point for most visitors. Depending on the search intent, however, Google may surface either the consumer or the business homepage. Each experience includes a persistent link to the other in the top-right corner ("Sei un ristoratore?" on the consumer side and "Sei un turista?" on the business side). Once users switch, the navigation changes completely: different voice, different color (red vs yellow), and different CTA hierarchy, so the user always knows which side they're on.

Simplified sitemap — dual track structure

ART sitemap — consumer and business tracks

I proposed splitting the two experiences completely rather than merging them into shared navigation, and the team validated it during wireframing, iterating on the first sitemap.

ART wireframes

First wireframes of the 10 main screens — consumer and business tracks.

We worked across three broad phases: IA and wireframes first, then UI and membership logic, then technical implementation and edge-case resolution, though in practice the last phase fed back into the first more than once.

01

IA mapping and dual-track wireframes

We mapped the full sitemap for both tracks, identifying shared pages (account, assistenza) and exclusive ones (diventa socio, dati ristorante, consulenze). Then we wireframed the 10 key screens: homepage consumer, homepage business, product page, membership page, checkout flow, and the account page both with and without an active membership.

Artifacts: sitemap · 10 wireframes · user flow diagram
02

RBAC design — defining what each role can see and do

I designed the full access matrix: 5 user states (guest, registered tourist, free member, base member, premium member) against every gated feature. Key decision: consulting forms accessible to Premium only, restaurant data upload open to Base and Premium, and the newsletter restricted to paying members: a deliberate filter to generate qualified leads instead of spam signups.

Artifacts: access matrix · role-state diagram
03

UI design and membership page optimization

High-fidelity mockups for all key screens. For the membership page specifically: removed the extra click to see plan benefits, so all tiers are compared on a single page; added social proof through testimonials and an FAQ to cut down on support requests; and visually flagged the Base tier as "most sold": a deliberate nudge for budget-conscious small restaurants.

Artifacts: mockups · membership page before/after

Before

Membership page before

After

Membership page after
04

Technical implementation and critical issue resolution

Built in WordPress with WooCommerce, Simple Membership, and Stripe. Along the way I ran into three critical technical blockers, each one meant digging through documentation, tracking down the actual root cause, and landing on a solution that wasn't obvious from the start. Details below.

Artifacts: live WordPress site · 3 documented critical resolutions

Every decision on this project came down to the same tension: making the membership funnel as frictionless as possible for restaurateurs, without opening the system to unqualified or fake signups.

Decision 01 — Stripe over PayPal

Chosen

Stripe as the sole payment provider

Fewer clicks to complete payment, lower commissions on European card transactions, better subscription management through the Stripe customer portal, and a cleaner integration with Simple Membership.

Why → Research showed PayPal adds 2 extra steps for users without an account — a significant drop-off risk at the most critical point of the conversion funnel.

Considered

PayPal + Stripe dual option

Offering both as payment options, the way many e-commerce sites do.

Why not → More options at checkout increase decision fatigue and abandonment. For a B2B subscription, one clear, trusted path is better than choice.

Decision 02 — Registration only after payment

Chosen

No free registration — purchase or checkout to create an account

Restaurateurs select a plan, including the free tier, before an account is created. Tourists complete a purchase first. No open registration form anywhere on the site.

Why → Requiring at minimum a credit card for the free tier eliminates fake email signups and ensures newsletter subscribers are genuinely interested — a higher-quality lead database from day one.

Considered

Open registration with email verification

A standard registration form open to anyone, with email verification before unlocking any gated content.

Why not → Creates a pool of low-intent users that pollutes the member database and increases support load for no business value.

Decision 03 — Stripe customer portal for subscription management

Chosen

Delegate subscription management to Stripe's hosted portal

Cancellations, upgrades, and billing updates are all handled on Stripe's side through a secure link. A "Gestisci abbonamento" button on the account page sends the user there via an email magic link.

Why → Building custom cancel/upgrade flows in WordPress would have created security risks and maintenance overhead. Stripe's portal is PCI-compliant and handles edge cases (failed payments, prorations) automatically.

Considered

Custom cancel and upgrade pages in WordPress

Building dedicated pages inside the site for every subscription management action.

Why not → Would require handling edge cases manually (failed renewals, mid-cycle upgrades, refunds) — complexity the project scope and the client's technical capability couldn't support.

The hardest part of this project wasn't drawing the interface, it was the three technical blockers I hit during implementation, and each one turned into a UX question as much as an engineering one. A €0 product breaking Stripe's checkout wasn't just a bug to patch; it forced me to rethink what a free-tier signup should actually feel like. Here's how I worked through each one, alone.

01

Stripe "Buy Now" can't process €0 products

Payment · Stripe API

The problem: The free membership tier needed to go through Stripe for consistency (so the user still creates a payment profile). But the standard Stripe "Buy Now" button throws an error when the product price is €0.

How I resolved it

Identified that "Stripe Buy" is for one-time payments only — switching to "Stripe Subscription" allows €0 recurring plans
Created the free product in Stripe's dashboard with a recurring €0/year price
Hit a second error: the Price ID existed in live mode but I was using a test key — had to recreate the product in test mode to get a valid test Price ID
Tested the full signup flow end-to-end, including the post-payment registration email
Result: Free tier signup works through the same Stripe flow as paid tiers — consistent UX, and every member (including free) has a Stripe customer profile from day one, making future upgrades seamless.
Stripe dashboard in test mode showing the membership products
02

WooCommerce and Simple Membership don't share an account page

Plugin integration · PHP

The problem: WooCommerce has its own "My Account" page. Simple Membership has its own separate member area. A user who subscribes ends up with two disconnected account spaces — confusing and unbrandable.

How I resolved it

Researched WooCommerce documentation — found that custom "endpoint pages" (sub-sections like Orders, Addresses) can be added programmatically
Used WPCode Lite to add a custom PHP snippet that registers a new "Membership" endpoint inside WooCommerce's account nav
Populated the endpoint with Simple Membership shortcodes, conditionally rendered: subscribers see their status, expiry, and a manage button; non-subscribers don't see the tab at all
Flushed permalinks — the new section appeared correctly in the account sidebar
Result: One unified account page. A restaurateur sees their WooCommerce orders and their membership status in the same space, with no "you don't have access" messages visible to users who don't need that section.
Account page with Membership section integrated
03

Restaurant data submission couldn't handle file uploads

Form plugin · File handling

The problem: Base and Premium members need to submit their restaurant data (name, hours, address, photos) to appear on the consumer-facing listings. WP Forms — the first plugin I tried — doesn't support file uploads in the free tier.

How I resolved it

Evaluated alternatives: Gravity Forms (paid), Ninja Forms (free tier lacks file upload), Contact Form 7 with additional plugin (fragile integration)
Chose a dedicated form plugin with native file upload support and Simple Membership gating compatibility
Protected the entire page with Simple Membership so only Base and Premium members can access the form — guests and free members see a "members only" message with a CTA to upgrade
Result: Restaurant data flows directly into the site admin without email handling — scalable to dozens of members without creating an unmanageable inbox. The gating ensures only paying members can create listings.

The project delivered a fully functional dual-audience platform, working payment flows, role-based access, and a unified account experience, completed in 3 weeks, with the membership system designed and built solo.

3

Membership tiers fully operational — Free, Base (€50/yr), Premium (€250/yr) — each with correct access gating

5

User states designed and tested — guest, registered tourist, free member, base member, premium member

3

Critical technical blockers identified, root-caused, and resolved independently, without external support.

The most valuable part of this project was learning that reading documentation and working through technical constraints systematically is itself a design skill.

Da Bianca cover

Next case study

Da Bianca

Rebranding a 40-year-old family restaurant from zero digital presence to an omnichannel ecosystem.

View project