Team Hierarchy
Upload a single CSV that defines your entire org chart so Git AI reports can be scoped by team.
Git AI can automatically create a report for every team in your company, and roll them up by groups and departments.
How uploads work
Org charts are uploaded as a CSV. Every upload is a full snapshot of your entire org. We suggest scheduling a daily or weekly sync, or using a Git AI plugin to pull the data on a schedule.
Uploads are atomic. The whole file validates and applies together, or nothing does.
A partial upload is never accepted, so a malformed row can't leave your org half-updated.
We suggest giving this page to your coding agent and having it map an export from your HR or SCM system — or its API calls — to the format below.
CSV format
There's one format, with five columns:
| Column | Description |
|---|---|
team_id | A stable identifier you assign. Keep it constant across uploads even if the team is renamed — the API and dashboard reference teams by this ID, so it survives name changes and name collisions. |
team_name | The display name for the team. |
team_lead_email | The manager of the team. One per team. |
parent_reference_id | The team_id of this team's parent. One per team. Leave blank for a top-level team. |
members | Comma-separated list of member emails. Can be blank (see rollup groups). |
The team_lead_email and members cells must use the name-qualified format
Employee Name <person@test.com>. A bare address like person@test.com is not
accepted — the display name is required so contributors resolve cleanly.
Here's a small org laid out as a table:
| team_id | team_name | team_lead_email | parent_reference_id | members |
|---|---|---|---|---|
team2 | Product X | Manager 11 <manager11@test.com> | — | — |
team3 | Product Y | Manager 15 <manager15@test.com> | — | — |
team5 | US Engineering | Manager 20 <manager20@test.com> | — | — |
team1 | iOS | Manager 5 <manager5@test.com> | team2 | Person 1 <person1@test.com>, Person 2 <person2@test.com> |
team4 | iOS | Manager 6 <manager6@test.com> | team3 | Person 3 <person3@test.com>, Person 4 <person4@test.com> |
And the same data as the raw CSV you'd upload:
team_id,team_name,team_lead_email,parent_reference_id,members
team2,Product X,Manager 11 <manager11@test.com>,,
team3,Product Y,Manager 15 <manager15@test.com>,,
team5,US Engineering,Manager 20 <manager20@test.com>,,
team1,iOS,Manager 5 <manager5@test.com>,team2,"Person 1 <person1@test.com>, Person 2 <person2@test.com>"
team4,iOS,Manager 6 <manager6@test.com>,team3,"Person 3 <person3@test.com>, Person 4 <person4@test.com>"In this example Product X and Product Y are parent teams. The two iOS
teams — same display name, different team_ids — roll up under different parents,
which is why stable IDs matter. US Engineering has no members, so it's a rollup
group.
Rules
Your mapping job should check each of these before it uploads:
- Exactly one manager per team.
team_lead_emailholds a single address. - Exactly one parent per team.
parent_reference_idpoints at oneteam_id, or is blank for a top-level team. - A team with no members is a rollup group. Leave
membersblank for grouping tiers likeUS EngineeringorGlobal Eng. On the dashboard, a rollup group shows a team leaderboard — a comparison across the teams beneath it — rather than a single team dashboard. - Team IDs are stable keys. Changing them may break downstream integrations via the API.
Manager role
Anyone listed as team_lead_email on any team is granted the Manager role in Git
AI. Managers who also write code have their own contributions counted inside their
team's dashboard — being the lead doesn't remove you from your team's numbers.
Uploading
Load the snapshot one of two ways:
- Enterprise admin API — post the CSV to the org-chart upload endpoint. Use this for the scheduled job that keeps your hierarchy in sync with your HR system.
- Dashboard upload form — upload the CSV by hand from the admin settings. Good for the first load and for one-off corrections.