Two likely places to check, in order: your error log, and whether the underlying entry can even be found. Each event is processed inside a try/catch specifically so a single malformed or unexpected event can't throw a 500 and cause GoCardless to retry the entire batch — a caught exception is logged and the handler moves on to the next event in the payload, returning 200 regardless. Separately, event-to-entry matching works by searching Gravity Forms entry meta for the mandate ID, payment ID, or billing request ID referenced in the event's links — there's no GoCardless-side pointer back to WordPress. If the entry that originally recorded that ID has since been deleted (GDPR erasure, manual cleanup, entry expiration), the event has nothing to attach to and is dropped without error. This is invisible from the WordPress side; if you need to debug it, check the raw payload GoCardless shows you in its own dashboard.
