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.
What the csv customer journey map template (saas trial to paid) process is
You did not arrive here with an editor open. You arrived with a file: an export from an analytics tool, a CRM or a warehouse query, one row per journey step, with columns for the stage, the touchpoint, the owner and a count. A CSV is what comes out of a system rather than what you work in, and that is the whole of the difficulty. It has no formulas, no sheets, no cell formatting and no drawing layer. It has a header row, a delimiter, an encoding and rows of text. Everything a journey map needs beyond that (which step leads to which, what the branch between them is called, which stage a step belongs to) is either already a column in your export or has to be added as one before the file is worth importing.
QueryChart's spreadsheet has the columns a journey map needs, and a CSV import matches them by header name rather than by position, so columns your export carries that mean nothing here are kept and ignored. Shape holds Start, Process, Decision, End, Success or Reject. Box text is the label inside the box. Line to holds the row numbers a row connects to, comma-separated. Line text holds the connector labels in matching order, so a row with a Line to of 4,5 and a Line text of Yes,No sends Yes to row 4 and No to row 5. Horizontal lane and Vertical lane are the two lane columns, and that pair is the whole trick of a journey map: put your export's stage column in the horizontal one and its owner or touchpoint column in the vertical one, and the map comes out as stages across and owners down.
Three things break, and all three are in the file rather than in the diagram. Line to is a row number, not a step name and not an id, so the step_id your export already has is no use until you have sorted the rows into the order you want them drawn and written the positions in by hand; insert one row afterwards and every number below it moves. A cell containing a comma has to be wrapped in double quotes, so a Line to of 4,5 written without them arrives as two columns and shifts every column to its right by one, silently. And the header has to be the first line of the file: exports that print a report title, a date range and a blank line above the header match nothing at all until you delete those lines. Beyond that, save as UTF-8 and look at the delimiter, because a European Excel export is usually semicolon-separated, which is a different format wearing the same extension. The chart below is what the file becomes once it is right: a SaaS trial-to-paid journey across five stages and five touchpoint lanes, with a separate ending for every way a customer leaves.
The stages are the reason to draw it at all. A funnel report gives you a percentage per stage and no route, so you learn that most trials never activate and not where they went instead. A journey map drawn as stages across and owners down puts the drop-off on the page as an edge with a label on it, in the column where it happened and the lane of whoever was holding the account at the time.
What this flowchart covers
In this template
- Five stage columns (Awareness, Trial, Activation, Conversion and Retention) crossed with five touchpoint lanes: Customer, Marketing, Product, Sales and Support. Your export's stage column fills the first, its owner column the second.
- Attribution captured at the start rather than reconstructed later, at "Record the source, campaign and landing page", so the fields sitting in the first columns of an analytics export are on the diagram instead of in a separate report next to it.
- An activation gate with three labelled exits rather than two: "Is the first key action done within 7 days?" passes into the Activation stage, routes a day-7 case to "Send the day-7 setup reminder with a booking link", and stops a day-14 case at "Churned before activation".
- A qualification branch in the Sales lane, "Does the account fit the target profile?", whose out-of-scope exit finishes at "Disqualified as out of scope" rather than leaving unqualified trials inside the conversion rate.
- A capped extension loop: "Does the trial convert before it expires?" hands an unpaid expiry to "Was an extension asked for before the end date?", which either returns once to "Send the pricing options and the trial end date" or ends at "Trial expired without a purchase".
- Six separate endings, so drop-off is countable by stage instead of by status: "Left before the trial started", "Disqualified as out of scope", "Churned before activation", "Trial expired without a purchase", "Cancelled at renewal" and "Renewed and expanded".
When to use this template
- You have an analytics or CRM export with one row per journey step and a stage column, and somebody has asked for the journey as a picture rather than as a table.
- Marketing, product, sales and support each describe a different journey, because each of them exports from a different system and nobody has put the exports side by side.
- The funnel report gives you a conversion rate per stage but no route: you can see that 40% of trials never activate, and not where those accounts went instead.
- Trials are being extended by whoever happens to be asked, and nobody can say how many are open past their original end date.
- You are handing the journey to a new team and want the stage names, the thresholds and the owner of each touchpoint written on one page rather than explained in a call.
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 | Registry | 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,Registry,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.