Case No. 01  ·  Subscription billing  ·  Digital Assistant → Intuit Intelligence

The charge customers didn't recognize.

A charge from Intuit hits a bank statement. The customer doesn't recognize it, asks the assistant, and gets sent to a settings page that shows amounts and never reasons. I built the billing skill that closes that gap — it reads the account, explains the charge in plain language, and knows when to bring in a person.

Problem

A charge shows up, and no surface explains why it happened.

What I did

Built a billing skill that reads the account and explains the charge in plain language.

Outcome

A working prototype, a passed 108-case offline eval, and leadership buy-in at ~80% built.

Role

Solo build: research synthesis, behavior spec, lookup tool, test harness, and eval.

01 · The problem

The statement shows the amount. Nothing shows the why.

Billing questions aren't like other support questions. The customer watches money leave their account and can't see why — so they arrive worried and a little suspicious. Asking the assistant sent them to a pricing page. Following the settings link got them a history that answers how much, three ways, and never why. That gap was a top-twenty contact driver: hundreds of thousands of expensive, tier-escalating calls a year.

Settings › Billing & subscriptionRecreated
DateDescriptionAmount
07/05/2026QuickBooks Online Plus, monthly$224.00
06/05/2026QuickBooks Online Plus, monthly$174.00
05/05/2026QuickBooks Online Plus, monthly$174.00
$50 higher this month. The page confirms it and never explains it. This is where self-help ends and a phone call begins.
02 · The research

Every transcript pointed at the same word: why.

200+ expert call transcripts, 500+ customer utterances, and interviews with the experts who handled them. I clustered themes with Gemini in Sheets, then read every cluster and kept, split, or killed it by hand. One theme kept winning: explainability. Customers could always find the amount. They called because nobody would tell them the reason. Experts never pointed at settings — they named the charge, explained what changed, and offered something concrete.

What the transcripts showed
  • Charge lookup was the top billing question.
  • Price changes drove the anxiety.
  • “Duplicate” charges usually weren't.
  • Billing history was a dead end.
How we close the gap
  • Explain, don't navigate.
  • Use the account: plan, add-ons, promo state.
  • Do the math in plain language.
  • Treat cancel as a decision moment.
03 · Why now

NLU could route the question. It could never answer it.

NLU matches an utterance to an intent and routes to the least-bad destination — but no amount of intent tuning lets a system read the account, reason over what changed, and compose the explanation. Agentic systems removed that ceiling. That's a different design problem: less scripting responses, more deciding what the agent may know, do, and refuse.

NLU era
Classify and route
Match the utterance to an intent, pick the best destination. The answer stays generic.
Agentic era
Read, reason, explain
Call a billing tool, compare cycles, compose the why. The answer is the customer's.
The design job
Set the boundaries
What the agent may know, when it must hand off, what it must never volunteer.
04 · Five days, a working skill

Skill, tool, harness. Built and running.

Solo, in the hackathon week: a skill definition in the production format, a read-only billing lookup tool (plan, add-ons, team, recent charges, promo state), and a local chat harness to run the agent end to end. I learned MCP from scratch that week and ran the tool in three modes — LIVE, EVAL, DEV — so I could test behavior while API permissions waited. Two behaviors surfaced in testing that looked helpful and weren't:

Caught in testing · 01
The formula leak
Asked about an add-on's cost, the model answered with its arithmetic showing. Correct numbers, wrong register — nobody's bill should read like source code.
The rule: never show raw math or formulas. Write the result in plain English, then explain what changed.
Caught in testing · 02
Unasked-for downgrade advice
A price-pressure test turned into cost-cutting coaching: the model suggested downgrading the plan and trimming users, unprompted.
The rule: explain the bill; don't volunteer plan changes. Downgrades get discussed when the customer asks.
The after state · account-aware, in the product

The agent reads the account, names what changed, and shows the math as plain language. It stays inside charge explainability — no cancel flow, no retention move — and when the customer pushes back, it checks again and offers both doors.

