diff --git a/static/app/components/workflowEngine/ui/actionMetadata.tsx b/static/app/components/workflowEngine/ui/actionMetadata.tsx
index b88dfa67c9df9d..b3e45ca8395c15 100644
--- a/static/app/components/workflowEngine/ui/actionMetadata.tsx
+++ b/static/app/components/workflowEngine/ui/actionMetadata.tsx
@@ -68,6 +68,10 @@ export const ActionMetadata: Partial<
name: t('Slack'),
icon: ,
},
+ [ActionType.SLACK_STAGING]: {
+ name: t('Slack (Staging)'),
+ icon: ,
+ },
[ActionType.WEBHOOK]: {
name: t('Webhook'),
icon: ,
diff --git a/static/app/types/workflowEngine/actions.tsx b/static/app/types/workflowEngine/actions.tsx
index 764fbd20e2116f..9a7c6b3c9bfc2c 100644
--- a/static/app/types/workflowEngine/actions.tsx
+++ b/static/app/types/workflowEngine/actions.tsx
@@ -35,6 +35,7 @@ export enum ActionTarget {
export enum ActionType {
SLACK = 'slack',
+ SLACK_STAGING = 'slack_staging',
MSTEAMS = 'msteams',
DISCORD = 'discord',
PAGERDUTY = 'pagerduty',
diff --git a/static/app/views/automations/components/actionNodes.tsx b/static/app/views/automations/components/actionNodes.tsx
index a1f7f3c3113019..935ed4a91bb8bb 100644
--- a/static/app/views/automations/components/actionNodes.tsx
+++ b/static/app/views/automations/components/actionNodes.tsx
@@ -217,6 +217,15 @@ export const actionNodesMap = new Map([
validate: validateSlackAction,
},
],
+ [
+ ActionType.SLACK_STAGING,
+ {
+ label: t('Slack (Staging)'),
+ action: SlackNode,
+ details: SlackDetails,
+ validate: validateSlackAction,
+ },
+ ],
[
ActionType.WEBHOOK,
{
diff --git a/static/app/views/automations/new.spec.tsx b/static/app/views/automations/new.spec.tsx
index b52e27ee41a453..8faeaccf3e1aef 100644
--- a/static/app/views/automations/new.spec.tsx
+++ b/static/app/views/automations/new.spec.tsx
@@ -128,6 +128,11 @@ describe('AutomationNewSettings', () => {
handlerGroup: ActionGroup.OTHER,
integrations: undefined,
}),
+ ActionHandlerFixture({
+ type: ActionType.SLACK_STAGING,
+ handlerGroup: ActionGroup.NOTIFICATION,
+ integrations: [{id: 'slack-staging-1', name: 'My Slack Staging Workspace'}],
+ }),
],
});
@@ -332,6 +337,16 @@ describe('AutomationNewSettings', () => {
delay: null,
});
+ await addAction('Slack (Staging)');
+ {
+ const stagingTargets = screen.getAllByRole('textbox', {name: 'Target'});
+ const stagingTarget = stagingTargets.at(-1);
+ expect(stagingTarget).toBeDefined();
+ await userEvent.type(stagingTarget as HTMLElement, '#staging-alerts', {
+ delay: null,
+ });
+ }
+
await addAction('Discord');
await userEvent.type(screen.getByPlaceholderText('channel ID or URL'), '123', {
delay: null,
@@ -490,6 +505,15 @@ describe('AutomationNewSettings', () => {
targetDisplay: null,
},
},
+ slack_staging: {
+ type: 'slack_staging',
+ integrationId: 'slack-staging-1',
+ config: {
+ targetType: 'specific',
+ targetIdentifier: '',
+ targetDisplay: '#staging-alerts',
+ },
+ },
};
await waitFor(() => expect(saveWorkflow).toHaveBeenCalled());
diff --git a/static/app/views/automations/utils/getIncompatibleActionWarning.tsx b/static/app/views/automations/utils/getIncompatibleActionWarning.tsx
index c2cdc9e15ee084..86aae718701193 100644
--- a/static/app/views/automations/utils/getIncompatibleActionWarning.tsx
+++ b/static/app/views/automations/utils/getIncompatibleActionWarning.tsx
@@ -5,6 +5,7 @@ import type {Detector} from 'sentry/types/workflowEngine/detectors';
const METRIC_DETECTOR_SUPPORTED_ACTIONS = new Set([
ActionType.EMAIL,
ActionType.SLACK,
+ ActionType.SLACK_STAGING,
ActionType.MSTEAMS,
ActionType.PAGERDUTY,
ActionType.OPSGENIE,