Omar Younis
Work About Resume
Hightouch Hightouch · 2021–2024

Patterns for data activation

I joined as the founding designer on a product that an engineer had built for other engineers. By the time I left, it had a design system, a way to monitor sync health, and workflows that a marketer could complete on their own.

RoleFounding product designer
TeamPM, founding engineer, and me as the only designer
UsersData engineers, then marketers
FoundationBuilt from scratch
Outcomes
31% Reduction in time to configure a first sync
55% Fewer support tickets about failed or stalled syncs
75 Components in the system at handover
What I owned
Design system Components, patterns and visual language, none of which existed
Workspace dashboard A new landing surface built around debugging
Core setup workflows Every step of model, sync and destination configuration
Then the growth work RBAC, deployments, Journeys, Audience builder
The problem

Hightouch was a working reverse ETL product, which means it moves data out of the warehouse and back into the tools business teams use every day. The front-end engineer who designed it had solved the hard integration problems for developers.

My job was to help it hold up as the audience widened, first to data engineers and then to marketers, whose workflows in the product were slow and unforgiving. That meant scaling the patterns we had rather than adding more screens.

Acceleration Help users focus on what's important, and design meaningful calls to action.
Empowerment Don't overwhelm users; let them make mistakes safely.
Education Explain how resources relate, respect expectations, maintain context.

These are the three principles we designed around.

High level design plan
Four phases
01 · Understand Heuristic audit of every flow. Zoom interviews with real customers, recurring concerns logged and grouped to prioritize design sprints.
02 · Observe Information architecture reworked around debugging, and the workspace dashboard released as the new landing surface.
03 · Standardize A common component set, a visual system, and the full set of states for the sync detail page, which is where users spend most of their time.
04 · Scale Every step of the core setup workflows revisited, then enterprise and marketer surfaces on top: RBAC, deployments, Journeys, Audience builder.
Audit before adding

I spent the first weeks cataloguing design debt

I went through every flow in the app against standard usability heuristics and wrote down what was actually wrong. Color was used inconsistently, a horizontal stepper had been stretched well past the three steps it worked for, and a "Preview" query button sat as a primary action next to "Save", so users stalled trying to decide which one came first.

Cataloguing all of this was how I got the whole product into my head at once. Once I had that picture, I could fix problems at the level of the system instead of one screen at a time, which is the only way I've found for a single designer to keep up with a startup.

Annotated audit board Annotated audit board
Landing page → dashboard

The app landing page ended up becoming a list of syncs

Customer interviews kept pointing to the same problems: too many clicks to reach error information, no sense of what needed attention, status badges that were hard to read, filters that were hard to build and harder to maintain, and no way to get an overview of the workspace. Taken together, they came down to one job: finding recent errors and debugging them quickly.

The existing landing page listed every active sync, and folders hadn't kept it from getting noisy as usage grew. I ran a design jam with the PM and founding engineer on what a monitoring-first home screen should show, prioritized the ideas against customer feedback, and shipped a dashboard that opens on a set of recent sync runs across syncs and destinations. This reduced the amount of time the average user spent hunting for a failing sync.

Before: sync list at scale Before: sync list at scale

Shipping a new design

We started with design jams to explore high-level concepts for what a monitoring-first home screen should show. I then took the strongest ideas into lo-fi wireframes to work out the structure and interaction details, and from there into high fidelity.

Design jam output Design jam output
Lo-fi UI ideation for the dashboard and interaction details: chart bin sizes, sort order and empty states Lo-fi ideation and interaction details
After: workspace overview with run health metrics, extensions, draft approvals and active syncs by destination After: workspace overview
After: hovering a chart bar breaks the window into successful and failed runs, with a link to those runs After: chart hover
After: sync runs for the hovered window, with status filters and a run log After: sync runs from the chart

Extending status patterns to resource pages

Status over time

