This is how they send us what's basically a subscr_cancel IPN from PayPal. An example from payments-listener-gravy-20260405.gz:
{
"type": "event",
"name": "payment-method.deleted",
"id": "0786948d-bba7-4748-8052-2418441b29d6",
"created_at": "2026-04-04T08:50:39.953833+00:00",
"target": {
"type": "payment-method",
"id": "07a398d7-cbbc-4261-bce9-3c6e6a938062",
"external_identifier": null,
"method": "paypal",
"status": "succeeded",
"created_at": "2025-05-15T08:39:52.819891+00:00",
"updated_at": "2026-04-04T08:50:39.945828+00:00"
},
"merchant_account_id": "default",
"gr4vy_id": "wikimedia",
"environment": "production"}
This should have been recorded as a recurring cancel but instead we went on to try to charge the donation on Apr 15th
Relevant classes: (smashpig)
PaymentProviders/Gravy/Actions/PaymentMethodDeleteAction.php
PaymentProviders/Gravy/Jobs/RecurringCancellationJob.php