Skip to content



This hook is called when CiviCRM receives a request to unsubscribe a user from a mailing.


Introduced in CiviCRM v4.2


hook_civicrm_unsubscribeGroups($op, $mailingId, $contactId, &$groups, &$baseGroups)


    • string $op - hard coded to be unsubscribe

    • int $mailingId - the id of the mailing sent that originated this unsubscribe request

    • int $contactId - the id of the contact that wishes to be unsubscribed
    • array $groups - the list of groups that the contact will be removed from
    • array $baseGroups - the list of base groups (for smart mailings) that the contact will be removed from


function civitest_civicrm_unsubscribeGroups( $op, $mailingId, $contactId, &$groups, &$baseGroups ) {
  // do the below for even mailing ids only
  // in a real implementation, you will have some logic to restrict what mailings
  // you want to handle the unsub via a different patch
  // this hook basically redirects you to a custom unsubscribe page
  // thanx to parvez @ veda consulting for this example
  if ($op == 'unsubscribe' && $mailingId % 2 == 0) {
    $oConfig                 = CRM_Core_Config::singleton();
    $sUnsubscribeRedirectUrl = $oConfig->unsubscribe_redirect_url;
    if ( !empty( $sUnsubscribeRedirectUrl ) ) {
      CRM_Utils_System::redirect( $sUnsubscribeRedirectUrl );
    } else {
      CRM_Core_Error::statusBounce( 'Unsubscribe URL has not been set.' );