Case Study / Platform · Enterprise SaaS Program Versioning

Program Versioning: making live editing safe

Post Publish Program Edits was the most-requested capability in Gainsight Journey Orchestrator's history. I led the design of a copy-based versioning model that let admins edit active programs in place, safely, incrementally, and without disrupting participants mid-journey, across a multi-quarter, three-phase initiative. It was developed as part of the broader Journey Orchestrator transformation.

My role
Product Designer, sole designer across all three phases. Co-authored the PRD with the PM, proposed the core architectural models, and owned design continuity for 12+ months.
Collaboration
  • Product Management (scope & PRD)
  • Engineering leads (participant state)
  • QA (edge cases & migrations)
  • Community team (demand validation)
At a glance
  • Multi-quarter · 3 phases
  • 100+ scoped · 94 closed
  • Released 2025 · phased rollout
The Gainsight Programs editor editing a copy in Post Publish Edit Draft state: an amber banner notes the active program keeps running unchanged, with a flow from Audience to Email that branches on email open into a Slack delay path and a Survey path (PX Engagement / Thank You email).

Program editor in Post Publish Edit Draft state, an amber banner anchors context while the active version keeps running in parallel.

The problem

Published programs were immutable, and that was expensive

Journey Orchestrator programs are complex, living systems: segments shift, priorities change, and the right engagement changes with them. Yet every published program was treated as locked. The only escape was cloning, which lost all historical analytics and disrupted active participants.

Locked participants

Adding a segment, correcting a query filter, or including a high-risk account meant cloning the program, losing analytics and disrupting journeys already in progress.

Unrepairable errors

A misconfigured branch, a wrong delay, or an outdated template couldn't be fixed without taking the program offline, forcing a choice between broken and interrupted.

No agility

Teams couldn't respond to real-time change, a renewal risk mid-program, a new launch needing a touchpoint, a CSM loop needing a Slack step. None could be accommodated.

“Ability to edit Journey Orchestrator programs”, upvoted across multiple Gainsight community threads, one of the longest-standing open feature requests in the product's history.
The Programs list with the row actions menu open on an Active program: the only options are Clone, Analytics and Delete, with no Edit.
On a published program the only actions were Clone, Analytics and Delete. There was no Edit, so changing anything meant duplicating the whole program.
The model, before the screens

The strategy lived here, not in the UI

Before a single screen, I mapped the full lifecycle, what a program is at each stage, and every transition between them. The hard decisions in this project were made on this canvas, in the PRD, before design started.

Program lifecycle map

The program lifecycle, designing the states and transitions before designing screens.

The design challenge

Three problems the model had to solve

We first looked at letting admins edit the live program directly. Engineering discussions made the risk clear: editing an active program can corrupt participant state and leave cross-version analytics ambiguous. That moved us toward a copy-based draft model, and the design still had to answer three questions at once.

// Question 01

How do you make editing feel safe?

Admins needed confidence that editing wouldn't break the active program.

→ Copy-based draft model
// Question 02

How do you communicate continuity?

Existing participants shouldn't restart, they continue from their current step in the new version.

→ Continuity messaging + publish modal
// Question 03

How do you handle analytics?

When steps are added or skipped, cross-version analytics become ambiguous.

→ Cumulative view + version filter
The 'Edit Your Program' explainer with four tiles: Edit a Draft Copy, No Change for Active participants, Sync is On Pause, and Add or Skip Steps.
The model answered all three questions at once, surfaced right in the product: edit a draft copy, the live program runs untouched, syncing pauses, and steps can be added or skipped.
Phased delivery

Three phases, each a complete increment

Given the technical complexity, the platform was designed and shipped in three phases, never a partial feature.

Phase 01
Feb – Mar 2024

Edit mode for drafts

Shipped

Enable safe, in-place edits to a draft copy while the live program continues running.

Key capabilities

  • Create draft from live
  • Edit email, wait, logic steps
  • Post Publish Edit Draft banner & state
  • Publish draft to replace live
Outcome

~40% reduction in clone usage

Phase 02
Apr – May 2024

