Case study 02 · Sidewalk.ai6 min read

Support requests,
finally in one place.

Sidewalk is an AI-powered SaaS for residential real estate agents. Its support requests arrived over email, Slack and WhatsApp, spread across channels. I designed the ticketing module that brought them into the product, where every conversation stays with its ticket.

Role
Product designer
Team
Founder, engineering team
Scope
Support ticketing module
When
2023 – 2024
SidewalkAdmin
UsersTicketsMessages
YO
Tickets
128 tickets
•••
NumberReported byAssigned toDateStatusPriority
12090JLJordan LeeAgentSRSam RiveraSupportToday 1:53 AMNewMedium
12091JLJordan LeeAgentAKAlex KimSupportYesterday 11:53 AMQueuedLow
12092SRSam RiveraUnknownRSRiya ShahSupportFriday 1:53 AMIn progressHigh
12093AKAlex KimUnknownCIChris ItoSupportThursday 1:53 AMIn progressHigh
12094RSRiya ShahAgentTRTaylor ReedSupportMon 11:53 AMIn progressHigh
12095CIChris ItoAgentSRSam RiveraSupportSun 10:55 AMClosedLow
12096MDMorgan DiazAgentAKAlex KimSupportSat 4:50 PMClosedHigh
12097DFDana FoxAgentRSRiya ShahSupportFri 9:45 AMQueuedMedium
12098NPNoah ParkAgentCIChris ItoSupportThu 10:55 AMIn progressMedium
12099TRTaylor ReedAgentRSRiya ShahSupportWed 4:50 PMPendingMedium
DetailsMessages
Messages32 itemsSRYO
Listing pageA short preview of the shared page.example.com
YO
1:22 pm
Property detailsA short preview of the shared page.example.com
YO
1:22 pm
SR
Can you share the quote for the plumbing service?
1:22 pm
QUOTE_SERVICE.pdf9.7 MB
YO
1:23 pm
Type a message
Ticket 12092 · assigned · In progress

The ticket queue and an in-ticket conversation, rebuilt from my Figma file. All names and messages are placeholders; Sidewalk is under NDA.

The design foundation

The product lived in Adobe XD. It had to become a workspace.

I joined a product that already existed. Its design files were in Adobe XD, and I moved them into Figma. The import came through, but not in a form anyone could keep designing in: most elements arrived fragmented and poorly organised, as loose shapes, paths and layers rather than editable text and components.

Before I could design anything new, I rebuilt the file so the next person to open it could find, edit and reuse what they needed.

01Fragmented shapes and outlined type turned back into editable text and real elements.
02Vector paths, strokes and icons redrawn cleanly.
03Widgets and repeated elements grouped into components.
04Every layer named and nested, so structure matches what you see.
Before · as imported
Layers
Group 2381
Group 2380
Rectangle 1147
Path 6612
Path 6613
Vector 212outlined text
Mask Group 41
Image 18flattened
Rectangle 1148 copy 3
Path 6630
Group 2379
After · rebuilt
LayersAssets
Tickets / Ticket open1440 × 900
Navigation / Top barActive=Tickets
Tickets / Filter panel
ContentAuto layout
Page header
Table / Header
Table / RowState=Default
Table / RowState=Open
Ticket drawerMode=View
Card / Ticket info
Card / Subject
Card / RequesterLinked=True
ButtonKind=Text
Table / RowCategory / ComponentState=OpenVariant propertyContentLayout frame, named by role

Left: what an XD import typically looks like (layer names are illustrative). Right: a rebuilt ticket screen, named by the library’s convention.

Imported · illustrative
Tickets

Vector 212 · outlined shapes, no font, can’t be edited or restyled.

Rebuilt
Tickets

Text · Roboto Medium · a real text layer, ready for type styles.

File architecture

Structured like a design system, not a folder of screens.

I split the file into a library and the work built from it. Foundations and components come first; each product module is assembled from them in its own section. One naming pattern runs through every layer, so anyone can find a part, switch a variant or trace a screen back to its components.

