diff --git a/app/models/integrations/instance/apple_app_store.rb b/app/models/integrations/instance/apple_app_store.rb
new file mode 100644
index 0000000000000000000000000000000000000000..4737e60d0f759f72290b77af659428459de9237a
--- /dev/null
+++ b/app/models/integrations/instance/apple_app_store.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class AppleAppStore < ::Integrations::AppleAppStore
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/asana.rb b/app/models/integrations/instance/asana.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e893717e9bb5e1b3d0d821e74f8f924a902d65a7
--- /dev/null
+++ b/app/models/integrations/instance/asana.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Asana < ::Integrations::Asana
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/assembla.rb b/app/models/integrations/instance/assembla.rb
new file mode 100644
index 0000000000000000000000000000000000000000..324c38d444025859dfa8ba68617dab4e029ec397
--- /dev/null
+++ b/app/models/integrations/instance/assembla.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Assembla < ::Integrations::Assembla
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/bamboo.rb b/app/models/integrations/instance/bamboo.rb
new file mode 100644
index 0000000000000000000000000000000000000000..24670d711503abffdadddf10a48ada482399bdf2
--- /dev/null
+++ b/app/models/integrations/instance/bamboo.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Bamboo < ::Integrations::Bamboo
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/beyond_identity.rb b/app/models/integrations/instance/beyond_identity.rb
new file mode 100644
index 0000000000000000000000000000000000000000..42adcb834487dc3e1eef527667036ccd055e23f9
--- /dev/null
+++ b/app/models/integrations/instance/beyond_identity.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class BeyondIdentity < ::Integrations::BeyondIdentity
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/bugzilla.rb b/app/models/integrations/instance/bugzilla.rb
new file mode 100644
index 0000000000000000000000000000000000000000..7acd22b9639ab48934a029a99cd9dc342fc21223
--- /dev/null
+++ b/app/models/integrations/instance/bugzilla.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Bugzilla < ::Integrations::Bugzilla
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/buildkite.rb b/app/models/integrations/instance/buildkite.rb
new file mode 100644
index 0000000000000000000000000000000000000000..fd1aad99902eda2becfdcefee0130682db6d3695
--- /dev/null
+++ b/app/models/integrations/instance/buildkite.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Buildkite < ::Integrations::Buildkite
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/campfire.rb b/app/models/integrations/instance/campfire.rb
new file mode 100644
index 0000000000000000000000000000000000000000..f731998f4c67bc9029e0bee88c4eff1b80f116f5
--- /dev/null
+++ b/app/models/integrations/instance/campfire.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Campfire < ::Integrations::Campfire
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/clickup.rb b/app/models/integrations/instance/clickup.rb
new file mode 100644
index 0000000000000000000000000000000000000000..5f770b08c556df64513ec44dad51f1b30876d285
--- /dev/null
+++ b/app/models/integrations/instance/clickup.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Clickup < ::Integrations::Clickup
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/confluence.rb b/app/models/integrations/instance/confluence.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b042c2aa0be87573d725064285e80bf2fe558d43
--- /dev/null
+++ b/app/models/integrations/instance/confluence.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Confluence < ::Integrations::Confluence
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/custom_issue_tracker.rb b/app/models/integrations/instance/custom_issue_tracker.rb
new file mode 100644
index 0000000000000000000000000000000000000000..eed95c89b216be4937d70fd64583ee445353d623
--- /dev/null
+++ b/app/models/integrations/instance/custom_issue_tracker.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class CustomIssueTracker < ::Integrations::CustomIssueTracker
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/datadog.rb b/app/models/integrations/instance/datadog.rb
new file mode 100644
index 0000000000000000000000000000000000000000..52ad4f2f200ab6339be1daa94e3d3c73e4319196
--- /dev/null
+++ b/app/models/integrations/instance/datadog.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Datadog < ::Integrations::Datadog
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/diffblue_cover.rb b/app/models/integrations/instance/diffblue_cover.rb
new file mode 100644
index 0000000000000000000000000000000000000000..4167180805852506deae47ebcf29554187e61d31
--- /dev/null
+++ b/app/models/integrations/instance/diffblue_cover.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class DiffblueCover < ::Integrations::DiffblueCover
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/discord.rb b/app/models/integrations/instance/discord.rb
new file mode 100644
index 0000000000000000000000000000000000000000..4a71720f9d892d619ded7f44ba1b1a20e8579652
--- /dev/null
+++ b/app/models/integrations/instance/discord.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Discord < ::Integrations::Discord
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/drone_ci.rb b/app/models/integrations/instance/drone_ci.rb
new file mode 100644
index 0000000000000000000000000000000000000000..86d9c458ceef2e2c98196f8f2bf3fc2b4e6eb9dc
--- /dev/null
+++ b/app/models/integrations/instance/drone_ci.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class DroneCi < ::Integrations::DroneCi
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/emails_on_push.rb b/app/models/integrations/instance/emails_on_push.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d7a2791c8a162fa7480ee7f417457f000ba7745a
--- /dev/null
+++ b/app/models/integrations/instance/emails_on_push.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class EmailsOnPush < ::Integrations::EmailsOnPush
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/ewm.rb b/app/models/integrations/instance/ewm.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b0ab7a690f266376b03d092f62d228f8d8f77c2f
--- /dev/null
+++ b/app/models/integrations/instance/ewm.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Ewm < ::Integrations::Ewm
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/external_wiki.rb b/app/models/integrations/instance/external_wiki.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d800c81e22ea86b67930b6e98ac5ef8fba063cda
--- /dev/null
+++ b/app/models/integrations/instance/external_wiki.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class ExternalWiki < ::Integrations::ExternalWiki
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/gitlab_slack_application.rb b/app/models/integrations/instance/gitlab_slack_application.rb
new file mode 100644
index 0000000000000000000000000000000000000000..585d8feac4f93eb0e34fbcc9d197f83a4725150e
--- /dev/null
+++ b/app/models/integrations/instance/gitlab_slack_application.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class GitlabSlackApplication < ::Integrations::GitlabSlackApplication
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/google_play.rb b/app/models/integrations/instance/google_play.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b14c98f8e4237739b1d47e746bce690752ba0122
--- /dev/null
+++ b/app/models/integrations/instance/google_play.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class GooglePlay < ::Integrations::GooglePlay
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/hangouts_chat.rb b/app/models/integrations/instance/hangouts_chat.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9c378d180f8862230daadf44165ec06e414a32b1
--- /dev/null
+++ b/app/models/integrations/instance/hangouts_chat.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class HangoutsChat < ::Integrations::HangoutsChat
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/harbor.rb b/app/models/integrations/instance/harbor.rb
new file mode 100644
index 0000000000000000000000000000000000000000..0706a93ba3d20383040a3cf3b099438ae80d2714
--- /dev/null
+++ b/app/models/integrations/instance/harbor.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Harbor < ::Integrations::Harbor
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/irker.rb b/app/models/integrations/instance/irker.rb
new file mode 100644
index 0000000000000000000000000000000000000000..86467af7da90c7ba803bd3bb48dade2fcbaa7010
--- /dev/null
+++ b/app/models/integrations/instance/irker.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Irker < ::Integrations::Irker
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/jenkins.rb b/app/models/integrations/instance/jenkins.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e788f0368407e38bfe8caf60152875358593e38b
--- /dev/null
+++ b/app/models/integrations/instance/jenkins.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Jenkins < ::Integrations::Jenkins
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/jira.rb b/app/models/integrations/instance/jira.rb
new file mode 100644
index 0000000000000000000000000000000000000000..522dedb051361cc04a3c583e8e302ed802ab668d
--- /dev/null
+++ b/app/models/integrations/instance/jira.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Jira < ::Integrations::Jira
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/jira_cloud_app.rb b/app/models/integrations/instance/jira_cloud_app.rb
new file mode 100644
index 0000000000000000000000000000000000000000..99a572a0227f39690fbff20baed39c225c99ad20
--- /dev/null
+++ b/app/models/integrations/instance/jira_cloud_app.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class JiraCloudApp < ::Integrations::JiraCloudApp
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/matrix.rb b/app/models/integrations/instance/matrix.rb
new file mode 100644
index 0000000000000000000000000000000000000000..3420a5c74916a035474b1a7e8bc1d04646b1aaa5
--- /dev/null
+++ b/app/models/integrations/instance/matrix.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Matrix < ::Integrations::Matrix
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/mattermost.rb b/app/models/integrations/instance/mattermost.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e59e5cd1d695467dcc5b3c8a416bed9122f568eb
--- /dev/null
+++ b/app/models/integrations/instance/mattermost.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Mattermost < ::Integrations::Mattermost
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/mattermost_slash_commands.rb b/app/models/integrations/instance/mattermost_slash_commands.rb
new file mode 100644
index 0000000000000000000000000000000000000000..6cee12ba8b65d31aec22030392d193188823320c
--- /dev/null
+++ b/app/models/integrations/instance/mattermost_slash_commands.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class MattermostSlashCommands < ::Integrations::MattermostSlashCommands
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/microsoft_teams.rb b/app/models/integrations/instance/microsoft_teams.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e2a3e081649201cfa24aa62f4c039acd2943ecae
--- /dev/null
+++ b/app/models/integrations/instance/microsoft_teams.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class MicrosoftTeams < ::Integrations::MicrosoftTeams
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/mock_ci.rb b/app/models/integrations/instance/mock_ci.rb
new file mode 100644
index 0000000000000000000000000000000000000000..11df9d22e991e72325ca630016282d2fb9fed425
--- /dev/null
+++ b/app/models/integrations/instance/mock_ci.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class MockCi < ::Integrations::MockCi
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/mock_monitoring.rb b/app/models/integrations/instance/mock_monitoring.rb
new file mode 100644
index 0000000000000000000000000000000000000000..8d8cd05a5e93a65bac914bc360073f81433a8069
--- /dev/null
+++ b/app/models/integrations/instance/mock_monitoring.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class MockMonitoring < ::Integrations::MockMonitoring
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/packagist.rb b/app/models/integrations/instance/packagist.rb
new file mode 100644
index 0000000000000000000000000000000000000000..18c7c5a687edc55e14ad5cedb70b775dbe2e74a8
--- /dev/null
+++ b/app/models/integrations/instance/packagist.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Packagist < ::Integrations::Packagist
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/phorge.rb b/app/models/integrations/instance/phorge.rb
new file mode 100644
index 0000000000000000000000000000000000000000..bec59159b836fd3b9192cc1c832da50946c0df21
--- /dev/null
+++ b/app/models/integrations/instance/phorge.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Phorge < ::Integrations::Phorge
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/pipelines_email.rb b/app/models/integrations/instance/pipelines_email.rb
new file mode 100644
index 0000000000000000000000000000000000000000..cfba7cc3d9f9fa30ce72f4d0d8fb3ab2a1d30be7
--- /dev/null
+++ b/app/models/integrations/instance/pipelines_email.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class PipelinesEmail < ::Integrations::PipelinesEmail
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/pivotaltracker.rb b/app/models/integrations/instance/pivotaltracker.rb
new file mode 100644
index 0000000000000000000000000000000000000000..af2440cfb29010a530e2404ed505c15144ebb368
--- /dev/null
+++ b/app/models/integrations/instance/pivotaltracker.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Pivotaltracker < ::Integrations::Pivotaltracker
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/prometheus.rb b/app/models/integrations/instance/prometheus.rb
new file mode 100644
index 0000000000000000000000000000000000000000..0e76091909c2c3d5a1fd2bcff53e1db7e6f2d4ec
--- /dev/null
+++ b/app/models/integrations/instance/prometheus.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Prometheus < ::Integrations::Prometheus
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/pumble.rb b/app/models/integrations/instance/pumble.rb
new file mode 100644
index 0000000000000000000000000000000000000000..cfcee4963d0e041758498549ac976d37d548d9b5
--- /dev/null
+++ b/app/models/integrations/instance/pumble.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Pumble < ::Integrations::Pumble
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/pushover.rb b/app/models/integrations/instance/pushover.rb
new file mode 100644
index 0000000000000000000000000000000000000000..0e7d1f1d727889ad4988c87019403021c8710e6d
--- /dev/null
+++ b/app/models/integrations/instance/pushover.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Pushover < ::Integrations::Pushover
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/redmine.rb b/app/models/integrations/instance/redmine.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e08c6faaf7e9f47f1a16bb8d599ca5e808a6a4d4
--- /dev/null
+++ b/app/models/integrations/instance/redmine.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Redmine < ::Integrations::Redmine
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/slack.rb b/app/models/integrations/instance/slack.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a737b11d7edfbb1cca6074d25b4589921e4f2ab9
--- /dev/null
+++ b/app/models/integrations/instance/slack.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Slack < ::Integrations::Slack
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/slack_slash_commands.rb b/app/models/integrations/instance/slack_slash_commands.rb
new file mode 100644
index 0000000000000000000000000000000000000000..8066c4b1e481865bdd715ac2043a4ec4d4701a02
--- /dev/null
+++ b/app/models/integrations/instance/slack_slash_commands.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class SlackSlashCommands < ::Integrations::SlackSlashCommands
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/squash_tm.rb b/app/models/integrations/instance/squash_tm.rb
new file mode 100644
index 0000000000000000000000000000000000000000..413018baaa59e2ede22d495c916dd662bed784bb
--- /dev/null
+++ b/app/models/integrations/instance/squash_tm.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class SquashTm < ::Integrations::SquashTm
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/teamcity.rb b/app/models/integrations/instance/teamcity.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d3a7fc159e2fba0295a42037b5e9150b0c7787ea
--- /dev/null
+++ b/app/models/integrations/instance/teamcity.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Teamcity < ::Integrations::Teamcity
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/telegram.rb b/app/models/integrations/instance/telegram.rb
new file mode 100644
index 0000000000000000000000000000000000000000..58cd5139d8df6022db270e6dd837a6d1a3a9a8a5
--- /dev/null
+++ b/app/models/integrations/instance/telegram.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Telegram < ::Integrations::Telegram
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/unify_circuit.rb b/app/models/integrations/instance/unify_circuit.rb
new file mode 100644
index 0000000000000000000000000000000000000000..7c6cc25a8fbe5095fc2d5861fa5702a6a9e26b6c
--- /dev/null
+++ b/app/models/integrations/instance/unify_circuit.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class UnifyCircuit < ::Integrations::UnifyCircuit
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/webex_teams.rb b/app/models/integrations/instance/webex_teams.rb
new file mode 100644
index 0000000000000000000000000000000000000000..ffe4012f439890522b65a1d42dc201d727dc5864
--- /dev/null
+++ b/app/models/integrations/instance/webex_teams.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class WebexTeams < ::Integrations::WebexTeams
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/youtrack.rb b/app/models/integrations/instance/youtrack.rb
new file mode 100644
index 0000000000000000000000000000000000000000..641b832fe6efa3fe2eba9dab04466be1c31ae4c7
--- /dev/null
+++ b/app/models/integrations/instance/youtrack.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Youtrack < ::Integrations::Youtrack
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance/zentao.rb b/app/models/integrations/instance/zentao.rb
new file mode 100644
index 0000000000000000000000000000000000000000..f0bb0de6056160c2fff3bcbdbbdfba4ca38d8ac3
--- /dev/null
+++ b/app/models/integrations/instance/zentao.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Integrations
+  module Instance
+    class Zentao < ::Integrations::Zentao
+      include InstanceIntegration
+    end
+  end
+end
diff --git a/app/models/integrations/instance_integration.rb b/app/models/integrations/instance_integration.rb
index 9fc52fb570808eda0365880cde76c3dcd8dc82d0..b201e2c0a8087bd5a329de41b307adc92505f614 100644
--- a/app/models/integrations/instance_integration.rb
+++ b/app/models/integrations/instance_integration.rb
@@ -1,7 +1,27 @@
 # frozen_string_literal: true
 
 module Integrations
