✨ Software.com is now Antenna. Read more →
Skip to Content

Sync Claude.ai Team spend with Cowork

Claude.ai Team plans have no usage or cost API, so actual spend is only available as a CSV export from Claude Analytics. The Antenna Team Spend Sync skill exports those reports in Claude Cowork  and uploads them to Antenna through the Antenna connector. Run it once to backfill, then schedule it weekly.

Goals

  • Actual spend: Antenna records each member’s billed net spend per day, which replaces the OpenTelemetry cost estimate on every uploaded day.
  • Seat costs: Antenna keeps each member list you upload, so every member has a seat tier and seat cost history.
  • Rolling coverage: Claude keeps 90 days of spend history. Each weekly run fills every day Antenna is missing in that window, so a skipped week is caught up on the next run.

Requirements

RequirementDetails
Claude roleOwner or Primary Owner of the Claude.ai Team organization. Admins can’t export the spend report.
Antenna roleEnterprise admin. Uploading data to a source needs admin access.
Antenna sourceA Claude.ai Team source in Settings > Sources. See Setup.
Claude DesktopThe Claude Desktop  app for macOS or Windows with Cowork enabled. Cowork uses the app to reach your browser and downloads folder.

Setup

Add the Antenna connector

On Team plans, only Owners can add a custom connector. In Claude, go to Organization settings > Connectors, click Add, and choose Custom > Web. Enter Antenna as the name and https://app.antenna.dev/api/mcp/enterprise/YOUR_ENTERPRISE_SLUG as the remote MCP server URL. Your enterprise slug is the identifier in your Antenna URL, for example acme in https://app.antenna.dev/enterprises/acme.

Then go to Customize > Connectors, click Connect next to Antenna, and approve access in your browser as an Antenna admin. See MCP Server for details.

If you connected Antenna before, the upload tools may need new access. If Settings > MCP Server in Antenna shows New tools need more access, disconnect and add Antenna again.

Install the skill

Download antenna-team-spend-sync.zip. Don’t unzip it. In Claude, go to Customize > Skills, upload the zip, and make sure antenna-team-spend-sync is turned on.

To review what the skill tells Claude to do before you install it, expand the full instructions below. They are the zip’s SKILL.md.

Skill instructions

