Case study

ArcTrade: every AI dollar tagged to a Jira epic, a Bitbucket repo, and an end-customer

How an electricity-brokerage software shop turned AI assistant spend from a fuzzy line item into per-project chargeback their clients pay without a quibble. A preview case study — technical flow live; quotes and logos awaiting customer sign-off.

By Chris Therriault8 min read
Preview — pending customer sign-off

ArcTrade builds the software that runs power-brokerage desks — the systems traders use to bid, hedge, and bill across PJM, ERCOT, and CAISO. The dev team is small, the contracts are time-and-materials, and the clients audit invoices line by line.

When their engineers started using Copilot, Cursor, and Claude inside their IDEs, the AI spend went from "a couple seats" to "a five-figure monthly question." Worse, the spend was happening across every client engagement at once. The Houston Power Contract paid for the same Anthropic key as the SoCal Edison rebuild. Nobody could honestly tell a client your project's AI costs were $4,200 this month.

ArcTradelogo pending turned to Visionality to get that number right.

The wedge

The wedge isn't AI cost control. It's AI cost attribution that survives a client audit.

ArcTrade bills time-and-materials. Every hour, every reimbursable, every infrastructure dollar shows up on the invoice with a project code. Their clients are sophisticated buyers — power utilities, hedge desks, ISO operators. When the AI line item showed up as a flat platform fee, the clients pushed back. Not because of the dollar amount. Because of the unattributed dollar amount.

Customer quote — awaiting approval
We weren't trying to hide AI cost from our clients. We were trying to bill it. The clients didn't believe the numbers because we couldn't show our work.
VP Engineering, attribution pending sign-off

The user flow

Three things had to be true before the first invoice could go out:

  1. Every API call had to know which Jira epic it belonged to.
  2. Every API call had to know which Bitbucket repo it came out of.
  3. Every API call had to know which ArcTrade end-customer the work was for.

Visionality already had the spine for (1) and (3) via project_id on the request log. The challenge was getting Jira and Bitbucket to put their identifiers on the calls without asking ArcTrade's engineers to do anything new.

Setup (one Tuesday afternoon)

ArcTrade's lead operator did the following:

  • Pointed Visionality's Jira connector at their workspace. Visionality pulled the project list (HPC — Houston Power Contract, SOCE — SoCal Edison, CAISO-Q3 — CAISO Q3 rebuild) and the active epic IDs.
  • Pointed the Bitbucket connector at their workspace. Visionality pulled the repo list and mapped each repo to the Jira project it lived under (a one-time YAML the operator filled in: hpc-billing → HPC, socedison-ingest → SOCE, and so on).
  • Wired the agent identity table: each engineer's IDE assistant got an agent_sub (alice@arctrade, bob@arctrade, etc.) and an owner (the engineer's name).
  • Set the engineers' IDEs to authenticate to the Visionality gateway instead of directly to OpenAI/Anthropic.

That was the entire integration. No SDK swap, no code change in ArcTrade's own apps.

The first day

The next morning, an engineer named Alice opened Cursor on a branch in hpc-billing. The branch name was HPC-1234-add-pjm-rebill-rules. Cursor made a Claude call.

Here's what Visionality wrote to request_logs:

| Column | Value | |---|---| | org_id | org_arctrade | | project_id | HPC | | model_used | claude-sonnet-4-6 | | agent_sub | alice@arctrade | | agent_owner | Alice K. | | task_class | code_completion | | cost_usd | 0.0034 |

Three things to notice. First, project_id = HPC came from Bitbucket → repo → mapped Jira project — Alice never typed it. Second, agent_sub and agent_owner were set by the agent-identity table — every future row from Alice's IDE flows the same way. Third, cost_usd is real, normalized at the gateway, not estimated post-hoc.

By end-of-day, request_logs had a few thousand rows. By end-of-month, it had 487,000.

The first chargeback

At month end, ArcTrade's controller opened the dashboard, filtered the request log by project_id = HPC, and downloaded the chargeback CSV. The file came down with columns the controller already had columns for in their billing template:

created_at, project_id, model_family, model_used, task_class,
agent_sub, agent_owner, currency, cost_usd

The total at the bottom: $4,237.18 on Houston Power Contract. Every dollar attributable to an engineer, a Jira epic, a repo, and a date. The controller dropped the CSV into the invoice as an evidence appendix.

Customer quote — awaiting approval
The first invoice with the appendix attached, our client didn't push back. They asked if they could get the same level of attribution on their own Salesforce automations. That's when I knew this was different.
Controller, attribution pending sign-off

The "running too hot" moment

Three weeks in, the SOCE project ran 60% of its monthly AI budget by day 12. The dashboard caught it.

ArcTrade had set a soft cap of $2,500/month on project_id = SOCE via Visionality's allocation rules. At 60% burn on day 12, the system flagged it on the operator view. The lead dropped into the dashboard, filtered the request log by SOCE, and immediately saw what happened: one engineer had been using a long-context model variant for a refactor task that should have been done with a cheaper variant.

The fix took fifteen minutes. The lead set a per-engineer hint on agent_sub = derek@arctrade to prefer claude-haiku for refactor tasks, and cost_usd on the project dropped 70% on the next day's window.

No 4 AM PagerDuty. No surprise on the invoice. The budget was a system property, not a hope.

The hard part Visionality didn't ask them to solve

ArcTrade's clients have different audit appetites. PJM utilities have one set of compliance asks. ERCOT desks have another. The CAISO clients are running ISO-NE-style continuous-evidence programs.

For SOC 2-adjacent asks, ArcTrade now hands the client the continuous-evidence pack Visionality generates for their org: signed JSON, SHA-256 fingerprint, every CC6/CC7/CC8 collector firing on the live data — and the client runs vis-verify pack.json offline to confirm the bundle wasn't touched in transit. That step alone has shortened ArcTrade's pre-audit prep from a week to about forty minutes.

For procurement-style asks, the chargeback CSV is the evidence. The line items are the line items. There is no interpretation.

What the marketing team is allowed to put on the website

We are publishing this as a preview case study while we wait for ArcTrade's written sign-off on direct quotes and on the use of their logo in the case-studies grid. The technical flow above is accurate to the integration we shipped together. The pull-quotes are working drafts, and the placeholder where the logo should go is a placeholder.

If you're an ArcTrade-shaped company — small, technical, time-and-materials with audit-grade clients — and the flow above describes what you've been trying to solve, book a call and we'll show you the live dashboard with anonymized data inside fifteen minutes.

ArcTradelogo pending

Visionality.AI

See how Visionality handles this.

30-minute demo. Live deployment. Your questions answered directly — no slides, no pitch.