Skip to content



This hook is called immediately after an extension is installed.


  • Unlike most CiviCRM hooks, hook_civicrm_postInstall is defined not in CRM_Utils_Hook but in CRM_Extension_Manager_Module.
  • Each module will receive hook_civicrm_postInstall after its own installation (but not following the installation of unrelated modules).




  • None


  • Void


This hook may be useful as a final installation step. Use it to perform tasks which depend on something that is a product of the installation itself.

For example, as of civix version 16.9.0, it is used to record the schema version number (i.e., which upgrade_N methods have run) in the civicrm_extension table. This step has to be performed in hook_civicrm_postInstall because the record doesn't yet exist to be updated in hook_civicrm_install.

Another potential use is to act on settings or managed entities that are created during the installation (but not necessarily in order that you want them to be created):

function hook_civicrm_postInstall() {
  $customFieldId = civicrm_api3('CustomField', 'getvalue', array(
    'return' => array("id"),
    'name' => "customFieldCreatedViaManagedHook",
  civicrm_api3('Setting', 'create', array(
    'myWeirdFieldSetting' => array('id' => $customFieldId, 'weirdness' => 1),