Thank you for reviewing my account and removing the hold today. My original question, submitted on August 15 in Questions, still appears under Activity → Pending (1):
“Which webhook reports a post-settlement Square ACH return?”
Could you please review and publish that existing question, or let me know if I need to change anything? I have not resubmitted it because I want to avoid duplicate topics.
The outstanding integration question is which supported webhook or API reliably reports an ACH bank return after a payment has reached COMPLETED, and whether there is a sandbox fixture for that post-settlement return. We need that confirmation to handle invoice balances correctly before enabling production ACH.
@nikolaikop - I’ll just answer your question here - there is no dedicated ACH-return webhook. The webhook we do have is payment.updated. It covers PENDING → COMPLETED and PENDING → FAILED reliably (see documentation here: Payments API Webhooks), but doesn’t guarantee notification of ACH returns.
There are values to test ACH payments in sandbox found here, but there is no sandbox fixture for a post-settlement ACH return.
Practical guidance for invoice balances: Because there is no reliable webhook for post-settlement returns, the recommended pattern is to treat COMPLETED as “ACH initially succeeded” (safe to fulfill) but maintain your own internal ACH_RETURNED state and reconcile via a separate process — e.g., polling GetPayment or monitoring payout entries for reversals via ListPayoutEntries.
a couple more questions I hope you could clarify also.
We already poll GetPayment and maintain an internal returned-payment state. To reliably reopen the correct invoice, could you clarify:
After a completed ACH payment is returned, does GetPayment change? Which exact field or status identifies the return, and can the payment remain COMPLETED?
If ListPayoutEntries is the appropriate source, which entry type identifies a customer ACH return, and which field links it to the original payment ID? We need to distinguish this from a failed payout to the seller’s bank.
Could you provide a redacted example response showing that return and its original payment reference?
Since there is no sandbox fixture, an example and confirmation of the expected fields would let us implement and test the reconciliation correctly.