--- name: antenna-team-spend-sync description: "Uploads Claude.ai Team spend to Antenna. Exports the spend report from the claude.ai analytics page one day at a time for each day Antenna is missing in the last 90 days, uploads each day with the Antenna connector, then uploads the current member list. Use for 'sync Claude Team spend to Antenna'." --- # Sync Claude Team spend to Antenna Claude.ai Team plans have no usage or cost API. The billed numbers are in the spend report on the analytics page, and seat tiers are in the Members page export. This skill exports both with the pages' own Export buttons and uploads them to Antenna through the Antenna connector. Antenna validates each file, keeps the history, and reports which days are still missing. ## Prerequisites (check first; stop and tell the user if any fail) - The user is a Team **Owner** or **Primary Owner**. Admins cannot see or export the spend report. - The **Antenna** connector is connected and its tools `claude_team_cost_status`, `claude_team_cost_upload` and `claude_team_members_upload` are available. If they are missing, the user must disconnect and re-add the connector in Antenna to approve the new access (an Antenna admin is required). - The browser Claude drives is signed in to claude.ai, on the Team organization being synced. - Claude can read the browser's download folder (usually `~/Downloads`). If it can't, ask the user to connect that folder. - Only use the real Export buttons on visible pages. Never call claude.ai private endpoints directly and never handle session cookies. ## Steps 1. **Ask Antenna what is missing.** Call `claude_team_cost_status`. If it lists several Claude sources instead, use the source ID the user gave in the prompt ("for source 8941"). Otherwise show each source's ID and last uploaded day, tell the user the ID is the number at the end of the source's page URL in Antenna (**Settings** > **Sources** > **Configure** on the Claude.ai Team source, e.g. `/claude_apps/8941`), and ask which to use; in a scheduled run, stop and report this instead. Call it again with that ID as `claude_data_source_id`. Note `window.start_date` and `window.end_date` (yesterday, UTC), each organization's `missing_dates`, `uploaded_days`, and `member_lists`. 2. **Find this organization.** The organization is the `<org>` in the spend report file name, `spend-report-<org>-YYYY-MM-DD-to-YYYY-MM-DD.csv`. If the status lists exactly one organization, use it. Otherwise, export one day (step 4) and read `<org>` from the downloaded file name. An organization that isn't listed is missing every day in the window. 3. **Choose the days.** Take this organization's missing days. Also re-export its newest uploaded day if it was uploaded less than two days after that day ended, because the report refreshes with a one-day delay and that day may have been incomplete. Process at most 14 days per run, oldest first, so days that are about to leave the 90-day window are saved first. Say how many days are left for the next run. 4. **Export one day.** Open https://claude.ai/analytics/overview, scroll to "How much is Claude costing?", click **Export spend report**, choose **Custom**, and set the start and end to the same day (click the month part of each date field and type the digits as MMDDYYYY). Check that both fields show that day, then click **Download**. Wait for the download to finish (the button shows "Downloading…" and the dialog closes) before starting the next day, or the browser may block later downloads. The report has no date column, so each file must cover exactly one day. 5. **Upload the day.** Read the downloaded file and call `claude_team_cost_upload` with: - `csv`: the file contents exactly as downloaded, header row included. Do not retype, reorder or round values. - `date`: the day, `YYYY-MM-DD`. - `claude_organization`: the `<org>` from the file name. - `file_name`: the downloaded file name. A file with only the header row is valid: that day had no usage beyond the seats. If Antenna refuses the file, record the day and the reason, and continue with the next day. Uploading a day again replaces that day's report. 6. **Upload the member list.** Once per run, after the spend days: open https://claude.ai/admin-settings/members and click **Export CSV**. Call `claude_team_members_upload` with the file contents as `csv` and the downloaded file name (`members-<organization ID>-YYYY-MM-DD.csv`) as `file_name`. - Leave out `tier_prices`: each seat tier keeps the price Antenna already has. - Only on a run the user is watching, and only when `member_lists` had no list for this organization, ask the user each seat tier's monthly price and pass them as `tier_prices`. A scheduled run never asks. 7. **Report.** Finish with a short summary: days uploaded with their user counts and net spend, days refused with the reason, days still missing, and the member list uploaded (member and Active counts). Do not paste emails or file contents into the chat. ## Rules - Antenna uses net spend. Never edit the CSV. - The spend report covers only usage beyond the seats. Seat fees come from the member list and the seat prices in Antenna. - The CSVs contain member emails and account IDs. Send them only to the Antenna connector; do not copy them anywhere else. Leave the downloaded files where they are; do not delete them. - If the spend report is missing from the page (no extra usage enabled, or the user is not an Owner), stop and explain. Do not try workarounds. - If the browser can't open a page, set the date range or download a file, or a Save As dialog or a prompt to allow claude.ai to download multiple files appears during a scheduled run, stop and report exactly which step failed. In the report, tell the user to turn off **Ask where to save each file before downloading** in `chrome://settings/downloads` and add `claude.ai` under **Allowed to automatically download multiple files** in `chrome://settings/content/automaticDownloads`. ## Running it on a schedule A skill can't create a schedule. After a successful first run, the Owner says "do this every week" (or uses **Scheduled** > **New task**) and Claude creates the scheduled task. Weekly is enough: the report keeps 90 days, and each run fills every missing day. The browser step needs the Claude Desktop app open and online on the Owner's computer, and the browser signed in to claude.ai.

Allow the Antenna tools

Go to Customize > Connectors, select Antenna, and set these tools to Always allow, so scheduled runs don’t stop for approval:

  • claude_team_cost_status
  • claude_team_cost_upload
  • claude_team_members_upload

If Always allow isn’t available, an Owner can allow it in Organization settings > Cowork.

Set up the browser and downloads folder

