Ten ways money goes wrong.
Six run live in the PayPal sandbox, four in automated tests.
Evidence ids and details
1: capture 59A98014DG653005N, Trial class; deduplicated by capture. 2: capture 7Y943188M77480212, Holiday camp.
3: invoice INV2-XSMX-ELUG-QLVV-PMMM, payment 81X20615X87083050, Free guide; agent-sent INV2-6ZMD-T3MY-9YPX-MJEW. Claude creates the draft with PayPal's Agent Toolkit; the ad click stays with the invoice in the shop's ledger. The send agent reads it from PayPal, checks it and sends it, pinned in code to that invoice. The sandbox sent no INVOICING.INVOICE.PAID event, so sent invoices are re-checked with PayPal.
4: one visit, Pay pressed twice: PayPal returned the same order 2UD41406J29438706 both times. Two separate payments, same payer and ad: 71264306943252202 flagged 17 s after 7Y943188M77480212, then refunded; 7A791792B60079253, 216 s after 59A98014DG653005N, refunded on 4 Nov by the refund agent after a person approved.
5: 71264306943252202 refunded $49.00. 6: 7Y943188M77480212 refunded $9.00.
7 and 8: test/ledger.test.js. 9: test/agent.test.js; Approve and Dismiss are logged on the server with their evidence. 10: test/rules.test.js, webhook CUSTOMER.DISPUTE.*, Toolkit list_disputes and get_dispute. No sandbox payment here has been disputed yet: opening one needs the buyer's account.
The ad export and leads are fictional demo data. PayPal calls are real sandbox calls. Meta Purchase events go to a real Meta test dataset; Google rows are previews.