Ten ways money goes wrong.

Six run live in the PayPal sandbox, four in automated tests.

1 · Meta ad saleThe click rides in the order; the capture counts for that ad and goes to Meta onceLive
2 · Google ad saleThe gclid is kept the same way and becomes a Google offline conversion rowLive
3 · Invoice paid by a leadClaude drafts it, a person approves, the send agent sends it; the payment counts for the lead's adLive
4 · Pay pressed twiceA second payment from the same payer and ad is held, then refunded by the refund agentLive
5 · Full refundThe order stops counting; Google gets a retraction, the Meta event is held backLive
6 · Partial refundThe order still counts at $40; Google gets a restatementLive
7 · No ad clickPayPal confirms it, but no ad gets the credit and no platform is toldTest
8 · Paid long afterRevenue stays; no Meta event after 7 days, no Google row after 90Test
9 · Invented numberThe code gate rejects it, allows one repair, then flags itTest
10 · DisputeWhile open it is not a paid order; lost counts as refunded, won counts againTest
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.

Every number behind these is on the proof page.Open proof