When does donation.refunded fire?
An operator or automated refund flow successfully refunds a donation through the originating gateway. The donation row stays in the database with status='refunded'.
What developers build with it
- Reverse the accounting entry in Tally / Zoho
- Trigger refund-confirmation email to donor
- Update donor CRM (lifetime value adjustment)
- Recalculate campaign-progress totals
- Compliance log for FCRA / 10BD reconciliation
Sample payload
The full envelope (with HMAC-SHA256 signature, delivery UUID and headers) is documented on the webhooks hub page. Below is the per-event data block for donation.refunded:
{
"donation_id": 12345,
"ngo_id": 7,
"original_amount": 5000,
"refund_amount": 5000,
"currency": "INR",
"gateway_refund_id": "rfnd_NYxYzAbCd5678",
"reason": "duplicate_payment",
"refunded_at": "2026-05-16T09:11:02+05:30"
}
Subscribe to this event
From your NGO dashboard, head to System · Webhooks · Add new. Paste your HTTPS endpoint, copy the signing secret, tick donation.refunded in the events list, save. The first matching event fires within seconds. Verify the X-Donateazy-Signature header on every request.
// PHP example - drop into your webhook receiver
$raw = file_get_contents('php://input');
$expected = hash_hmac('sha256', $raw, $WEBHOOK_SECRET);
if (! hash_equals($expected, $_SERVER['HTTP_X_DONATEAZY_SIGNATURE'] ?? '')) {
http_response_code(401); exit;
}
$payload = json_decode($raw, true);
if ($payload['event'] !== 'donation.refunded') {
http_response_code(202); exit; // not for this handler
}
// $payload['data'] is the block documented above.
handleDonationRefunded($payload['data'], $payload['id']);
http_response_code(200);