Edit source fields & properties

Shipped

Allow updates to source fields, filters, and properties without rebuilding the program.

Key capabilities

  • Add / remove source fields
  • Update filters & mappings
  • Preview impact before publish
  • Version history & comparisons
Outcome

~60% faster source updates

Phase 03
Jun – Jul 2024

Edit program flow

Shipped

Enable structural flow edits, add actions, connect branches, skip steps, without breaking continuity.

Key capabilities

  • Insert new steps in flow
  • Connect / re-route branches
  • Skip (not delete) any step
  • Full versioning & history
Outcome

Safe edits at scale, confidently

Key design decisions

Key decisions in the versioning model

A published, Active program in read-only Model view: Audience, Email, a 10-day wait, and Not Opened / Opened branches into PX Engagement, no way to edit it in place.
// Safety by architecture, not by warning

Editing happens on a copy

Editing creates a copy of the active program. The live version keeps running with no interruption while admins work in a clearly labelled ‘Post Publish Edit Draft’ state, a persistent amber banner reinforcing that they're editing a copy. This framing removed the biggest source of admin anxiety: fear of accidentally breaking something customers were already in.

Source editing with participant transparency

When filters change, a green confirmation surfaces exactly how many new participants will be added on re-publish, with a clear note that existing participants are unaffected. Each source type carries distinct capabilities, surfaced in context, not buried in documentation.

Audience · Q3 Renewal OutreachPost Publish Edit Draft
Query: Renewal Accounts312 recordsEdit filter
Segment: High-Risk CSMs89 recordsEdit filter
CSV: Manual additions14 recordsEdit filter
42 new participants will be added on re-publishExisting participants continue their current journey step.

Steps are skipped, not deleted

Hard-deleting a step orphans participants who already completed it and breaks analytics integrity. Instead, ‘Skip step’ keeps the step in the flow but marks it skipped for future participants. A counterintuitive but critical decision that came directly from deep collaboration with engineering on participant state management.

Program Flow · Edit modePost Publish Edit Draft
Entry triggerActive
Send email v1Skip set
EvaluateExisting
Slack nudgeNew · added post-publish

Cumulative analytics with version awareness

Analytics across versions is genuinely hard, added steps reach only a subset of participants; skipped steps change paths. The decision: show cumulative performance by default, with a ‘filter by publish date’ control to isolate version-specific behaviour. New and skipped steps are labelled inline.

Analytics · Program snapshotAll versions (cumulative) · Filter by publish date
487Total enrolled 312Active 142Completed 33Dropped
Entry100%
Email94%
Evaluate87%
Slack (new)72%
End +61%

A publish summary before anything goes live

Re-publishing overrides a live program and transitions participants, so the design treats it as a deliberate review moment. A summary modal surfaces every change, sources, new steps, skipped steps, analytics, with an explicit continuity guarantee before confirming. This became the primary trust-building moment in the entire flow.

Publish updates · Summary of changes

Source

Query filter updated, 42 new participants added

Step added

Slack nudge inserted after Evaluate

Step skipped

Email v1 marked skipped for future participants

Analytics

Cumulative view enabled with version filter

Participant continuity guaranteedExisting participants continue from their current step in the updated program.
The 'Edit Program' confirmation: changes are stored in a Draft version and won't affect the active program until you republish.
Decision 01, safety by architecture: editing opens a draft copy, and the change is spelled out before any edit begins.
The version switcher showing a Draft created on 15/2/2024 alongside the Active version published on 10/9/2023.
Decision 03, the version switcher: Draft and Active side by side with their dates, so admins always know which version they're in.
Design process

Designing the versioning model