While I was working on the dashboard, I also explored how the same status colors could show a single sync's health over time, and what a hover should reveal about why its status changed. I tried several treatments for the history bar, the change log and the tooltips before settling on tints for past states, with the hovered moment shown at full strength.

Once the patterns held up on the dashboard, I carried them into resource pages. On a sync's Monitoring tab, the history bar uses the same scale, and the monitor settings below it use the warning and unhealthy colors to separate the two thresholds each monitor can trigger, so people can see what will change a sync's status before it happens.

Status patterns: status scale, monitoring history bar treatments, status change log, hover tooltips and overlapping monitors
Status pattern explorations
Sync Monitoring tab: notification routing by status, monitoring history bar, and warning and unhealthy thresholds for each monitor
Sync detail: monitoring tab
Sync detail page while a sync is running: no open alerts, querying the model
Sync detail: running
Sync detail page with no run scheduled and open alerts collapsed to a summary
Sync detail: idle, alerts collapsed
Sync detail page with a critical and a warning alert expanded while a run sends rows to the destination
Sync detail: alerts open, run in progress

What the foundation made possible

Built on top

Once the design debt in the core experience was under control, I moved on to enterprise features first, like RBAC and deployments, and then to marketer-facing features like Journeys and the Audience builder.

Journeys was the clearest test of whether the foundation held up. A canvas of triggers, destinations and delays is a very different interface from a sync list, but it's built entirely from the components we standardized for the core product, which I cover further down: the same tables, drawers, status colors and empty states. A marketer reading a live journey and a data engineer reading a failed sync are reading the same visual language.

Journey overview: canvas, performance panel
Journey overview: canvas and per-tile performance

Standardizing components

Design system

As I redesigned the core workflows and the dashboard, I kept running into the inconsistencies the audit had surfaced, so I standardized components alongside the screen work instead of treating it as a separate project. That work turned into a set of clear, consistent styles and, just as importantly, rules for how to use them. Each component got one job and a defined set of states. For example, there's one primary action per view, destructive actions stay outlined until they're confirmed, badges are for status and pills are for metadata, and alerts escalate based on their intent.

Because the rules were written down, they held up across every core workflow. Setting up a sync, monitoring its runs and building an audience all felt like the same product, and new screens could start from decisions we'd already made.

Hightouch UI components specimen: buttons, dropdowns and menus, inputs, selection controls
Components: buttons, menus, inputs, selection
Hightouch UI feedback and status specimen: banners, alerts, badges and pills, tooltips
Feedback & status: banners, alerts, badges, tooltips
Text highlighting for code: blocked and warning errors, search matches, and added, changed and removed lines
Text highlighting: code errors, search matches, diffs
Application components and patterns
Application components and patterns: inspector, drawers, tables
What I took away

I learned that teams serving data engineers don't buy through self-serve alone. They read the docs, watch the explainer videos, sit through a demo, and come back to the product once their questions have been answered.

So the product's job was narrower than it first looked: be as simple as possible, add guardrails and governance where the risk is, and always leave a clear path to help. Designing for how people actually evaluated the product worked better than designing for a fully self-serve experience that didn't match reality.

Marketing design

Beyond the product

Alongside the product work, I designed marketing collateral: blog thumbnails, signup pages and email campaigns.

Working on both marketing and product helped keep the story consistent, from the first campaign someone saw to the product they signed into.

Campaign graphic: You shouldn’t have to be an astrophysicist to send a decent e-mail. Friends don’t let friends buy a CDP
Campaign: astrophysicist
Campaign graphic: You shouldn’t have to be an expert in deep-sea marine biology to access data, over an anglerfish
Campaign: deep-sea
Blog thumbnail: iPaaS point-to-point integrations versus Reverse ETL from a central warehouse
Blog thumbnail: iPaaS vs Reverse ETL
Email: 2022 Hightouch Rewind, a year-in-review of each workspace's syncs, destinations and rows synced
Email: 2022 Hightouch Rewind
← All work Next: Fivetran →
Click anywhere or press Esc to close