When does donor.merged fire?
An admin runs the donor-merge action, or the BeneficiaryMergeService's auto-merge logic identifies duplicate PAN/phone+name combinations. Donations are transferred from the merged record to the kept record.
What developers build with it
- Mirror the merge into your external CRM (delete or soft-delete the duplicate)
- Update accounting attribution if donations moved between donor IDs
- Re-anchor mailing-list subscriptions to the surviving donor
- Audit-trail compliance for donor-data lineage
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 donor.merged:
{
"kept_donor_id": 482,
"merged_donor_id": 491,
"ngo_id": 7,
"donations_transferred": 3,
"merged_at": "2026-05-16T15:44:00+05:30",
"merged_by_user_id": 12
}
Subscribe to this event
From your NGO dashboard, head to System · Webhooks · Add new. Paste your HTTPS endpoint, copy the signing secret, tick donor.merged 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'] !== 'donor.merged') {
http_response_code(202); exit; // not for this handler
}
// $payload['data'] is the block documented above.
handleDonorMerged($payload['data'], $payload['id']);
http_response_code(200);