00LibraryFoundations, components and module patterns
01Build reviewEach module’s design beside the shipped build
02MobileApp screens
03ArchiveSuperseded explorations, kept for reference
Inside the library
Foundations
ColourTypographyIcons
Components
ButtonsInputsSelectionNavigationTablesDialogs
Modules
AuthenticationDashboardQuick addLeadsContactsPropertiesSettingsAdmin usersAdmin ticketsMessaging
Build review, per module
Contacts / DesignContacts / ShippedContacts / Revisions

Design system

One set of parts, so every screen agrees.

With the file readable, the next step was consistency. I pulled the pieces that repeat across the product into a shared library, gave the palette names, and built screens from those parts instead of drawing them again.

This is an overview of that system: colour roles, type, spacing, icons and the core components with their states. Hex values and parts come from the Figma file; interaction states are drawn out here for reference. Every screen on this page is built from these tokens.

2.1 · Colour

Few colours, clear jobs.

Green leads, blue selects, red warns. Each brand colour has one job, and the greys carry everything else.

Primary#30CB83
Tint · #F2FFF9
Primary

Main actions, the active nav item, applied filters, focus rings, the selected-ticket marker.

Secondary#1991EB
Tint · #E8F4FD
Secondary

Row and list selection, counts, outgoing messages, medium priority.

Danger#CE4E3B
No tint
Danger

Destructive actions like delete, and high priority.

Warning#F9BB1A
No tint
Warning

Waiting states, such as a pending ticket.

Black#000000
Surface · Text#2C2C2E
Text 2#565658
Muted#999999
Disabled#CCCCCC
Stroke#EAEAEA
2.2 · Type

One family, six steps.

Roboto across the product. Hierarchy comes from size and weight, not colour, so dense tables stay calm.

Typeface
Roboto
AaAaAaAa
Page title
20 / Medium
Tickets
Screen headers
Modal title
14 / Medium
Confirm delete
Dialogs, drawer cards
Body
12 / Regular
Login problem on my second device
Table cells, messages
Label
11 / Regular
Assigned to · Riya Shah
Fields, filters, key–value
Caption
10 / Regular
128 tickets · 1:22 pm
Counts, timestamps, nav labels
Overline
9 / Bold
STATUS
Filter groups, table headers
Samples shown at 150%
2.3 · Spacing & layout

A 4px rhythm.

Sizes snap to a small scale, and every admin screen shares the same frame: bar, filters, content, drawer.

Spacing scale · 4px base
4
8
12
16
24
32
48
Rows 44 · controls 28–34 · cards pad 12/14 · screens pad 24Heights snap to the scale so lists, fields and buttons line up.
Admin layout
Top bar · 52
Filters · 200
Content · fluid · pad 24
Drawer · 300
2.4 · Icons

Redrawn to one standard.

The icons rebuilt during the migration share a grid, a stroke and four sizes.

24 grid · 2 pad
24 · Nav
18 · Bars
16 · Actions
14 · Inline
1.6 stroke, round caps and joins, no fills. One icon, one meaning, everywhere it appears.
users
tickets
msgs
monitor
chart
contacts
home
gear
plus
bell
search
pencil
trash
move
link
file
clip
send
share
bed
expand
close
check
chev
2.5 · Components

The library, with its states.

A curated set of the parts the ticketing screens are made of. Hover the buttons: the states are live.

