diff --git a/config/schema/meta_entity.schema.yml b/config/schema/meta_entity.schema.yml
index 6222e3b..fb0c6b4 100644
--- a/config/schema/meta_entity.schema.yml
+++ b/config/schema/meta_entity.schema.yml
@@ -18,6 +18,13 @@ meta_entity.type.*:
         type: sequence
         label: 'Target entity type bundles'
         sequence:
-          type: string
-          label: 'Reverse reference field name'
-          nullable: true
+          type: mapping
+          label: 'Target bundle settings'
+          mapping:
+            field_name:
+              type: string
+              label: 'Reverse reference field name'
+              nullable: true
+            auto_create:
+              type: boolean
+              label: 'Auto-create meta entity'
diff --git a/meta_entity.install b/meta_entity.install
new file mode 100644
index 0000000..beb2bf1
--- /dev/null
+++ b/meta_entity.install
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for Meta Entity module.
+ */
+
+declare(strict_types = 1);
+
+use Drupal\Core\Config\Entity\ConfigEntityUpdater;
+use Drupal\meta_entity\Entity\MetaEntityTypeInterface;
+
+/**
+ * Allow meta entity auto-creation and auto-deletion.
+ */
+function meta_entity_update_8001(array &$sandbox): void {
+  \Drupal::classResolver(ConfigEntityUpdater::class)->update($sandbox, 'meta_entity_type', function (MetaEntityTypeInterface $meta_entity_type): bool {
+    $mapping = $meta_entity_type->get('mapping');
+    foreach ($mapping as $entity_type_id => $bundles) {
+      foreach ($bundles as $bundle => $field_name) {
+        $mapping[$entity_type_id][$bundle] = [
+          'field_name' => $field_name,
+          'auto_create' => FALSE,
+        ];
+      }
+    }
+    $meta_entity_type->set('mapping', $mapping);
+    return TRUE;
+  });
+}
diff --git a/meta_entity.module b/meta_entity.module
index 81e5416..68d8434 100644
--- a/meta_entity.module
+++ b/meta_entity.module
@@ -88,3 +88,31 @@ function meta_entity_entity_bundle_field_info(EntityTypeInterface $entity_type,
 
   return $fields;
 }
+
+/**
+ * Implements hook_entity_insert().
+ */
+function meta_entity_entity_insert(EntityInterface $entity) {
+  if (!$entity instanceof ContentEntityInterface) {
+    return;
+  }
+
+  $meta_entity_type_ids = \Drupal::service('meta_entity.repository')->getTypesWithAutoCreation($entity);
+  if ($meta_entity_type_ids) {
+    $storage = \Drupal::entityTypeManager()->getStorage('meta_entity');
+    foreach ($meta_entity_type_ids as $meta_entity_type_id) {
+      $meta_entity = $storage->create([
+        'type' => $meta_entity_type_id,
+        'target' => $entity,
+      ]);
+      $meta_entity->save();
+      \Drupal::logger('meta_entity')->debug("Auto-created %meta_entity_type_id meta-entity with ID @meta_entity_id for the %bundle %entity_type entity with ID @entity_id.", [
+        '%meta_entity_type_id' => $meta_entity_type_id,
+        '@meta_entity_id' => $meta_entity->id(),
+        '%bundle' => $entity->bundle(),
+        '%entity_type' => $entity->getEntityTypeId(),
+        '@entity_id' => $entity->id(),
+      ]);
+    }
+  }
+}
diff --git a/src/Form/MetaEntityTypeForm.php b/src/Form/MetaEntityTypeForm.php
index ade4527..5044566 100644
--- a/src/Form/MetaEntityTypeForm.php
+++ b/src/Form/MetaEntityTypeForm.php
@@ -160,11 +160,12 @@ class MetaEntityTypeForm extends BundleEntityFormBase {
             '#value' => NULL,
           ];
         }