Cowork drives a browser to export the reports, then reads them from your downloads folder.

  • Browser: Sign in to claude.ai  in the browser Cowork uses, on the Team organization you’re syncing. If you use Claude in Chrome , change two Chrome settings once so each export saves without a prompt:
    • In chrome://settings/downloads, turn off Ask where to save each file before downloading.
    • In chrome://settings/content/automaticDownloads, add claude.ai under Allowed to automatically download multiple files.
  • Downloads folder: Connect your downloads folder (usually Downloads) to Cowork, so Claude can read the exported files.

Run the first sync

In Claude Desktop, open Cowork and start a new task. Select your downloads folder and send:

Sync Claude Team spend to Antenna

Claude asks Antenna which days are missing, exports them one day at a time, oldest first, and uploads each one. It then exports and uploads your member list. On this first run, Claude asks for each seat tier’s monthly price.

If your enterprise has more than one Claude.ai Team source, Claude asks which one to use. The source ID isn’t shown on the page; it’s the number at the end of the URL. In Antenna, go to Settings > Sources and click Configure on the Claude.ai Team source: in app.antenna.dev/enterprises/acme/claude_apps/8941, the ID is 8941. Add it to the message, for example Sync Claude Team spend to Antenna for source 8941, and use the same prompt for the scheduled task.

Each run exports up to 14 days. To backfill all 90 days now, send the same message again until Claude reports no missing days.

Schedule it weekly

In the same task, send Do this every week. You can also click Scheduled in the left sidebar, then New task, and enter:

  • Name: Antenna Team Spend Sync
  • Prompt: Sync Claude Team spend to Antenna
  • Frequency: Weekly
  • Folder: your downloads folder

Click Save. The task appears on the Scheduled page, where you can run it now, see past runs, pause it, or delete it.

A scheduled run uses your browser and local files, so it only runs while Claude Desktop is open and your computer is awake. A missed run doesn’t lose data: the next run fills every missing day in the 90-day window.

How each run works

  1. Claude calls claude_team_cost_status to see which days Antenna is missing for your Claude organization.
  2. For each missing day, Claude opens Claude Analytics, clicks Export spend report, chooses Custom with the same start and end day, and downloads the CSV. The report has no date column, so each file covers exactly one day.
  3. Claude uploads each file unchanged with claude_team_cost_upload. Antenna checks that the file name matches the day and refuses files covering other days.
  4. Claude re-exports the newest day if it was uploaded before Claude finished updating it. The report updates with about a one-day delay.
  5. Claude exports the member list from Members settings with Export CSV and uploads it with claude_team_members_upload. Each tier keeps the price you set.
  6. Claude reports the days uploaded, any refused files with the reason, the days still missing, and the member counts.

Uploading a day again replaces that day’s report. Antenna uses Total Net Spend USD, the amount after discounts and credits.

Verify the sync

In Antenna, go to Settings > Sources and click Configure on the Claude source. The Daily Spend Reports card shows which days have reports, and the Seat Costs card shows the latest member list.

You can also ask Claude, “Which days of Claude Team spend is Antenna missing?”

Troubleshooting

ProblemFix
Claude can’t find the Antenna upload toolsAntenna added tools after you connected. Disconnect and add Antenna again, then make sure you approve as an Antenna admin.
A scheduled run stops for approvalSet the Antenna tools to Always allow in Customize > Connectors.
A Save As dialog stops the exportTurn off Ask where to save each file before downloading in your browser’s download settings.
Chrome asks whether claude.ai can download multiple filesAdd claude.ai under Allowed to automatically download multiple files in chrome://settings/content/automaticDownloads.
Claude can’t read the downloaded fileConnect your downloads folder to Cowork and select it on the scheduled task.
Export spend report is missingOnly Owners and Primary Owners see the spend report, and it only appears when the organization has usage beyond seats.
A scheduled run didn’t happenClaude Desktop was closed or your computer was asleep. Run it from the Scheduled page, or wait for the next run.
Claude asks which Claude source to use, or a scheduled run stops for itYour enterprise has more than one Claude.ai Team source. Find the source ID at the end of the source’s URL in Antenna (.../claude_apps/8941) and add it to the prompt: Sync Claude Team spend to Antenna for source 8941.
You have several Claude.ai Team organizationsRun the skill once signed in to each organization. Antenna keeps each organization’s reports separately on the same source.
Last updated on