← 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.