-  class InstanceIntegration < Integration
-    self.table_name = 'instance_integrations'
+  module InstanceIntegration
+    extend ActiveSupport::Concern
+
+    included do
+      self.table_name = 'instance_integrations'
+
+      def instance_level?
+        true
+      end
+
+      def group_level?
+        false
+      end
+
+      def project_level?
+        false
+      end
+
+      def self.fields
+        superclass.fields
+      end
+    end
   end
 end
diff --git a/db/docs/instance_integrations.yml b/db/docs/instance_integrations.yml
index b799f7a5a5b21a79c78522993f8a29cfab06fa0f..62b4ec1d40557ede6b7178c306b6224580240cee 100644
--- a/db/docs/instance_integrations.yml
+++ b/db/docs/instance_integrations.yml
@@ -1,7 +1,55 @@
 ---
 table_name: instance_integrations
 classes:
-- Integrations::InstanceIntegration
+- Integrations::Instance::AppleAppStore
+- Integrations::Instance::Asana
+- Integrations::Instance::Assembla
+- Integrations::Instance::Bamboo
+- Integrations::Instance::BeyondIdentity
+- Integrations::Instance::Bugzilla
+- Integrations::Instance::Buildkite
+- Integrations::Instance::Campfire
+- Integrations::Instance::Clickup
+- Integrations::Instance::Confluence
+- Integrations::Instance::CustomIssueTracker
+- Integrations::Instance::Datadog
+- Integrations::Instance::DiffblueCover
+- Integrations::Instance::Discord
+- Integrations::Instance::DroneCi
+- Integrations::Instance::EmailsOnPush
+- Integrations::Instance::Ewm
+- Integrations::Instance::ExternalWiki
+- Integrations::Instance::GitlabSlackApplication
+- Integrations::Instance::GooglePlay
+- Integrations::Instance::HangoutsChat
+- Integrations::Instance::Harbor
+- Integrations::Instance::Irker
+- Integrations::Instance::Jenkins
+- Integrations::Instance::Jira
+- Integrations::Instance::JiraCloudApp
+- Integrations::Instance::Matrix
+- Integrations::Instance::Mattermost
+- Integrations::Instance::MattermostSlashCommands
+- Integrations::Instance::MicrosoftTeams
+- Integrations::Instance::MockCi
+- Integrations::Instance::MockMonitoring
+- Integrations::Instance::Packagist
+- Integrations::Instance::Phorge
+- Integrations::Instance::PipelinesEmail
+- Integrations::Instance::Pivotaltracker
+- Integrations::Instance::Prometheus
+- Integrations::Instance::Pumble
+- Integrations::Instance::Pushover
+- Integrations::Instance::Redmine
+- Integrations::Instance::Slack
+- Integrations::Instance::SlackSlashCommands
+- Integrations::Instance::SquashTm
+- Integrations::Instance::Teamcity
+- Integrations::Instance::Telegram
+- Integrations::Instance::UnifyCircuit
+- Integrations::Instance::WebexTeams
+- Integrations::Instance::Youtrack
+- Integrations::Instance::Zentao
 feature_categories:
 - integrations
 description: Support 3rd party instance-wide integrations
