# Virtual cards for purchases an AI agent makes

> Atta issues one single-use Stripe Issuing card per approved order, capped at the approved total and checked on every charge. The number never enters the app.

Updated 2026-11-06. Source: https://atta.sh/virtual-cards

Atta issues one single-use virtual card per approved order through Stripe Issuing. The card is capped at the approved total, so a charge above it is declined by the network, and every authorization is checked against the order. The card number and CVC are shown in Stripe's own frame and never reach Atta's servers.

## What a card is for

Approving a purchase in a chat doesn't stop anyone from paying more at the store. Once a checkout link is handed over, whoever opens it can type any card and any amount. Atta issues a virtual card after the approval and sets its limit to the approved figure. The rule goes from "overspend gets flagged" to "overspend gets declined".

Nothing about who decides changes. The approval policy and the approval chain still decide whether money may move. The card is a second, narrower check on the charge itself: is this the one that was approved?

## One card per order

A card is issued inside `placeOrder`, after the budget reservation and before the order is handed out.

- **Single use.** One order, one card. A retry of the same order returns the same card.
- **Capped at the approved total.** The limit is set as both a per-authorization and an all-time limit on Stripe's side. If Atta is offline when the charge arrives, Stripe still applies the cap.
- **Expires with the abandon window**, 24 hours. An unused card is cancelled by the same sweep that releases the unpaid reservation.
- **Waits out the undo window.** When a workspace gives people a few minutes to undo an auto-approved order, the card is issued inactive and activated when the window closes.
- **In the budget's currency.** A budget has one currency, so the card does too.

If the card can't be issued, the checkout fails before anything is reserved and the cart is still there to retry.

## What happens when the merchant charges it

Stripe asks Atta to authorize each charge in real time. The check is a pure function with no tolerance on the amount:

| Check | Declined when |
| --- | --- |
| Card | it isn't active |
| Order | it isn't in checkout |
| Currency | it differs from the order's |
| Amount | it's above the limit, by even one cent |
| Merchant category | it isn't in the program's allowed list |
| Merchant | it doesn't match the one pinned by the first approved charge |

Every decline is logged with a reason code. A merchant name that doesn't match the approved store is flagged and sent to owners and admins as a notification, but not declined, because a descriptor is free text a payment processor can rewrite.

The charge also moves the budget. For an order paid by card, the card's events are the only thing that settles it. The reservation becomes spent when the capture arrives, any difference under the reservation is released, and a refund is released once, keyed by the issuer's transaction id. A capture over the reservation, like shipping added at the store, is settled as captured and flagged for review, since the network already let it through.

## Seeing the card

The order page has a **Show card** button for the person who requested the order, if they may check out. It mints an ephemeral key and renders Stripe's own frame, so the number and CVC go from Stripe to the browser. They're not in Postgres, a log line, an email or the transcript. Atta stores the card id, last four digits, expiry, limit and status. The agent sees "card ending 4242, up to $120.00, expires in 24 h" and nothing more. Approvers approve; they don't get the card.

> **Marcus, in Slack:** need a label printer, the usual one
>
> **Atta:** Found one at $189.00 from your stationery supplier. Over your limit, so I've asked Dana.
>
> **Dana taps Approve.**
>
> **Atta:** Approved. Card ending 4242 is ready on the order page, good for $189.00, once, until tomorrow.

## What the agent can do with a card

Two tools put money on a card: placing an order and funding a purchase at a store the agent can't check out of itself. Funding a purchase names a basket that a model chose after reading web pages, so it always asks a person, whatever mode the workspace runs in. Neither tool is available to a role that can't check out.

## Setting up a program

A card spends the balance of the Stripe account it was issued on, so each workspace connects its own. The owner presses **Connect a Stripe account** in Settings, then Virtual cards, and finishes Stripe's hosted onboarding. Someone with budget management turns the program on and gives the company name and billing address the cards are issued under. A program has to name at least one merchant category, because a card with none declines everything. [Stripe Issuing setup](https://atta.sh/integrations/stripe-issuing) has the steps.

Without a card program, Atta builds the cart and hands over the store's checkout link, and the person pays there.

## Questions

### Can the card be used more than once?

No. Each card is issued for one order and is cancelled once the order is settled or the 24 hour window passes without a charge. A retry of the same order returns the same card rather than a new one.

### Does Atta store the card number?

No. The number and CVC are shown in Stripe's own frame from the order page. Atta keeps the card id, last four digits, expiry, limit and status.

### What if the store adds shipping after approval?

A charge above the card's limit is declined. If the store's capture comes in over what was reserved but the network allowed it, the budget settles the captured figure and the order is flagged for review.

### Does having a card program change what needs approval?

No. The approval policy decides first and is unchanged by the program. The card only enforces the approved figure at the store.
