CSV organizational chart template (approval authority by reporting line)
Turn an HRIS CSV export into a flowchart of who may sign what. The manager_id column becomes an escalation ladder, three authority limits sit on the decisions, and self-approval, delegation and cross-charging each get a route.
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 | Raise a request against a cost centre | 2 | Employee | Requesting line | |
| 2 | Process | Read the requester's row from the HRIS export | 3 | Employee | Requesting line | |
| 3 | Decision | Does the row name a manager? | 6, 4 | Yes, No | Employee | Requesting line |
| 4 | Process | Ask the People team to correct the reporting line | 5 | Employee | People team | |
| 5 | Decision | Reporting line corrected before the cut-off? | 6, 22 | Yes, No | Employee | People team |
| 6 | Process | Walk manager_id up to build the approval chain | 7 | Line manager | Requesting line | |
| 7 | Decision | Is the requester inside their own approval chain? | 8, 12 | No, Yes - skip a level | Line manager | Requesting line |
| 8 | Decision | Is the named approver available? | 10, 9 | Available, On leave | Line manager | Requesting line |
| 9 | Process | Route to the delegate named on the approver's row | 10 | Line manager | People team | |
| 10 | Decision | Within the line manager's approval limit? | 11, 12 | Within limit, Over limit | Line manager | Requesting line |
| 11 | Process | Line manager signs the request | 19 | Line manager | Requesting line | |
| 12 | Process | Escalate to the department head | 13 | Department head | Requesting line | |
| 13 | Decision | Within the department head's approval limit? | 14, 15 | Within limit, Over limit | Department head | Requesting line |
| 14 | Process | Department head signs the request | 19 | Department head | Requesting line | |
| 15 | Process | Escalate to the director for the function | 16 | Director | Requesting line | |
| 16 | Decision | Within the director's approval limit? | 17, 18 | Within limit, Over limit | Director | Requesting line |
| 17 | Process | Director signs the request | 19 | Director | Requesting line | |
| 18 | Decision | Take it to the executive committee or withdraw it? | 20, 25 | Take it up, Withdraw | Director | Requesting line |
| 19 | Decision | Does the spend sit on another line's cost centre? | 21, 23 | Yes, No | Executive committee | Finance |
| 20 | Decision | Does the executive committee approve? | 19, 24 | Approved, Rejected | Executive committee | Executive office |
| 21 | Process | Finance countersigns for the owning cost centre | 23 | Executive committee | Finance | |
| 22 | Reject | Returned: no approver in the reporting line | Employee | People team | ||
| 23 | Success | Approved and recorded against the cost centre | Executive committee | Finance | ||
| 24 | Reject | Rejected with the reason recorded | Executive committee | Executive office | ||
| 25 | End | Withdrawn by the requester | Employee | Requesting line |
#,Shape,Box text,Line to,Line text,Horizontal lane,Vertical lane
1,Start,Raise a request against a cost centre,2,,Employee,Requesting line
2,Process,Read the requester's row from the HRIS export,3,,Employee,Requesting line
3,Decision,Does the row name a manager?,"6, 4","Yes, No",Employee,Requesting line
4,Process,Ask the People team to correct the reporting line,5,,Employee,People team
5,Decision,Reporting line corrected before the cut-off?,"6, 22","Yes, No",Employee,People team
6,Process,Walk manager_id up to build the approval chain,7,,Line manager,Requesting line
7,Decision,Is the requester inside their own approval chain?,"8, 12","No, Yes - skip a level",Line manager,Requesting line
8,Decision,Is the named approver available?,"10, 9","Available, On leave",Line manager,Requesting line
9,Process,Route to the delegate named on the approver's row,10,,Line manager,People team
10,Decision,Within the line manager's approval limit?,"11, 12","Within limit, Over limit",Line manager,Requesting line
11,Process,Line manager signs the request,19,,Line manager,Requesting line
12,Process,Escalate to the department head,13,,Department head,Requesting line
13,Decision,Within the department head's approval limit?,"14, 15","Within limit, Over limit",Department head,Requesting line
14,Process,Department head signs the request,19,,Department head,Requesting line
15,Process,Escalate to the director for the function,16,,Director,Requesting line
16,Decision,Within the director's approval limit?,"17, 18","Within limit, Over limit",Director,Requesting line
17,Process,Director signs the request,19,,Director,Requesting line
18,Decision,Take it to the executive committee or withdraw it?,"20, 25","Take it up, Withdraw",Director,Requesting line
19,Decision,Does the spend sit on another line's cost centre?,"21, 23","Yes, No",Executive committee,Finance
20,Decision,Does the executive committee approve?,"19, 24","Approved, Rejected",Executive committee,Executive office
21,Process,Finance countersigns for the owning cost centre,23,,Executive committee,Finance
22,Reject,Returned: no approver in the reporting line,,,Employee,People team
23,Success,Approved and recorded against the cost centre,,,Executive committee,Finance
24,Reject,Rejected with the reason recorded,,,Executive committee,Executive office
25,End,Withdrawn by the requester,,,Employee,Requesting lineHow it works
Fix the export before you touch the chart
Open the CSV in a plain text editor, not a spreadsheet, and look at the first line. If the fields are separated by semicolons, a European locale exported it and most importers will read the whole file as one column. If the first header cell looks like employee_id with an invisible character in front of it, that is a UTF-8 byte order mark and it will stop the header matching. Check that any field containing a comma is wrapped in double quotes, and that employee ids with leading zeros survived — a spreadsheet round trip is where those usually die.
Reduce the export to the five columns that route
employee_id, full_name, job_title, manager_id and cost_centre. Delete nothing in the source file; take a copy. Then check two things a tree drawing would also need: that exactly one row has a blank manager_id, and that no manager_id names an employee_id absent from the file. A manager who left last month is still named on twelve rows and is the most common reason a chain stops halfway.
Reshape it into the editor's columns
QueryChart imports by header name, so the columns to produce are Shape, Box text, Line to, Line text, Horizontal lane and Vertical lane. Box text is the label in the box, Shape is Process, Decision, Start, End, Success or Reject, and the two lane columns place the box. Line to is the row number of the next step, comma-separated for a decision, with Line text carrying the matching branch labels in the same order. Drop the file onto the spreadsheet area of an open chart, or paste the CSV text into it.
Type your real approval limits onto the three decisions
"Within the line manager's approval limit?" and its two siblings are deliberately unnumbered, because the amounts are not in any HRIS export — they come from a delegation of authority policy. Write the currency figure into each decision's box text, and note in the box comment which policy version it came from and when it was last reviewed. A ladder with no numbers on it routes nothing.
Decide what a blank delegate means
The on-leave branch assumes the approver's row carries a delegate or acting_manager value. Decide now what happens when it is empty: escalate a level automatically, or hold the request and notify the People team. Both are defensible. Leaving it undecided means the request sits with a named owner who is not reading it, which is indistinguishable from being lost.
Keep this apart from the headcount org chart
The same export can produce two artefacts, and they answer different questions. A tree drawn in QueryChart's org-chart editor shows who reports to whom and how many people sit under each manager. This flowchart shows how a request travels through that tree. Do not try to make one document do both — the tree will grow decision diamonds it cannot explain, and the flowchart will grow every employee who never approves anything.
Frequently asked questions
What columns does the HRIS export actually need?
Five. employee_id, a stable identifier for each person. manager_id, holding the employee_id of that person's manager, which is the column the hierarchy lives in. full_name and job_title, which become the text people read on the boxes. And cost_centre, which is what makes the cross-charge decision answerable at all. Everything else in a payroll or HRIS export — salary band, start date, location, contract type, national insurance number — is either irrelevant to routing or is data you should not be pasting into a diagram. Take a copy of the file, keep those five, and leave the original alone.
Why does my CSV open as a single column?
Because the delimiter is not a comma. Exports generated under a European locale routinely use a semicolon, since the comma is the decimal separator there, and a file full of semicolons read as comma-separated is one field per line. Two other common causes: the file was saved as UTF-16 rather than UTF-8, so every character is followed by a null byte and nothing matches, or the first header cell carries a byte order mark that silently makes employee_id a different string from employee_id. Open the file in a plain text editor and look at line one before blaming the importer.
Is this the same as an org chart?
No, and it is worth being exact about the difference. An org chart is a tree: it answers who reports to whom, how deep the structure goes and how many people sit under each manager, and QueryChart has a dedicated org-chart editor that draws exactly that from the same export. This template is a flowchart. It answers a routing question — this request needs approving, whose signature does it need, and where does it go when that person is over their limit, absent, or the requester themselves. The tree is the input. The flowchart is what you do with it. Most organisations need both, drawn separately.
What breaks when the file is imported?
Three things, and only one of them is loud. The Line to column holds row numbers rather than step names, so an edge pointing at a row that does not exist is dropped with no message at all and the box simply sits there unconnected. Inserting a row renumbers every row beneath it, which is why it is safer to append and repoint than to insert. And a shape name the editor does not recognise normalises to Process, so a mistyped Decision becomes a rectangle with its branch labels still attached to its arrows. Check the diamonds after any import; they are where a silent failure shows first.
How do you set the approval limits?
From a written delegation of authority policy, not from the org chart. The org chart tells you the order of the levels; the policy tells you the amount at each one, and the two are maintained by different people. Three practical rules. Give every level a stated figure, including the top one, so there is no amount that nobody may approve. Make the bands non-overlapping, so exactly one level is the lowest that can sign a given amount. And state whether a request may be split, because a policy with a limit and no anti-splitting clause is a limit on paperwork rather than on spend.