In this article
Overview
Pensero connects to Claude Code to make AI-assisted work visible at team and company level.
AI usage on its own is not the goal. Pensero aligns Claude Code usage with real delivery signals so teams can understand when AI increases output and when it adds defects or rework.
What Pensero Reads from Claude Code
Pensero ingests Claude Code usage analytics only. It does not access source code.
Pensero retrieves the following information:
Total lines added
Total lines removed
Sessions
Commits
User identifiers
Timestamps for AI events
How we calculate AI usage
Pensero estimates AI adoption using a directional proxy, not exact code authorship attribution.
AI usage % = Accepted AI-suggested lines ÷ Total committed lines
Important clarifications:
This metric is designed to track adoption trends over time, not to audit individual lines of code.
Different AI tools report usage differently. Pensero focuses on a consistent, comparable signal.
The goal is to understand how AI affects delivery and quality, not to maximize the percentage.
How to connect Claude Code to Pensero
The right setup depends on how your team runs Claude Code.
Prerequisites
Before setting up the integration, make sure you have:
Pensero Admin access ( Integrations > Claude Code)
Access to your organization’s Claude account or Claude Code configuration
Choose your setup path
Pick the option that matches how your team accesses Claude Code today. The path names match exactly what you see when you run /login in Claude Code.
Your team uses Claude Code through API keys or usage-based billing.
Your team uses a Claude Pro, Max, Team, or Enterprise subscription.
Your team uses Claude through Amazon Bedrock, Microsoft Foundry, or Google Vertex AI.
Not sure which applies? If your developers pay per token or use API keys to access Claude Code, choose Path 1. If your company has a Claude Teams or Enterprise seat subscription, choose Path 2. If Claude is hosted in your own AWS or GCP environment, choose Path 3.
Path 1: API integration
Use this when your team runs Claude Code through API keys or usage-based billing.
This is the simplest setup. No configuration is pushed to developers.
Step 1 - Open Claude Code in Pensero
Go to Integrations > Claude Code in the Pensero sidebar.
Step 2 - Get your API token from Claude Console
Log in to the Claude Console at console.anthropic.com. You need organization admin access. Copy your API token.
Step 3 Add the token to Pensero and save
Paste the token in Pensero and click Save credentials. Pensero starts reading usage through the analytics integration immediately.
In this setup, Claude reports usage for developers working through API keys. Pensero reads that directly. No action is required from individual developers.
Path 2: OpenTelemetry integration
Use this when your team uses a Claude Pro, Max, Team, or Enterprise subscription.
In this setup, the standard analytics API does not expose everything Pensero needs. OpenTelemetry fills that gap. You configure it once and roll it out to your team.
Important before you start: OpenTelemetry data is not historical. Pensero starts receiving data from the moment telemetry is configured. Past usage is not backfilled.
Step 1 - Open Developer telemetry setup in Pensero
Go to Integrations > Claude Code in Pensero. Find the Developer telemetry setup section.
Step 2 - Generate the organization token
Click to generate your organization token. This is a shared credential for your whole team. Treat it like a password and share it securely.
Pensero uses this token in the OTLP headers:
"OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer <organization_token>"
Step 3 - Choose a rollout method and distribute to your team
Pick the method that fits how your team manages developer environments.
OPTION A: MANAGED SETTINGS
Best for: Teams where you want to push config centrally without asking each developer to set anything up.
Copy the config from the Managed settings tab in Pensero.
Paste it into Settings > Claude Code > Managed settings in claude.ai.
Developers then run
/loginin Claude Code to accept the settings.
This is how the JSON looks. You only need to update OTEL_EXPORTER_OTLP_HEADERS with the value provided in Pensero. The format should look similar to: tk_...:sk...
{
"env": {
"CLAUDE_CODE_ENABLE_TELEMETRY": "1",
"OTEL_METRICS_EXPORTER": "otlp",
"OTEL_EXPORTER_OTLP_PROTOCOL": "http/json",
"OTEL_EXPORTER_OTLP_ENDPOINT": "https://pensero.ai/otel",
"OTEL_METRIC_EXPORT_INTERVAL": "300000",
"OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer <organization_token>"
}
}
Developers must run /login so Claude Code prompts them to accept the managed settings. Once accepted, telemetry is applied automatically.
OPTION B: SETTINGS.JSON
Best for: Teams where developers manage Claude Code through local config files.
Copy the config from the settings.json tab in Pensero.
Share it with developers.
Each developer adds it to
~/.claude/settings.json.
{
"env": {
"CLAUDE_CODE_ENABLE_TELEMETRY": "1",
"OTEL_METRICS_EXPORTER": "otlp",
"OTEL_EXPORTER_OTLP_PROTOCOL": "http/json",
"OTEL_EXPORTER_OTLP_ENDPOINT": "https://pensero.ai/otel",
"OTEL_METRIC_EXPORT_INTERVAL": "300000",
"OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer <organization_token>"
}
}For each developer, the Claude Code telemetry setup is visible in their Pensero Profile Settings Page
OPTION C: TERMINAL
Best for: Developers who prefer shell-based configuration.
Copy the config from the Terminal tab in Pensero.
Developers add these lines to their shell profile, usually
~/.zshrcor~/.bashrc.After saving, they reload their shell or open a new terminal session.
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_METRICS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_PROTOCOL=http/json
export OTEL_EXPORTER_OTLP_ENDPOINT=https://pensero.ai/otel
export OTEL_METRIC_EXPORT_INTERVAL=300000
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer <organization_token>"
After saving the file, developers should reload their shell or open a new terminal session before using Claude Code again.
For each developer, the Claude Code telemetry setup is visible in their Pensero Profile Settings Page
Path 3: 3rd-party platform
Use this when your team is not using a Claude Code subscription. This includes Amazon Bedrock, Microsoft Foundry, Google Vertex AI, LiteLLM, and any other third-party backend.
These platforms do not send the user email in telemetry events by default. Pensero receives the usage data. But without an extra step, it cannot tell which developer the data belongs to.
There are two ways to fix this. Choose the one that matches your setup.
Option B: Per-developer manual setup
Option A: Centralized rollout via Managed settings (recommended)
Use this only if your team uses a Claude Code subscription AND routes traffic through a 3rd-party backend such as Bedrock or Vertex AI behind it. This is an advanced setup. Most teams on Bedrock, Vertex AI, or LiteLLM will not have access to Managed settings and should use Option B instead.
This approach uses a Claude Code session hook to automatically populate each developer's email from their git config. No manual step is required from individual developers.
Add the following to your Claude Code Managed settings in claude.ai. Pick the config that matches your backend.
Bedrock
{
"env": {
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "global.anthropic.claude-haiku-4-5-20251001-v1:0",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "us.anthropic.claude-opus-4-6-v1",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "global.anthropic.claude-sonnet-4-5-20250929-v1:0",
"AWS_BEARER_TOKEN_BEDROCK": "xx=",// UPDATE: replace with your AWS bearer token
"AWS_REGION": "us-east-1", // UPDATE: replace with your AWS region
"CLAUDE_CODE_ENABLE_TELEMETRY": "1",
"CLAUDE_CODE_USE_BEDROCK": "1",
"OTEL_METRICS_EXPORTER": "otlp",
"OTEL_EXPORTER_OTLP_PROTOCOL": "http/json",
"OTEL_EXPORTER_OTLP_ENDPOINT": "https://pensero.ai/otel",
"OTEL_METRIC_EXPORT_INTERVAL": "300000",
"OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer <organization_token>", // UPDATE: replace with your Pensero org token
"OTEL_SERVICE_NAME": "[email protected]" // UPDATE: replace with your company email
},
"hooks": {
"SessionStart": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "bash -c '(EMAIL=$(git config user.email) && echo \"{\\\"env\\\":{\\\"OTEL_SERVICE_NAME\\\":\\\"$EMAIL\\\"}}\" > ~/.claude/settings.json)'"
}
]
}
]
}
}Vertex AI
{
"env": {
"CLAUDE_CODE_ENABLE_TELEMETRY": "1",
"CLAUDE_CODE_USE_VERTEX": "1",
"ANTHROPIC_VERTEX_PROJECT_ID": "your-gcp-project-id", // UPDATE: replace with your GCP project ID
"CLOUD_ML_REGION": "global",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-4-6",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-4-7",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "claude-haiku-4-5@20251001",
"OTEL_METRICS_EXPORTER": "otlp",
"OTEL_EXPORTER_OTLP_PROTOCOL": "http/json",
"OTEL_EXPORTER_OTLP_ENDPOINT": "https://pensero.ai/otel",
"OTEL_METRIC_EXPORT_INTERVAL": "300000",
"OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer <organization_token>", // UPDATE: replace with your Pensero org token
"OTEL_SERVICE_NAME": "[email protected]" // UPDATE: replace with your company email
},
"hooks": {
"SessionStart": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "bash -c '(EMAIL=$(git config user.email) && echo \"{\\\"env\\\":{\\\"OTEL_SERVICE_NAME\\\":\\\"$EMAIL\\\"}}\" > ~/.claude/settings.json)'"
}
]
}
]
}
}The SessionStart hook reads each developer's git email automatically at the start of every Claude Code session. It writes it as OTEL_SERVICE_NAME in their local settings. Pensero uses this to map events to the correct developer. No manual input is needed from the team.
Option B: Per-developer manual setup (most common for Bedrock, Vertex AI, and LiteLLM)
Use this when your team does not have a Claude Code subscription.
Each developer adds their company email to ~/.claude/settings.json:
{
"env": {
"CLAUDE_CODE_ENABLE_TELEMETRY": "1",
"OTEL_METRICS_EXPORTER": "otlp",
"OTEL_EXPORTER_OTLP_PROTOCOL": "http/json",
"OTEL_EXPORTER_OTLP_ENDPOINT": "https://pensero.ai/otel",
"OTEL_METRIC_EXPORT_INTERVAL": "300000",
"OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer <organization_token>", // UPDATE: replace with your Pensero org token
"OTEL_SERVICE_NAME": "[email protected]" // UPDATE: replace with your company email
}Replace [email protected] with the developer's actual company email. This must match the email configured in Pensero.
Without this step: Claude Code sends only an anonymous installation ID in telemetry. Pensero receives the usage events but cannot map them to individual developers. AI adoption metrics will be incomplete.
Data Availability
Once telemetry is configured, Pensero starts receiving Claude Code usage data from that point forward.
Historical data is not available through the OpenTelemetry setup. Pensero does not backfill Claude Code telemetry from before the integration was enabled.