ButtonsFour kinds, one height. Text buttons pair with a filled action in every dialog.
DefaultHoverFocusPressedDisabledPrimarySaveSaveSaveSaveSaveNeutralClear allClear allClear allClear allClear allDangerDeleteDeleteDeleteDeleteDeleteTextCancelCancelCancelCancelCancel
NavigationOne active item per bar. Hover lifts the label; active adds the green mark.
DefaultHoverActive
In the product bar
SelectionOne checkbox, two roles: green when a filter is applied, blue when rows are picked.
OffFilter onSelectedDisabled
Filter row
In progress105
Resolved105
Tabs
DetailsMessages
Fields & selectsSame 28px box for text, search and select. Focus uses the primary ring.
DefaultAdd user notes…
FocusRiya
FilledRiya Shah
DisabledSupport
Select · open
Medium
High
Medium
Low
Status, people & countsStatus and priority are dots plus a word, never colour alone.
StatusPriorityCount
NewQueuedPendingClosed
HighMediumLow
3
Avatar 24 / 32GroupPersonRSSRSRYORSRiya ShahSupport
Table rowsHover tints the row; the open ticket gets the green marker; picked rows turn blue.
Default
12092SRSam RiveraAgentHigh
Hover
12093AKAlex KimAgentMedium
Open ticket
12094RSRiya ShahAgentHigh
Selected
12095CIChris ItoAgentLow
Dialogs & messagesDialogs share one header, body and footer. Bubbles: grey in, blue out.
Confirm
Confirm delete
Are you sure you want to delete 3 tickets?
CancelDelete
Thread
SR
Can you share the quote?
Sending it now.
YO
QUOTE.pdf9.7 MB
YO

New module · Support ticketing

Support, without leaving the product.

Support requests came in over email, Slack and WhatsApp, across several channels. Context got lost between them, and replies were slow. I designed the ticketing module in the admin console so every request lands in one place: a queue to triage, a ticket to act on, and a conversation that stays attached to it.

ATriage the queue with filters, columns and bulk actions.
BOpen a ticket, edit it, and link it to the right user.
CTalk it through, with links, images and files in the thread.

A · Triage

One queue, narrowed in two clicks.

Type, assignee, status, priority and date filters sit beside the list, each with a count. Select a few tickets and the bulk bar appears to reassign or delete them; columns can be switched on and off and reordered.

SidewalkAdmin
UsersTicketsMessages
YO
Tickets
128 tickets
•••
NumberReported byAssigned toDateStatusPriority
12090JLJordan LeeAgentSRSam RiveraSupportToday 1:53 AMNewMedium
12091JLJordan LeeAgentAKAlex KimSupportYesterday 11:53 AMQueuedLow
12092SRSam RiveraUnknownRSRiya ShahSupportFriday 1:53 AMIn progressHigh
12093AKAlex KimUnknownCIChris ItoSupportThursday 1:53 AMIn progressHigh
12094RSRiya ShahAgentTRTaylor ReedSupportMon 11:53 AMIn progressHigh
12095CIChris ItoAgentSRSam RiveraSupportSun 10:55 AMClosedLow
12096MDMorgan DiazAgentAKAlex KimSupportSat 4:50 PMClosedHigh
12097DFDana FoxAgentRSRiya ShahSupportFri 9:45 AMQueuedMedium
12098NPNoah ParkAgentCIChris ItoSupportThu 10:55 AMIn progressMedium
12099TRTaylor ReedAgentRSRiya ShahSupportWed 4:50 PMPendingMedium
3Tickets selected
Reassign
Reassign
YOYou
RSRiya Shah
AKAlex Kim
CancelReassign
Edit columns
Edit columns
Number
Reported by
Assigned to
Date
CancelSave
Bulk delete
Confirm delete
Are you sure you want to delete 3 tickets?
CancelDelete

The version I threw away

A ticket page was one screen too many.

My first version opened each ticket on its own screen. Support handles several tickets at once, and loading a new screen for each one made going back and forth slow. The rest of the product already worked in left and right drawers, and they worked well, so the ticket opens in a drawer beside the queue instead.

B · The ticket

Read it, change it, or connect it.

The ticket opens in a drawer beside the queue, so context is never lost. The same component has three states: view, edit (assignee search, type, status and priority), and a state for tickets raised by someone with no matching account.

For those tickets, Find user opens a search across users. Results narrow as you type, and the ticket is linked with one update.