diff --git a/db/migrate/20241011103239_update_instance_integration_table.rb b/db/migrate/20241011103239_update_instance_integration_table.rb
new file mode 100644
index 0000000000000000000000000000000000000000..563d6044dc074932476859d48aed1237524982de
--- /dev/null
+++ b/db/migrate/20241011103239_update_instance_integration_table.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class UpdateInstanceIntegrationTable < Gitlab::Database::Migration[2.2]
+  milestone '17.5'
+
+  disable_ddl_transaction!
+
+  def up
+    add_column :instance_integrations, :project_id, :bigint, null: true
+    add_column :instance_integrations, :group_id, :bigint, null: true
+    add_column :instance_integrations, :inherit_from_id, :bigint, null: true
+    add_column :instance_integrations, :instance, :boolean, default: true
+
+    rename_column :instance_integrations, :type, :type_new
+
+    add_check_constraint :instance_integrations, 'project_id IS NULL', 'project_id_null_constraint'
+    add_check_constraint :instance_integrations, 'group_id IS NULL', 'group_id_null_constraint'
+    add_check_constraint :instance_integrations, 'inherit_from_id IS NULL', 'inherit_from_id_null_constraint'
+    add_check_constraint :instance_integrations, 'instance = TRUE', 'instance_is_true_constraint'
+  end
+
+  def down
+    remove_column :instance_integrations, :project_id, if_exists: true
+    remove_column :instance_integrations, :group_id, if_exists: true
+    remove_column :instance_integrations, :inherit_from_id, if_exists: true
+    remove_column :instance_integrations, :instance, if_exists: true
+
+    rename_column :instance_integrations, :type_new, :type
+  end
+end
diff --git a/db/schema_migrations/20241011103239 b/db/schema_migrations/20241011103239
new file mode 100644
index 0000000000000000000000000000000000000000..2eab31553a1835796f8437541271ca7d9c54f0df
--- /dev/null
+++ b/db/schema_migrations/20241011103239
@@ -0,0 +1 @@
+61bf49e142de2f50e055676aef057439fe846dba7971fc94db0165eb29abb2bb
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index e4bac27b1100d923af2c860bbdcf60963bd7c733..322c35e8cddef451fcba7edca13a6390439a5ea3 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -12625,11 +12625,19 @@ CREATE TABLE instance_integrations (
     group_mention_events boolean DEFAULT false NOT NULL,
     group_confidential_mention_events boolean DEFAULT false NOT NULL,
     category text DEFAULT 'common'::text,
-    type text,
+    type_new text,
     encrypted_properties bytea,
     encrypted_properties_iv bytea,
+    project_id bigint,
+    group_id bigint,
+    inherit_from_id bigint,
+    instance boolean DEFAULT true,
     CONSTRAINT check_611836812c CHECK ((char_length(category) <= 255)),
-    CONSTRAINT check_69b7b09aa8 CHECK ((char_length(type) <= 255))
+    CONSTRAINT check_69b7b09aa8 CHECK ((char_length(type_new) <= 255)),
+    CONSTRAINT group_id_null_constraint CHECK ((group_id IS NULL)),
+    CONSTRAINT inherit_from_id_null_constraint CHECK ((inherit_from_id IS NULL)),
+    CONSTRAINT instance_is_true_constraint CHECK ((instance = true)),
+    CONSTRAINT project_id_null_constraint CHECK ((project_id IS NULL))
 );
 
 CREATE SEQUENCE instance_integrations_id_seq
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
index 7d1d634521eb7b2543ea74a11f04dbffd11e7d4f..a3b1838f3890f46656ff1f20550b7f8f1cc3738a 100644
--- a/spec/db/schema_spec.rb
+++ b/spec/db/schema_spec.rb
@@ -218,7 +218,8 @@
     ai_testing_terms_acceptances: %w[user_id], # testing terms only have 1 entry, and if the user is deleted the record should remain
     namespace_settings: %w[early_access_program_joined_by_id], # isn't used inside product itself. Only through Snowflake
     workspaces_agent_config_versions: %w[item_id], # polymorphic associations