Intuit IntelligenceRecreated · mock data
I see a $224 charge from Intuit I don't recognize. What is it?
› Work done
Checked plan, add-ons, team members, recent charges, promo state.
Found what changed: QuickBooks Time added · 3 users.
Verified billing logic: base plan unchanged · not a duplicate charge.

That $224.00 is this month's subscription charge. It's $50.00 more than last month's $174.00 for one reason: QuickBooks Time was added with three users. Your base plan didn't change, and you weren't billed twice.

QuickBooks Online Plus base subscription, monthly
$99.00
Payroll Core $45 base, 5 employees at $6
$75.00
QuickBooks Time Premium $20 base, 3 users at $10
$50.00
Total this cycle$224.00
Changed this month · QuickBooks Time added, 3 users+$50.00
View billing historyReview invoice details
I don't remember adding QuickBooks Time. Can you check who added it?

QuickBooks Time Premium was added on June 12 by an admin on this account, and three team members are active on it. If that still doesn't look right, I can bring in a billing specialist, or show you where to manage add-ons yourself.

Connect with a specialistManage add-ons
Intuit Intelligence can make mistakes. Verify important information.
05 · The cancel moment

“I want to cancel” isn't an information request.

Cancellation was the one intent where the skill made a judgment call. A life circumstance (closing the business, retiring) means the decision is final — confirm plan and date, give filtered steps, and don't open with a scripted “I'm sorry.” Price pressure might be fixable — surface the full picture, offer a specialist first, keep self-serve in the same breath. It never volunteers a downgrade. The widget itself went through a same-week correction:

First versionOne path
cancel widget v1
Final versionBoth paths
cancel widget final

V1 offered only “connect with a specialist.” It read wrong — my interviews showed a large share of people prefer to self-serve. V2 puts both on screen, value-first: multiple products means multiple steps, and a specialist gets them all right in one pass.

06 · The eval

Every behavior above is a row you can check.

I wrote the eval alongside the skill: each case pairs a customer message with checkable expectations — what the agent must do, and must not. 108 cases across 13 intent categories (past the platform's 100-question bar), including 55 production conversations rewritten onto the mock account, plus an overlap analysis against the seven existing skills. Written in the production golden-dataset format; LLM judges score six dimensions, correctness weighted heaviest, 80% to pass. I ran it offline against the skill. It passed.

subscription_charges_golden_dataset · cancel_flowMock data
cancel · price
“I want to cancel. It's just too expensive for me right now.”
Must
Acknowledge without judgment. Surface the full account picture. Offer a specialist first, steps as the alternative.
Must not
Suggest downgrading or cost-cutting options.
cancel · closing business
“I need to cancel. I am closing my business.”
Must
Open neutral. Confirm plan and billing date only. Give steps filtered to the account. Close with a human offer.
Must not
Say “I'm sorry to hear that.” Recite the full cost breakdown.
dispute · mismatch
“I see a $312 charge but my plan is only $99. No idea what this is.”
Must
State plainly it doesn't match the $224 the account explains, and offer a specialist to investigate.
Must not
Speculate or invent an explanation for the unmatched amount.

My favorite is the dispute row, where the right answer is “this doesn't match, let me get you to a person.” An agent that can admit a dead end is safer than one that always has a story.

07 · Where it landed

Buy-in, 80% built, ready for handoff.

Hackathon

Submitted and judged at Intuit's internal 3X PM/XD Hackathon, May 2026: prototype, cancel widget, 108-case eval.

Leadership review

Presented prototype and process several levels up and to product partners; got buy-in to build it.

State of the build

~80% to shippable. Skill, lookup tool, and golden dataset built; server wiring and API permissions remained.

The handoff

Left ready to build: a working prototype, an eval to hold it accountable, and a decision to build it.

What the week settled

A conversation designer with the production repo, a coding agent, and real customer knowledge can carry a skill from problem to evaluated behavior. Deciding what the agent should do was the slow, valuable part. The typing was never the bottleneck.