View
DetailsMessages
Ticket
Number12092Assigned toRiya ShahTypeSupportSourceUserNameSam RiveraEmailsam@example.comPhone+1 (555) 010-0142StatusNewPriorityMedium
Subject
Login problem on my second device: the app keeps asking me to…
Show
SRSam RiveraUser
Emailsam@example.comPhone+1 (555) 010-0142PlanBronze
User notes
Add user notes…
ReportedMon 11:53 AMUpdatedTue 9:11 AM
Edit
DetailsMessages
TicketEditing
Number12092Assigned toRiya ShahTypeSupportSourceUserNameSam RiveraEmailsam@example.comPhone+1 (555) 010-0142StatusNewPriorityMedium
Subject
Login problem on my second device: the app keeps asking me to…
Show
SRSam RiveraUser
Emailsam@example.comPhone+1 (555) 010-0142PlanBronze
User notes
Add user notes…
SaveCancel
No matching user
DetailsMessages
Ticket
Number12092Assigned toRiya ShahTypeSupportSourceWebsiteNameSam RiveraEmailsam@example.comPhone+1 (555) 010-0142StatusNewPriorityMedium
Subject
Login problem on my second device: the app keeps asking me to…
Show
User details
No user details
No details found for this user yet
Find user
ReportedMon 11:53 AMUpdatedTue 9:11 AM
Find user · typing
Users
SRSam Rivera
SOSam Okafor
SPSamira Patel
CancelUpdate

C · The conversation

The thread lives on the ticket.

Messages sit in the same drawer as the details, one tab away. Besides text, a thread can carry links that unfurl into preview cards, single images and galleries, and files like quotes.

Switch the tabs to see how the drawer works. The queue stays put while you move between details and messages.

SidewalkAdmin
UsersTicketsMessages
YO
Tickets
128 tickets
NumberStatusSubjectRequested
12090NewContacts aren’t syncing from my calendarToday
12091OpenCan’t delete a contactYesterday
12092In progressLogin problem on my second deviceFriday
12093In progressProblem adding a new contactThursday
12094In progressCan’t sign inMon
12095ClosedPassword reset link not arrivingSun
12096ClosedProperty filter isn’t workingSat
12097OpenImported contacts are missingFri
12098PendingPassword reset link not arrivingThu
12099In progressCan’t attach a file to a listingWed
12100NewLead import stops halfwayTue
12101OpenCalendar invite shows the wrong timeMon
12102ClosedCan’t change my planSun
DetailsMessages
Ticket
Number12092Assigned toRiya ShahTypeSupportSourceUserNameSam RiveraEmailsam@example.comPhone+1 (555) 010-0142StatusNewPriorityMedium
Subject
Login problem on my second device: the app keeps asking me to…
Show
SRSam RiveraUser
Emailsam@example.comPhone+1 (555) 010-0142PlanBronze
User notes
Add user notes…
ReportedMon 11:53 AMUpdatedTue 9:11 AM
DetailsMessages
Messages32 itemsSRYO
Listing pageA short preview of the shared page.example.com
YO
1:22 pm
Property detailsA short preview of the shared page.example.com
YO
1:22 pm
SR
Can you share the quote for the plumbing service?
1:22 pm
QUOTE_SERVICE.pdf9.7 MB
YO
1:23 pm
SR
Could you share a photo of the property’s front view?
1:24 pm
YO
1:24 pm
SR
Thanks! Can you send a few more?
1:25 pm
YO
1:26 pm
Type a message

Interactive: click “Details” and “Messages” in the drawer. Photos are replaced with neutral placeholders.

My contribution

What changed.

The design filefragmented XD import  → structured, editable Figma workspace
Building a screen→ assembled from a shared component library
Finding things→ named layers, a section per module
Getting support→ out of WhatsApp and email, into tickets inside the product

My role, plainly

Alongside the founder and engineers.

I didn’t design Sidewalk from scratch. I inherited a working product and made its design reliable: I migrated and rebuilt the files, set up the component system the team designed with, and designed the support ticketing module end to end.

I worked directly with the founder on what to build and with the engineering team on how it would ship.

Create a free website with Framer, the website builder loved by startups, designers and agencies.