CSV customer journey map template (SaaS trial to paid)
Turn an analytics or CRM CSV export into a customer journey map: one row per step, the export's stage column becomes the horizontal lanes and its owner column the vertical ones, with a separate ending for each drop-off.
The CSV that produces this diagram
One row per step. The numbers in Line to are row numbers — that is what draws the connectors, and it is the column most files are missing.
| # | Shape | Box text | Line to | Line text | Horizontal lane | Vertical lane |
|---|---|---|---|---|---|---|
| 1 | Start | Land on the site from a campaign or search | 2 | Awareness | Customer | |
| 2 | Process | Record the source, campaign and landing page | 3 | Awareness | Marketing | |
| 3 | Decision | Does the visitor start a trial? | 5, 4 | Starts a trial, Leaves without signing up | Awareness | Customer |
| 4 | End | Left before the trial started | Awareness | Marketing | ||
| 5 | Process | Create the trial account and verify the email | 6 | Trial | Customer | |
| 6 | Process | Open a CRM record with the trial end date | 7 | Trial | Sales | |
| 7 | Decision | Does the account fit the target profile? | 9, 8 | Fits the profile, Out of scope | Trial | Sales |
| 8 | End | Disqualified as out of scope | Trial | Sales | ||
| 9 | Process | Run the guided setup in the product | 10 | Trial | Product | |
| 10 | Decision | Is the first key action done within 7 days? | 13, 11, 12 | Key action done, Not done by day 7, Nothing by day 14 | Trial | Product |
| 11 | Process | Send the day-7 setup reminder with a booking link | 9 | Trial | Marketing | |
| 12 | Reject | Churned before activation | Trial | Marketing | ||
| 13 | Process | Record the activation event with its timestamp | 14 | Activation | Product | |
| 14 | Decision | Are three or more seats active in the first week? | 16, 15 | Three or more seats, Fewer than three | Activation | Customer |
| 15 | Process | Book a use-case review with the wider team | 16 | Activation | Support | |
| 16 | Process | Send the pricing options and the trial end date | 17 | Conversion | Sales | |
| 17 | Decision | Does the trial convert before it expires? | 20, 18 | Buys a plan, Expires unpaid | Conversion | Customer |
| 18 | Decision | Was an extension asked for before the end date? | 16, 19 | Extension agreed, No extension | Conversion | Sales |
| 19 | Reject | Trial expired without a purchase | Conversion | Sales | ||
| 20 | Process | Take payment and open the paid account | 21 | Conversion | Customer | |
| 21 | Process | Compare day-30 usage with the activation baseline | 22 | Retention | Product | |
| 22 | Decision | Is usage still above the activation baseline? | 25, 23, 24 | Above the baseline, Below on any measure, No sessions for 30 days | Retention | Product |
| 23 | Process | Run a recovery call and agree one action | 25 | Retention | Support | |
| 24 | Reject | Cancelled at renewal | Retention | Support | ||
| 25 | Process | Confirm the renewal and record any expansion | 26 | Retention | Sales | |
| 26 | Success | Renewed and expanded | Retention | Customer |
#,Shape,Box text,Line to,Line text,Horizontal lane,Vertical lane
1,Start,Land on the site from a campaign or search,2,,Awareness,Customer
2,Process,"Record the source, campaign and landing page",3,,Awareness,Marketing
3,Decision,Does the visitor start a trial?,"5, 4","Starts a trial, Leaves without signing up",Awareness,Customer
4,End,Left before the trial started,,,Awareness,Marketing
5,Process,Create the trial account and verify the email,6,,Trial,Customer
6,Process,Open a CRM record with the trial end date,7,,Trial,Sales
7,Decision,Does the account fit the target profile?,"9, 8","Fits the profile, Out of scope",Trial,Sales
8,End,Disqualified as out of scope,,,Trial,Sales
9,Process,Run the guided setup in the product,10,,Trial,Product
10,Decision,Is the first key action done within 7 days?,"13, 11, 12","Key action done, Not done by day 7, Nothing by day 14",Trial,Product
11,Process,Send the day-7 setup reminder with a booking link,9,,Trial,Marketing
12,Reject,Churned before activation,,,Trial,Marketing
13,Process,Record the activation event with its timestamp,14,,Activation,Product
14,Decision,Are three or more seats active in the first week?,"16, 15","Three or more seats, Fewer than three",Activation,Customer
15,Process,Book a use-case review with the wider team,16,,Activation,Support
16,Process,Send the pricing options and the trial end date,17,,Conversion,Sales
17,Decision,Does the trial convert before it expires?,"20, 18","Buys a plan, Expires unpaid",Conversion,Customer
18,Decision,Was an extension asked for before the end date?,"16, 19","Extension agreed, No extension",Conversion,Sales
19,Reject,Trial expired without a purchase,,,Conversion,Sales
20,Process,Take payment and open the paid account,21,,Conversion,Customer
21,Process,Compare day-30 usage with the activation baseline,22,,Retention,Product
22,Decision,Is usage still above the activation baseline?,"25, 23, 24","Above the baseline, Below on any measure, No sessions for 30 days",Retention,Product
23,Process,Run a recovery call and agree one action,25,,Retention,Support
24,Reject,Cancelled at renewal,,,Retention,Support
25,Process,Confirm the renewal and record any expansion,26,,Retention,Sales
26,Success,Renewed and expanded,,,Retention,CustomerHow it works
Export one row per journey step, not one row per customer
Most analytics exports are one row per event or per account, which is the wrong grain: it gives you a hundred thousand rows describing twenty steps. Aggregate first, in the tool or in a query, until the file has one row for each distinct step in the journey, with the stage it belongs to and the team that owns it. Keep the counts as extra columns if you want them: the importer matches on header names, so anything it does not recognise is carried through and ignored.
Point the two lane columns at the columns you already have
Rename your export's stage column to Horizontal lane and its owner or touchpoint column to Vertical lane. Keep the stage names as the export writes them, including the ordering prefix if it has one, because the names in the file are the names your reports already use and a map with different stage names than the dashboard cannot be reconciled with it. If your export has no owner column, add one and fill it in by hand — five values for a twenty-step journey is ten minutes of work, and it is the axis that shows the handoffs.
Add the Line to column, because no export has one
This is the column your source system cannot give you: a stage tells you where a step sits, not what it leads to. Sort the rows into the order you want them drawn, then fill Line to with the row numbers each step connects to. Do the numbering last and do not insert rows afterwards, because Line to is a position and every number below an inserted row moves. A row that names a position with no row at it is dropped without an error, so a chart that comes out as loose boxes is almost always a numbering problem.
Quote the cells that contain commas, then check the delimiter and the encoding
A branching row has a Line to of 4,5 and a Line text of Yes,No, and in a CSV both of those cells have to be wrapped in double quotes or they split into two columns and shift everything to their right. The same goes for any box label containing a comma. Save the file as UTF-8, delete any title or date-range lines printed above the header, and re-save it comma-separated if your spreadsheet exported semicolons. Then drop the .csv onto the spreadsheet area of the editor, or paste the CSV text straight into it.
Write your own numbers into the three thresholds
The chart carries placeholders where your data belongs. "Is the first key action done within 7 days?" needs one product event named exactly as the export names it, not a list of good behaviours. The seat count in the activation decision should be the number your own retained accounts crossed in their first week. The retention baseline is the usage recorded at that account's own activation event, not an average of the customer base. A threshold that cannot be read out of a column is a threshold nobody will apply twice the same way.
Give every drop-off its own ending
This map ends six ways, and that is the point of drawing it rather than reporting it. A single ending called Closed lost tells you the total and nothing else; six named terminators let you count, per stage, how many accounts left before signing up, were disqualified, never activated, expired unpaid, cancelled at renewal or renewed. Delete the ones you do not have — a self-serve product with no qualification step does not need "Disqualified as out of scope" — and add one wherever your export shows accounts leaving by a route the chart cannot currently describe.
Frequently asked questions
What is a customer journey map?
A process map of everything a customer does with you, drawn with the journey stages as columns rather than the departments. That is the only structural difference from an ordinary swimlane chart, and it matters because a journey crosses teams: the same account is a marketing record, then a product account, then a CRM opportunity, then a support ticket. Stages across and owners down means each box sits at the intersection of when it happens and who is holding the account, so a handoff appears as an edge crossing a lane boundary rather than as a sentence in a document. The chart above uses five stages — Awareness, Trial, Activation, Conversion and Retention — and five lanes, from the customer's own actions through to support.
How do you turn a CSV export into a journey map?
By deciding what a row means before you open anything. In your export a row is usually an event or an account; in a journey map a row is one step, drawn as one box. So aggregate the export down to one row per step, then rename the columns the importer knows: the stage column becomes Horizontal lane, the owner column becomes Vertical lane, the step name becomes Box text, and the shape column, if you have none, gets typed in as Start, Process, Decision, End, Success or Reject. Then add the one column no source system will give you, Line to, holding the row numbers each step leads to, with the branch labels in Line text in the same order. Drop the file on the spreadsheet area and the boxes, the lanes and the arrows all arrive together.
What columns does the CSV need?
Four to draw anything and six for a journey map. Shape decides the box, Box text labels it, Line to holds the row numbers it connects to, and Line text holds the connector labels in matching order — a Line to of 4,5 with a Line text of Yes,No sends Yes to row 4 and No to row 5, so the order of the two lists is load-bearing. Horizontal lane and Vertical lane are the two axes, and they are what makes it a journey map rather than a flowchart. Line style, Notes and Link are optional. The match is on header names rather than column positions, so you can leave your export's own id, date and count columns in the file: they are carried and ignored.
Why did my import come out as a field of disconnected boxes?
Almost always Line to, and almost always for one of three reasons. It holds a step id or a step name copied from the export rather than a row number, and a number that names no row is dropped silently — no error, no warning, just an arrow that never renders. Or the cell contained a comma and was not wrapped in double quotes, so 4,5 arrived as two columns and every column to its right shifted by one, which puts your lane names into Line style and leaves Line to empty. Or rows were inserted after the numbering was written, and every reference below the insertion point now points one row short. Check the boxes that did connect: if they are all near the top of the sheet, it is an insertion; if none connected at all, it is quoting.
What are the stages of a SaaS trial-to-paid journey?
Five, and they are the five columns of the chart above. Awareness is everything before an account exists, which is why the source and campaign are recorded there and not reconstructed later. Trial covers signup, qualification and guided setup, and it is where most of the loss happens. Activation is the point where the account has done the one thing that predicts it will still be here in ninety days, and it needs a named event and a deadline rather than a feeling. Conversion is the paid decision, including the extension that is agreed once and then not again. Retention compares the account with its own activation baseline and ends either at a renewal or at a cancellation. Rename them to your own if your team says onboarding rather than activation, but keep the count small: a stage that never changes what anybody does is a column that only makes the chart wider.