**Source URL:** https://general.veevavault.dev/vault-sdk/entry-points/record-merge/record-merge-handlers.md

# Record Merge Event Handlers



Your organization may want to create custom Record Merge Event Handlers which execute custom logic immediately when a record merge begins or after a record merge completes. You can initiate a record merge operation through [Vault API](/vault-api/api-reference/26.1/vault-objects/merge-object-records) or the Vault Java SDK. Record Merge Event Handlers execute regardless of the merge operation origin, for example, starting a merge from the SDK or the API.
The `@RecordMergeEventHandlerInfo` annotation indicates that a class is a Record Merge Event Handler and specifies the object where this handler will execute. Each Vault object can only have one (1) Record Merge Event Handler.

The `RecordMergeEventHandler` interface contains the logic for your record merges. Custom logic can execute either:

* `onMergeStart()`: Invoked when the merge starts.

* `onMergeComplete()`: Invoked when the merge completes.

For example, your organization may need a record merge event handler if you have an external integration that relies on records that may be undergoing a merge. `onMergeStart()`, the handler can send a message to the integration that it should pause integration activities. `onMergeComplete()`, the handler can send another message that integration can resume again.

The following example is a skeleton for a Record Merge Event Handler:

```
@RecordMergeEventHandlerInfo(object = "account__v")
      public class RecordMergeEventHandlerSample implements RecordMergeEventHandler {


     @Override
     public void onMergeStart(RecordMergeEventStartContext context) {
         LogService logService = ServiceLocator.locate(LogService.class);


         String objectName = context.getObjectName();
         String jobId = context.getJobId();
         List mergeSets = context.getRecordMergeSets();
         for (RecordMergeSet mergeSet : mergeSets) {
             String dupRecordId = mergeSet.getDuplicateRecordId();
             String mainRecordId = mergeSet.getMainRecordId();
             logService.info(String.format("Started merge of duplicate record [%s] into main record [%s] for object [%s] job [%s]", dupRecordId, mainRecordId, objectName, jobId));
             //do something
         }
     }
     @Override
     public void onMergeComplete(RecordMergeEventCompletionContext context) {
         LogService logService = ServiceLocator.locate(LogService.class);


         String objectName = context.getObjectName();
         String jobId = context.getJobId();
         List mergeSetResults = context.getRecordMergeSetResults();
         for (RecordMergeSetResult mergeSetResult : mergeSetResults) {
             String dupRecordId = mergeSetResult.getDuplicateRecordId();
             String mainRecordId = mergeSetResult.getMainRecordId();
             RecordMergeCompletionStatus status = mergeSetResult.getStatus();
             if (status == RecordMergeCompletionStatus.SUCCESS) {
                 logService.info(String.format("Succeeded in merge of duplicate record [%s] into main record [%s] for object [%s] job [%s]",  dupRecordId, mainRecordId, objectName, jobId));
                 //do something for success
             } else if (status == RecordMergeCompletionStatus.FAILURE) {
                 logService.info(String.format("Failed in merge of duplicate record [%s] into main record [%s] for object %s job %s",  dupRecordId, mainRecordId, objectName, jobId));
                 //do something for failure
             }
         }
     }
 }

```

After writing your handler code, you must [deploy](/vault-sdk/deploying-code/) your Record Merge Event Handler to make it active in your Vault. You can view all of the extensions currently deployed to your Vault in **Admin > Configuration > Vault Java SDK**.

Learn more about Record Merge Event Handlers in the [Javadocs](https://repo.veevavault.com/javadoc/vault-sdk-api/26.1.0/docs/api/com/veeva/vault/sdk/api/data).



---

**Previous:** [Record Merges](/vault-sdk/entry-points/record-merge)  
**Next:** [Services](/vault-sdk/services)