Skip to content

SaaS onboarding journey

a customer journey map (`kind: journey`): five stages from Discover to Renew as columns, lanes for customer actions, touchpoints, pain points and opportunities as rows, the customer's path as arrows, and an emotion curve from each step's score that dips at the data import and peaks at the first shared report.

17 nodes4 groups9 edges
Open full size
SaaS onboarding customer journey map: five stages, four lanes of step cards and an emotion curve across the stagesSaaS onboarding customer journey map: five stages, four lanes of step cards and an emotion curve across the stagesSaaS onboarding customer journey map: five stages, four lanes of step cards and an emotion curve across the stagesSaaS onboarding customer journey map: five stages, four lanes of step cards and an emotion curve across the stages
journey-saas-onboarding.yamlOn GitHub
# yaml-language-server: $schema=../references/diagram.schema.json
title: SaaS onboarding journey
subtitle: A new customer's path from first search to the first renewal, with what hurts and what to fix
kind: journey
stages: [Discover, Sign up, Set up, First value, Renew]

legend:
  solid: The customer's path
  dotted: Where it happens, what fixes it

# Each lane is a row; every step names its stage (the column) and the customer's steps carry a
# score from -2 to 2, which the emotion curve averages per stage.
groups:
  actions: { type: lane, label: Customer actions }
  touchpoints: { type: lane, label: Touchpoints }
  pains: { type: lane, label: Pain points, color: "#cf222e" }
  ideas: { type: lane, label: Opportunities, color: "#1a7f37" }

nodes:
  search: { in: actions, stage: Discover, icon: generic:search, label: Compares tools, note: Reads reviews and a comparison post, score: 1 }
  trial: { in: actions, stage: Sign up, icon: generic:user, label: Starts a free trial, note: Work email and password, score: -1 }
  import: { in: actions, stage: Set up, icon: generic:files, label: Imports their data, note: Uploads a CSV export, score: -2 }
  report: { in: actions, stage: First value, icon: generic:dashboard, label: Shares a first report, note: The moment it clicks, score: 2 }
  invite: { in: actions, stage: First value, icon: generic:users, label: Invites the team, note: Three more seats, score: 1 }
  upgrade: { in: actions, stage: Renew, icon: generic:payment, label: Upgrades to a paid plan, note: Before the trial ends, score: 1 }

  review: { in: touchpoints, stage: Discover, icon: generic:browser, label: Review site, note: G2 and a blog post }
  form: { in: touchpoints, stage: Sign up, icon: generic:email, label: Sign-up form, note: Verify by email }
  wizard: { in: touchpoints, stage: Set up, icon: generic:etl, label: Import wizard, note: Column mapping }
  dash: { in: touchpoints, stage: First value, icon: generic:analytics, label: Dashboard, note: Sharing and seat invites }
  billing: { in: touchpoints, stage: Renew, icon: generic:notification, label: Trial-end email, note: Links to billing }

  spam: { in: pains, stage: Sign up, label: Verification lands in spam, note: A third never confirms }
  mapping: { in: pains, stage: Set up, label: Columns do not map, note: Dates and currencies fail }
  pricing: { in: pains, stage: Renew, label: Plans are hard to compare, note: Seats or usage? }

  magic: { in: ideas, stage: Sign up, label: Magic-link sign-in, note: "No password, no wait" }
  sample: { in: ideas, stage: Set up, label: Start with sample data, note: Map columns later }
  preview: { in: ideas, stage: Renew, label: Plan preview in the app, note: Cost at current usage }

edges:
  - search -> trial -> import -> report -> invite -> upgrade
  - search ... review
  - trial ... form
  - import ... wizard
  - invite ... dash
  - upgrade ... billing
  - spam ... magic
  - mapping ... sample
  - pricing ... preview

Start from this one

Copies the spec to diagram.yaml, then renders every format.

$ orrery init journey-saas-onboarding$ orrery render diagram.yaml -f all --theme both