Dashboard →

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

RouteWhere you set it upBest for
Vendor analytics APIConnect an agent › Sources, or Settings › Data sources for Anthropic and OpenAI keysCursor, GitHub Copilot, Claude Enterprise, Windsurf, Claude Code (Anthropic Admin key), Codex (ChatGPT Enterprise)
OpenTelemetryConnect an agent › OpenTelemetryClaude Code on any plan, Gemini CLI, VS Code Copilot Chat, Kiro Enterprise, Cline Enterprise, Continue, any tool that emits the standard GenAI token metric
AIScaleConnect an agent › AIScale (each developer, on each machine)Token usage per developer and which committed lines came from AI
RouterYour Token Meter Router base URLCline 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

PageWho can open it
Connect an agent › AIScaleEvery member
Connect an agent › OpenTelemetry, Sources, JiraAdmins and owners
Connect an agent › GitHubAdmins and owners
Settings › Data sources (Anthropic Admin key, OpenAI connection)Admins and owners
Agent usageTeam leads and above. Team leads see their own teams only.
TeamTeam leads and above, team workspaces only
Individual › PeopleTeam leads and above. Team leads see their own teams only.
Individual › MeEvery member, own data only
Your agentsAdmins and owners, team workspaces only
Seat managementAdmins 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

ToolHow it connectsWhat you getNot available
Claude CodeAnthropic 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 personThe Admin API does not cover Claude Code run through Bedrock, Vertex or Foundry
Claude EnterpriseAnalytics API key on SourcesPer 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.
CodexYour OpenAI connection under Data sources, with a ChatGPT workspace IDThreads, prompts and credits by client (CLI, web and so on), tokens, and cost where ChatGPT reports it, per personCodex OpenTelemetry is not mapped yet. Over that route only the standard GenAI token metric is read, and it shows as Other tools.
CursorTeam API key on SourcesLines 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 CopilotGitHub 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 CLIOpenTelemetry through a CollectorSessions, tokens by model, tool accept and rejectPartly supported: no lines, commits or cost
KiroKiro Enterprise's daily OpenTelemetry exportCredits, messages and conversations per person and client (IDE, CLI, plugin), a day behindNo tokens
ClineCline Enterprise's OpenTelemetry logs, or the RouterTasks (as sessions), prompts, tokens and cost by modelOver OpenTelemetry, people are anonymous IDs unless a Collector adds user.email
ContinueContinue's data destination, or the RouterTokens by model and providerPeople are anonymous IDs
WindsurfService key on SourcesCredits used per person per dayEnterprise plans with individual-level analytics on. Nothing else is reported.
Any other toolOpenTelemetry, if it emits gen_ai.client.token.usageTokens by model and person, shown as Other toolsNo sessions, lines or commits
DevinNot supported yetNothing

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.

  1. 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.
  2. 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.
  3. 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.
Shell
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.

  1. 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.
  2. Point each tool at the endpoint the page shows, https://<your ingest address>/v1/otlp, with the header Authorization: Bearer <your connector token>.
  3. 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.

settings.json
{
  "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.

collector.yaml
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.

JSON
{
  "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.

Cline Remote Configuration
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.

config.yaml
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.

Shell
export OTEL_RESOURCE_ATTRIBUTES="user.email=you@company.com"

What the endpoint accepts

  • OTLP over HTTP only, as application/x-protobuf or application/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 with cumulativetodelta converts 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.read permission; 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.email as 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.

  1. 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.
  2. 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.
  3. Set each tier's Seat price / month and, optionally, declare its Weekly allowance.
  4. 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.
  5. 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 seeWhat to check
A connector shows Nothing received yetThe 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 rejectedSet OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=delta, or send through a Collector with cumulativetodelta.
HTTP 415 from the endpointThe body must be application/x-protobuf or application/json.
connected. The first sync has not run yetSyncs run hourly, or after you save the connection. Use Sync now to queue one.
Codex is connected. One more step: add your ChatGPT workspace IDAdd the workspace ID to the OpenAI connection under Settings › Data sources.
GitHub Copilot is connected. One more step: add your organization loginAdd the organization login on the Copilot panel.
A source could not read its usageThe 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 keyAI Code Tracking is Enterprise only. The rest of Cursor's data still syncs.
An AIScale key shows Quiet 3+ daysRun 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 keysRevoke a key you no longer use, then create one.
Usage is not linked to peopleSee Linking usage to people.
Cline or Continue usage looks doubledThe tool is reporting both through the Router and through OpenTelemetry or data events. Keep one.
A tool shows nothingCursor has no OpenTelemetry export, Codex OpenTelemetry is not mapped yet, and Devin is not supported.