Community signal State mapping Trade-off analysis PRD Prototype Engineering alignment Delivery Launch
  1. Community research

    Read every upvoted thread on program editing. The real pain wasn't ‘I want to edit’, it was ‘I'm afraid to publish because I can't fix mistakes.’ This reframed the brief from a feature request to a confidence problem.

  2. Requirements mapping on Miro

    Mapped the full state space with PM, program state, edit type, participant state, analytics impact. This map became the source of truth for scope across all three phases.

  3. PRD co-authoring on Coda

    Contributed directly to the requirements doc, proposing the copy-based draft model, skip-not-delete, and the cumulative analytics view. Design decisions were captured before a single screen was drawn.

  4. Figma explorations, three directions

    Explored in-place editing with a lock model, a side-by-side active/draft view, and the copy-based draft with banner. Presented to PM and engineering with a trade-off matrix; copy-based won on safety and clarity.

  5. Iterative delivery across sprints

    Maintained a living Figma spec updated every sprint, joined standups during crunch, attended QA reviews, and wrote microcopy for every system state.

  6. Scope negotiation under constraint

    Adding new fields was descoped from Phase 1 mid-build for stability. I redesigned the scope communication, info banner and onboarding tooltip, to set expectations without making the feature feel incomplete.

  7. Bug bash & QA partnership

    Defined edge-case UI states for migration failures, rollback, publishing timeouts, and X-Org validation, so every failure mode had a designed response, not a raw error string.

State-space architecture

Program State
Draft State
Participant State
Analytics State
Publish

Trade-off matrix, three explored directions

The platform model was chosen before UI exploration, ensuring every interaction reinforced safety, continuity and analytics integrity.

What was shipped

Three phases · three sub-epics · 100+ tickets

0
Phases shipped
Multi-quarter
0
Tickets closed
of 100+ scoped
0
Rollout milestones
May–Jun 2025
0
Active-program disruptions
On re-publish
Delivery ledger
CategoryExamplesCount
UI StoriesEdit mode entry, source panel, flow editor, skip step, publish modal, analytics~28
Backend StoriesVersioning table, participant caching, worker changes, field dependencies, S3, X-Org~22
QA StoriesSource edits, flow edits, backward compat, Redshift, X-Org, regression, migrations~18
AutomationPost Publish Edit Phase 2 automation, manual sync automation3
Spike / POCBackend analysis & UI flow builder POC for Phase 32
BugsPublishing failure edge case, union mapping condition, evaluate preview8
TasksUI tech analysis, PX trackers, security review, microcopy12
TotalAll categories across three sub-epics100+ scoped
Screens designed

The edited flow, end to end

The shipped experience, end to end, generating a safe draft, inserting and re-routing steps, and validating every branch before publish.

The 'Let's Create Your Draft!' state generating a duplicate of the current model, with a 'Draft version successfully created' confirmation toast.
Editing spins up a duplicate, a safe draft, created in a click.
The draft flow editor with the Actions palette open, Email, Survey, CTA, Engagement, API, Slack, Community, Education, plus Evaluate and Delay conditions, inserting a step into the flow.
Phase 3: insert any step type at any position in the flow.
The draft editor with a 'Select a path' panel for choosing the Opened / Not Opened branch, and a validation warning surfaced on the Email node.
Branch routing with inline validation, every path is a designed, checked state.
The fully edited draft: Audience, Email with Opened/Not Opened branches, a Survey with a 10-day wait, Evaluate, and Catch All / Branch 1 outcomes.
The result, a richer program, edited safely while the live version kept running.
Outcome & impact

A long-requested capability, shipped

  • Admins can now edit active programs without taking them offline, zero disruption to existing participants
  • Participant continuity is guaranteed across versions: no restarts, no data loss
  • Cumulative analytics with version filters tell the full story even after multiple flow changes
  • Two of the highest-voted requests in the Gainsight community, editing participants and editing flow, were both closed
  • Complex programs are less risky to build, directly increasing JO adoption depth
Leadership reflection

Designing across four state spaces at once

This work demanded designing across participant state, version state, source type, and analytics simultaneously, and holding a single coherent mental model across 12+ months and three phases. The strategy lived in architectural decisions (copy-based drafts, skip-not-delete) made in the PRD before any screen existed, and in the cross-functional alignment that turned a years-old request into shipped platform capability.

Interested in working together?

I lead design that holds the whole system in view, from the PRD down to participant-state edge cases.

Get in touch