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.
Important: Pensero only processes Claude Code data for users already created in Pensero. Make sure each developer’s company email in Claude Code telemetry matches their email in Pensero. If the user is not in Pensero, their telemetry will be skipped and will not appear in AI Impact.
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 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 automatically (see Troubleshooting for a way to recover recent days).
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 in Claude.ai under > Organization Settings > Products > Claude Code > Managed Settings.
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 AI lines are added, 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
},
"hooks": {
"SessionStart": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "bash -c '(EMAIL=$(git config user.email) && echo \"{\\\"env\\\":{\\\"OTEL_RESOURCE_ATTRIBUTES\\\":\\\"enduser.id=$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
},
"hooks": {
"SessionStart": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "bash -c '(EMAIL=$(git config user.email) && echo \"{\\\"env\\\":{\\\"OTEL_RESOURCE_ATTRIBUTES\\\":\\\"enduser.id=$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_RESOURCE_ATTRIBUTES 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.
Step 1: Each engineer updates their local configuration in ~/.claude/settings.json.
Step 2: The manager shares the JSON with OTEL_EXPORTER_OTLP_HEADERS updated with the Pensero token, and each engineer replaces the email with their own.
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_RESOURCE_ATTRIBUTES": "[email protected]"// UPDATE: replace with your company email
}Update
OTEL_EXPORTER_OTLP_HEADERSwith the value provided in Pensero. The format should look similar to:tk_...:sk...Replace
[email protected]with the developer's actual company email. This must match the email configured in Pensero.
Step 3: Each engineer saves the settings.json file and restarts Claude Code so telemetry starts being sent correctly.
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, unless the developer runs the backfill report described in Troubleshooting (it can recover roughly the last 30 days from their computer).
How to open and edit your settings.json
Before you start, open Claude Code in your Terminal and make sure you are logged in with your company email.
If you see a personal email instead, run
/loginand switch to your company account before continuing.
On Mac
Run:
open -a TextEdit ~/.claude/settings.json
Paste the Pensero config. Save with Command + S. Restart Claude Code.
Verify it worked:
cat ~/.claude/settings.json
On Windows
Run:
notepad %USERPROFILE%\.claude\settings.json
Paste the Pensero config. Save with Ctrl + S. Restart Claude Code.
Verify it worked:
type C:\Users\%USERNAME%\.claude\settings.json
Claude Desktop setup
Use this section if your team uses the Claude Desktop app in addition to, or instead of, Claude Code in the terminal.
The Claude Desktop app does not read OTEL_RESOURCE_ATTRIBUTES from ~/.claude/settings.json. Instead, it reads this value from the user’s shell or system environment.
This means each developer must configure their company email as an environment variable so Pensero can map Claude telemetry to the correct Pensero user.
Important: the email used in OTEL_RESOURCE_ATTRIBUTES must match the developer’s email in Pensero.
macOS
Add the following variable to your shell profile, usually ~/.zshrc or ~/.bash_profile:
export OTEL_RESOURCE_ATTRIBUTES="[email protected]"
Replace [email protected] with the developer’s company email.
Alternatively, you can populate it automatically from the developer’s git email:
EMAIL=$(git config user.email); grep -q OTEL_RESOURCE_ATTRIBUTES ~/.zshrc || echo "export OTEL_RESOURCE_ATTRIBUTES=\"enduser.id=$EMAIL\"" >> ~/.zshrc
After saving the file, fully restart Claude Desktop so the app picks up the new environment variable.
Windows
Set a persistent user environment variable:
setx OTEL_RESOURCE_ATTRIBUTES "[email protected]"
Replace [email protected] with the developer’s company email.
After setting the variable, sign out and back in, then fully restart Claude Desktop so the app inherits the updated environment.
Why this is required
Without OTEL_RESOURCE_ATTRIBUTES, Claude telemetry may only include an anonymous installation ID. Pensero can still receive usage events, but it cannot reliably map them to the correct developer.
Once this value is configured and Claude Desktop is restarted, Pensero can associate Claude usage with the right user in AI Impact.
Troubleshooting: When Your Numbers Don't Match
Sometimes the usage numbers you see in Pensero may not match your real Claude Code activity.
This usually means Claude Code stopped sending telemetry from your computer for some days. You can fix it yourself in two steps: Step 1 repairs the past, Step 2 makes sure it does not happen again. Both steps are needed.
Before you start
Run the commands below in the same terminal and project folder you normally use Claude Code from. The check looks at that exact setup.
On Windows, use Git Bash or WSL. The commands do not work in PowerShell or Command Prompt.
If you use Claude Code on more than one computer, repeat the steps on each one.
Step 1: Compare and backfill your Claude Code activity
Open a terminal and paste in this command:
curl -fsSL https://pensero.ai/otel/claude/report | sh -s -- --report
Here's what happens when you run it:
You sign in. Your browser opens so you can log in to Pensero. This only happens the first time; after that, it remembers you.
It shows you a comparison. It reads your own Claude Code history from your computer and lists your usage day by day, next to what Pensero currently shows. Days marked missing in Pensero were never received; days marked sides disagree were received only partially.
It asks before changing anything. It shows exactly which days it plans to send and waits for you to type
yand press Enter. Once you confirm, it updates those days in Pensero so they match your actual usage.
After you confirm, your numbers in Pensero should line up.
Good to know:
Claude Code only keeps your history on your computer for about 30 days, so older days cannot be recovered.
If you recently deleted or reinstalled your Claude Code folder (
~/.claude), do not confirm the upload: the report would lower those days to the little that is left on your computer. Contact us instead.
Step 2: Check your setup so it does not happen again
This is the important step. Run:
curl -fsSL https://pensero.ai/otel/claude/report | sh -s -- --check
It checks your Claude Code telemetry configuration, sends a small test signal to Pensero and confirms it arrived under your name. It changes nothing on your computer.
If everything is OK, your activity will flow to Pensero automatically from now on. You only need to run this check once; you do not need to run the report every day.
If you see WARN or FAIL lines, they tell you exactly which setting is wrong and how to fix it. Fix it, then run the check again.
If the check still fails, or your numbers still don't match, contact us at [email protected] and paste the output of the --check command. It is safe to share: it never shows passwords or full tokens.



