Rebuilding Segment Journeys from the ground up

Segment Journeys is a visual workflow builder that technical marketers and data teams use to reach their customers at the right moment, whether that's a nudge back to an abandoned cart or a reminder about tomorrow's appointment.

I led design for its rebuild from early vision work to GA, collaborating with three PMs, two engineering teams, and a researcher. This project was a lesson in cutting scope to deliver value quickly and learning when to push back on those cuts in order to preserve the experience.

Role

Lead Product Designer

Timeline

2023 – 2025

The Segment Journeys builder wizard.

The details couldn't make it through

Imagine a marketer wants to send a message to someone who added items to a cart but never checked out. They'd also like to reference the specific item in the cart to make the nudge feel personal. In the original Journeys, you could know when someone abandoned their cart, but there was no way to know what was in it.

That gap came from how the Journeys architecture worked under the hood. Every step in a journey was defined by an audience, a computed group of users who matched specific conditions. Because of this, the only information a step could pass forward was whether you were a member of that audience or not.

Customers worked around it by adding cascading layers of steps just to approximate information the system should already have. Extra steps meant higher cost and more logic to maintain. Some customers duplicated the same journey over and over, changing only the conditions.

A classic Journeys canvas with cascading split steps, triggering a follow-up email with no personalization, referencing only that a cart was abandoned.

A classic Journey, stitched together with extra steps to approximate personalization.

A new system that carries context forward

Journeys v2 is built around a new drag-and-drop canvas backed by an event-driven system. A journey can trigger off a specific customer's action, and every step carries that event's data forward.

Now an abandoned cart journey triggers the moment someone updates their cart, holds them there while they keep updating it, and only moves them forward once they've stopped for a set window. The follow-up message goes out with the latest cart data, not just the fact that they never checked out.

Because a journey carries context forward on its own, the same campaigns take a fraction of the steps. One customer condensed twelve journeys into one.

The Journeys v2 canvas, condensed to a single Hold until step, triggering a personalized follow-up email referencing the specific items left in the cart.

An abandoned cart flow in v2, where the message includes the actual cart contents.

Getting to Journeys v2

The rebuild took two years of incremental shipping. It started with vision work to align the team, then moved through three phases: event-triggered payloads, event-triggered Journeys for abandoned intent, and Journeys v2 itself.

The three phases

Phase one: event-triggered payload.

Event-triggered payloads

Phase two: event-triggered journey for abandoned intent.

Event-triggered abandonment journeys

Phase three: Journeys v2 abandoned cart journey.

Journeys v2

Building belief in the vision

I started by sketching what the new Journeys could look like, working with two other designers so the functionality would scale to other products. We looked at how other tools handled similar problems, then came up with step types and settings of our own. We continuously stress-tested our ideas against use cases, putting ourselves in our customers' shoes and asking, "what's the best way to solve this with the steps and settings we're imagining?" Core pieces of the final product, like the ability to split on event properties, came directly out of those exercises.

When we started sharing the vision internally, people were stuck on how classic Journeys worked, so the new model didn't immediately click. We put together decks explaining what the new event-driven architecture was and why the features customers kept asking for weren't possible without it. Once the event trigger concept landed, the excitement was obvious, and we knew we were on the right track.

Two designers on the team whiteboarding an early concept for the new Journeys architecture.

Two designers on the team working through an early concept.

Phase 1: Event-triggered payloads

The new architecture and visual canvas ended up being a much bigger lift than we'd planned for. To keep momentum, we stripped down the first release to a simple form: define an event trigger and send its data to a destination. This covered simple cases like confirmation messages.

Even though the first version of event-triggered journeys didn't have a visual canvas, I placed the entry point where customers would eventually create the full experience so the design could scale to what came next.

Customers were excited to get event data downstream, but confirmation messages weren't the problem they most needed solved. Most were trying to build abandoned intent flows, which are journeys that nudge someone back after they drop off mid-action.

The event-triggered payload form, defining an event trigger and its destination.

Phase 2: Event-triggered Journeys for abandoned intent

We scoped abandonment logic next.

Advocating for the canvas

As the team scoped this phase, they debated whether to keep holding off on the visual canvas and fold the new logic into the single-page form instead. I knew the form wasn't the right choice. Our users already have mental models for how journey builders look and work, and the canvas is a key part of that. This logic would span multiple steps, including a branching step, and stretching it into form fields would have fought what people expected. Choosing the form would also conflict with the long-term vision, meaning we'd have to backtrack and rework the UI later once the canvas was built.