-    work_item_types: %w[correct_id] # temporary column that is not a foreign key
+    work_item_types: %w[correct_id], # temporary column that is not a foreign key
+    instance_integrations: %w[project_id group_id inherit_from_id] # these columns are not used in instance integrations
   }.with_indifferent_access.freeze
 
   context 'for table' do
@@ -349,7 +350,8 @@
     'ProjectAutoDevops' => %w[deploy_strategy],
     'ResourceLabelEvent' => %w[action],
     'User' => %w[layout dashboard project_view],
-    'Users::Callout' => %w[feature_name]
+    'Users::Callout' => %w[feature_name],
+    'Integrations::Instance::Jira' => %w[comment_detail]
   }.freeze
 
   context 'for enums', :eager_load do
diff --git a/spec/factories/integrations/instance_integrations.rb b/spec/factories/integrations/instance_integrations.rb
deleted file mode 100644
index d70b7ecf889682d955dc7bf9800b7e0860528958..0000000000000000000000000000000000000000
--- a/spec/factories/integrations/instance_integrations.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-FactoryBot.define do
-  factory :instance_integration, class: 'Integrations::InstanceIntegration' do
-    type { 'Integrations::InstanceIntegration' }
-  end
-end
diff --git a/spec/models/integrations/instance/apple_app_store_spec.rb b/spec/models/integrations/instance/apple_app_store_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d47a0a4fd3859ddd2e85bb6f31bd3e4b19830e92
--- /dev/null
+++ b/spec/models/integrations/instance/apple_app_store_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::AppleAppStore, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/asana_spec.rb b/spec/models/integrations/instance/asana_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..5eca63c031716f5a3e2fffa7b394356beb96a20a
--- /dev/null
+++ b/spec/models/integrations/instance/asana_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Asana, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/assembla_spec.rb b/spec/models/integrations/instance/assembla_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..0501d55475e6ade4d43e29099b0f80d63adebaf0
--- /dev/null
+++ b/spec/models/integrations/instance/assembla_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Assembla, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/bamboo_spec.rb b/spec/models/integrations/instance/bamboo_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..0a8929ea7f2de29e9db4f0b27089e30ba51498ed
--- /dev/null
+++ b/spec/models/integrations/instance/bamboo_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Bamboo, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/beyond_identity_spec.rb b/spec/models/integrations/instance/beyond_identity_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..523695e0c4c41e898185ca5a294b1ed3dfc0ab5a
--- /dev/null
+++ b/spec/models/integrations/instance/beyond_identity_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::BeyondIdentity, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/bugzilla_spec.rb b/spec/models/integrations/instance/bugzilla_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..c6c97f87a3ca1630b1016f2f7ae4b28e44ddabe2
--- /dev/null
+++ b/spec/models/integrations/instance/bugzilla_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Bugzilla, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/buildkite_spec.rb b/spec/models/integrations/instance/buildkite_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..0509c860fedcd2a9f9d28356cf6e180d364f2838
--- /dev/null
+++ b/spec/models/integrations/instance/buildkite_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Buildkite, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/campfire_spec.rb b/spec/models/integrations/instance/campfire_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..5394835a726d40195b8a91251704d5ba49d6de65
--- /dev/null
+++ b/spec/models/integrations/instance/campfire_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Campfire, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/clickup_spec.rb b/spec/models/integrations/instance/clickup_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..58c64b10728c6438b0481b14e58359e66a703969
--- /dev/null
+++ b/spec/models/integrations/instance/clickup_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Clickup, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/confluence_spec.rb b/spec/models/integrations/instance/confluence_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..86ef082dc5cbd8066f7af85d33ec4c7d87c83108
--- /dev/null
+++ b/spec/models/integrations/instance/confluence_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Confluence, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/custom_issue_tracker_spec.rb b/spec/models/integrations/instance/custom_issue_tracker_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..c5a06ceec181e860636cf480a192ca0e9765d608
--- /dev/null
+++ b/spec/models/integrations/instance/custom_issue_tracker_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::CustomIssueTracker, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/datadog_spec.rb b/spec/models/integrations/instance/datadog_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..831a17a2ce8c15a5363a7d452bbcca458d4e9e87
--- /dev/null
+++ b/spec/models/integrations/instance/datadog_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Datadog, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/diffblue_cover_spec.rb b/spec/models/integrations/instance/diffblue_cover_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d3411bede16402dbb8f74277cce096057a6fa086
--- /dev/null
+++ b/spec/models/integrations/instance/diffblue_cover_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::DiffblueCover, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/discord_spec.rb b/spec/models/integrations/instance/discord_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..f89c0d98b449b9b7da7388e8d6e3260d9ddeab48
--- /dev/null
+++ b/spec/models/integrations/instance/discord_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Discord, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/drone_ci_spec.rb b/spec/models/integrations/instance/drone_ci_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..047b5cfd1e839547eb51826312d944a64657e87d
--- /dev/null
+++ b/spec/models/integrations/instance/drone_ci_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::DroneCi, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/emails_on_push_spec.rb b/spec/models/integrations/instance/emails_on_push_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..8374d7f0d5e213d75e406a78f1390542918d2fc0
--- /dev/null
+++ b/spec/models/integrations/instance/emails_on_push_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::EmailsOnPush, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/ewm_spec.rb b/spec/models/integrations/instance/ewm_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e2f2cc8da693e6b0dd0a1ce705252581bfe6ff61
--- /dev/null
+++ b/spec/models/integrations/instance/ewm_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Ewm, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/external_wiki_spec.rb b/spec/models/integrations/instance/external_wiki_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..aacb455acd926871a822bc5efce8bfa6e1f4f857
--- /dev/null
+++ b/spec/models/integrations/instance/external_wiki_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::ExternalWiki, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/gitlab_slack_application_spec.rb b/spec/models/integrations/instance/gitlab_slack_application_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a7a493ec8acdce9f21227b2f4115d6f3c9857bab
--- /dev/null
+++ b/spec/models/integrations/instance/gitlab_slack_application_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::GitlabSlackApplication, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/google_play_spec.rb b/spec/models/integrations/instance/google_play_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..2629b10303736ae19706a9cf57858775d995d47a
--- /dev/null
+++ b/spec/models/integrations/instance/google_play_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::GooglePlay, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/hangouts_chat_spec.rb b/spec/models/integrations/instance/hangouts_chat_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..aceb88f2a5bc96b426489ed44dd32b87a69889c4
--- /dev/null
+++ b/spec/models/integrations/instance/hangouts_chat_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::HangoutsChat, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/harbor_spec.rb b/spec/models/integrations/instance/harbor_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d95bb0af60dd2157add22cabf53f82f4ab4b2ecf
--- /dev/null
+++ b/spec/models/integrations/instance/harbor_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Harbor, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/irker_spec.rb b/spec/models/integrations/instance/irker_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..03dcd4bb1b29954cb021b9c640f3e1176eb7d60d
--- /dev/null
+++ b/spec/models/integrations/instance/irker_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Irker, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/jenkins_spec.rb b/spec/models/integrations/instance/jenkins_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..d2448e863960312a49c8db19d6ceb52a7fd93e32
--- /dev/null
+++ b/spec/models/integrations/instance/jenkins_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Jenkins, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/jira_cloud_app_spec.rb b/spec/models/integrations/instance/jira_cloud_app_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..cf63ed0b12b96a0c1812001ef3c187dd03c062d4
--- /dev/null
+++ b/spec/models/integrations/instance/jira_cloud_app_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::JiraCloudApp, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/matrix_spec.rb b/spec/models/integrations/instance/matrix_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..2a5d06813215fed63ba9e726cdba61547926725c
--- /dev/null
+++ b/spec/models/integrations/instance/matrix_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Matrix, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/mattermost_slash_commands_spec.rb b/spec/models/integrations/instance/mattermost_slash_commands_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a58d9097bc2c7c1f26e5f59a9d9f2d8b91ee3438
--- /dev/null
+++ b/spec/models/integrations/instance/mattermost_slash_commands_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::MattermostSlashCommands, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/mattermost_spec.rb b/spec/models/integrations/instance/mattermost_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b4e8e07f7b3392db8dd3134884eaa202fa6f486e
--- /dev/null
+++ b/spec/models/integrations/instance/mattermost_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Mattermost, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/microsoft_teams_spec.rb b/spec/models/integrations/instance/microsoft_teams_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b3844021ea31d673e6d0adc74edcd896ee9cf50d
--- /dev/null
+++ b/spec/models/integrations/instance/microsoft_teams_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::MicrosoftTeams, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/mock_ci_spec.rb b/spec/models/integrations/instance/mock_ci_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..6b8299962c706099be0cdf9e12996049dd3be45b
--- /dev/null
+++ b/spec/models/integrations/instance/mock_ci_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::MockCi, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/mock_monitoring_spec.rb b/spec/models/integrations/instance/mock_monitoring_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..24963c5cdb3209f88b04e9e5650f9113d34f8333
--- /dev/null
+++ b/spec/models/integrations/instance/mock_monitoring_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::MockMonitoring, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/packagist_spec.rb b/spec/models/integrations/instance/packagist_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..1c57abd5498bb8b24b01373cd39eb87b2bfd74ce
--- /dev/null
+++ b/spec/models/integrations/instance/packagist_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Packagist, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/phorge_spec.rb b/spec/models/integrations/instance/phorge_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..63f9c02ecf4fed248c14f003db13223f2117ff99
--- /dev/null
+++ b/spec/models/integrations/instance/phorge_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Phorge, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/pipelines_email_spec.rb b/spec/models/integrations/instance/pipelines_email_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..ea22a86e9c4abbbd68093b2f378e44dbec9a3188
--- /dev/null
+++ b/spec/models/integrations/instance/pipelines_email_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::PipelinesEmail, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/pivotaltracker_spec.rb b/spec/models/integrations/instance/pivotaltracker_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..7c8b25ebc6d880b296e3d2148c8457822dae3536
--- /dev/null
+++ b/spec/models/integrations/instance/pivotaltracker_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Pivotaltracker, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/prometheus_spec.rb b/spec/models/integrations/instance/prometheus_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a894a15f1c3424b59a1f7ff265bb3e6760b84060
--- /dev/null
+++ b/spec/models/integrations/instance/prometheus_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Prometheus, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/pumble_spec.rb b/spec/models/integrations/instance/pumble_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..67bff5197d1bcb547b570a191944afd944ae3def
--- /dev/null
+++ b/spec/models/integrations/instance/pumble_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Pumble, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/pushover_spec.rb b/spec/models/integrations/instance/pushover_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..958cfb8fd1702a846a543923ad1bd96e5636b88e
--- /dev/null
+++ b/spec/models/integrations/instance/pushover_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Pushover, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/slack_slash_commands_spec.rb b/spec/models/integrations/instance/slack_slash_commands_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..c0b41ad0e84e88c7449b8f9c5012f2d8b2342f86
--- /dev/null
+++ b/spec/models/integrations/instance/slack_slash_commands_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::SlackSlashCommands, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/slack_spec.rb b/spec/models/integrations/instance/slack_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..206899aa86b434bacae303d16d079fe85b5eb0df
--- /dev/null
+++ b/spec/models/integrations/instance/slack_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Slack, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/squash_tm_spec.rb b/spec/models/integrations/instance/squash_tm_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a0dcbd7ec727d62892d907e16a1cde5efb6fd0d9
--- /dev/null
+++ b/spec/models/integrations/instance/squash_tm_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::SquashTm, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/teamcity_spec.rb b/spec/models/integrations/instance/teamcity_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b2c22d8c504b296779e7bcbf5c180f80de29fbd5
--- /dev/null
+++ b/spec/models/integrations/instance/teamcity_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Teamcity, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/telegram_spec.rb b/spec/models/integrations/instance/telegram_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..fd411dcb9ba075d5636fe0ab39fe8eb4b757b9c1
--- /dev/null
+++ b/spec/models/integrations/instance/telegram_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Telegram, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/unify_circuit_spec.rb b/spec/models/integrations/instance/unify_circuit_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..ca5139ae751ed1ef3944f7bc57f46eee996f195b
--- /dev/null
+++ b/spec/models/integrations/instance/unify_circuit_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::UnifyCircuit, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/webex_teams_spec.rb b/spec/models/integrations/instance/webex_teams_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..c52ad9b6b237ef5a9be68396b710822076c4962b
--- /dev/null
+++ b/spec/models/integrations/instance/webex_teams_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::WebexTeams, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/models/integrations/instance/youtrack_spec.rb b/spec/models/integrations/instance/youtrack_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..25a7dd65dce5abb1e6199212c08f3fcd0048eb9c
--- /dev/null
+++ b/spec/models/integrations/instance/youtrack_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::Instance::Youtrack, feature_category: :integrations do
+  it_behaves_like 'instance integration'
+end
diff --git a/spec/support/shared_examples/models/integrations/instance/instance_integration_shared_examples.rb b/spec/support/shared_examples/models/integrations/instance/instance_integration_shared_examples.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e98f1dcf9931e21f52aa9914b264ab128386a573
--- /dev/null
+++ b/spec/support/shared_examples/models/integrations/instance/instance_integration_shared_examples.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'instance integration' do
+  let(:instance_integration) { described_class.new }
+
+  it 'successfully persists the record' do
+    expect { instance_integration.save! }.to change { described_class.count }.by(1)
+
+    expect(instance_integration.instance_level?).to eq(true)
+    expect(instance_integration.group_level?).to eq(false)
+    expect(instance_integration.project_level?).to eq(false)
+
+    expect(instance_integration.project_id).to be_nil
+    expect(instance_integration.group_id).to be_nil
+    expect(instance_integration.inherit_from_id).to be_nil
+  end
+
+  describe '.fields' do
+    it 'returns the fields of the superclass' do
+      expect(described_class.fields).to eq(described_class.superclass.fields)
+    end
+  end
+
+  describe 'null constraints' do
+    context 'when project_id null constraint is violated' do
+      it 'raises an error' do
+        instance_integration.project_id = 1
+
+        expect { instance_integration.save! }.to raise_error(ActiveRecord::RecordInvalid)
+      end
+    end
+
+    context 'when group_id null constraint is violated' do
+      it 'raises an error' do
+        instance_integration.group_id = 1
+
+        expect { instance_integration.save! }.to raise_error(ActiveRecord::RecordInvalid)
+      end
+    end
+
+    context 'when inherit_from_id null constraint is violated' do
+      it 'raises an error' do
+        instance_integration.inherit_from_id = 1
+
+        expect { instance_integration.save! }.to raise_error(ActiveRecord::StatementInvalid)
+      end
+    end
+  end
+end