How to create a swimlane diagram from CSV
Turn the Owner or Assigned-to column of a CSV export into swimlanes: every distinct value becomes a lane, blank cells fall into the first lane, and a handoff is any connector whose two rows sit in different lanes.
A worked example, stage by stage
Rows and shapes only
The first six rows are the brief: "Raise a campaign request", "Fill in the campaign brief", the check "Brief complete enough to plan?", a follow-up question about the missing detail, the Reject row "Campaign request withdrawn" and "Agree the launch date and the budget". This is what a CSV export usually holds: a list of steps with a Shape value and nothing joining them. Nobody can tell from it where work changes hands.
Line to, and the first crossing
Filling Line to draws the arrows and the first handoff appears immediately: "Fill in the campaign brief" sits with the requester and points at "Brief complete enough to plan?", which sits with Marketing. Rows 9 to 11 add the brand check and its rework loop, where row 11 points back at row 9: a backwards number in Line to that hands the assets from Marketing to Brand for a second time.
Labels on the branches
Row 14, "Claim approved as written?", has three numbers in Line to and three labels in Line text: Yes, Reword, and "Cannot be substantiated". The Reword exit goes to row 15 in Marketing, which points straight back at row 13 in Legal. One wording change therefore crosses the lane boundary twice, which is the kind of round trip the file states plainly and a prose SOP never does.
The lane columns
All 25 rows now carry a Vertical lane value (Requester, Marketing, Brand, Legal, Media buying) and a Horizontal lane value for the phase: Brief, Draft, Review, Approve, Launch. Fifteen of the 30 connectors cross an owner boundary. Legal occupies only three rows yet four connectors cross into or out of it, which is the argument for pulling Legal in earlier than row 13.
How it works
Pick the one column that names an owner
Exports usually offer several candidates: Assigned to, Owner, Responsible, Department, Team, Queue. Choose the one at the level you want lanes at: teams if the reader is a manager, named people only if the process really is person-specific. A swimlane diagram has one lane axis that carries the argument; the rest of the columns can ride along unused.
List the distinct values before you import
Run a unique-values or remove-duplicates pass on that column in whatever tool produced the file, and read the result. That list is exactly the set of lanes you are about to get. If it has nine entries and you expected five, you have four spelling variants, not four teams, and it is far cheaper to fix them in the column than to merge lanes afterwards.
Fill the blanks with a real value
A blank owner cell does not create an "unknown" lane: the step lands in the first lane, and it will look to every reader as though the first team owns that work. Type an explicit value, "Unassigned" or "Not agreed", into every empty cell. Steps whose owner nobody can name are the most useful output of this whole exercise, so give them somewhere visible to sit.
Rename the header row
The header row is what the importer reads: "Box text" for the step, "Line to" for the row number it leads to, "Line text" for the branch label, "Shape" for Start, Process, Decision, End, and "Vertical lane" for the owner. Use "Horizontal lane" too if you also have a phase or stage column. A header still called "Owner" is carried through and ignored, and the chart renders flat with no warning.
Check the delimiter, the quoting and the encoding
Owner values are the ones most likely to contain a comma ("Finance, EMEA" or "Operations, Nordics"), and an unquoted comma splits the row into an extra column, shifting every value after it one place left. Open the file in a plain text editor and look at three or four lines. Confirm the separator is what you think it is, that any value containing it is wrapped in double quotes, and that the file is UTF-8 so accented lane names survive.
Import, then read the crossings
Drop the .csv onto the spreadsheet area of a new chart, or paste the text into it. The lanes appear as bands and the diagram routes itself. Now trace each arrow that leaves one band and enters another: those are the handoffs, and the ones worth attention are the pairs that cross and cross back, like the reword loop between Marketing and Legal in the example.
Frequently asked questions
Should the owner go in Horizontal lane or Vertical lane?
Either works, and you can use both. The convention in the example is Vertical lane for the owner (Requester, Marketing, Brand, Legal, Media buying) and Horizontal lane for the phase: Brief, Draft, Review, Approve, Launch. That gives a grid where a step's position states who does it and when. If your file only has an owner column, fill one lane column and leave the other empty; a single axis is a normal swimlane diagram.
How many lanes will I get?
One per distinct non-blank value in the lane column, which is why the unique-values list is worth reading before you import. Blank cells do not produce an extra lane (they put the step in the first one), so an export with gaps quietly attributes unassigned work to whichever team happens to be first. Typing "Unassigned" into those cells costs a minute and turns an invisible error into a visible lane.
Can I find the handoffs by reading the CSV alone?
Yes, and it is worth doing once so you trust the diagram. For each row, take the number in Line to, find that row, and compare the two owner cells: different values mean the work changed hands. Backwards numbers count too: a rework row pointing at an earlier row is a handoff in the other direction. The example file at /templates/csv-swimlane-flowchart has 30 connectors and 15 of them cross a lane boundary.
My export has one row per ticket and forty names in Assigned to. What now?
You have an instance log, not a process definition, and importing it gives you forty lanes each holding a handful of unrelated boxes. Two passes fix it: reduce the rows to the distinct steps the tickets pass through, then map the names to the roles or teams that perform them. Lanes are only readable at somewhere between three and about seven, and a chart with a lane per person answers a staffing question rather than a process one.
The lane titles came out as garbage characters. What went wrong?
Encoding. Lane names are drawn on the chart, so a file exported as Latin-1 or Windows-1252 and read as UTF-8 shows its damage in the most visible place: Ø, ä and é each become a pair of stray characters in a band title. Re-export as UTF-8 rather than correcting the labels by hand, because the same values usually appear in other columns too. If the first column looks ignored instead, check the header row for a leading byte-order mark.