← all flows

cookbook enablement · payment-recovery-enablement-guard

Recover failed payments

Put a dunning agent on past-due invoices. It charges once to recover; it can't hammer the card on every retry.

Agno Bedrock · Nova Pro RETRY_PAYMENT
before Dunning ran in batch windows or needed a human to approve each retry — an agent left unguarded hits the card five times on the same past-due invoice.
RETRY_PAYMENT the line ↓ RETRY_PAYMENT hits the customer's card to recover a missed payment.
now you ship The agent retries the charge on its own. The boundary makes it recover once and stop.
1 Agent proposes RETRY_PAYMENT on a Invoice.
2 KIFF reads the Invoice's current state — before anything runs.
3 State is PAST_DUE → the agent's action runs, receipt signed.
4 State is now RECOVERED → every repeat is a no-op. You don't babysit it.

The flow you ship

A dunning agent retries the charge on a PAST_DUE invoice and the payment is recovered. The same agent then retries again and again — each attempt looks legitimate — but only the first should ever hit the card. You put the agent on recovery; the boundary holds the limit.

Why your team ships it

After recovery the invoice advances to RECOVERED, and RETRY_PAYMENT is allowed only from PAST_DUE — so every subsequent charge attempt is declined (state_not_allowed). The agent owns recovery; the customer's card is charged once.