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.
| Date | Description | Amount |
|---|---|---|
| 07/05/2026 | QuickBooks Online Plus, monthly | $224.00 |
| 06/05/2026 | QuickBooks Online Plus, monthly | $174.00 |
| 05/05/2026 | QuickBooks Online Plus, monthly | $174.00 |
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.
- Charge lookup was the top billing question.
- Price changes drove the anxiety.
- “Duplicate” charges usually weren't.
- Billing history was a dead end.
- Explain, don't navigate.
- Use the account: plan, add-ons, promo state.
- Do the math in plain language.
- Treat cancel as a decision moment.
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.
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:
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.
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 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.
“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:
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.
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.
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.
Buy-in, 80% built, ready for handoff.
Submitted and judged at Intuit's internal 3X PM/XD Hackathon, May 2026: prototype, cancel widget, 108-case eval.
Presented prototype and process several levels up and to product partners; got buy-in to build it.
~80% to shippable. Skill, lookup tool, and golden dataset built; server wiring and API permissions remained.
Left ready to build: a working prototype, an eval to hold it accountable, and a decision to build it.
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.