diff --git a/CHANGELOG.md b/CHANGELOG.md
index 68d4a5e4..a62805c4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,7 +12,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com), and this
 * [#1359](https://github.com/shlinkio/shlink/issues/1359) Hidden database commands.
 
 ### Deprecated
-* *Nothing*
+* [#1340](https://github.com/shlinkio/shlink/issues/1340) Deprecated webhooks. New events will only be added to other real-time updates approaches, and webhooks will be completely removed in Shlink 4.0.0.
 
 ### Removed
 * *Nothing*
diff --git a/composer.json b/composer.json
index 496e961e..970ae432 100644
--- a/composer.json
+++ b/composer.json
@@ -51,7 +51,7 @@
         "shlinkio/shlink-config": "^1.6",
         "shlinkio/shlink-event-dispatcher": "^2.3",
         "shlinkio/shlink-importer": "^2.5",
-        "shlinkio/shlink-installer": "^7.0",
+        "shlinkio/shlink-installer": "dev-develop#9394944 as 7.1",
         "shlinkio/shlink-ip-geolocation": "^2.2",
         "symfony/console": "^6.0",
         "symfony/filesystem": "^6.0",
diff --git a/config/autoload/webhooks.global.php b/config/autoload/webhooks.global.php
index 8e768e39..5de7c53b 100644
--- a/config/autoload/webhooks.global.php
+++ b/config/autoload/webhooks.global.php
@@ -4,6 +4,7 @@ declare(strict_types=1);
 
 use Shlinkio\Shlink\Core\Config\EnvVars;
 
+// Deprecated. Webhooks are no longer supported. To be removed in Shlink 4.0.0
 return (static function (): array {
     $webhooks = EnvVars::VISITS_WEBHOOKS()->loadFromEnv();
 
diff --git a/module/Core/src/Config/EnvVars.php b/module/Core/src/Config/EnvVars.php
index e3771e4c..3513687d 100644
--- a/module/Core/src/Config/EnvVars.php
+++ b/module/Core/src/Config/EnvVars.php
@@ -114,7 +114,9 @@ final class EnvVars
     public const DEFAULT_DOMAIN = 'DEFAULT_DOMAIN';
     public const AUTO_RESOLVE_TITLES = 'AUTO_RESOLVE_TITLES';
     public const REDIRECT_APPEND_EXTRA_PATH = 'REDIRECT_APPEND_EXTRA_PATH';
+    /** @deprecated */
     public const VISITS_WEBHOOKS = 'VISITS_WEBHOOKS';
+    /** @deprecated */
     public const NOTIFY_ORPHAN_VISITS_TO_WEBHOOKS = 'NOTIFY_ORPHAN_VISITS_TO_WEBHOOKS';
 
     /**
diff --git a/module/Core/src/EventDispatcher/NotifyVisitToWebHooks.php b/module/Core/src/EventDispatcher/NotifyVisitToWebHooks.php
index b5c2e501..73ff9266 100644
--- a/module/Core/src/EventDispatcher/NotifyVisitToWebHooks.php
+++ b/module/Core/src/EventDispatcher/NotifyVisitToWebHooks.php
@@ -21,6 +21,7 @@ use Throwable;
 
 use function Functional\map;
 
+/** @deprecated */
 class NotifyVisitToWebHooks
 {
     public function __construct(
diff --git a/module/Core/src/Options/WebhookOptions.php b/module/Core/src/Options/WebhookOptions.php
index 6eb07692..7196fd0c 100644
--- a/module/Core/src/Options/WebhookOptions.php
+++ b/module/Core/src/Options/WebhookOptions.php
@@ -6,6 +6,7 @@ namespace Shlinkio\Shlink\Core\Options;
 
 use Laminas\Stdlib\AbstractOptions;
 
+/** @deprecated */
 class WebhookOptions extends AbstractOptions
 {
     protected $__strictMode__ = false; // phpcs:ignore