Platform
Coding agents
Connect Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Kiro, Cline, Continue, Windsurf and other AI coding tools, and see their usage, output and cost per tool, team and developer.
Coding tool usage reaches Token Meter separately from your SDK-metered API calls. Each tool reports through whatever channel it supports: the vendor's own analytics API, an OpenTelemetry export, the AIScale agent on each developer's machine, or the Token Meter Router. Everything lands under Developers in the sidebar: Connect an agent, Your agents, Agent usage, Seat management, Team and Individual.
Counts only
Token Meter reads sessions, prompts, tokens, lines, commits, credits and accept or reject decisions. Prompts, code, diffs and conversation content are never stored.How data arrives
| Route | Where you set it up | Best for |
|---|---|---|
| Vendor analytics API | Connect an agent › Sources, or Settings › Data sources for Anthropic and OpenAI keys | Cursor, GitHub Copilot, Claude Enterprise, Windsurf, Claude Code (Anthropic Admin key), Codex (ChatGPT Enterprise) |
| OpenTelemetry | Connect an agent › OpenTelemetry | Claude Code on any plan, Gemini CLI, VS Code Copilot Chat, Kiro Enterprise, Cline Enterprise, Continue, any tool that emits the standard GenAI token metric |
| AIScale | Connect an agent › AIScale (each developer, on each machine) | Token usage per developer and which committed lines came from AI |
| Router | Your Token Meter Router base URL | Cline and Continue, with exact tokens and cost (team workspaces) |
Commits, lines and merged pull requests for every tool also come from the GitHub connection (Connect an agent › GitHub): a commit with an AI co-author marker counts as that tool, one without counts as human. GitLab and Bitbucket are not supported. See AI Impact.
When a vendor API and OpenTelemetry or AIScale describe the same tool, person and day, the vendor row wins and the other is left out of every figure, so connecting both does not double count.
One route per tool for the Router
A call sent through the Router and also reported by the tool's own OpenTelemetry or data events counts twice.Who can do what
| Page | Who can open it |
|---|---|
| Connect an agent › AIScale | Every member |
| Connect an agent › OpenTelemetry, Sources, Jira | Admins and owners |
| Connect an agent › GitHub | Admins and owners |
| Settings › Data sources (Anthropic Admin key, OpenAI connection) | Admins and owners |
| Agent usage | Team leads and above. Team leads see their own teams only. |
| Team | Team leads and above, team workspaces only |
| Individual › People | Team leads and above. Team leads see their own teams only. |
| Individual › Me | Every member, own data only |
| Your agents | Admins and owners, team workspaces only |
| Seat management | Admins and owners, team workspaces only |
In a freelancer workspace only Individual, Agent usage and Connect an agent appear, named My usage, My AI impact and Connect.
Tool by tool
| Tool | How it connects | What you get | Not available |
|---|---|---|---|
| Claude Code | Anthropic Admin key under Data sources, or OpenTelemetry on any plan (Personal, Team or Enterprise) | Sessions, lines added and removed, commits, PRs, tokens and estimated cost by model, edit accepts and rejects, terminal type, per person | The Admin API does not cover Claude Code run through Bedrock, Vertex or Foundry |
| Claude Enterprise | Analytics API key on Sources | Per person: Claude Code sessions, lines, commits, PRs and edit accepts, plus claude.ai chat and Cowork activity (shown as Claude chat and Cowork). Assigned seat counts on Seat management. | Needs an Enterprise plan. Data starts 2026-01-01 and is about a day behind. Claude Code through Bedrock is not covered. |
| Codex | Your OpenAI connection under Data sources, with a ChatGPT workspace ID | Threads, prompts and credits by client (CLI, web and so on), tokens, and cost where ChatGPT reports it, per person | Codex OpenTelemetry is not mapped yet. Over that route only the standard GenAI token metric is read, and it shows as Other tools. |
| Cursor | Team API key on Sources | Lines added by AI (accepted suggestions), accepts and rejects, prompts by agent, composer, chat and inline edit, who uses Tab. On Enterprise, exact per-commit AI lines from AI Code Tracking. | No cost, no tokens, no sessions. No OpenTelemetry export. |
| GitHub Copilot | GitHub organization and token on Sources. VS Code Copilot Chat can also send OpenTelemetry. | Lines added and prompts by feature (completion, agent, chat, CLI), accepted suggestions and AI credits per person. Over OpenTelemetry: tokens by model. | Usage metrics are about two days behind. People are named by GitHub login. |
| Gemini CLI | OpenTelemetry through a Collector | Sessions, tokens by model, tool accept and reject | Partly supported: no lines, commits or cost |
| Kiro | Kiro Enterprise's daily OpenTelemetry export | Credits, messages and conversations per person and client (IDE, CLI, plugin), a day behind | No tokens |
| Cline | Cline Enterprise's OpenTelemetry logs, or the Router | Tasks (as sessions), prompts, tokens and cost by model | Over OpenTelemetry, people are anonymous IDs unless a Collector adds user.email |
| Continue | Continue's data destination, or the Router | Tokens by model and provider | People are anonymous IDs |
| Windsurf | Service key on Sources | Credits used per person per day | Enterprise plans with individual-level analytics on. Nothing else is reported. |
| Any other tool | OpenTelemetry, if it emits gen_ai.client.token.usage | Tokens by model and person, shown as Other tools | No sessions, lines or commits |
| Devin | Not supported yet | Nothing |
The Sources tab shows the same list as a shelf of tool logos grouped into Supported, Partly supported and Not supported yet. A dot on a logo shows a vendor feed's state; click a logo to connect or manage it. To ask for another tool, use Tell us which one at the bottom of the shelf.
AIScale (every developer)
AIScale is an agent that runs on a developer's machine and reports their AI coding tools' token usage and which committed lines came from AI. Usage sent with a key counts as the key owner's. It recognises Claude Code, Codex, Cursor, GitHub Copilot, Windsurf and Gemini CLI; anything else it reports shows as Other tools.
- Open Developers › Connect an agent (the AIScale tab) and choose Create key. Name it after the machine, for example "Work laptop". The key is shown once.
- On that machine, with Node.js 18 or newer, run the command the page shows. It works on macOS, Linux and Windows, asks before it installs anything, and replaces any other server the machine was sending to.
- Check it with
npx aiscale status. The server line should show your ingest address. After you next use an AI tool the activity log shows "metrics upload batch result" with no errors, and the key's status turns to Uploading.
npx aiscale connect --url https://<your ingest address> --key <your AIScale key>- A key expires after 90 days. Make a new one and revoke the old one to rotate.
- Each member can hold up to 5 live keys.
- A key that has not uploaded for 3 days shows as Quiet 3+ days. Admins see Everyone's keys, and an "AIScale key quiet" rule on Monitors sends a notice when a key goes quiet and clears it when uploads resume.
- Your account needs an email address to own a key.
OpenTelemetry
One endpoint takes OpenTelemetry metrics (Claude Code, Gemini CLI, Copilot Chat, Kiro), OpenTelemetry logs (Cline) and Continue's data events. Admins set it up on Developers › Connect an agent › OpenTelemetry.
- Choose Create token and name it after a group of machines or teams, for example "Dev laptops". The token is shown once, and the setup blocks on the page are filled in with it. One token per group lets you see what is reporting and revoke one without touching the rest.
- Point each tool at the endpoint the page shows,
https://<your ingest address>/v1/otlp, with the headerAuthorization: Bearer <your connector token>. - The Connectors table shows each token's Last data and People (30d). Revoke a token there to stop it at once.
Claude Code
Add this to ~/.claude/settings.json, or to Claude Code's managed settings to roll it out to everyone. Delta is Claude Code's default.
{
"env": {
"CLAUDE_CODE_ENABLE_TELEMETRY": "1",
"OTEL_METRICS_EXPORTER": "otlp",
"OTEL_EXPORTER_OTLP_PROTOCOL": "http/protobuf",
"OTEL_EXPORTER_OTLP_ENDPOINT": "https://<your ingest address>/v1/otlp",
"OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer <your connector token>",
"OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE": "delta"
}
}Gemini CLI, Copilot Chat and other tools, through a Collector
Run the contrib OpenTelemetry Collector where the tools run and point each tool's OTLP export at http://localhost:4317 (gRPC) or :4318 (HTTP). The Collector adds the token, sends HTTP to Token Meter, and converts cumulative metrics to delta.
receivers:
otlp:
protocols:
grpc: { endpoint: 0.0.0.0:4317 }
http: { endpoint: 0.0.0.0:4318 }
processors:
cumulativetodelta: {}
batch: { send_batch_max_size: 5000 }
exporters:
otlphttp:
endpoint: https://<your ingest address>/v1/otlp
headers:
Authorization: "Bearer <your connector token>"
service:
pipelines:
metrics:
receivers: [otlp]
processors: [cumulativetodelta, batch]
exporters: [otlphttp]Kiro (Enterprise)
Kiro sends from AWS once a day at 02:00 UTC, for the previous day. Store this as the plaintext of an AWS Secrets Manager secret encrypted with a customer managed KMS key, give q.amazonaws.com read access to the secret and the key, then pick the secret in the Kiro console under OpenTelemetry export with the HTTP/protobuf protocol.
{
"OTEL_EXPORTER_OTLP_ENDPOINT": "https://<your ingest address>/v1/otlp",
"OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer <your connector token>"
}A resent day replaces the stored day, so Kiro's retries never count twice.
Cline (Enterprise)
In the Cline dashboard's Remote Configuration, turn on OpenTelemetry with logs enabled and set these. Cline reports usage as log events; metrics can stay off.
OTLP endpoint: https://<your ingest address>/v1/otlp
Protocol: HTTP/protobuf
Header: Authorization: Bearer <your connector token>Continue
Add this to Continue's config.yaml, or to a shared assistant on Continue Hub. Continue posts one tokensGenerated event per model call, and no code is sent at level noCode.
data:
- name: Token Meter
destination: https://<your ingest address>/v1/connectors/continue
schema: "0.2.0"
level: noCode
events: [tokensGenerated]
apiKey: <your connector token>Say who is using a tool
Usage is linked to a person by user.email, then user.account_uuid, then the tool's anonymous user.id. A tool that reports no user can be attributed by setting a resource attribute where it runs. Without it, usage still counts but is not linked to anyone.
export OTEL_RESOURCE_ATTRIBUTES="user.email=you@company.com"What the endpoint accepts
- OTLP over HTTP only, as
application/x-protobuforapplication/json, gzipped or not. Tools that only speak gRPC go through a Collector. - Delta temporality only. Cumulative points are rejected with a message asking for
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=delta; a Collector withcumulativetodeltaconverts them. - At most 5,000 data points per request.
- Points dated more than 400 days ago or more than a day ahead are rejected.
- Metrics the endpoint does not map are ignored, not treated as errors.
Vendor analytics APIs
Admins connect these on Developers › Connect an agent › Sources. Keys are stored encrypted and never shown again.
- Cursor: a team API key with the
admin:*scope (cursor.com dashboard, API Keys). Cursor documents these APIs for Enterprise teams; whether a Teams-plan key works is not confirmed. AI Code Tracking is Enterprise only. - GitHub Copilot: the GitHub organization login and a token that can read it (
read:org), with the Copilot usage metrics policy switched on for the organization. This is the same GitHub connection Seats and licences uses for Copilot seats, so saving it in one place updates the other. Copilot names people by GitHub login, so map logins to members on the GitHub tab. - Claude Enterprise: an Analytics API key (scope
read:analytics) that the primary owner creates in claude.ai under Organization settings, API. An Admin key does not work. - Windsurf: a service key with the Teams Read-only permission (Windsurf team settings, Service Keys), and optionally a Group. Individual-level analytics must be on in Windsurf.
Two feeds come from provider connections under Settings › Data sources instead:
- Claude Code: an Anthropic Admin API key. If Claude Enterprise is also connected, Claude Code figures from the two are de-duplicated.
- Codex: your OpenAI connection with the ChatGPT workspace ID (optional, for Codex on AI Impact) filled in. The connection's key must be a workspace Admin key with the
enterprise.analytics.usage.readpermission; the Codex-only analytics scope does not work. Leave the ID blank to skip Codex. Your billing sync is unaffected either way.
Syncs run hourly, and also right after you save a connection. The first successful sync backfills 90 days; later runs re-pull the last few days because vendors revise them. Sync now queues a run, and Disconnect stops syncing and removes the stored key. Each tool's panel shows its last run and outcome, and the Connector ingest activity card on Sources shows recent activity from push connectors, kept for 90 days.
Cline and Continue through the Router
Cline and Continue call models with your own API keys, so you can point their OpenAI-compatible base URL at the Token Meter Router instead. Every call is then metered with exact tokens and cost. The Router is available in team workspaces; see Router for the settings. These calls arrive without a customer, feature or team.
Not both
Use the Router or the tool's own OpenTelemetry or data events, not both, or calls count twice.Linking usage to people
Usage counts under a person only when the tool reports a member's email, or a GitHub login mapped to a member. The rest is shown as not linked: the Team page shows a banner with how many tool identities are unlinked in the range, per tool.
- Ask developers to use AIScale with their own key, so their usage carries their email.
- Map GitHub logins to members on Connect an agent › GitHub (needed for Copilot).
- Add
user.emailas an OpenTelemetry resource attribute for tools that report no user. - Cline over OpenTelemetry and Continue report anonymous IDs; their org-wide totals are right, but they are not linked to members.
- Kiro is linked by the email Kiro resolves from your directory, else it stays unlinked.
What you see
Agent usage
Developers › Agent usage shows how teams use AI coding tools over 7, 30, 90 or 180 days or a year: active people, agent sessions, AI commits and pull requests, pay-as-you-go spend and API-equivalent value; agent sessions by tool, prompts sent by tool, active people by type of engagement (terminal, chat, agent, web); lines, commits and PRs per day; and By tool and By team tables. Select a row for every figure, including tokens and accept rate.
- Sessions and prompts are separate charts because they are different units. Claude Code, Gemini CLI and Cline report sessions; Cursor, Copilot, Codex and Claude chat report prompts.
- With GitHub connected, the daily output charts come from GitHub and split human from each AI tool. Human is an upper bound: a commit without an AI marker counts as human.
- With Cursor AI Code Tracking, a separate chart shows exact committed lines written by Cursor against everything else. Only that tool is measured, so it is not a workspace-wide AI share.
- Spend is pay-as-you-go where the tool bills it, otherwise API-equivalent value (subscription use valued at API rates, not money spent), otherwise credits. These are never added together.
- Teams under 5 people are combined in By team so no individual can be read from a row.
- A connected source that needs attention (a rejected key, a missing workspace ID or organization login) shows a notice above the charts with a link to fix it.
Team
Developers › Team (team workspaces) has an Overview tab with the org adoption rate, daily active AI users, power users and average cost per active user, plus an Attribution card and a Coding agents card showing spend per tool and how much of it is linked to people. The Teams and Roles tab has the team matrix, power users by team and usage by role. Admins can set a target share of active people per team with Edit targets. Active means at least one SDK or connected AI-tool activity in the range.
Individual
Developers › Individual has two views. People (team leads and above) lists AI spend and engineering output per person, with no score or ranking; select a person for their daily tokens by tool, coding tools and SDK-metered models. Me is every member's own usage, output and Claude plan, and is visible only to them.
Your agents
Developers › Your agents (admins, team workspaces) is the inventory of AI tools and accounts: Tools in use (sanctioned and shadow tools), Discovery (Google Workspace and expense or card CSV uploads, which feed Shadow AI signals), Registry (AI assets and SaaS agreements; register a tool by hand) and Seats and licences (seat utilization, idle seats, renewals, and vendor admin connectors for GitHub Copilot seats and Slack).
Seat management
Developers › Seat management (admins, team workspaces) measures how much of each Claude seat's weekly allowance is used. Anthropic publishes no token or dollar quota for a seat, so a seat's use is reported when Claude showed a percentage, a calibrated estimate when usage is divided by an allowance learned from readings, or a peer estimate otherwise.
- Add plan: name, type (Max / Pro, Team or Enterprise) and, for Enterprise, seat-based or usage-based billing. Each person belongs to exactly one plan.
- Add a seat: one email and tier, or import a CSV of
email,tier. People who use Claude but hold no seat appear under Not on any plan, where you can assign them. - Set each tier's Seat price / month and, optionally, declare its Weekly allowance.
- Add Usage readings: the weekly percentage a seat holder sees in Claude under Settings, Usage. Readings above 50% are the most accurate; one below 30% is ignored.
- With a directory synced (Google Workspace, Okta or Entra), Add a directory rule selects people by organisational unit, department or job title. You review them before anyone is added.
Seats are graded over the last 4 complete weeks as Achiever, Steady, Laggard, Dormant or Unknown, with "at cap" and "downgrade?" flags. Values are API-equivalent dollars of Claude Code usage, not money spent; chat is not included unless a feed reports it. Usage comes from the Claude Code feeds above (Admin API, Enterprise Analytics, OpenTelemetry or AIScale), and with Claude Enterprise connected each plan card also shows how many seats Anthropic reports as assigned. Every view of the named seat list is recorded.
On Individual › Me, a member sees their own seat and weekly use and can Add a reading. Pro and Max subscribers can install a Claude Code status-line reporter, shown on that tab, that forwards only the weekly percentage and their email.
Troubleshooting
| What you see | What to check |
|---|---|
| A connector shows Nothing received yet | The endpoint and Authorization: Bearer header, that the tool exports over HTTP (use a Collector for gRPC), and that it has flushed at least once. |
| The exporter reports non-delta points rejected | Set OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=delta, or send through a Collector with cumulativetodelta. |
| HTTP 415 from the endpoint | The body must be application/x-protobuf or application/json. |
| connected. The first sync has not run yet | Syncs run hourly, or after you save the connection. Use Sync now to queue one. |
| Codex is connected. One more step: add your ChatGPT workspace ID | Add the workspace ID to the OpenAI connection under Settings › Data sources. |
| GitHub Copilot is connected. One more step: add your organization login | Add the organization login on the Copilot panel. |
| A source could not read its usage | The key was rejected. Check its plan and permissions (for Codex, enterprise.analytics.usage.read and a workspace ID that belongs to that workspace). |
| Cursor AI Code Tracking is not available for this key | AI Code Tracking is Enterprise only. The rest of Cursor's data still syncs. |
| An AIScale key shows Quiet 3+ days | Run npx aiscale status on that machine. The key may be revoked or expired, the network blocked, or the agent uninstalled. |
| You already have 5 active keys | Revoke a key you no longer use, then create one. |
| Usage is not linked to people | See Linking usage to people. |
| Cline or Continue usage looks doubled | The tool is reporting both through the Router and through OpenTelemetry or data events. Keep one. |
| A tool shows nothing | Cursor has no OpenTelemetry export, Codex OpenTelemetry is not mapped yet, and Devin is not supported. |