-        $form['mapping'][$entity_type_id]['bundles'][$bundle_id]['field_name'] = [
-          '#type' => 'textfield',
-          '#title' => $this->t('Reverse reference field name'),
-          '#default_value' => $mapping[$entity_type_id][$bundle_id] ?? NULL,
-          '#maxlength' => 32,
+        $form['mapping'][$entity_type_id]['bundles'][$bundle_id]['settings'] = [
+          '#type' => 'fieldset',
+          '#title' => $this->t('Settings for @bundle @entity_type', [
+            '@bundle' => $bundle_info['label'],
+            '@entity_type' => $entity_type->getSingularLabel(),
+          ]),
           '#states' => [
             'visible' => [
               'input[name="mapping[' . $entity_type_id . '][bundles][' . $bundle_id . '][enabled]"]' => [
@@ -173,6 +174,21 @@ class MetaEntityTypeForm extends BundleEntityFormBase {
             ],
           ],
         ];
+
+        $form['mapping'][$entity_type_id]['bundles'][$bundle_id]['settings']['field_name'] = [
+          '#type' => 'textfield',
+          '#title' => $this->t('Reverse reference field name'),
+          '#default_value' => $mapping[$entity_type_id][$bundle_id]['field_name'] ?? NULL,
+          '#maxlength' => 32,
+        ];
+        $form['mapping'][$entity_type_id]['bundles'][$bundle_id]['settings']['auto_create'] = [
+          '#type' => 'checkbox',
+          '#title' => $this->t('Auto-create a meta entity when a new @bundle @entity_type is created', [
+            '@bundle' => $bundle_info['label'],
+            '@entity_type' => $entity_type->getSingularLabel(),
+          ]),
+          '#default_value' => $mapping[$entity_type_id][$bundle_id]['auto_create'] ?? FALSE,
+        ];
       }
     }
 
@@ -215,15 +231,15 @@ class MetaEntityTypeForm extends BundleEntityFormBase {
         // NULL in ::buildEntityTypeOptions().
         // @see self::buildEntityTypeOptions()
         if ($info['enabled'] || ($info['enabled'] === NULL)) {
-          if ($field_name = trim($info['field_name']) ?? NULL) {
+          if ($field_name = trim($info['settings']['field_name']) ?? NULL) {
             // Validate the field name length and allowed characters.
             if (!preg_match('/^[a-z][a-z0-9_]{0,31}$/i', $field_name)) {
-              $form_state->setErrorByName("mapping][{$entity_type_id}][bundles][{$bundle_id}][field_name", $this->t('The field name should start with a lowercase latin letter and may contain only lowercase letters, digits and the underscore character.'));
+              $form_state->setErrorByName("mapping][{$entity_type_id}][bundles][{$bundle_id}][settings][field_name", $this->t('The field name should start with a lowercase latin letter and may contain only lowercase letters, digits and the underscore character.'));
             }
             // Validate that this field name is unique within the same target
             // entity type and meta entity type.
             $ids = $storage->getQuery()
-              ->condition("mapping.{$entity_type_id}.*", $field_name)
+              ->condition("mapping.{$entity_type_id}.*.field_name", $field_name)
               ->condition('id', $this->getEntity()->id(), '<>')
               ->execute();
             if ($ids) {
@@ -243,7 +259,10 @@ class MetaEntityTypeForm extends BundleEntityFormBase {
               }
             }
           }
-          $mapping[$entity_type_id][$bundle_id] = $field_name;
+          $mapping[$entity_type_id][$bundle_id] = [
+            'field_name' => $field_name,
+            'auto_create' => (bool) $info['settings']['auto_create'],
+          ];
         }
       }
     }
diff --git a/src/MetaEntityRepository.php b/src/MetaEntityRepository.php
index 74a395f..dcc588f 100644
--- a/src/MetaEntityRepository.php
+++ b/src/MetaEntityRepository.php
@@ -159,8 +159,8 @@ class MetaEntityRepository implements MetaEntityRepositoryInterface {
     foreach ($storage->loadMultiple() as $id => $type) {
       $cache_tags = Cache::mergeTags($cache_tags, $type->getCacheTags());
       $mapping = $type->get('mapping');
-      if (!empty($mapping[$entity_type_id][$bundle])) {
-        $fields[$id] = $mapping[$entity_type_id][$bundle];
+      if (!empty($mapping[$entity_type_id][$bundle]['field_name'])) {
+        $fields[$id] = $mapping[$entity_type_id][$bundle]['field_name'];
       }
     }
 
@@ -175,4 +175,41 @@ class MetaEntityRepository implements MetaEntityRepositoryInterface {
     return $fields;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getTypesWithAutoCreation(ContentEntityInterface $entity): array {
+    $cid = 'auto_create';
+
+    if ($cache = $this->cache->get($cid)) {
+      if (isset($cache->data[$entity->getEntityTypeId()][$entity->bundle()])) {
+        return $cache->data[$entity->getEntityTypeId()][$entity->bundle()];
+      }
+      return [];
+    }
+
+    $cache = [];
+    $storage = $this->entityTypeManager->getStorage('meta_entity_type');
+    $cache_tags = $this->entityTypeManager->getDefinition('meta_entity_type')->getListCacheTags();
+    foreach ($storage->loadMultiple() as $meta_entity_type_id => $meta_entity_type) {
+      $cache_tags = Cache::mergeTags($cache_tags, $meta_entity_type->getCacheTags());
+      foreach ($meta_entity_type->get('mapping') as $entity_type_id => $bundles) {
+        foreach ($bundles as $bundle_id => $info) {
+          $auto_create = $info['auto_create'] ?? FALSE;
+          if ($auto_create) {
+            $cache[$entity_type_id][$bundle_id][] = $meta_entity_type_id;
+          }
+        }
+      }
+    }
+
+    // Cache the results.
+    $this->cache->set($cid, $cache, Cache::PERMANENT, $cache_tags);
+
+    if (isset($cache[$entity->getEntityTypeId()][$entity->bundle()])) {
+      return $cache[$entity->getEntityTypeId()][$entity->bundle()];
+    }
+    return [];
+  }
+
 }
diff --git a/src/MetaEntityRepositoryInterface.php b/src/MetaEntityRepositoryInterface.php
index 0570aec..3d60dd9 100644
--- a/src/MetaEntityRepositoryInterface.php
+++ b/src/MetaEntityRepositoryInterface.php
@@ -63,4 +63,15 @@ interface MetaEntityRepositoryInterface {
    */
   public function getReverseReferenceFieldNames(string $entity_type_id, string $bundle): array;
 
+  /**
+   * Returns a list of meta entity types that are configured with auto-creation.
+   *
+   * @param \Drupal\Core\Entity\ContentEntityInterface $entity
+   *   The entity for which to return the list.
+   *
+   * @return string[]
+   *   A list of meta entity type IDs.
+   */
+  public function getTypesWithAutoCreation(ContentEntityInterface $entity): array;
+
 }
diff --git a/tests/src/Functional/MetaEntityCacheTagsTest.php b/tests/src/Functional/MetaEntityCacheTagsTest.php
index 9e89387..d15d342 100644
--- a/tests/src/Functional/MetaEntityCacheTagsTest.php
+++ b/tests/src/Functional/MetaEntityCacheTagsTest.php
@@ -53,7 +53,7 @@ class MetaEntityCacheTagsTest extends EntityWithUriCacheTagsTestBase {
    */
   public function createEntity() {
     MetaEntityType::load('visit_count')->set('mapping', [
-      'entity_test' => ['entity_test' => NULL],
+      'entity_test' => ['entity_test' => []],
     ])->save();
 
     $target_entity = EntityTest::create([
diff --git a/tests/src/Kernel/AutoCreationTest.php b/tests/src/Kernel/AutoCreationTest.php
new file mode 100644
index 0000000..8b3b823
--- /dev/null
+++ b/tests/src/Kernel/AutoCreationTest.php
@@ -0,0 +1,83 @@
+<?php
+
+declare(strict_types = 1);
+
+namespace Drupal\Tests\meta_entity\Kernel;
+
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\meta_entity\Entity\MetaEntityType;
+
+/**
+ * Tests meta entity auto-creation and auto-deletion.
+ *
+ * @group meta_entity
+ */
+class AutoCreationTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'dynamic_entity_reference',
+    'entity_test',
+    'field',
+    'meta_entity',
+    'meta_entity_test',
+    'user',
+  ];
+
+  /**
+   * Tests meta entity auto-creation.
+   */
+  public function testAutoCreation(): void {
+    $this->installConfig(['meta_entity_test']);
+    $this->installEntitySchema('entity_test');
+    $this->installEntitySchema('meta_entity');
+    $this->installEntitySchema('user');
+    $repository = $this->container->get('meta_entity.repository');
+
+    $meta_entity_type = MetaEntityType::load('visit_count');
+    // Set the mapping for but don't set any 'auto-*' flag.
+    $meta_entity_type->set('mapping', [
+      'entity_test' => [
+        'entity_test' => [],
+      ],
+    ])->save();
+
+    $target_entity = EntityTest::create([
+      'type' => 'entity_test',
+      'name' => $this->randomString(),
+    ]);
+    $target_entity->save();
+
+    // Check that no associated meta entity has been created.
+    $this->assertNull($repository->getMetaEntityForEntity($target_entity, 'visit_count'));
+
+    $target_entity->delete();
+
+    // Add meta entity auto-creation for this bundle.
+    $meta_entity_type->set('mapping', [
+      'entity_test' => [
+        'entity_test' => [
+          'auto_create' => TRUE,
+        ],
+      ]
+    ])->save();
+
+    $target_entity = EntityTest::create([
+      'type' => 'entity_test',
+      'name' => $this->randomString(),
+    ]);
+    $target_entity->save();
+
+    // Check that an associated meta entity has been created.
+    $meta_entity = $repository->getMetaEntityForEntity($target_entity, 'visit_count');
+    $this->assertSame('visit_count', $meta_entity->bundle());
+
+    // Check that the associated meta entity has been deleted.
+    $target_entity->delete();
+    $this->assertNull($repository->getMetaEntityForEntity($target_entity, 'visit_count'));
+  }
+
+}
diff --git a/tests/src/Kernel/MappedTargetEntityConstraintTest.php b/tests/src/Kernel/MappedTargetEntityConstraintTest.php
index 5e55abc..f90dd4f 100644
--- a/tests/src/Kernel/MappedTargetEntityConstraintTest.php
+++ b/tests/src/Kernel/MappedTargetEntityConstraintTest.php
@@ -80,7 +80,7 @@ class MappedTargetEntityConstraintTest extends KernelTestBase {
     // the different bundle "visit_count". It should still throw a validation
     // error.
     MetaEntityType::load('download_count')->set('mapping', [
-      'entity_test' => ['entity_test' => NULL],
+      'entity_test' => ['entity_test' => []],
     ])->save();
 
     $violations = $meta_entity->validate();
@@ -91,7 +91,7 @@ class MappedTargetEntityConstraintTest extends KernelTestBase {
     // meta entity type. This provides the correct mapping, and the constraint
     // violation should be gone.
     MetaEntityType::load('visit_count')->set('mapping', [
-      'entity_test' => ['entity_test' => NULL],
+      'entity_test' => ['entity_test' => []],
     ])->save();
 
     $violations = $meta_entity->validate();
diff --git a/tests/src/Kernel/MetaEntityAccessTest.php b/tests/src/Kernel/MetaEntityAccessTest.php
index fc1d428..689f9b3 100644
--- a/tests/src/Kernel/MetaEntityAccessTest.php
+++ b/tests/src/Kernel/MetaEntityAccessTest.php
@@ -45,7 +45,7 @@ class MetaEntityAccessTest extends KernelTestBase {
 
     MetaEntityType::load('visit_count')->set('mapping', [
       'entity_test' => [
-        'entity_test' => NULL,
+        'entity_test' => [],
       ],
     ])->save();
 
diff --git a/tests/src/Kernel/MetaEntityRepositoryTest.php b/tests/src/Kernel/MetaEntityRepositoryTest.php
index 383cb1e..3b115d3 100644
--- a/tests/src/Kernel/MetaEntityRepositoryTest.php
+++ b/tests/src/Kernel/MetaEntityRepositoryTest.php
@@ -43,13 +43,13 @@ class MetaEntityRepositoryTest extends KernelTestBase {
     $this->container->get('entity_type.bundle.info')->clearCachedBundles();
 
     MetaEntityType::load('visit_count')->set('mapping', [
-      'entity_test' => ['foo' => NULL],
-      'node' => ['page' => NULL],
-      'user' => ['user' => NULL],
+      'entity_test' => ['foo' => []],
+      'node' => ['page' => []],
+      'user' => ['user' => []],
     ])->save();
     MetaEntityType::load('download_count')->set('mapping', [
-      'entity_test' => ['bar' => NULL],
-      'node' => ['article' => NULL],
+      'entity_test' => ['bar' => []],
+      'node' => ['article' => []],
     ])->save();
     $service = $this->container->get('meta_entity.repository');
 
diff --git a/tests/src/Kernel/MetaEntityTypeDependencyTest.php b/tests/src/Kernel/MetaEntityTypeDependencyTest.php
index 546c663..d361c7a 100644
--- a/tests/src/Kernel/MetaEntityTypeDependencyTest.php
+++ b/tests/src/Kernel/MetaEntityTypeDependencyTest.php
@@ -46,9 +46,13 @@ class MetaEntityTypeDependencyTest extends KernelTestBase {
 
     $meta_entity_type = MetaEntityType::load('visit_count');
     $meta_entity_type->set('mapping', [
-      'entity_test' => ['entity_test' => 'reverse_ref'],
+      'entity_test' => [
+        'entity_test' => [
+          'field_name' => 'reverse_ref',
+        ],
+      ],
       // Pick-up only one bundle.
-      'taxonomy_term' => ['vocab1' => NULL],
+      'taxonomy_term' => ['vocab1' => []],
     ])->save();
 
     $this->assertSame([
@@ -62,12 +66,16 @@ class MetaEntityTypeDependencyTest extends KernelTestBase {
     ], $meta_entity_type->getDependencies());
 
     $meta_entity_type->set('mapping', [
-      'entity_test' => ['entity_test' => 'reverse_ref'],
+      'entity_test' => [
+        'entity_test' => [
+          'field_name' => 'reverse_ref',
+        ],
+      ],
       // Pick-up all bundles explicitly.
       'taxonomy_term' => [
-        'vocab1' => NULL,
-        'vocab2' => NULL,
-        'vocab3' => NULL,
+        'vocab1' => [],
+        'vocab2' => [],
+        'vocab3' => [],
       ],
     ])->save();
 
@@ -114,7 +122,11 @@ class MetaEntityTypeDependencyTest extends KernelTestBase {
     // Add back one vocabulary.
     Vocabulary::create(['vid' => 'vocab1'])->save();
     $mapping = $meta_entity_type->get('mapping');
-    $mapping['taxonomy_term'] = ['vocab1' => 'reverse_reference'];
+    $mapping['taxonomy_term'] = [
+      'vocab1' => [
+        'field_name' => 'reverse_reference',
+      ],
+    ];
     $meta_entity_type->set('mapping', $mapping)->save();
 
     // Check that the entity dependencies were updated.
diff --git a/tests/src/Kernel/TargetEntityComputedFieldTest.php b/tests/src/Kernel/TargetEntityComputedFieldTest.php
index bb83a02..fad02bf 100644
--- a/tests/src/Kernel/TargetEntityComputedFieldTest.php
+++ b/tests/src/Kernel/TargetEntityComputedFieldTest.php
@@ -59,11 +59,11 @@ class TargetEntityComputedFieldTest extends KernelTestBase {
     $this->container->get('entity_type.bundle.info')->clearCachedBundles();
 
     MetaEntityType::load('visit_count')->set('mapping', [
-      'entity_test' => ['foo' => 'visits'],
-      'taxonomy_term' => ['vocab1' => 'usage'],
+      'entity_test' => ['foo' => ['field_name' => 'visits']],
+      'taxonomy_term' => ['vocab1' => ['field_name' => 'usage']],
     ])->save();
     MetaEntityType::load('download_count')->set('mapping', [
-      'entity_test' => ['foo' => 'unique_visits'],
+      'entity_test' => ['foo' => ['field_name' => 'unique_visits']],
     ])->save();
     Vocabulary::create(['vid' => 'vocab1'])->save();
     Vocabulary::create(['vid' => 'vocab2'])->save();
@@ -139,8 +139,8 @@ class TargetEntityComputedFieldTest extends KernelTestBase {
 
     // Replace 'vocab1' with 'vocab2'.
     MetaEntityType::load('visit_count')->set('mapping', [
-      'entity_test' => ['foo' => 'visits'],
-      'taxonomy_term' => ['vocab2' => 'usage'],
+      'entity_test' => ['foo' => ['field_name' => 'visits']],
+      'taxonomy_term' => ['vocab2' => ['field_name' => 'usage']],
     ])->save();
 
     // Check that the field has been removed from $term1 but added to $term2.
@@ -155,12 +155,24 @@ class TargetEntityComputedFieldTest extends KernelTestBase {
    */
   public function testAssignValueToComputedField(): void {
     MetaEntityType::load('download_count')->set('mapping', [
-      'entity_test' => ['entity_test' => 'downloads'],
-      'entity_test_string_id' => ['entity_test_string_id' => 'downloads'],
+      'entity_test' => ['entity_test' => ['field_name' => 'downloads']],
+      'entity_test_string_id' => [
+        'entity_test_string_id' => [
+          'field_name' => 'downloads',
+        ],
+      ],
     ])->save();
     MetaEntityType::load('visit_count')->set('mapping', [
-      'entity_test' => ['entity_test' => 'visits'],
-      'entity_test_string_id' => ['entity_test_string_id' => 'visits'],
+      'entity_test' => [
+        'entity_test' => [
+          'field_name' => 'visits',
+        ],
+      ],
+      'entity_test_string_id' => [
+        'entity_test_string_id' => [
+          'field_name' => 'visits',
+        ],
+      ],
     ])->save();
 
     // Check assigning a meta entity on target entity creation.
diff --git a/tests/src/Kernel/UniquePerMetaTypeAndTargetConstraintTest.php b/tests/src/Kernel/UniquePerMetaTypeAndTargetConstraintTest.php
index 9bf877d..35ac9d9 100644
--- a/tests/src/Kernel/UniquePerMetaTypeAndTargetConstraintTest.php
+++ b/tests/src/Kernel/UniquePerMetaTypeAndTargetConstraintTest.php
@@ -39,10 +39,10 @@ class UniquePerMetaTypeAndTargetConstraintTest extends KernelTestBase {
     $this->installEntitySchema('meta_entity');
     $this->installConfig(['meta_entity_test']);
     MetaEntityType::load('visit_count')->set('mapping', [
-      'entity_test' => ['entity_test' => NULL],
+      'entity_test' => ['entity_test' => []],
     ])->save();
     MetaEntityType::load('download_count')->set('mapping', [
-      'entity_test' => ['entity_test' => NULL],
+      'entity_test' => ['entity_test' => []],
     ])->save();
   }
 