I designed three options to make the tradeoff concrete:

  • A single page form with abandonment settings added in (the original proposal)
  • A rigid canvas where steps could only go in fixed positions, from a limited set of step types
  • A freeform, drag-and-drop canvas where steps could go anywhere, still from a limited set of step types

I led a discussion with the team to walk through the options. The rigid canvas turned out to be barely more work than stretching the form further, so we scoped it in.

The three design options presented to make the tradeoff concrete.

An overview of the three design options I presented to the team.

Making the case for a complete experience

Once we'd built the rigid canvas and its step types, the team was ready to release event-triggered Journeys to public beta. I had a hunch the scope wouldn't hold up for most real-world cases, and was worried that shipping it as-is could break customer trust if it didn't meet their expectations.

I partnered with my research teammate to design the study, and we ran eight concept-testing sessions together. She shared my concern about the canvas scoping going in, and the findings confirmed it. We'd built basic abandonment logic, and the broader abandoned intent problem needed more granular filtering and cascading splits than the rigid canvas could support. Users were also hesitant to move to the new experience at all, since it had limited functionality compared to classic Journeys.

We brought the findings to leadership with two recommendations: expand the canvas to be fully flexible, and hold event-triggered Journeys in private beta until we were closer to parity with the classic experience. There was real internal debate about timing, but the research gave the team enough evidence to align on delaying the public beta and expanding scope.

The limited abandoned intent canvas. The add button only appears in specific spots, and only certain steps are enabled.

Phase 3: Journeys v2

With the canvas expanded and the beta extended, we kept building toward GA.

Matching the design to users' mental models

One of the new step types, still called "Wait for event" at the time, had never existed in classic Journeys. Its most complex mechanic was loopback, a PM's idea that let a customer cycle back through the step every time the qualifying event fired again, like a shopper who keeps updating their cart. To find out whether users could follow how it worked, I built prototypes and ran sessions with my research partner.

Users generally understood the loopback, but were getting tripped up by everything around it. People were still applying the classic Journeys mental model to the new system, expecting to wait passively until the evaluation window closed and then find out what happened. In reality, each branch got assessed the moment its event fired. The design wasn't making that clear.

Two pieces of the UI were contributing to the confusion:

  • The step's name: "Wait for event" made it seem like you'd pick one event and then wait for it to be evaluated. One participant, unprompted, said, "To me, [the step] is essentially like a hold." That's where the new name, "Hold until," came from. In addition to changing the name, I rewrote the step's description to make its purpose clear.
  • Where the hold duration lived: I'd put it in the parent node, since to me you sit there holding until an event pulls you out. Users expected it to be another branch alongside the events: do A, do B, or hit the duration and take the "everyone else" branch. I combined the configuration with the "everyone else" branch to match how they were already thinking about it.
The original 'Wait for event' step on the canvas, with its side sheet open.

Before: Wait for event step

The renamed 'Hold until' step on the canvas, with its side sheet open.

After: Hold until step

Scaling steadily to GA and beyond

From there, we shipped steadily toward parity with classic Journeys. We added more step types, like a delay step and randomized split, tools for seeing exactly where a given profile stood in a journey, and quality-of-life features like versioning and editing.

I had created a design language early on, covering everything from what a node looks like to how branching steps get configured. By the end I could move fast on new features without rehashing the fundamentals every time.

A journey canvas with a randomized split step, sending a portion of profiles to a control destination and the rest to a treatment destination.

A journey with a function step and a randomized split step.

Funnel metrics overlaid on the journey canvas, showing how many profiles entered, are in progress, completed, or exited at each step.

Funnel metrics showing how profiles moved through a journey.

A profile activity table listing individual customers and the journey steps and events tied to their timestamps.

A profile activity log for tracing exactly what happened to an individual customer.

A clear shift to v2

Journeys v2 is now how most customers build on the platform. One stood up a v2 journey in a single day, delivering contextual alerts that weren't possible on the legacy system.

As of Q2 2026:

88%
of customers who published chose v2
74%
of new journeys published were built on v2

Learning when to move fast and when to slow down

This was the biggest, longest project I've worked on. Throughout it I learned when the quick version is good enough, and when it isn't.

Cutting scope got features into customers' hands quickly instead of waiting years for one big release. Most of the time that was the right call, but if a cut meant jeopardizing customer trust or shipping something confusing, it wasn't worth it. Deciding to hold event-triggered Journeys in beta was one of those moments.

On the flip side, I've become much faster at gathering evidence. At the start of this project I would have taken extra time to validate every feature, but by the end I was comfortable getting signal on concepts in days instead of weeks.