diff --git a/CHANGELOG.md b/CHANGELOG.md
index 339be5c..00db369 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
+# 2.2.2.0 (2025-09-15)
+* [#153](https://github.com/MercuryTechnologies/slack-web/pull/153)
+ Implement `channel_shared` and `channel_unshared` events.
+
# 2.2.1.0 (2025-09-15)
-* [#151](https://github.com/MercuryTechnologies/slack-web/151)
+* [#151](https://github.com/MercuryTechnologies/slack-web/pull/151)
Implement `conversations.member` API method.
# 2.2.0.0 (2025-03-21)
diff --git a/slack-web.cabal b/slack-web.cabal
index cad602e..e32e344 100644
--- a/slack-web.cabal
+++ b/slack-web.cabal
@@ -1,6 +1,6 @@
cabal-version: 3.0
name: slack-web
-version: 2.2.1.0
+version: 2.2.2.0
build-type: Simple
diff --git a/src/Web/Slack/Experimental/Events/Types.hs b/src/Web/Slack/Experimental/Events/Types.hs
index 4be88de..47794f8 100644
--- a/src/Web/Slack/Experimental/Events/Types.hs
+++ b/src/Web/Slack/Experimental/Events/Types.hs
@@ -283,6 +283,31 @@ data ChannelLeftEvent = ChannelLeftEvent
$(deriveFromJSON snakeCaseOptions ''ChannelLeftEvent)
+-- | A channel has been shared with an external workspace.
+--
+--
+data ChannelSharedEvent = ChannelSharedEvent
+ { connectedTeamId :: TeamId
+ , channel :: ConversationId
+ , eventTs :: Text
+ }
+ deriving stock (Show)
+
+$(deriveFromJSON snakeCaseOptions ''ChannelSharedEvent)
+
+-- | A channel has been unshared with an external workspace.
+--
+--
+data ChannelUnsharedEvent = ChannelUnsharedEvent
+ { previouslyConnectedTeamId :: TeamId
+ , channel :: ConversationId
+ , isExtShared :: Bool
+ , eventTs :: Text
+ }
+ deriving stock (Show)
+
+$(deriveFromJSON snakeCaseOptions ''ChannelUnsharedEvent)
+
-- |
data UrlVerificationPayload = UrlVerificationPayload
{ challenge :: Text
@@ -347,6 +372,8 @@ data Event
EventChannelJoinMessage
| EventChannelCreated ChannelCreatedEvent
| EventChannelLeft ChannelLeftEvent
+ | EventChannelShared ChannelSharedEvent
+ | EventChannelUnshared ChannelUnsharedEvent
| -- | @since 2.1.0.0
EventAppHomeOpened AppHomeOpenedEvent
| EventUnknown Value
@@ -366,6 +393,8 @@ instance FromJSON Event where
("message", Just "file_share") -> EventMessage <$> parseJSON @MessageEvent (Object obj)
("channel_created", Nothing) -> EventChannelCreated <$> parseJSON (Object obj)
("channel_left", Nothing) -> EventChannelLeft <$> parseJSON (Object obj)
+ ("channel_shared", Nothing) -> EventChannelShared <$> parseJSON (Object obj)
+ ("channel_unshared", Nothing) -> EventChannelUnshared <$> parseJSON (Object obj)
("app_home_opened", Nothing) -> EventAppHomeOpened <$> parseJSON (Object obj)
_ -> pure $ EventUnknown (Object obj)
diff --git a/tests/Web/Slack/Experimental/Events/TypesSpec.hs b/tests/Web/Slack/Experimental/Events/TypesSpec.hs
index 45956ce..37e5dc1 100644
--- a/tests/Web/Slack/Experimental/Events/TypesSpec.hs
+++ b/tests/Web/Slack/Experimental/Events/TypesSpec.hs
@@ -22,6 +22,8 @@ spec = describe "Types for Slack events" do
, "messageIm"
, "slackbotIm"
, "channel_left"
+ , "channel_shared"
+ , "channel_unshared"
, "share_without_message"
, "share_with_message"
, "circleci"
diff --git a/tests/golden/SlackWebhookEvent/channel_shared.golden b/tests/golden/SlackWebhookEvent/channel_shared.golden
new file mode 100644
index 0000000..9cc04f0
--- /dev/null
+++ b/tests/golden/SlackWebhookEvent/channel_shared.golden
@@ -0,0 +1,21 @@
+EventEventCallback
+ ( EventCallback
+ { eventId = EventId
+ { unEventId = "Ev044RKJHB8W" }
+ , teamId = TeamId
+ { unTeamId = "T043DB835ML" }
+ , eventTime = MkSystemTime
+ { systemSeconds = 1664827321
+ , systemNanoseconds = 0
+ }
+ , event = EventChannelShared
+ ( ChannelSharedEvent
+ { connectedTeamId = TeamId
+ { unTeamId = "E163Q94DX" }
+ , channel = ConversationId
+ { unConversationId = "C123ABC456" }
+ , eventTs = "1561064063.001100"
+ }
+ )
+ }
+ )
diff --git a/tests/golden/SlackWebhookEvent/channel_shared.json b/tests/golden/SlackWebhookEvent/channel_shared.json
new file mode 100644
index 0000000..488b109
--- /dev/null
+++ b/tests/golden/SlackWebhookEvent/channel_shared.json
@@ -0,0 +1,24 @@
+{
+ "token": "aaaa",
+ "team_id": "T043DB835ML",
+ "api_app_id": "A0442TUPHGR",
+ "event": {
+ "type": "channel_shared",
+ "connected_team_id": "E163Q94DX",
+ "channel": "C123ABC456",
+ "event_ts": "1561064063.001100"
+ },
+ "type": "event_callback",
+ "event_id": "Ev044RKJHB8W",
+ "event_time": 1664827321,
+ "authorizations": [
+ {
+ "enterprise_id": null,
+ "team_id": "T043DB835ML",
+ "user_id": "U0442US8QGH",
+ "is_bot": false,
+ "is_enterprise_install": false
+ }
+ ],
+ "is_ext_shared_channel": true
+}
diff --git a/tests/golden/SlackWebhookEvent/channel_unshared.golden b/tests/golden/SlackWebhookEvent/channel_unshared.golden
new file mode 100644
index 0000000..78ac14c
--- /dev/null
+++ b/tests/golden/SlackWebhookEvent/channel_unshared.golden
@@ -0,0 +1,22 @@
+EventEventCallback
+ ( EventCallback
+ { eventId = EventId
+ { unEventId = "Ev044RKJHB8W" }
+ , teamId = TeamId
+ { unTeamId = "T043DB835ML" }
+ , eventTime = MkSystemTime
+ { systemSeconds = 1664827321
+ , systemNanoseconds = 0
+ }
+ , event = EventChannelUnshared
+ ( ChannelUnsharedEvent
+ { previouslyConnectedTeamId = TeamId
+ { unTeamId = "E163Q94DX" }
+ , channel = ConversationId
+ { unConversationId = "C123ABC456" }
+ , isExtShared = False
+ , eventTs = "1561064063.001100"
+ }
+ )
+ }
+ )
diff --git a/tests/golden/SlackWebhookEvent/channel_unshared.json b/tests/golden/SlackWebhookEvent/channel_unshared.json
new file mode 100644
index 0000000..c43e570
--- /dev/null
+++ b/tests/golden/SlackWebhookEvent/channel_unshared.json
@@ -0,0 +1,25 @@
+{
+ "token": "aaaa",
+ "team_id": "T043DB835ML",
+ "api_app_id": "A0442TUPHGR",
+ "event": {
+ "type": "channel_unshared",
+ "previously_connected_team_id": "E163Q94DX",
+ "channel": "C123ABC456",
+ "is_ext_shared": false,
+ "event_ts": "1561064063.001100"
+ },
+ "type": "event_callback",
+ "event_id": "Ev044RKJHB8W",
+ "event_time": 1664827321,
+ "authorizations": [
+ {
+ "enterprise_id": null,
+ "team_id": "T043DB835ML",
+ "user_id": "U0442US8QGH",
+ "is_bot": false,
+ "is_enterprise_install": false
+ }
+ ],
+ "is_ext_shared_channel": false
+}