Platform
AI Impact
Put AI coding tool spend next to what your teams ship: merged pull requests from GitHub, AI-written lines from AIScale and resolved tickets from Jira, at team level.
AI Impact is the set of Developers pages that join three kinds of data: what your AI coding tools cost, what landed in your repositories, and what was delivered in Jira. It answers questions such as “what does an AI-authored pull request cost us”, “how do AI-authored pull requests fare in review” and “roughly how much AI spend sits behind this ticket”. Every figure is an association between spend and output, not proof that the tools caused it.
What AI Impact shows
All pages are under Developers in the sidebar. Each has a 7d, 30d, 90d, 180d and 1y range (dates are UTC). Repositories holds a year of GitHub history. The other pages hold what each AI tool’s analytics feed served when it was connected (90 days at most; GitHub Copilot metrics serve 28), and a notice under the header says per source where its data starts when the range reaches further back. Jira is read over the connection’s lookback window, 365 days by default.
| Page | What it shows |
|---|---|
| Work › Repositories | Tabs Repositories (merged and AI-authored pull requests and AI spend per repository), Quality (review and revert signals, AI-authored against human) and Code attribution (committed lines AIScale says AI wrote). Each pull request has a detail page. |
| Work › Delivery | Tabs Cost per PR (cost per AI-authored pull request by team, spend against output, quality beside cost, before and after AI, spend by model), Jira (delivery and bug metrics, AI cost per ticket) and Recall (context tokens avoided by Agent Recall). |
| People › Team | Adoption: active users, power users, usage by role, and team adoption targets. |
| People › Individual | AI spend and engineering output per person, with no score or ranking. |
| Tools › Agent usage | How teams use AI coding tools and what they cost. |
| Tools › Data sources | Tabs AIScale, OpenTelemetry, GitHub, Jira and Coding tools: where every input is connected. |
Who can see and set it up
| Role | Can |
|---|---|
| Team lead | Open Repositories, Delivery, Agent usage and Team. A team lead sees only the teams they lead. |
| Admin or owner | Everything above for the whole workspace, plus connect GitHub, Jira, OpenTelemetry and the AI tool sources, and set team adoption targets. |
| Member | Create their own AIScale keys on Data sources › AIScale. |
GitHub, Jira and AIScale are available on every plan. The Team page and adoption targets exist only in team workspaces.
Connect GitHub
GitHub gives AI Impact the human baseline: commits, merged pull requests, reviews and reverts. It connects through the Token Meter GitHub App with read-only Metadata, Contents and Pull requests permissions.
Set it up
- Open Developers › Data sources › GitHub (admin or owner).
- Choose Connect GitHub, top right. GitHub asks you to pick the organization and the repositories to install the App on, and to authorize it. You must be an admin of that GitHub organization. If you are not, GitHub sends an install request to an organization owner; connect again after they approve it.
- Back in Token Meter the first sync is queued. The connection card shows the account, status, last sync and how many repositories are included.
- Under Repositories, include or exclude each repository. Only included repositories are read. Forks and archived repositories start excluded.
- Under Git authors, check that each GitHub login is matched to a workspace member (see below).
To add or remove repositories later, use Reconnect or change repositories. Sync now queues a sync straight away. Disconnect stops syncing and removes the stored credential.
What a sync reads
- Syncs run about once an hour. The first sync of a repository reads the last 30 days, and the past year is then filled in behind it over the following hours; later syncs re-read the last 3 days, because pull requests merge late and history can be rewritten.
- Commits on each repository's default branch (merge commits are skipped), with their date, author, line counts and AI markers.
- Pull requests in any state (merged, open, closed), with dates, size, commit count, reviews by people other than the author, review threads and revert links.
- Jira-style issue keys (such as
PAY-123) found in pull request titles, branch names and commit messages, so tickets can be linked to pull requests. - 14 days after a pull request merges, line survival measured with GitHub's blame (no repository clone).
Matching authors to people
At each sync, a GitHub login is matched to a workspace member whose email appears on that login's commits. When someone commits with a personal or noreply address, map the login by hand under Git authors: enter the member's email and choose Map. A manual mapping is never overwritten by a sync. Bot and agent accounts (for example copilot-swe-agent[bot]) are not people and cannot be mapped.
Work by an unmatched author shows as Unassigned on the team charts.
How AI authorship is detected
A commit counts as AI-authored when it carries a marker an AI tool leaves:
- a co-author trailer or footer from Claude Code, GitHub Copilot, Cursor, Codex, Devin or Gemini CLI (for example
Co-Authored-By: Claude, or “Generated with Claude Code”); - an Aider author name ending in
(aider); - a commit made by an agent account, such as Copilot, Devin, Codex, Cursor or Claude bot accounts.
A pull request is AI-authored when an agent account opened it, or when any of its commits is AI-authored.
AI-authored is a floor
This is not a code classifier. Stripped trailers, squash merges that drop them, and tab-completion tools that leave no mark are all missed, so “human” means “no AI marker found” and the AI-authored figures are a floor.AI-written lines with AIScale
AIScale runs on each developer's machine. It reports token usage per AI session and model, and, for each commit, which line ranges in which files each AI session wrote. Setting it up is covered in Coding agents.
With AIScale and GitHub both connected:
- Code attribution lists AI-attributed committed lines per commit and file, with the tool and model. A row appears only when the commit note could be parsed, the commit was synced from GitHub, and the author is a verified workspace member. Separate sessions can report overlapping lines.
- The pull request detail page shows Who wrote the lines (AI sessions against the human) and AI sessions behind this PR. A commit with no AIScale note counts as unknown, not human-written.
- Repositories, pull requests and Jira tickets get an AI cost (see How cost is tied to work).
Only machines running AIScale contribute. Admins see every key on Data sources › AIScale; a key that has not uploaded for 3 days shows as quiet.
Connect Jira
Jira adds resolved tickets, story points, epics and bugs. Only Jira Cloud (https://<site>.atlassian.net) is supported.
Set it up
- Each Jira project is mapped to a Token Meter team, so create your teams first (Settings › Team › Teams). The Jira page lists every existing team with its slug.
- In Jira, find the story points field id: Settings › Issues › Custom fields › Story points; the id (such as
customfield_10016) is in the field's URL. - Create an API token for a dedicated read-only integration account that can browse projects and issues in the projects you map.
- Open Developers › Data sources › Jira (admin or owner) and fill in the form below.
- Choose Save Jira connection, then Sync now. The page shows the number of imported events, the last sync and any error.
| Field | What to enter |
|---|---|
| Jira Cloud URL | The site origin only, for example https://acme.atlassian.net |
| Account email | The integration account's email |
| API token | The token from step 3. It is stored encrypted and never shown again. |
| Project-to-team mappings | One PROJECT_KEY=team-slug per line. At least one; every team slug must exist in the workspace. |
| Story points field id (required) | customfield_NNNNN |
| Issue types that count as bugs | Comma-separated, default Bug (1 to 10 types) |
| Lookback days (1–365) | How far back the first sync reads, default 90 |
Later changes (a new token, mappings, story points field) go under Rotate credentials or change project mappings. Disconnect stops syncing; imported issues are kept. To cut off access completely, also revoke the token in your Atlassian account.
What a sync reads
- Syncs run about once an hour. Each sync reads issues in the mapped projects changed since the last sync (with a 2-day overlap); the first sync reads the lookback window (365 days by default), and so does the next sync after the lookback is changed.
- Per issue: key, project, issue type, parent and epic, status category, priority, story points, and created, updated and resolved dates.
- Issue titles, descriptions and comments are not requested or stored. No assignee or reporter is read.
- The story points field must exist and be a number field. If it is not, the sync fails and the error lists likely candidate field ids.
Done without a resolution
Many team-managed Jira projects move issues to Done without ever setting a resolution. AI Impact treats an issue as resolved at its resolution date or, when there is none, at the time it entered a Done-category status. An issue outside the Done category with no resolution date is unresolved.
AI tool sources
The spend side of AI Impact comes from your AI coding tools: vendor analytics APIs connected on Data sources › Coding tools (Claude Code, Claude Enterprise, Cursor, GitHub Copilot, Codex, Windsurf and others), OpenTelemetry on Data sources › OpenTelemetry, and AIScale. Only counts are read, never prompts, code or conversation content. What each tool reports, and what plan it needs, is in Coding agents.
Commits and pull requests come from GitHub only. GitLab and Bitbucket are not supported.
Reading the pages
Repositories
- By repository: merged pull requests, AI-authored pull requests, AI spend (AIScale) and spend per merged or per AI-authored pull request. Select a repository for lines merged, spend with no committed code, estimated spend across all tools, tools and models, and review coverage.
- Quality compares AI-authored and human pull requests: reviewed before merge, reviews per pull request, changes requested, commits after first review, rework rate, 14-day churn, time to first review and reverted. Review data exists only for pull requests synced since review collection started. Recent pull requests lists pull requests by team, not by author; the number opens the pull request's detail page.
- The pull request detail page also shows Review, Did the code stay? (line survival, and whether it was reverted) and Linked Jira tickets.
Delivery
- Cost per PR: cost per AI-authored pull request by team, weekly or monthly, with a trend verdict once a team has 8 weeks of history (first four weeks against the last four). Without GitHub, the tab uses the pull requests, commits and lines the AI tools themselves report. It also shows spend over time, AI cost by Jira epic or project, story points against spend, Before vs after AI and Spend by model.
- Jira: By project (resolved issues, story points, bugs created, Est. AI spend), Bugs (created, fixed, open now, median lead time from created to resolved), By epic and AI cost per ticket.
- Recall: estimated context tokens avoided by Agent Recall; see Router.
Team
Org adoption rate, daily active AI users, power users (AI use on at least 75% of workdays), average cost per active user and usage by role. Admins set a target per team with Edit targets: the share of the team's roster that should be active, over a window of 7 to 365 days. A team below its target raises a warning alert, checked daily, which clears when the team is back on target.
How cost is tied to pull requests and tickets
There are three different bases, and they are never added together.
| Figure | How it is computed |
|---|---|
| Cost per AI-authored PR (Cost per PR tab) | A team's pay-as-you-go AI tool spend divided by its AI-authored merged pull requests. Subscription usage has no per-token cost and is excluded; a team with only subscription usage shows its API-equivalent value marked "equiv.". |
| AI spend per repository and per pull request | AIScale token counts priced at API list rates for the model. A session's cost is split across the commits it touched by lines attributed; a pull request gets the share for its own commits and its merge commit. For seat-billed tools such as Cursor or Copilot this is what the tokens would cost, not what was paid. |
| AI cost per ticket | The AIScale cost of the merged pull requests linked to the ticket. A pull request that names several tickets splits its cost evenly between them, so nothing is counted twice. |
| Est. AI spend (Jira by project) | Each linked AI-authored pull request times its team's cost per AI-authored pull request. |
| Est. spend (repository dialog) | Pay-as-you-go vendor and OpenTelemetry spend spread by each person's commits per repository and day. |
- A ticket is linked to a pull request only when the pull request names the issue key in its title, branch name or commit messages. Revert pull requests are not costed. The Jira tab shows what share of merged pull requests carry a key.
- A dash means no cost is recorded, not $0. A leading
~means the figure is a floor (some linked pull requests have no cost, or some usage could not be priced). - Models with no price rule are counted as unpriced and named, never shown as $0.
- AIScale session spend that no commit note attributes a line to is shown as No committed code. Treat it as spend without a delivered pull request, not as waste.
- Planning, review and work done without AI tools are not in any of these figures.
Privacy and limits
- No source code. The GitHub sync reads commit and pull request metadata: counts, line totals, authorship markers, reviews. It stores no code, diffs or commit messages. Pull request titles, bodies and commit messages are read in memory only to find issue keys, revert links and AI markers.
- Jira stores no titles, descriptions or comments, and reads no assignee or reporter.
- AIScale sends counts and line ranges. Prompts and code are never stored.
- Team grain. Repositories, Delivery and Agent usage report by team, not by person. Teams with fewer than 5 people are combined into Other (small teams). Per-person figures are only on Individual.
- Correlation, not causation. Team size, seniority and repository type are not controlled. Do not use these figures to rank teams or people.
- Very large backlogs are read in bounded chunks: a sync that reaches its page limit catches up over later runs.
- Line survival is not measured for rebase-merged pull requests or pull requests adding more than 3,000 lines, and only the 10 files with the most added lines are checked.
Troubleshooting
| What you see | What to check |
|---|---|
| The GitHub App is not configured on this server | The deployment has no GitHub App set up. Ask whoever runs your Token Meter deployment. |
| Installation requested | A GitHub organization owner has to approve the install. Connect again after they do. |
| Only an admin of that GitHub organization can connect it | Sign in to GitHub as an organization admin, or ask one to connect. |
| That GitHub installation is already connected to another workspace | One installation belongs to one Token Meter workspace. Disconnect it there first. |
| A repository shows Failing or Stale | The error is shown under the status. Stale means not synced in over 24 hours. "GitHub rate limit reached" clears on a later run. |
| Work shows as Unassigned | Map the GitHub login to a member under Git authors. |
| No review data yet | Review data is collected for pull requests synced from now on, not backfilled for older ones. |
| Story points field is not set | Sync is paused. Set it under Rotate credentials or change project mappings. |
| Jira field does not exist on this site, or is not a number field | Use one of the candidate field ids the error lists. |
| No Jira outcomes imported yet | Run Sync now. Only issues in mapped projects resolved inside the lookback window are counted. |
| Tickets were resolved, but none can be costed | Put the Jira key in the pull request title or branch name. |
| No AIScale line attribution found | Connect GitHub and AIScale, map the author to a member, and wait for a note sync. |
| A ticket or repository shows a dash for cost | No AIScale session is attributed to its pull requests. |