Rightshold™ Sign up

Answers · agent payments

What should happen when tax, tip or shipping pushes an AI agent's charge above the amount a human approved?

Last updated

TL;DR: Decide the overage rule before the approval, and put it in what the human approves. A quote often isn't the final charge: tax and shipping are added at checkout from the address, restaurants and taxis add tips at capture, and card rules allow it. Stripe's overcapture table lets merchants capture more than authorized in some categories, for example up to 30% more for US restaurants on Visa and 15% for most other Visa categories. So choose one of two policies. Either the approval includes an explicit ceiling (quote plus a stated overage, such as 10% or a fixed amount for shipping), and anything up to the ceiling proceeds, or any amount above the quote needs a new approval. Never let the agent widen an approved amount on its own. On Rightshold, request_human_approval stores a hash of the exact action, so put quote_amount_minor and max_total_minor in it. If the final total is over the ceiling, the agent asks again with the new total; changing the approved action makes verify_human_approval report a mismatch. Rightshold doesn't compare the charge to the approval for you: your checkout step does that before it calls authorize_spend.

What should I check, step by step?

1. Pick the overage policy per workflow: a pre-approved ceiling (quote plus a percent or a fixed amount) for routine buys, or hard re-approval for anything above the quote on high-value or one-off purchases.

  1. Have the agent get the full price before asking: item subtotal, tax, shipping, fees, and whether a tip or gratuity can be added later. If tax or shipping isn't known yet, it says so instead of guessing.
  2. Put the numbers in the approval action: quote_id, merchant, currency, quote_amount_minor, max_total_minor and the overage rule in words. request_human_approval hashes the canonical action, so the ceiling is part of what was approved.
  3. Show the approver the quote and the ceiling side by side (for example: quote 84.00 USD, approving up to 95.00 USD for tax and shipping), not one blended number.
  4. At checkout, compare the final total to max_total_minor in code. At or under: call authorize_spend with the final amount and the approval id in reference. Over: stop, and open a new request_human_approval with the new total.
  5. Set the agent's per_tx_max_minor (set_spend_policy) no lower than the approved ceiling, or authorize_spend will deny a charge the human approved; and no higher than you'd accept without a person looking.
  6. Set the card's per-authorization limit at the ceiling. On Stripe Issuing, captures for approved authorizations always succeed and over captures can't be blocked, so a tip added at capture shows up after the fact: catch it in reconciliation and dispute it if it wasn't legitimate.
  7. Reconcile each capture against the approved ceiling. A capture above max_total_minor is an exception to investigate, with the approval record as evidence.

Why does an AI agent's final charge differ from the approved quote after tax, tip and shipping?

Many carts are priced before tax and shipping are known, and the final total appears only after the address is entered. That's normal, but it means a yes for the subtotal doesn't cover the total.

Should an AI agent purchase over the quote use a pre-approved overage or a new approval?

A pre-approved overage is a ceiling the human agrees to up front: quote plus 10%, or quote plus a fixed 15.00 for shipping. It keeps routine purchases moving and is still bounded, because the ceiling is in the approved action.

How do I stop an AI agent from widening an approved payment amount on its own?

request_human_approval stores the SHA-256 of the canonical action plus a summary and an expiry. verify_human_approval with the action fails if any field changed, so the agent can't raise max_total_minor and reuse the old approval. A higher total needs a new request and a new decision.

How do I ask Rightshold about this (free, no key)?

Add the MCP server https://www.rightshold.com/mcp to Claude, Cursor, ChatGPT, Grok or VS Code, then ask: “My agent has an 84.00 USD quote for office supplies before tax and shipping. Ask me to approve it with a ceiling of 95.00 USD, so a higher final total needs my approval again.”

One-click setup

{
  "tool": "request_human_approval",
  "arguments": {
    "summary": "Agent wants to buy office supplies: quote 84.00 USD, approve up to 95.00 USD including tax and shipping",
    "expires_in_minutes": 120,
    "action": {
      "type": "purchase",
      "quote_id": "q_…",
      "merchant_domain": "shop.example",
      "currency": "USD",
      "quote_amount_minor": 8400,
      "max_total_minor": 9500,
      "overage_rule": "tax and shipping up to the ceiling; anything above needs a new approval"
    }
  }
}

Rightshold records human approvals bound to a hash of the exact action and signs spend allow/deny decisions on a hash-chained ledger. It never holds, moves or settles money, doesn't calculate tax, shipping or tips, doesn't see card captures and doesn't compare a charge to an approval on its own. The overage check, card limits and reconciliation are steps you run. Not financial or tax advice.

What are the sources?

Related

Not legal advice. JSON · Markdown · All answers

Get a free API key in one call

No card and no email needed. 100 free credits; the license and policy checks stay free without a key.

curl -s -X POST https://www.rightshold.com/v1/accounts/signup -H "Content-Type: application/json" -d '{"accept_terms":true}'
export RIGHTSHOLD_API_KEY=rs_...   # the api_key from the reply (shown once)
curl -s https://www.rightshold.com/v1/licenses/check -H "Authorization: Bearer $RIGHTSHOLD_API_KEY" \
  -H "Content-Type: application/json" -d '{"license":"MIT","intended_use":{"commercial_use":true}}'