diff --git a/modules/salesforce_pull/salesforce_pull.module b/modules/salesforce_pull/salesforce_pull.module
index c23d5ba..9a8591c 100644
--- a/modules/salesforce_pull/salesforce_pull.module
+++ b/modules/salesforce_pull/salesforce_pull.module
@@ -108,6 +108,9 @@ function salesforce_pull_get_updated_records() {
       $soql->addCondition('RecordTypeId', $mapped_record_types, 'IN');
     }
 
+    // Allowing alteration of select query (user may want to fetch custom fields).
+    drupal_alter('salesforce_pull_select_query', $type, $soql);
+
     // Execute query.
     $results = $sfapi->query($soql);
     $version_path = parse_url($sfapi->getApiEndPoint(), PHP_URL_PATH);
@@ -115,6 +118,14 @@ function salesforce_pull_get_updated_records() {
     if (!isset($results['errorCode'])) {
       // Write items to the queue.
       foreach ($results['records'] as $result) {
+        // Trigger a hook to allow other modules to prevent this entity/operation from
+        // triggering a sync with Drupal.
+        foreach (module_implements('salesforce_pull_record_allowed') as $module) {
+          if (module_invoke($module, 'salesforce_pull_record_allowed', $result) === FALSE) {
+            continue 2;
+          }
+        }
+
         $queue->createItem($result);
       }
 
@@ -127,6 +138,14 @@ function salesforce_pull_get_updated_records() {
         if (!isset($new_result['errorCode'])) {
           // Write items to the queue.
           foreach ($new_result['records'] as $result) {
+            // Trigger a hook to allow other modules to prevent this entity/operation from
+            // triggering a sync with Drupal.
+            foreach (module_implements('salesforce_pull_record_allowed') as $module) {
+              if (module_invoke($module, 'salesforce_pull_record_allowed', $result) === FALSE) {
+                continue 2;
+              }
+            }
+
             $queue->createItem($result);
           }
         }
@@ -175,9 +194,21 @@ function salesforce_pull_process_records($sf_object) {
           // Set fields values on the Drupal entity.
           salesforce_pull_map_fields($sf_mapping->field_mappings, $wrapper, $sf_object);
 
+          // Trigger a hook to allow other modules to prevent this entity from
+          // from being saved in Drupal.
+          foreach (module_implements('salesforce_pull_entity_allowed') as $module) {
+            if (module_invoke($module, 'salesforce_pull_entity_allowed', $sf_mapping->drupal_entity_type, $entity, $sf_object, $sf_mapping) === FALSE) {
+              continue 2;
+            }
+          }
+
+          drupal_alter('salesforce_pull_before_update', $sf_object, $sf_mapping->drupal_entity_type, $entity);
+
           // Update entity.
           $wrapper->save();
 
+          drupal_alter('salesforce_pull_after_update', $sf_object, $sf_mapping->drupal_entity_type, $entity);
+
           // Update mapping object.
           $mapping_object->last_sync = REQUEST_TIME;
           $mapping_object->entity_update = REQUEST_TIME;
@@ -232,10 +263,23 @@ function salesforce_pull_process_records($sf_object) {
           $entity->salesforce_pull = TRUE;
           $wrapper = entity_metadata_wrapper($sf_mapping->drupal_entity_type, $entity);
           // Save entity to populate ID, necessary for relations.
+
+          // Trigger a hook to allow other modules to prevent this entity from
+          // from being saved in Drupal.
+          foreach (module_implements('salesforce_pull_entity_allowed') as $module) {
+            if (module_invoke($module, 'salesforce_pull_entity_allowed', $sf_mapping->drupal_entity_type, $entity, $sf_object, $sf_mapping) === FALSE) {
+              continue 2;
+            }
+          }
+
+          drupal_alter('salesforce_pull_before_create', $sf_object, $sf_mapping->drupal_entity_type, $entity);
+
           $wrapper->save();
           salesforce_pull_map_fields($sf_mapping->field_mappings, $wrapper, $sf_object);
           $wrapper->save();
 
+          drupal_alter('salesforce_pull_after_create', $sf_object, $sf_mapping->drupal_entity_type, $entity);
+
           // If no id exists, the insert failed.
           list($entity_id) = entity_extract_ids($sf_mapping->drupal_entity_type, $entity);
           if (!$entity_id) {
diff --git a/modules/salesforce_push/salesforce_push.module b/modules/salesforce_push/salesforce_push.module
index f0dd6e1..0833856 100644
--- a/modules/salesforce_push/salesforce_push.module
+++ b/modules/salesforce_push/salesforce_push.module
@@ -104,8 +104,10 @@ function salesforce_push_sync_rest($entity_type, $entity, $mapping, $sf_sync_tri
   // Delete SF object.
   if ($sf_sync_trigger == SALESFORCE_MAPPING_SYNC_DRUPAL_DELETE) {
     if ($mapped_objects) {
+      drupal_alter('salesforce_push_before_delete', $entity_type, $entity, $mapping);
       try {
         $sfapi->objectDelete($mapping->salesforce_object_type, $mapped_objects->salesforce_id);
+        drupal_alter('salesforce_push_after_delete', $entity_type, $entity, $mapping);
       }
       catch(SalesforceException $e) {
         watchdog_exception('salesforce_push', $e);
@@ -127,6 +129,8 @@ function salesforce_push_sync_rest($entity_type, $entity, $mapping, $sf_sync_tri
 
   // Entity is not linked to an SF object.
   if (!$mapped_objects) {
+    drupal_alter('salesforce_push_before_create', $entity_type, $entity, $mapping);
+
     // Setup SF record type.
     if ($mapping->salesforce_record_type != SALESFORCE_MAPPING_DEFAULT_RECORD_TYPE) {
       if ($mapping->salesforce_object_type != 'CampaignMember') {
@@ -144,6 +148,7 @@ function salesforce_push_sync_rest($entity_type, $entity, $mapping, $sf_sync_tri
           case '204':
             $sf_object = $sfapi->objectReadbyExternalId($mapping->salesforce_object_type, $key_field, $key_value);
             $data['id'] = $sf_object['Id'];
+            drupal_alter('salesforce_push_after_update', $entity_type, $entity, $mapping);
             break;
 
           // Handle duplicate records.
@@ -156,6 +161,10 @@ function salesforce_push_sync_rest($entity_type, $entity, $mapping, $sf_sync_tri
       // No key or mapping, create a new object in Salesforce.
       else {
         $data = $sfapi->objectCreate($mapping->salesforce_object_type, $params);
+
+        // We need salesforce_id in our entity before hook invocation.
+        $entity->salesforce_id = $data['id'];
+        drupal_alter('salesforce_push_after_create', $entity_type, $entity, $mapping);
       }
     }
     catch(SalesforceException $e) {
@@ -172,6 +181,10 @@ function salesforce_push_sync_rest($entity_type, $entity, $mapping, $sf_sync_tri
         'entity_type' => $entity_type,
         'salesforce_id' => $data['id'],
       ));
+
+      // We need salesforce_id in our entity before hook invocation.
+      $entity->salesforce_id = $data['id'];
+      drupal_alter('salesforce_push_after_create', $entity_type, $entity, $mapping);
     }
     else {
       $message = t('Failed to sync %label with Salesforce. @code: @message',
@@ -185,6 +198,8 @@ function salesforce_push_sync_rest($entity_type, $entity, $mapping, $sf_sync_tri
       watchdog('salesforce_push', $message);
       return;
     }
+
+
   }
   // Existing object link, update.
   else {
@@ -194,6 +209,8 @@ function salesforce_push_sync_rest($entity_type, $entity, $mapping, $sf_sync_tri
       return;
     }
 
+    drupal_alter('salesforce_push_before_update', $entity_type, $entity, $mapping);
+
     // Update SF object.
     try {
       $sfapi->objectUpdate($mapping->salesforce_object_type, $mapped_objects->salesforce_id, $params);
@@ -208,6 +225,8 @@ function salesforce_push_sync_rest($entity_type, $entity, $mapping, $sf_sync_tri
     }
 
     $mapped_objects->last_sync = REQUEST_TIME;
+
+    drupal_alter('salesforce_push_after_update', $entity_type, $entity, $mapping);
   }
 
   salesforce_set_message(t('%name has been synchronized with Salesforce record %sfid.', array(
